Tất cả các loại hỗn hợp tồn tại. Bạn có cấu trúc dữ liệu, không liên quan đến thuật toán, thuật toán, không yêu cầu cấu trúc dữ liệu (thực), nhưng hầu hết cả hai đều có trong một gói.
Chỉnh sửa: như @Doval đã chỉ ra một cách chính xác, các cấu trúc dữ liệu trên mỗi se không có bất kỳ hoạt động nào liên quan đến chúng. Hành động kết hợp cấu trúc dữ liệu và thuật toán tạo thành một kiểu dữ liệu trừu tượng.
Cấu trúc dữ liệu không có thuật toán
Ví dụ, xem xét một cấu trúc dữ liệu để lưu trữ tọa độ 2 chiều, được gọi một cách thích hợp Point
. Không có gì nhiều về các thuật toán được thực hiện cho một điểm và nó thực sự chỉ là một thùng chứa cho một giá trị x
và y
. Tất nhiên, đưa ra cấu trúc dữ liệu này, giờ đây bạn có thể thêm tất cả các loại thuật toán lên trên nó (tính toán khoảng cách, vỏ lồi, những gì bạn có).
Bạn có thể nghĩ về rất nhiều cấu trúc dữ liệu, đơn giản chỉ là sự tích lũy dữ liệu riêng lẻ. Mặc dù những điều này xảy ra thường xuyên trong thực tế, nhưng chúng không tạo ra tài liệu giảng dạy tốt, bởi vì không có gì để học từ nó, một khi bạn đã hiểu, các mục dữ liệu đơn lẻ có thể được tích lũy vào cấu trúc dữ liệu mới (như bạn học được gì sau Point
ví dụ trên , nếu tôi cung cấp cho bạn cấu trúc dữ liệu tuyệt vời đó được gọi Point3D
, có thể làm điều tương tự cho không gian 3 chiều không?)
Các thuật toán không có cấu trúc dữ liệu (thực)
"Thực", vì rõ ràng mọi thuật toán thú vị đều cần các kiểu dữ liệu nguyên thủy như số nguyên hoặc booleans và chúng tôi không muốn coi chúng là cấu trúc dữ liệu trong ngữ cảnh này. Tương tự như trên, các thuật toán này thường khá đơn giản. Cụ thể, chúng không đi kèm với một trạng thái phức tạp nào, bởi vì điều đó thường đi vào cấu trúc dữ liệu (xem phần tiếp theo).
Một ví dụ cho thuật toán như vậy sẽ tính toán ước số chung lớn nhất của hai số. Các thuật toán của Euklid cho gcd thực sự chỉ cần giữ hai số nguyên và thao tác với chúng.
Khi mọi thứ bắt đầu trở nên thú vị hơn, bạn sẽ sớm bước vào thế giới của các loại dữ liệu trừu tượng. Ví dụ, sàng của Eratosthenes dựa trên một mảng. Bây giờ chúng ta có thể có một cuộc thảo luận, cho dù một mảng vẫn còn nguyên thủy hay thực tế, bạn có thể thảo luận nếu một số nguyên chưa phải là cấu trúc dữ liệu. Dù bằng cách nào, các thuật toán tồn tại hoàn toàn không có cấu trúc dữ liệu khá nhàm chán, ngay cả khi bạn chấp nhận sự tồn tại biệt lập của chúng.
Các thuật toán kết hợp với cấu trúc dữ liệu, còn gọi là các loại dữ liệu trừu tượng
Bây giờ đây là những người thú vị, nhưng vì hai lý do rất khác nhau. Thông thường, bạn có thể tiếp cận những điều này từ hai hướng: cấu trúc dữ liệu trước hoặc thuật toán trước.
Mặc dù kiểu dữ liệu trừu tượng được xác định bởi sự kết hợp của cấu trúc dữ liệu + thuật toán / thao tác, chúng tôi thường xem chúng tập trung vào một trong hai loại đó và coi cái kia là một yếu tố hỗ trợ.
Cấu trúc dữ liệu, sau đó là thuật toán
Bạn sẽ gặp các kiểu dữ liệu trừu tượng, khá đơn giản để sử dụng, nhưng liên quan đến các thuật toán phức tạp hơn hoặc ít hơn để làm cho chúng hoạt động bên trong. Ví dụ, a HashMap
là tầm thường để sử dụng, nhưng liên quan đến hàm băm tiện lợi và xử lý các va chạm băm ở bên trong. Tuy nhiên, từ quan điểm của bạn với tư cách là một người dùng, bạn quan tâm đến nó như một thứ giữ dữ liệu cho bạn, không phải là thứ gì đó làm cho bạn.
Trái ngược với nhóm cuối cùng bên dưới, các cấu trúc dữ liệu này không đưa người dùng của họ đến các thuật toán này. Bạn không cần biết, cũng không cần quan tâm đến HashMap
chức năng băm nội bộ của s để có thể sử dụng nó. (Để sử dụng nó một cách hiệu quả, bạn có thể muốn biết những điều này;)
Thuật toán, sau đó cấu trúc dữ liệu
Hướng khác có nghĩa là bạn có một thuật toán mà bạn muốn có thể sử dụng đơn giản, nhưng cần cấu trúc dữ liệu bên trong để làm cho nó hoạt động như dự định. Một ví dụ sẽ là thuật toán phân vùng không gian nhị phân (BSP), bạn chỉ cần yêu cầu 2 chiều Point
từ một tập hợp lớn các điểm gần nhất với một điểm truy vấn nhất định. Tuy nhiên, bạn cần một cấu trúc cây (và thậm chí các thuật toán bổ sung như tính toán khoảng cách) ở bên trong để thực sự viết thuật toán.
Nói chung, người ta có thể nói rằng các thuật toán trong nhóm này sử dụng các cấu trúc dữ liệu liên quan để biểu diễn trạng thái bên trong của chúng. Tôi sẽ lập luận rằng nhóm thuật toán này là đa dạng nhất và bạn sẽ tìm thấy nhiều thuật toán khác nhau phù hợp với sơ đồ chung này. Về quan điểm, chúng tôi thấy những điều này là thú vị, bởi vì họ làm điều gì đó (ví dụ như sắp xếp) cho chúng tôi và không quan tâm nhiều đến phần giữ dữ liệu.
Các cấu trúc dữ liệu và thuật toán liên quan chặt chẽ
Cuối cùng, bạn có các cấu trúc dữ liệu, rất liên quan đến các thuật toán tương ứng trực tiếp với chúng. Một ví dụ điển hình là cây nhị phân, khi bạn muốn làm bất cứ điều gì có ý nghĩa với nó, buộc chủ đề về thuật toán đi trên cây (trước hết, sâu trước, bất cứ điều gì).
Đối với những trường hợp này, chúng tôi thay đổi trọng tâm của quan điểm của chúng tôi về các loại dữ liệu trừu tượng kết quả thường xuyên. Đôi khi bạn quan tâm đến cấu trúc của cây, vài phút sau bạn quan tâm đến việc có thể chạy một hoạt động tìm kiếm trên nó, sau đó bạn tự hỏi về việc xóa một nút và ngay lập tức về cách cấu trúc trông sau đó. Mặc dù tất cả những điều này cũng đúng với các phần khác ở trên, nhưng nó không phải là trọng tâm chính trong tâm trí của bạn, ví dụ, khi bạn lưu trữ / truy xuất dữ liệu đến / từ một Map
hoặc khi bạn sắp xếp danh sách được liên kết.