Có bảng băm trong python không?

Trong một bảng băm, một chỉ mục mới được xử lý bằng các phím. Và, phần tử tương ứng với khóa đó được lưu trữ trong chỉ mục. Quá trình này được gọi là băm

Gọi k là khóa và h(x) là hàm băm

Ở đây, h(k) sẽ cho ta một chỉ mục mới để lưu phần tử được liên kết với k

Có bảng băm trong python không?
Biểu diễn bảng băm

Để tìm hiểu thêm, hãy truy cập Băm


Xung đột băm

Khi hàm băm tạo cùng một chỉ mục cho nhiều khóa, sẽ xảy ra xung đột (giá trị nào sẽ được lưu trong chỉ mục đó). Đây được gọi là xung đột hàm băm

Chúng tôi có thể giải quyết xung đột băm bằng một trong các kỹ thuật sau

  • Giải quyết va chạm bằng chuỗi
  • mở địa chỉ. Thăm dò tuyến tính/bậc hai và băm kép

1. Giải quyết va chạm bằng chuỗi

Trong chuỗi, nếu một hàm băm tạo ra cùng một chỉ mục cho nhiều phần tử, thì các phần tử này được lưu trữ trong cùng một chỉ mục bằng cách sử dụng danh sách liên kết kép

Nếu

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
8 là vị trí dành cho nhiều phần tử, thì nó chứa một con trỏ tới phần đầu của danh sách phần tử. Nếu không có phần tử nào,
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
8 chứa
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
0

Có bảng băm trong python không?
Giải quyết va chạm bằng cách sử dụng chuỗi

Mã giả cho hoạt động

chainedHashSearch(T, k)
  return T[h(k)]
chainedHashInsert(T, x)
  T[h(x.key)] = x //insert at the head
chainedHashDelete(T, x)
  T[h(x.key)] = NIL

2. mở địa chỉ

Không giống như chuỗi, địa chỉ mở không lưu trữ nhiều phần tử vào cùng một vị trí. Ở đây, mỗi vị trí được lấp đầy bằng một phím duy nhất hoặc để lại

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
0

Các kỹ thuật khác nhau được sử dụng trong địa chỉ mở là

i. thăm dò tuyến tính

Trong thăm dò tuyến tính, xung đột được giải quyết bằng cách kiểm tra vị trí tiếp theo

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
0

ở đâu

  • if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
    if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
    if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
    if m = 2p, then h(k) = p lower bits of m
    1
  • if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
    if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
    if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
    if m = 2p, then h(k) = p lower bits of m
    2 là một hàm băm mới

Nếu va chạm xảy ra tại

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
3 thì đánh dấu vào
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
4. Theo cách này, giá trị của
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
5 được tăng tuyến tính

Vấn đề với thăm dò tuyến tính là một cụm các vị trí liền kề được lấp đầy. Khi chèn một phần tử mới, toàn bộ cụm phải được duyệt qua. Điều này làm tăng thêm thời gian cần thiết để thực hiện các thao tác trên bảng băm

ii. Thăm dò bậc hai

Nó hoạt động tương tự như thăm dò tuyến tính nhưng khoảng cách giữa các khe được tăng lên (lớn hơn một) bằng cách sử dụng mối quan hệ sau

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
6
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
7____18
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
9
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
5
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
9
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
32

ở đâu,

  • if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
    if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
    if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
    if m = 2p, then h(k) = p lower bits of m
    33
    if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
    if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
    if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
    if m = 2p, then h(k) = p lower bits of m
    7 và
    if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
    if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
    if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
    if m = 2p, then h(k) = p lower bits of m
    33
    if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
    if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
    if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
    if m = 2p, then h(k) = p lower bits of m
    9 là các hằng số phụ dương,
  • if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
    if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
    if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
    if m = 2p, then h(k) = p lower bits of m
    1

iii. băm đôi

Nếu xung đột xảy ra sau khi áp dụng hàm băm

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
38, thì hàm băm khác sẽ được tính để tìm vị trí tiếp theo

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
39
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
7____221
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
9
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
23


Hàm băm tốt

Một hàm băm tốt có thể không ngăn chặn hoàn toàn các va chạm tuy nhiên nó có thể làm giảm số lượng va chạm

Ở đây, chúng ta sẽ xem xét các phương pháp khác nhau để tìm một hàm băm tốt

1. Phương pháp phân chia

Nếu

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
24 là khóa và
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
25 là kích thước của bảng băm, thì hàm băm
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
26 được tính như sau

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
27

Ví dụ: Nếu kích thước của bảng băm là

if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
28 và
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
29 thì
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
10 mod
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
11. Giá trị của
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
25 không được là lũy thừa của
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
9. Điều này là do lũy thừa của
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
9 ở định dạng nhị phân là
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
15. Khi chúng tôi tìm thấy
if m = 22, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 01
if m = 23, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 001
if m = 24, k = 17, then h(k) = 17 mod 22 = 10001 mod 100 = 0001
if m = 2p, then h(k) = p lower bits of m
16, chúng tôi sẽ luôn nhận được p-bit bậc thấp hơn

Từ điển Python có phải là Hashmap hay Hashtable không?

Có, đó là ánh xạ băm hoặc bảng băm . Bạn có thể đọc mô tả về triển khai dict của python, như được viết bởi Tim Peters, tại đây. Bạn có thể đọc thêm về bảng băm hoặc kiểm tra xem nó đã được triển khai như thế nào trong python và tại sao nó được triển khai theo cách đó.

Từ điển Python có giống với bảng băm không?

Trong Python, từ điển (hay gọi tắt là “dicts”) là một cấu trúc dữ liệu trung tâm. Dicts lưu trữ một số đối tượng tùy ý, mỗi đối tượng được xác định bằng một khóa từ điển duy nhất. Từ điển thường còn được gọi là bản đồ, hàm băm, bảng tra cứu hoặc mảng kết hợp .

Bảng băm được triển khai như thế nào trong Python?

Tính toán chỉ mục cho khóa được cung cấp bằng hàm băm. Chuyển đến nhóm cho chỉ mục đó. Lặp lại các nút trong danh sách được liên kết đó cho đến khi tìm thấy khóa hoặc đến cuối danh sách. Trả về giá trị của nút được tìm thấy hoặc Không có nếu không tìm thấy