Kiểu dữ liệu trừu tượng và cấu trúc dữ liệu


32

Thật khó cho tôi để hiểu những điều khoản này. Tôi đã tìm kiếm trên google và đọc một chút trên Wikipedia nhưng tôi vẫn không chắc chắn. Tôi đã xác định cho đến nay:

Tóm tắt Kiểu dữ liệu là một định nghĩa về loại mới, mô tả các thuộc tính và hoạt động của nó.

Cấu trúc dữ liệu là một triển khai của ADT. Nhiều ADT có thể được thực hiện dưới dạng Cấu trúc dữ liệu giống nhau.

Nếu tôi nghĩ đúng, mảng như ADT có nghĩa là một tập hợp các phần tử và dưới dạng Cấu trúc dữ liệu, cách nó được lưu trữ trong bộ nhớ. Stack là ADT với các hoạt động đẩy, pop, nhưng chúng ta có thể nói về cấu trúc dữ liệu ngăn xếp nếu tôi muốn sử dụng stack được triển khai như một mảng trong thuật toán của mình không? Và tại sao heap không phải là ADT? Nó có thể được thực hiện dưới dạng cây hoặc một mảng.


3
Trước tiên bạn có thể muốn đọc Sự khác biệt giữa Mảng và Ngăn xếp là gì?
chrisaycock


Câu trả lời:


24

Nói một cách đơn giản, một ADT (Kiểu dữ liệu trừu tượng) là một mô tả logic hơn, trong khi Cấu trúc dữ liệu là cụ thể.

Hãy nghĩ về một ADT như một bức tranh về dữ liệu và các thao tác để thao tác và thay đổi nó.

Một cấu trúc dữ liệu là điều thực tế, cụ thể . Nó có thể được thực hiện và sử dụng trong một thuật toán.


nhưng tôi cũng có thể triển khai Stack và Queue (đó là ADT) bên trong một thuật toán. Không?
FedericoCapaldo

Stack và Queue là các biểu diễn logic với ý nghĩa khoa học máy tính cụ thể. Tuy nhiên, việc triển khai Hàng đợi trong C #, Java, Go hoặc [đặt tên ngôn ngữ của bạn] sẽ hơi khác một chút. Xếp hàng khái niệm là ADT, Hàng đợi Java là Cấu trúc dữ liệu. Tương tự với việc thực hiện C # Stack.
Berin Loritsch

53

ADT là một giao diện ( nó làm gì) cấu trúc dữ liệu là gì đối với một lớp ( nó hoạt động như thế nào ).

Một vài ví dụ:

ADT: List
DS:  ArrayList, LinkedList...

ADT: Map
DS:  HashMap, TreeMap...

Tôi đoán bạn có được điểm.


ADT có thể nói là kiểu chung của cấu trúc Dữ liệu?
Owais Qureshi

1
Đây phải là câu trả lời được đánh dấu. Nó không thể được nói đơn giản hơn cho giáo dân.
deppfx

cảm ơn @dagnelies vì ​​câu trả lời đơn giản và hiệu quả. Điều này nên được đánh dấu là câu trả lời.
Sarun UK

1
Không chắc chắn tại sao nhưng tôi thích một sự sắp xếp lại nhỏ trong từ ngữ ở đây : ADT is to a Data Structure, what an Interface (what it does) is to a Class (how it does it). Các ví dụ là tại chỗ.
MP Aditya

10

Kiểu dữ liệu trừu tượng: ADT có thể được định nghĩa là một tập hợp các giá trị dữ liệu và các hoạt động liên quan được chỉ định chính xác độc lập với bất kỳ triển khai cụ thể nào. Do đó, Kiểu dữ liệu trừu tượng là một tập hợp thông tin có tổ chức và một tập hợp các hoạt động được sử dụng để quản lý thông tin đó. Tập hợp các hoạt động xác định giao diện của ADT. Miễn là ADT đáp ứng các điều kiện của giao diện, việc ADT được triển khai thực sự không quan trọng. Vì trong ADT, các giá trị dữ liệu và thao tác được xác định với độ chính xác toán học, thay vì thực hiện bằng ngôn ngữ máy tính, chúng tôi có thể lý giải về tác động của các hoạt động, quan hệ với các loại dữ liệu trừu tượng khác cho dù chương trình có thực hiện kiểu dữ liệu, v.v.

Sự khác biệt cơ bản giữa kiểu dữ liệu trừu tượng (ADT) và kiểu dữ liệu cụ thể là kiểu sau cho phép chúng ta xem xét biểu diễn cụ thể, trong khi kiểu trước ẩn dấu đại diện khỏi chúng ta. Một ADT có thể là ADT thuần túy hoặc ADT cập nhật. Một ADT thuần túy là một trong đó tất cả các hoạt động là các hàm thuần túy. Điều này có nghĩa là các hoạt động không có tác dụng phụ. Cụ thể, họ không sửa đổi hoặc cập nhật các đối số đầu vào. Họ chỉ sử dụng các đối số này để tạo đầu ra, là các giá trị mới của ADT (hoặc của các loại khác). Hầu hết các loại bê tông là tinh khiết. Ví dụ, không có thao tác nào trên số nguyên thực sự sửa đổi một số nguyên. Thay vào đó, tất cả các hoạt động như '+' tạo ra kết quả đầu ra mới.

Một ADT có thể cập nhật là một trong đó một số thao tác thực sự thay đổi giá trị của ADT. Ví dụ: giả sử chúng tôi có một hoạt động được gọi là 'pop', lấy một ngăn xếp làm đối số và sửa đổi nó. (Tại địa điểm, thành phố, một khu vực khác, có thể loại bỏ mục ưu tiên cao nhất. Hoạt động này sẽ được coi là không tinh khiết và toàn bộ ADT sau đó cũng sẽ không trong sạch. Một ADT có thể được người dùng xác định ADT.

Chúng tôi biết rằng Kiểu dữ liệu trừu tượng là loại dữ liệu thỏa mãn hai điều kiện sau:

  1. Biểu diễn hoặc định nghĩa của loại và các hoạt động được chứa trong một đơn vị cú pháp duy nhất.

  2. Việc biểu diễn các đối tượng của loại được ẩn khỏi các đơn vị chương trình sử dụng loại đó, do đó chỉ các hoạt động trực tiếp có thể có trên các đối tượng đó là những hoạt động được cung cấp trong định nghĩa của loại.

Một kiểu dữ liệu trừu tượng do người dùng định nghĩa sẽ cung cấp:

  1. Một định nghĩa kiểu cho phép các đơn vị chương trình khai báo các biến của kiểu, nhưng ẩn biểu diễn của các biến này.

  2. Một tập hợp các thao tác để thao tác các đối tượng của loại.

Một ví dụ về kiểu dữ liệu trừu tượng do người dùng định nghĩa là cấu trúc. 'C' cung cấp bốn loại cơ bản: int, char, float và double. Tuy nhiên, 'C' cũng cung cấp cho người lập trình khả năng xác định loại của riêng anh ta / cô ta. Cấu trúc là một ví dụ như vậy. Một cấu trúc là một tập hợp của các phần khác nhau, trong đó mỗi phần là một số loại hiện có.

struct abc

{int x;

float y;

};

Định nghĩa cấu trúc ở trên không tạo ra bất kỳ biến nào, thay vào đó nó tạo ra một kiểu mới. Các biến có kiểu này có thể được tạo theo cách tương tự với các biến có kiểu dựng sẵn.

struct abc a;

Từ khóa typedef cho phép chúng tôi tạo tên loại mới cho các loại mới.

Ví dụ:

typedef struct abc AB;

Trong đó AB là một tên loại mới hiện có thể được sử dụng để tạo các loại mới.

AB b;

Cấu trúc dữ liệu: Sau đây là các tính năng đặc trưng của cấu trúc dữ liệu:

  1. Nó chứa các mục dữ liệu thành phần, có thể là nguyên tử hoặc cấu trúc dữ liệu khác (vẫn là một miền).

  2. Một tập hợp các hoạt động trên một hoặc nhiều mục thành phần.

  3. Xác định các quy tắc về cách các thành phần liên quan với nhau và với toàn bộ cấu trúc (các xác nhận).

Cấu trúc dữ liệu:

Một cấu trúc dữ liệu có thể là tĩnh hoặc động. Một cấu trúc dữ liệu tĩnh có kích thước cố định. Ý nghĩa này khác với ý nghĩa của công cụ sửa đổi tĩnh. Mảng là tĩnh; một khi chúng ta xác định số lượng phần tử có thể giữ, số đó không thay đổi. Một cấu trúc dữ liệu động phát triển và co lại tại thời điểm thực hiện theo yêu cầu của nội dung của nó. Một cấu trúc dữ liệu động được thực hiện bằng các liên kết.

Cấu trúc dữ liệu có thể được phân loại thành cấu trúc dữ liệu tuyến tính và cấu trúc dữ liệu phi tuyến tính. Trong cấu trúc dữ liệu tuyến tính, mọi thành phần đều có tiền thân và kế thừa duy nhất, ngoại trừ các yếu tố đầu tiên và cuối cùng, trong khi đó trong cấu trúc dữ liệu phi tuyến tính, không có hạn chế nào như vậy vì các yếu tố có thể được sắp xếp theo bất kỳ cách nào mong muốn bị hạn chế bởi cách chúng ta sử dụng đại diện cho các loại như vậy.


0

Trước hết, Thuật ngữ trong Cấu trúc dữ liệu có thể rất khó hiểu.

ADT giống như lý thuyết hoặc mô hình hoặc hướng dẫn, vv cho biết cấu trúc dữ liệu nên hoạt động như thế nào, loại hoạt động nào cần hỗ trợ, v.v ... Ba loại dữ liệu trừu tượng cơ bản là container, từ điển và hàng đợi ưu tiên. Ví dụ: từ điển, nó cho chúng ta biết rằng mọi cấu trúc dữ liệu thực hiện ADT từ điển này phải hỗ trợ các cặp giá trị khóa, tìm kiếm dựa trên các khóa, chèn các mục, tìm người kế thừa và tiền thân của một khóa đã cho, v.v.

Bây giờ mọi thứ khác thực hiện điều này ở trên ADT là Cấu trúc dữ liệu (DS) , Cấu trúc dữ liệu là những thứ thực sự mà bạn thực hiện trong các vấn đề của mình và tìm thấy bên trong các thư viện. Trong trường hợp từ điển, bạn có thể chọn thực hiện nó thông qua danh sách Mảng hoặc Liên kết.

Tôi nghĩ rằng sự nhầm lẫn thực sự nảy sinh khi ai đó đặt tên DS của họ là ADT, ví dụ như một số người sẽ gọi DS đã nói ở trên là 'Từ điển' thay vì DictImcellenceation là hoàn toàn hợp pháp, nó chỉ gây ra một số nhầm lẫn.

Tham khảo: Skiena: Hướng dẫn thiết kế thuật toán

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.