Sự khác biệt giữa bản đồ và từ điển là gì?


197

Tôi biết bản đồ là cấu trúc dữ liệu ánh xạ các khóa thành giá trị. Không phải là một từ điển giống nhau sao? Sự khác biệt giữa bản đồ và từ điển 1 là gì?


1. Tôi không hỏi về cách chúng được định nghĩa trong ngôn ngữ X hoặc Y (dường như là những gì mọi người thường hỏi ở đây trên SO), tôi muốn biết sự khác biệt của chúng trong lý thuyết là gì.


Câu hỏi tuyệt vời!
NoName

Câu trả lời:


259

Hai thuật ngữ cho cùng một điều:

  • "Bản đồ" được sử dụng bởi Java, C ++
  • "Từ điển" được sử dụng bởi .Net, Python
  • "Mảng liên kết" được PHP sử dụng

"Bản đồ" là thuật ngữ toán học chính xác, nhưng nó được tránh vì nó có một ý nghĩa riêng trong lập trình hàm .

Một số ngôn ngữ vẫn sử dụng các thuật ngữ khác ("Đối tượng" trong Javascript, "Hash" trong Ruby, "Bảng" trong Lua) , nhưng tất cả các ngôn ngữ này cũng có ý nghĩa riêng trong lập trình, vì vậy tôi nên tránh chúng.

Xem ở đây để biết thêm.


7
Không phải JAVA có cả Bản đồ và Từ điển sao? Có gì khác biệt ở đó?
vivek_jonam

35
@vivek_jonam: Dictionarytrong Java đã lỗi thời. Đây là một lớp trừu tượng, được sử dụng trước khi Mapgiao diện được tạo.
BlueRaja - Daniel Pflughoeft

7
Tôi biết câu hỏi là bất khả tri về ngôn ngữ, vì vậy đây là câu trả lời đúng, nhưng cuối cùng tôi đã tìm kiếm lý do Java có cả hai, vì vậy nhận xét này thực sự là điều hoàn hảo đối với tôi.
GrandOpener

1
"bảng" được sử dụng trong lua.
Ded repeatator

1
nó cũng phần nào gây nhầm lẫn gọi là "đối tượng" trong JSON (vì lý do lịch sử liên quan đến JavaScript)
Aprillion

20

Một là một thuật ngữ cũ cho khác. Thông thường, thuật ngữ "từ điển" đã được sử dụng trước khi thuật ngữ "bản đồ" toán học nắm giữ. Ngoài ra, từ điển có xu hướng có một loại chuỗi chính, nhưng điều đó không đúng 100% ở mọi nơi.


9

2 xu của tôi.

Từ điển là một lớp trừu tượng trong Java trong khi Bản đồ là một giao diện. Vì, Java không hỗ trợ nhiều kế thừa, nếu một lớp mở rộng Từ điển, nó không thể mở rộng bất kỳ lớp nào khác.

Do đó, giao diện Bản đồ đã được giới thiệu.

Lớp từ điển đã lỗi thời và việc sử dụng Bản đồ được ưu tiên.


9

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:

  • khả năng lưu trữ các yếu tố với biệt quan trọnggiá trị linh kiện

  • khả năng truy xuất (các) giá trị chỉ được cung cấp khóa

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::findbạ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, dequevv, 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ụ: dequechỉ 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 ...


3

Thông thường tôi cho rằng một bản đồ được hỗ trợ bởi bảng băm; nó bao hàm một cửa hàng không có thứ tự. Từ điển bao hàm một cửa hàng được đặt hàng.

Có một từ điển dựa trên cây gọi là Trie .

Trong Lisp, nó có thể trông như thế này:

(a (n (d t)) n d )

Mà gói gọn các từ:

  • một
  • con kiến
  • một
  • quảng cáo

Các đường ngang từ đỉnh đến lá mang lại một từ.


4
Dictionarytrong .Net là không có thứ tự.
BlueRaja - Daniel Pflughoeft

2
Từ điển ca cao cũng không có thứ tự.
Ken

C ++ std::mapđược ra lệnh, việc triển khai không được chỉ định trong tiêu chuẩn, std::unordered_mapđược giới thiệu trong c ++ 11, nó được thực hiện thông qua hàm băm
Harald Scheirich

3
@HaraldScheirich - Mặc dù tiêu chuẩn C ++ không nói cụ thể "bạn sẽ sử dụng cây đỏ đen để thực hiện std::map", hãy thử sử dụng bất cứ điều gì khác. Cây AVL sẽ không hoạt động; đó là chi phí chèn không đáp ứng tiêu chuẩn. Một hàm băm sẽ không hoạt động; một hàm băm không có thứ tự và do đó không đáp ứng tiêu chuẩn. Tiêu chuẩn khá nhiều nói rằng "ngươi sẽ sử dụng cây đỏ đen để thực hiện std::map" mà không nói rõ ràng như vậy.
David Hammen 19/03/2015

+1. Mặc dù từ điển không có thứ tự trong nhiều nền tảng, từ này có nghĩa là một trật tự. Tôi thích bản đồ hạn hơn.
nawfal

2

Không thực sự giống nhau. Bản đồ là một tập hợp con của từ điển. Từ điển được định nghĩa ở đây là có chức năng chèn, xóa và tìm. Bản đồ như được sử dụng bởi Java (theo điều này ) là một từ điển với yêu cầu rằng các khóa ánh xạ tới các giá trị được ánh xạ nghiêm ngặt như là một hàm một. Một từ điển có thể có nhiều hơn một bản đồ chính cho một giá trị hoặc một bản đồ chính cho một số giá trị (như xâu chuỗi trong một hasthtable), ví dụ như tìm kiếm hashtag Twitter.

Như một ví dụ "thế giới thực" hơn, việc tìm kiếm một từ trong từ điển có thể cho chúng ta một số định nghĩa cho cùng một từ và khi chúng ta tìm thấy một mục chỉ chúng ta đến một mục khác (xem từ khác), một số từ cho cùng một danh sách các định nghĩa. Trong thế giới thực, bản đồ rộng hơn nhiều, cho phép chúng ta có vị trí cho tên hoặc tên cho tọa độ, nhưng chúng ta cũng có thể tìm thấy một hàng xóm gần nhất hoặc các thuộc tính khác (dân số, v.v.), vì vậy IMHO có thể tranh luận về việc mở rộng hơn loại bản đồ có thể có các triển khai dựa trên biểu đồ, nhưng tốt nhất là luôn luôn giả sử chỉ là cặp giá trị khóa, đặc biệt là vì hàng xóm gần nhất và các thuộc tính khác đối với giá trị có thể chỉ là thành viên dữ liệu của giá trị.

bản đồ java, mặc dù yêu cầu một đối một, có thể thực hiện một cái gì đó giống như một từ điển tổng quát nếu giá trị được khái quát hóa như một bộ sưu tập hoặc nếu các giá trị chỉ là tham chiếu đến các bộ sưu tập được lưu trữ ở nơi khác.

Hãy nhớ rằng các trình duy trì Java không phải là các trình duy trì các định nghĩa ADT và các quyết định Java dành riêng cho Java.


1

Các thuật ngữ khác cho khái niệm này khá phổ biến: mảng kết hợp và hàm băm.


1
Hash không có gì để làm với điều này. Đó là một phương pháp nhanh chóng phát hiện xem các đối tượng có khác nhau không. Bạn đang nghĩ về một hashmap, sử dụng hàm băm để thực hiện công việc Map / Dictionary.
DJClayworth

5
@DJClayworth Không, nhiều ngôn ngữ lập trình thực sự gọi những thứ này là băm. Xem Ruby . Tôi đã không thiết kế nó, và tôi sẽ không gọi nó như vậy, nhưng đừng bắn sứ giả.
Hank Gay

1

Có, chúng giống nhau, bạn có thể thêm "Mảng liên kết" vào hỗn hợp.

sử dụng Hashtable hoặc một thay đổi Hashđề cập đến việc thực hiện.


1

như vậy trên một mức độ lý thuyết thuần túy.

Từ điển là một giá trị có thể được sử dụng để định vị Giá trị được liên kết. Bản đồ là một Giá trị cung cấp hướng dẫn về cách xác định các giá trị khác

tất cả các bộ sưu tập cho phép truy cập phi tuyến tính (nghĩa là chỉ nhận được trước hoặc cuối cùng) là một Bản đồ, vì ngay cả một Mảng đơn giản cũng có một chỉ mục ánh xạ tới giá trị chính xác. Vì vậy, trong khi Từ điển là Loại bản đồ, bản đồ là phạm vi rộng hơn nhiều của chức năng có thể.

Trong Thực tế, chức năng ánh xạ thường xác định tên, do đó HashMap là cấu trúc dữ liệu được ánh xạ sử dụng thuật toán băm để liên kết khóa với giá trị, trong đó Từ điển không chỉ định cách các khóa được liên kết với giá trị vì vậy có thể được lưu trữ thông qua một danh sách liên kết, cây hoặc bất kỳ thuật toán nào khác. từ đầu sử dụng, bạn thường không quan tâm thuật toán chỉ hoạt động của chúng vì vậy bạn sử dụng từ điển chung và chỉ chuyển sang một trong các cấu trúc khác khi bạn cần sử dụng loại thuật toán


-2

Đây là hai thuật ngữ khác nhau cho cùng một khái niệm.
HashtableHashMapcũng đề cập đến khái niệm tương tự.


3
Trên thực tế, Hashtable / Hashmap ngụ ý một cách triển khai cụ thể trong tên của họ (ví dụ như nói về một cây cân bằng, được sử dụng trong C ++ std :: map chẳng hạn).
Joe

Nói chung, bạn không nên quan tâm đến việc thực hiện. (Ngoại trừ lý do hiệu suất) Ngoài ra, điều đó không phải lúc nào cũng đúng; nhìn vào .Net chẳng hạn.
SLaks

-2

Sự khác biệt chính là Bản đồ , yêu cầu tất cả các mục (cặp giá trị & khóa) có một khóa duy nhất. Nếu va chạm xảy ra, tức là khi một mục nhập mới có cùng khóa với một mục đã có trong bộ sưu tập, thì cần phải xử lý va chạm.

Thông thường, chúng tôi xử lý các va chạm bằng cách sử dụng Chuỗi riêng biệt . Hoặc Probing tuyến tính .

Một từ điển cho phép nhiều mục được liên kết tới khóa tương tự.

Khi một Bản đồ đã triển khai Chuỗi riêng, thì nó có xu hướng giống với Từ điể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.