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


46

Sự khác biệt giữa Hashvà là Dictionarygì?

Đến từ một nền tảng kịch bản, tôi cảm thấy rằng chúng giống nhau, nhưng tôi muốn tìm ra sự khác biệt chính xác. Googling đã không giúp tôi nhiều.

Câu trả lời:


92

Hashlà một cấu trúc dữ liệu được đặt tên cực kỳ kém, trong đó lập trình viên đã nhầm lẫn giao diện với việc triển khai ( quá lười để viết tên đầy đủ, tức là HashTabledùng đến một từ viết tắt, Hash).

Dictionarylà tên chính xác của một giao diện (= ADT ), tức là một thùng chứa kết hợp ánh xạ các khóa (thường là duy nhất) thành các giá trị (không nhất thiết là duy nhất).

Bảng băm là một triển khai có thể có của một từ điển như vậy cung cấp các đặc điểm truy cập khá tốt (về mặt thời gian chạy) và do đó thường là triển khai mặc định.

Việc thực hiện như vậy có hai thuộc tính quan trọng:

  1. các khóa phải được bămbình đẳng có thể so sánh được .
  2. các mục xuất hiện không theo thứ tự cụ thể trong từ điển.

(Để một khóa có thể băm có nghĩa là chúng ta có thể tính toán một giá trị số từ một khóa mà sau đó được sử dụng làm chỉ mục trong một mảng.)

Có tồn tại các triển khai thay thế của cấu trúc dữ liệu từ điển áp đặt thứ tự trên các khóa - đây thường được gọi là từ điển được sắp xếp (và thường được triển khai theo thuật ngữ của cây tìm kiếm, mặc dù các triển khai hiệu quả khác tồn tại).


Tóm lại: một từ điển là một ADT ánh xạ các khóa thành các giá trị. Có một số triển khai có thể có của ADT này, trong đó bảng băm là một. Hashlà một cách viết sai nhưng trong ngữ cảnh, nó tương đương với một từ điển được triển khai dưới dạng bảng băm.


4
Để đưa ra một ví dụ trong C ++, các mẫu thùng chứa kết hợp tiêu chuẩn không thể được triển khai dưới dạng băm, mặc dù tiêu chuẩn tiếp theo sẽ có các bảng băm hiệu quả. Họ được gọi unordered_mapđể thể hiện những gì họ làm hơn là những gì họ đang làm.
David Thornley

6
Chính xác, theo đúng thẩm quyền? Trong một số ngôn ngữ, chẳng hạn như Ruby và Perl, chính thức đọc các dòng Tên chính xác cho các cấu trúc này là Băm băm.

11
@nohat: Lưu ý tôi sử dụng dấu ngoặc kép. Hơn nữa, tôi đã giải thích lý do tại sao tên được chọn xấu, phải không? Vì vậy, nếu bạn yêu cầu một cơ quan có thẩm quyền thì tôi sẽ nói rằng đó là thẩm quyền của cảnh sát khoa học máy tính lý thuyết.
Konrad Rudolph

9
Thật thú vị, trong Ruby 1.9, thực tế không thể thực hiện Hashlớp bằng bảng băm, vì Ruby 1.9 Hashes giữ nguyên thứ tự chèn trong khi bảng băm thì không. Vì vậy, trong Ruby 1.9, cái tên Hashthậm chí không phản ánh việc thực hiện nữa.
Jörg W Mittag

7
@hippietrail Bạn đã sai - trước tiên, đó những mô tả khách quan. Rốt cuộc, tôi đủ điều kiện tại sao việc đặt tên kém và một cách viết sai (xem bên dưới). Về phần tôi, quá lười biếng Và bạn đã sai về từ điển của Wikipedia. Đây chỉ đơn giản là tên chính thức của cấu trúc dữ liệu. Định nghĩa của bạn về từ điển Tiếng Việt là sai trong bối cảnh khoa học máy tính và cái tên có trước Python hàng thập kỷ.
Konrad Rudolph

8

"Từ điển" là tên của khái niệm. Một hashtable là một thực hiện có thể.


1
Hash cũng là một ADT. HashTable là một triển khai của Hash
Sairam

3
@Sairam Tôi nghĩ rằng 'băm' phổ biến hơn nhiều có nghĩa là hàm băm chứ không phải là bảng băm.
jk.

@jk Trên thực tế, "hàm băm" là kết quả của việc áp dụng "hàm băm / thuật toán" cho một số đầu vào. Một "bảng băm" hoặc "bản đồ băm" omehoe liên quan và đối tượng có thể băm với một số đối tượng (đối tượng ở dạng chung, không giới hạn ở OOP)
johannes

Có những ngôn ngữ sử dụng 'Hash' để chỉ cấu trúc kiểu từ điển thay vì chỉ hoạt động của hàm băm. Ruby chẳng hạn .
Sean Burton

7

Từ điển là thuật ngữ tập thể được đưa ra cho bất kỳ triển khai cấu trúc dữ liệu nào được sử dụng để tra cứu / chèn nhanh. Điều này có thể đạt được / thực hiện bằng nhiều cấu trúc dữ liệu khác nhau như bảng băm, danh sách bỏ qua, cây rb, v.v ... Bảng băm là một cấu trúc dữ liệu cụ thể hữu ích cho nhiều mục đích bao gồm thực hiện từ điển.


Hash cũng là một ADT. Có sự khác biệt cụ thể nào giữa Hash và Dictionary ADT không?
Sairam

2
@Sairam: Không, hàm băm là đầu ra của một loại thuật toán nhất định (hàm băm).

5

Một từ điển sử dụng một khóa để tham chiếu giá trị trực tiếp bên trong một mảng kết hợp .

I E (KEY => VALUE)

Một hàm băm thường được mô tả như một bảng băm sử dụng hàm băm để tính toán vị trí trong bộ nhớ (hoặc dễ dàng hơn là một mảng) trong đó giá trị sẽ là. Hàm băm sẽ lấy KEY làm đầu vào và đưa ra giá trị làm đầu ra. Sau đó cắm giá trị đó vào bộ nhớ hoặc chỉ mục mảng.

I E KEY => HASH FUNCTION => VALUE

Tôi đoán một cái là trực tiếp trong khi cái kia thì không. Các hàm băm có thể không hoàn hảo hoặc đôi khi có thể cung cấp một chỉ mục tham chiếu giá trị sai. Nhưng điều đó có thể được sửa chữa.

Nơi tốt nhất để tìm: Wikipedia ( mảng kết hợpbảng băm )

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.