Trả lời câu hỏi này rất phức tạp bởi các lập trình viên đã thấy các thuật ngữ có ý nghĩa cụ thể hơn trong các ngôn ngữ hoặc hệ thống cụ thể mà họ đã sử dụng, nhưng câu hỏi yêu cầu so sánh ngôn ngữ bất khả tri "về mặt lý thuyết", mà tôi đang hiểu theo thuật ngữ Khoa học điện toán .
Thuật ngữ giải thích
Từ điển Đại học Oxford về danh sách Khoa học Máy tính :
từ điển bất kỳ cấu trúc dữ liệu nào đại diện cho một tập hợp các phần tử có thể hỗ trợ việc chèn và xóa các phần tử cũng như kiểm tra tư cách thành viên
- Ví dụ: chúng tôi có một tập hợp các phần tử {A, B, C, D ...} mà chúng tôi đã có thể chèn và có thể bắt đầu xóa và chúng tôi có thể truy vấn "có mặt C không?" .
Khái niệm Khoa học máy tính về bản đồ mặc dù dựa trên ánh xạ thuật ngữ ngôn ngữ toán học , mà Từ điển Oxford định nghĩa là:
ánh xạ Một hoạt động liên kết từng phần tử của một tập hợp nhất định (miền) với một hoặc nhiều phần tử của tập thứ hai (phạm vi).
- Như vậy, cấu trúc dữ liệu bản đồ cung cấp một cách để đi từ các phần tử của một tập hợp nhất định - được biết là " các khóa " trong bản đồ, đến một hoặc nhiều phần tử trong tập thứ hai - được gọi là " giá trị " được liên kết .
- Các "... hoặc nhiều yếu tố trong tập thứ hai" khía cạnh có thể được hỗ trợ bởi một thực hiện là hai cách khác nhau:
- Nhiều triển khai bản đồ thực thi tính duy nhất của các khóa và chỉ cho phép mỗi khóa được liên kết với một giá trị, nhưng giá trị đó có thể là chính cấu trúc dữ liệu chứa nhiều giá trị của loại dữ liệu đơn giản hơn, ví dụ {{1, {"một" , "ichi"}, {2, {"hai", "ni"}}} minh họa các giá trị bao gồm các cặp chuỗi.
- Việc triển khai bản đồ khác cho phép các khóa trùng lặp mỗi ánh xạ tới cùng một giá trị hoặc khác nhau - có chức năng thỏa mãn "các yếu tố liên kết ... mỗi phần tử [khóa] ... với ... nhiều hơn [một] phần tử [giá trị]. Ví dụ: {{1, "một"}, {1, "ichi"}, {2, "hai"}, {2, "ni"}}.
Từ điển và bản đồ tương phản
Vì vậy, bằng cách sử dụng thuật ngữ Comp Sci nghiêm ngặt ở trên, từ điển chỉ là bản đồ nếu giao diện xảy ra để hỗ trợ các hoạt động bổ sung không bắt buộc của mọi từ điển:
Một bước ngoặt nhỏ:
- một giao diện bản đồ có thể không hỗ trợ trực tiếp việc kiểm tra xem một cặp {key, value} có trong container hay không, đây là một yêu cầu của một từ điển trong đó các yếu tố xảy ra là các cặp {key, value}; một bản đồ thậm chí có thể không có chức năng kiểm tra khóa, nhưng tệ nhất là bạn có thể thấy liệu một khóa tìm kiếm giá trị đã thử thành công hay thất bại, sau đó nếu bạn quan tâm, bạn có thể kiểm tra xem khóa đó có lấy được giá trị mong đợi hay không.
Giao tiếp rõ ràng với khán giả của bạn
Bất chấp tất cả những điều trên, nếu bạn sử dụng từ điển theo nghĩa Khoa học điện toán nghiêm ngặt được giải thích ở trên, đừng hy vọng khán giả của bạn sẽ theo dõi bạn ban đầu hoặc bị ấn tượng khi bạn chia sẻ và bảo vệ thuật ngữ. Các câu trả lời khác cho câu hỏi này (và các câu trả lời của họ) cho thấy khả năng "từ điển" sẽ đồng nghĩa với "bản đồ" như thế nào trong kinh nghiệm của hầu hết các lập trình viên. Cố gắng chọn thuật ngữ sẽ được hiểu rộng rãi và rõ ràng hơn: vd
- thùng chứa kết hợp : bất kỳ cặp lưu trữ khóa / giá trị nào với truy xuất giá trị và xóa bằng khóa
- bản đồ băm : triển khai bảng băm của một thùng chứa liên kết
- bộ băm thực thi các khóa duy nhất : việc thực hiện bảng băm của phần tử / giá trị lưu trữ từ điển mà không coi chúng là chứa các thành phần khóa / giá trị riêng biệt, trong đó không thể chèn các phần tử của các phần tử
- cân bằng bản đồ cây nhị phân hỗ trợ khóa trùng lặp : ...
Thuật ngữ Crossreferences Comp Sci với việc triển khai cụ thể
Thư viện chuẩn C ++
- bản đồ:
map
, multimap
, unordered_map
,unordered_multimap
- từ điển khác:
set
, multiset
, unordered_set
,unordered_multiset
- lưu ý: với vòng lặp hoặc
std::find
bạn có thể xóa một phần tử và thử nghiệm cho các thành viên trong array
, vector
, list
, deque
vv, nhưng giao diện chứa không trực tiếp hỗ trợ điều đó bởi vì việc tìm kiếm một phần tử là ngoạn mục không hiệu quả tại O (N), trong một số trường hợp chèn / xóa là không hiệu quả và hỗ trợ các hoạt động đó làm suy yếu API bị giới hạn có chủ ý mà bộ chứa ngụ ý - ví dụ: deque
chỉ nên hỗ trợ xóa / bật ở phía trước và phía sau và không liên quan đến một số khóa. Phải làm nhiều công việc hơn trong mã để phối hợp tìm kiếm một cách nhẹ nhàng khuyến khích lập trình viên chuyển sang cấu trúc dữ liệu chứa với tìm kiếm hiệu quả hơn.
... có thể thêm các ngôn ngữ khác sau / thoải mái chỉnh sửa trong ...