Hướng dẫn how do you make a hashtable in python? - làm thế nào để bạn tạo một bảng băm trong python?


Các bảng Hash là một loại cấu trúc dữ liệu trong đó địa chỉ hoặc giá trị chỉ mục của phần tử dữ liệu được tạo từ hàm băm. Điều đó làm cho việc truy cập dữ liệu nhanh hơn khi giá trị chỉ mục hoạt động như một khóa cho giá trị dữ liệu. Nói cách khác, bảng băm lưu trữ các cặp giá trị khóa nhưng khóa được tạo thông qua hàm băm.

Vì vậy, chức năng tìm kiếm và chèn của một phần tử dữ liệu trở nên nhanh hơn nhiều khi chính các giá trị chính trở thành chỉ mục của mảng lưu trữ dữ liệu.

Trong Python, các loại dữ liệu từ điển đại diện cho việc thực hiện các bảng băm. Các khóa trong từ điển đáp ứng các yêu cầu sau.

  • Các khóa của từ điển có thể băm, tức là được tạo bằng hàm băm tạo ra kết quả duy nhất cho mỗi giá trị duy nhất được cung cấp cho hàm băm.

  • Thứ tự của các yếu tố dữ liệu trong từ điển không được sửa.

Vì vậy, chúng tôi thấy việc triển khai bảng băm bằng cách sử dụng các loại dữ liệu từ điển như dưới đây.

Truy cập các giá trị trong từ điển

Để truy cập các phần tử từ điển, bạn có thể sử dụng các dấu ngoặc vuông quen thuộc cùng với khóa để có được giá trị của nó.

Thí dụ

# Declare a dictionary 
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

# Accessing the dictionary with its key
print "dict['Name']: ", dict['Name']
print "dict['Age']: ", dict['Age']

Đầu ra

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

dict['Name']:  Zara
dict['Age']:  7

Cập nhật từ điển

Bạn có thể cập nhật từ điển bằng cách thêm một mục nhập mới hoặc một cặp giá trị khóa, sửa đổi một mục nhập hiện có hoặc xóa một mục nhập hiện có như được hiển thị bên dưới trong ví dụ đơn giản-

Thí dụ

# Declare a dictionary
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School"; # Add new entry
print "dict['Age']: ", dict['Age']
print "dict['School']: ", dict['School']

Đầu ra

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

dict['Age']:  8
dict['School']:  DPS School

Cập nhật từ điển

Bạn có thể cập nhật từ điển bằng cách thêm một mục nhập mới hoặc một cặp giá trị khóa, sửa đổi một mục nhập hiện có hoặc xóa một mục nhập hiện có như được hiển thị bên dưới trong ví dụ đơn giản-

Thí dụ

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
del dict['Name']; # remove entry with key 'Name'
dict.clear();     # remove all entries in dict
del dict ;        # delete entire dictionary

print "dict['Age']: ", dict['Age']
print "dict['School']: ", dict['School']

Đầu ra

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

dict['Age']:
Traceback (most recent call last):
   File "test.py", line 8, in 
      print "dict['Age']: ", dict['Age'];
TypeError: 'type' object is unsubscriptable

Băm là gì?

Một hàm băm là một giá trị có độ dài cố định và nó được tạo bằng công thức toán học. Các giá trị băm được sử dụng trong nén dữ liệu, mật mã, v.v ... Trong lập chỉ mục dữ liệu, các giá trị băm được sử dụng vì chúng có kích thước chiều dài cố định bất kể các giá trị được sử dụng để tạo chúng. Nó tạo ra các giá trị băm để chiếm không gian tối thiểu so với các giá trị khác của các độ dài khác nhau.

Hàm băm sử dụng thuật toán toán học để chuyển đổi khóa thành băm. Một vụ va chạm xảy ra khi hàm băm tạo ra giá trị băm giống nhau cho nhiều hơn một phím.

Trong hướng dẫn thuật toán này, bạn sẽ học:

  • Băm là gì?
  • Bảng băm là gì?
  • Chức năng băm
  • Phẩm chất của một hàm băm tốt
  • Va chạm
  • Hoạt động bàn băm
  • Ví dụ về bảng băm Python
  • Giải thích mã bảng băm
  • Ví dụ từ điển Python
  • Phân tích độ phức tạp
  • Ứng dụng trong thế giới thực
  • Ưu điểm của bảng băm
  • Nhược điểm của bảng băm

Bảng băm là gì?

Bảng băm là một cấu trúc dữ liệu lưu trữ các giá trị bằng một cặp khóa và giá trị. Mỗi giá trị được gán một khóa duy nhất được tạo bằng hàm băm.HASH TABLE is a data structure that stores values using a pair of keys and values. Each value is assigned a unique key that is generated using a hash function.

Tên của khóa được sử dụng để truy cập giá trị liên quan của nó. Điều này làm cho việc tìm kiếm các giá trị trong bảng băm rất nhanh, không phân biệt số lượng mục trong bảng băm.

Chức năng băm

Ví dụ: nếu chúng tôi muốn lưu trữ hồ sơ nhân viên và mỗi nhân viên được xác định duy nhất bằng số nhân viên.

Chúng tôi có thể sử dụng số nhân viên làm khóa và gán dữ liệu nhân viên làm giá trị.

Cách tiếp cận trên sẽ yêu cầu thêm không gian trống của thứ tự (M * N2) trong đó biến M là kích thước của mảng và biến N là số chữ số cho số nhân viên. Cách tiếp cận này giới thiệu một vấn đề không gian lưu trữ.(m * n2) where the variable m is the size of the array, and the variable n is the number of digits for the employee number. This approach introduces a storage space problem.

Hàm băm giải quyết vấn đề trên bằng cách lấy số nhân viên và sử dụng nó để tạo giá trị số nguyên băm, các chữ số cố định và tối ưu hóa không gian lưu trữ. Mục đích của hàm băm là tạo một khóa sẽ được sử dụng để tham chiếu giá trị mà chúng tôi muốn lưu trữ. Hàm chấp nhận giá trị được lưu sau đó sử dụng thuật toán để tính giá trị của khóa.

Sau đây là một ví dụ về hàm băm đơn giản

h(k) = k1 % m

HERE,

  • H (k) là hàm băm chấp nhận tham số k. Tham số k là giá trị mà chúng tôi muốn tính toán khóa cho.
  • K1 % m là thuật toán cho hàm băm của chúng tôi trong đó K1 là giá trị chúng tôi muốn lưu trữ và m là kích thước của danh sách. Chúng tôi sử dụng toán tử mô đun để tính toán khóa.

Thí dụ

Hãy giả sử rằng chúng ta có một danh sách với kích thước cố định là 3 và các giá trị sau

[1,2,3]

Chúng ta có thể sử dụng công thức trên để tính toán các vị trí mà mỗi giá trị nên chiếm.

Hình ảnh sau đây cho thấy các chỉ mục có sẵn trong bảng băm của chúng tôi.

Hướng dẫn how do you make a hashtable in python? - làm thế nào để bạn tạo một bảng băm trong python?

Bước 1)

Tính vị trí sẽ bị chiếm bởi giá trị đầu tiên như vậy

H (1) = 1 % 3

= 1

Giá trị 1 sẽ chiếm không gian trên INDEX 11 will occupy the space on index 1

Bước 2)

Tính vị trí sẽ bị chiếm bởi giá trị thứ hai

H (2) = 2 % 3

= 2

Giá trị 2 sẽ chiếm không gian trên INDEX 22 will occupy the space on index 2

Bước 3)

Tính vị trí sẽ bị chiếm bởi giá trị thứ ba.

H (3) = 3 % 3

= 0

Giá trị 3 sẽ chiếm không gian trên INDEX 03 will occupy the space on index 0

Kết quả cuối cùng

Chúng tôi điền vào bảng băm bây giờ sẽ như sau.

Hướng dẫn how do you make a hashtable in python? - làm thế nào để bạn tạo một bảng băm trong python?

Phẩm chất của một hàm băm tốt

Một hàm băm tốt nên có những phẩm chất sau.

  • Công thức để tạo hàm băm nên sử dụng giá trị dữ liệu để được lưu trữ trong thuật toán.
  • Hàm Hash sẽ tạo ra các giá trị băm duy nhất ngay cả đối với dữ liệu đầu vào có cùng một lượng.
  • Các chức năng nên giảm thiểu số lượng va chạm. Va chạm xảy ra khi cùng một giá trị được tạo cho nhiều hơn một giá trị.
  • Các giá trị phải được phân phối nhất quán trên toàn bộ băm có thể.

Va chạm

Một vụ va chạm xảy ra khi thuật toán tạo ra cùng một băm cho nhiều hơn một giá trị.

Hãy cùng nhìn vào một ví dụ.

Giả sử chúng ta có danh sách các giá trị sau

[3,2,9,11,7]

Hãy giả sử rằng kích thước của bảng băm là 7 và chúng tôi sẽ sử dụng công thức (k1 % m) trong đó m là kích thước của bảng băm.

Bảng sau đây cho thấy các giá trị băm sẽ được tạo.

Chìa khóaThuật toán băm (k1 % m)Giá trị băm
3 3 % 73
2 3 % 72
9 3 % 72
11 3 % 74
7 3 % 70

Như chúng ta có thể thấy từ các kết quả trên, các giá trị 2 và 9 có cùng giá trị băm và chúng ta không thể lưu trữ nhiều hơn một giá trị ở mỗi vị trí.

Vấn đề đã cho có thể được giải quyết bằng cách sử dụng chuỗi hoặc thăm dò. Các phần sau đây thảo luận về chuỗi và thăm dò chi tiết.

Chuỗi

Chuỗi là một kỹ thuật được sử dụng để giải quyết vấn đề va chạm bằng cách sử dụng các danh sách được liên kết mà mỗi danh sách có các chỉ mục duy nhất.

Hình ảnh sau đây hình dung ra một danh sách xích trông như thế nào

Hướng dẫn how do you make a hashtable in python? - làm thế nào để bạn tạo một bảng băm trong python?

Cả 2 và 9 đều chiếm cùng một chỉ số, nhưng chúng được lưu trữ dưới dạng danh sách được liên kết. Mỗi danh sách có một định danh duy nhất.

Lợi ích của danh sách xích

Sau đây là những lợi ích của danh sách xích:

  • Danh sách xích có hiệu suất tốt hơn khi chèn dữ liệu vì thứ tự chèn là O (1).
  • Không cần thiết phải thay đổi kích thước bảng băm sử dụng danh sách chuỗi.
  • Nó có thể dễ dàng chứa một số lượng lớn các giá trị miễn là có sẵn không gian trống.

Để thăm dò

Kỹ thuật khác được sử dụng để giải quyết va chạm là thăm dò. Khi sử dụng phương pháp thăm dò, nếu xảy ra va chạm, chúng ta có thể chỉ cần di chuyển và tìm một khe trống để lưu trữ giá trị của chúng ta.

Sau đây là các phương pháp thăm dò:

Phương phápSự mô tả
Thăm dò tuyến tínhGiống như tên gợi ý, phương pháp này tìm kiếm các khe trống một cách tuyến tính bắt đầu từ vị trí xảy ra va chạm và tiến về phía trước. Nếu kết thúc của danh sách đạt được và không tìm thấy khe trống. Việc thăm dò bắt đầu ở đầu danh sách.
Thăm dò bậc haiPhương pháp này sử dụng các biểu thức đa thức bậc hai để tìm khe cắm miễn phí có sẵn tiếp theo.
Gấp đôi bămKỹ thuật này sử dụng thuật toán hàm băm thứ cấp để tìm vị trí có sẵn miễn phí tiếp theo.

Sử dụng ví dụ trên của chúng tôi, bảng băm sau khi sử dụng thăm dò sẽ xuất hiện như sau:

Hướng dẫn how do you make a hashtable in python? - làm thế nào để bạn tạo một bảng băm trong python?

Hoạt động bàn băm

Ở đây, các hoạt động được hỗ trợ bởi các bảng băm:

  • Chèn - Hoạt động này được sử dụng để thêm một phần tử vào bảng băm – this Operation is used to add an element to the hash table
  • Tìm kiếm - Hoạt động này được sử dụng để tìm kiếm các phần tử trong bảng băm bằng cách sử dụng khóa – this Operation is used to search for elements in the hash table using the key
  • Xóa - Hoạt động này được sử dụng để xóa các phần tử khỏi bảng băm – this Operation is used to delete elements from the hash table

Chèn hoạt động dữ liệu

Hoạt động chèn được sử dụng để lưu trữ các giá trị trong bảng băm. Khi một giá trị mới được lưu trữ trong bảng băm, nó được gán một số chỉ mục. Số chỉ mục được tính toán bằng hàm băm. Hàm Hash giải quyết mọi va chạm xảy ra khi tính toán số chỉ mục.

Tìm kiếm hoạt động dữ liệu

Hoạt động tìm kiếm được sử dụng để tra cứu các giá trị trong bảng Hash bằng số chỉ mục. Hoạt động tìm kiếm trả về giá trị được liên kết với số chỉ mục tìm kiếm. Ví dụ: nếu chúng ta lưu trữ giá trị 6 tại INDEX 2, thao tác tìm kiếm với chỉ mục số 2 sẽ trả về giá trị 6.

Xóa hoạt động dữ liệu

Hoạt động xóa được sử dụng để xóa giá trị khỏi bảng băm. Để xóa hoạt động được thực hiện bằng số chỉ mục. Khi một giá trị đã bị xóa, số chỉ mục được thực hiện miễn phí. Nó có thể được sử dụng để lưu trữ các giá trị khác bằng cách sử dụng thao tác chèn.

Thực hiện bảng băm với ví dụ Python

Hãy cùng xem một ví dụ đơn giản tính toán giá trị băm của khóa

def hash_key( key, m):
    return key % m


m = 7

print(f'The hash value for 3 is {hash_key(3,m)}')
print(f'The hash value for 2 is {hash_key(2,m)}')
print(f'The hash value for 9 is {hash_key(9,m)}')
print(f'The hash value for 11 is {hash_key(11,m)}')
print(f'The hash value for 7 is {hash_key(7,m)}')

Giải thích mã bảng băm

Hướng dẫn how do you make a hashtable in python? - làm thế nào để bạn tạo một bảng băm trong python?

HERE,

  1. Xác định hàm Hash_key chấp nhận khóa tham số và m.
  2. Sử dụng một thao tác mô đun đơn giản để xác định giá trị băm
  3. Xác định một biến M được khởi tạo thành giá trị 7. Đây là kích thước của bảng băm của chúng tôi
  4. Tính toán và in giá trị băm là 3
  5. Tính toán và in giá trị băm là 2
  6. Tính toán và in giá trị băm là 9
  7. Tính toán và in giá trị băm là 11
  8. Tính toán và in giá trị băm là 7

Thực hiện mã trên tạo ra các kết quả sau.

The hash value for 3 is 3
The hash value for 2 is 2
The hash value for 9 is 2
The hash value for 11 is 4
The hash value for 7 is 0

Ví dụ từ điển Python

Python đi kèm với một loại dữ liệu tích hợp gọi là Từ điển. Từ điển là một ví dụ về bảng băm. Nó lưu trữ các giá trị bằng một cặp khóa và giá trị. Các giá trị băm được tự động tạo cho chúng tôi và bất kỳ va chạm nào được giải quyết cho chúng tôi trong nền.

Ví dụ sau đây cho thấy cách bạn có thể sử dụng kiểu dữ liệu từ điển trong Python 3

employee = {
    'name': 'John Doe',
    'age': 36,
    'position': 'Business Manager.'
}

print (f"The name of the employee is {employee['name']}")
employee['position'] = 'Software Engineer'
print (f"The position of {employee['name']} is {employee['position']}")
employee.clear()

print (employee)

Hướng dẫn how do you make a hashtable in python? - làm thế nào để bạn tạo một bảng băm trong python?

HERE,

  1. Xác định một nhân viên biến từ điển. Tên khóa được sử dụng để lưu trữ giá trị John Doe, Stores Age 36 và vị trí lưu trữ Trình quản lý doanh nghiệp giá trị.
  2. Lấy giá trị của tên khóa và in nó trong thiết bị đầu cuối
  3. Cập nhật giá trị của vị trí khóa cho Kỹ sư phần mềm giá trị
  4. In các giá trị của tên và vị trí các phím
  5. Xóa tất cả các giá trị được lưu trữ trong nhân viên biến từ điển của chúng tôi
  6. In giá trị của nhân viên

Chạy mã trên tạo ra các kết quả sau.

dict['Name']:  Zara
dict['Age']:  7
0

Phân tích độ phức tạp

Các bảng băm có độ phức tạp thời gian trung bình của O (1) trong trường hợp tốt nhất. Độ phức tạp thời gian trong trường hợp xấu nhất là O (N). Kịch bản trường hợp xấu nhất xảy ra khi nhiều giá trị tạo ra cùng một khóa băm giống nhau và chúng ta phải giải quyết vụ va chạm bằng cách thăm dò.

Ứng dụng trong thế giới thực

Trong thế giới thực, các bảng băm được sử dụng để lưu trữ dữ liệu cho

  • Cơ sở dữ liệu
  • Mảng liên kết
  • Bộ
  • Bộ nhớ đệm bộ nhớ

Ưu điểm của bảng băm

Ở đây, là ưu/lợi ích của việc sử dụng bảng băm:

  • Các bảng băm có hiệu suất cao khi tìm kiếm dữ liệu, chèn và xóa các giá trị hiện có.
  • Độ phức tạp về thời gian cho các bảng băm là không đổi bất kể số lượng vật phẩm trong bảng.
  • Họ hoạt động rất tốt ngay cả khi làm việc với các bộ dữ liệu lớn.

Nhược điểm của bảng băm

Ở đây, là nhược điểm của việc sử dụng bảng băm:

  • Bạn không thể sử dụng giá trị null làm khóa.
  • Không thể tránh được sự va chạm khi tạo các phím sử dụng. Chức năng băm. Các vụ va chạm xảy ra khi một khóa đã được sử dụng được tạo ra.
  • Nếu chức năng băm có nhiều va chạm, điều này có thể dẫn đến giảm hiệu suất.

Summary:

  • Các bảng băm được sử dụng để lưu trữ dữ liệu bằng một cặp khóa và giá trị.
  • Hàm băm sử dụng thuật toán toán học để tính toán giá trị băm.
  • Một vụ va chạm xảy ra khi giá trị băm giống nhau được tạo cho nhiều hơn một giá trị.
  • Chuỗi giải quyết va chạm bằng cách tạo danh sách liên kết.
  • Thăm dò giải quyết va chạm bằng cách tìm các khe trống trong bảng băm.
  • Thăm dò tuyến tính tìm kiếm cho khe miễn phí tiếp theo để lưu trữ giá trị bắt đầu từ khe nơi xảy ra va chạm.
  • Thăm dò bậc hai sử dụng các biểu thức đa thức để tìm khe miễn phí tiếp theo khi xảy ra va chạm.
  • Double Hash sử dụng thuật toán hàm băm thứ cấp để tìm vị trí miễn phí tiếp theo khi xảy ra va chạm.
  • Các bảng băm có hiệu suất tốt hơn khi so sánh với các cấu trúc dữ liệu khác.
  • Độ phức tạp thời gian trung bình của các bảng băm là O (1)
  • Một loại dữ liệu từ điển trong Python là một ví dụ về bảng băm.
  • Bảng Hash hỗ trợ Chèn, tìm kiếm và xóa các hoạt động.
  • Một giá trị null không thể được sử dụng làm giá trị chỉ mục.
  • Va chạm không thể tránh được trong các chức năng băm. Một hàm băm tốt giảm thiểu số lượng va chạm xảy ra để cải thiện hiệu suất.

Làm thế nào để bạn tạo một bảng băm?

Bây giờ, có một số bước liên quan đến chức năng chèn ...
Tạo mục dựa trên cặp {key: value} ..
Tính chỉ mục dựa trên hàm băm ..
Kiểm tra xem chỉ mục đã bị chiếm dụng hay không, bằng cách so sánh khóa. Nếu nó không bị chiếm đóng. Chúng ta có thể trực tiếp chèn nó vào chỉ mục ..

Có một hashtable trong Python?

Các bảng băm hoặc có bản đồ trong Python được triển khai thông qua kiểu dữ liệu từ điển tích hợp. Các khóa của một từ điển trong Python được tạo ra bởi một hàm băm. Các yếu tố của từ điển không được đặt hàng và chúng có thể được thay đổi.. The keys of a dictionary in Python are generated by a hashing function. The elements of a dictionary are not ordered and they can be changed.

Là một từ điển Python giống như một bảng băm?

Trong Python, từ điển (hay gọi tắt là Dict Dicts, là một cấu trúc dữ liệu trung tâm: Dicts lưu trữ một số lượng đối tượng tùy ý, mỗi đối tượng được xác định bởi một khóa từ điển duy nhất.Từ điển thường được gọi là bản đồ, băm, bảng tra cứu hoặc mảng kết hợp.Dictionaries are often also called maps, hashmaps, lookup tables, or associative arrays.

__ Hash __ làm gì trong Python?

Gọi __hash__ trên chìa khóa để tính toán băm của khóa.Nếu khóa không thể băm, hãy tăng một kiểu.Lưu trữ (Hash_Value, khóa, giá trị) trong một mảng tại vị trí Hash_value % Len (mảng).compute the hash of the key. If the key is not hashable raise a TypeError. Store (hash_value, key, value) in an array at location hash_value % len(array) .