Sử dụng python định nghĩa được xử lý

Nói chung, bạn sẽ sử dụng yếu tố độc nhất trong hồ sơ người dùng của bạn. Và điều này thường có nghĩa là hệ thống nói chung có tên người dùng hoặc ID duy nhất cho mỗi bản ghi [người dùng], được đảm bảo là duy nhất. Tên người dùng hoặc ID sẽ là khóa duy nhất cho bản ghi. Vì điều này được thực hiện bởi hệ thống chính, ví dụ bằng cách sử dụng từ khóa tự động trong bảng cơ sở dữ liệu, bạn có thể chắc chắn rằng không có va chạm

Nội dung chính Hiển thị

  • 6. 5. 1. Chức năng băm CôngHash Functions¶
  • 6. 5. 2. Giải quyết va chạmGiải quyết xung đột¶
  • 6. 5. 3. Thực hiện kiểu dữ liệu hiển thị >>> ord['c'] 99 >>> ord['a'] 97 >>> ord['t'] 116 4Thực hiện >>> ord['c'] 99 >
  • 6. 5. 4. Phân vùng bămPhân tích băm¶
  • Làm thế nào để Python xử lý và trùm?
  • Làm thế nào để bạn ngăn chặn và trùm trong Python?
  • Những cách giải quyết va chạm trong bảng trùm là gì?
  • Và trùm trùm trong Hashtable là gì và nó được xử lý như thế nào?

Do đó, khóa duy nhất đó phải là khóa trong bản đồ của bạn để cho phép bạn tìm thấy bản ghi của người dùng

Tuy nhiên, nếu vì một lý do nào đó, bạn không có quyền truy cập vào từ khóa Guranteed-to-be-Unique như vậy, bạn chắc chắn có thể tạo một hàm băm từ bản ghi [như được mô tả bởi bạn] và . Trong trường hợp đó, bạn không tránh va chạm, nhưng bạn chỉ cần đối phó với nó

Một thuật toán nhanh chóng và thông thường được sử dụng cho điều đó diễn ra như sau. Sử dụng mũ trên bản ghi để tạo từ khóa, như bạn đã làm. Khóa này có khả năng không phải là duy nhất. Bây giờ hãy lưu trữ một danh sách các bản ghi tại vị trí được chỉ định bởi từ khóa. Chúng tôi gọi những danh sách đó là 'xô'. Để lưu trữ một phần tử mới, băm nó và sau đó kết nối nó vào danh sách đã được lưu trữ tại vị trí đó [thêm nó vào xô]. Để tìm một phần tử, hãy tìm mục đó, sau đó tìm kiếm tuần tự thông tin qua danh sách/xô tại vị trí đó để tìm mục bạn muốn

This is a ví dụ

mymap[123] = [ {'name':'John','age':27}, {'name':'Bob','age':19} ]
mymap[678] = [ {'name':'Frank','age':29} ]

Trong ví dụ, bạn có bảng băm của bạn [được thực hiện thông qua một lệnh]. You have the key hash key 678, in that a item has been archive in xô. Sau đó, bạn có giá trị khóa băm 123, nhưng có một nhiệm vụ và yêu cầu. cả hai mục 'John' và 'Bob' đều có giá trị trùm này. Không có vấn đề gì, bạn đã tìm thấy xô được lưu trữ tại mymap [123] và lặp lại nó để tìm giá trị

Đây là một sự phát triển khai linh hoạt động và rất phổ biến của các bản đồ băm, không yêu cầu phân bổ lại hoặc các biến chứng khác. Nó được mô tả ở nhiều nơi, ví dụ ở đây. https. //www. cs. auckland. AC. nz/~jmor159/plds210/hash_tables. html [trong Chương 8. 3. 1]

Hiệu suất nói chung chỉ trở thành một vấn đề khi bạn có rất nhiều va chạm [khi danh sách cho mỗi thùng thực sự dài]. Một cái gì đó bạn sẽ tránh với một chức năng trùm tốt

Tuy nhiên. ví dụ. ID duy nhất thực sự cho hồ sơ của bạn, được thực hiện bởi cơ sở dữ liệu không có giới hạn, có thể vẫn là cách tiếp cận thích

Trong các phần trước, chúng tôi đã có thể cải thiện các thuật toán tìm kiếm của mình bằng cách tận hưởng việc sử dụng thông tin về nơi các mục được lưu trữ trong bộ sưu tập đối với nhau. Ví dụ, bằng cách biết rằng một danh sách đã được đặt hàng, chúng ta có thể tìm kiếm trong thời gian logarit bằng cách sử dụng tìm kiếm nhị phân tìm kiếm. Trong phần này, chúng tôi sẽ cố gắng tiến thêm một bước bằng cách xây dựng cấu trúc dữ liệu cấu trúc có thể được tìm kiếm trong thời gian \ [o [1] \]. Khái niệm này được gọi là trùm. \[O[1]\] thời gian. Khái niệm này được gọi là băm.

Để làm điều này, chúng ta cần biết nhiều hơn về nơi các mục có thể ở đâu khi chúng ta đi tìm chúng trong bộ sưu tập. Nếu mọi mục là nơi cần có, thì tìm kiếm có thể sử dụng một so sánh duy nhất để khám phá sự hiện diện của một mục. Tuy nhiên, chúng ta sẽ thấy rằng đây không phải là trường hợp

Một bảng băm là một tập hợp các mặt hàng được lưu trữ theo cách để dễ dàng tìm thấy chúng sau này. Mỗi vị trí của bảng băm, thường được gọi là khe, có thể giữ một mục và được đặt tên bởi một giá trị nguyên số bắt đầu từ 0. Ví dụ. chúng ta sẽ có một khe có tên 0, một khe có tên 1, một khe có tên 2, và do that on. Ban đầu, bảng băm không chứa các mục để mọi khe trống đều trống. Chúng tôi có thể phát triển bảng băm bằng cách sử dụng một danh sách với mỗi phần tử được khởi tạo thành giá trị Python đặc biệt

def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
9. Hình 4 cho thấy một bảng băm có kích thước \ [m = 11 \]. Nói cách khác, có các khe m trong bảng, được đặt tên là 0 đến 10. bảng băm là một tập hợp các mục được lưu trữ theo cách giúp dễ dàng tìm thấy chúng sau này. Mỗi vị trí của bảng băm, thường được gọi là vị trí, có thể chứa một mục và được đặt tên theo một giá trị số nguyên bắt đầu từ 0. Ví dụ: chúng ta sẽ có một vị trí có tên là 0, một vị trí có tên là 1, một vị trí có tên là 2, v.v. Ban đầu, bảng băm không chứa mục nào nên mọi vị trí đều trống. Chúng ta có thể triển khai bảng băm bằng cách sử dụng danh sách với mỗi phần tử được khởi tạo thành giá trị Python đặc biệt
def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
9. Hình 4 hiển thị bảng băm có kích thước \[m=11\]. In other words, there are m slots in the table, named 0 through 10.

Hình 6. Băm một chuỗi bằng cách sử dụng các giá trị thứ tự

Listing 1

def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize

Thật thú vị khi lưu ý rằng khi sử dụng hàm băm này, các đảo chữ cái sẽ luôn được cung cấp cùng một giá trị băm. Để giải quyết vấn đề này, chúng ta có thể sử dụng vị trí của nhân vật quan trọng. Hình 7 cho thấy một cách có thể sử dụng giá trị vị trí làm yếu tố quan trọng. Chức năng sửa đổi chức năng

>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
1 is to back as a post file. Hình 7 cho thấy một cách khả thi để sử dụng giá trị vị trí làm hệ số trọng số. Việc sửa đổi chức năng
>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
1 còn lại như một bài tập.

Hình 7. Băm một chuỗi bằng cách sử dụng các giá trị thứ tự có trọng số

Bạn có thể nghĩ ra một số cách bổ sung để tính toán các giá trị trùm cho các mục trong một bộ sưu tập. Điều quan trọng cần nhớ là hàm băm phải có hiệu quả để nó không trở thành phần chi phối của quá trình lưu trữ và tìm kiếm. Nếu hàm quá phức tạp, thì công việc tính toán tên khe sẽ trở nên nhiều hơn so với công việc thực hiện tìm kiếm tuần tự hoặc nhị phân cơ bản như được mô tả trước đó. Điều này sẽ nhanh chóng đánh bại mục tiêu trùm

6. 5. 2. Giải quyết va chạmGiải quyết xung đột¶

Bây giờ chúng tôi trở lại vấn đề va chạm. Khi hai mục băm vào cùng một khe, chúng ta phải có một phương pháp có hệ thống để đặt mục thứ hai trong bảng băm. Quá trình này được gọi là giải quyết va chạm. Như chúng tôi đã nêu trước đó, nếu hàm mũm mĩm là hoàn hảo, các va chạm sẽ không bao giờ xảy ra. Tuy nhiên, vì điều này thường là không thể, độ phân giải va chạm trở thành một phần rất quan trọng của trùm. giải quyết va chạm. Như chúng tôi đã nói trước đó, nếu hàm băm hoàn hảo, xung đột sẽ không bao giờ xảy ra. Tuy nhiên, vì điều này thường không thể thực hiện được nên việc giải quyết va chạm trở thành một phần rất quan trọng của quá trình băm

Một phương pháp để giải quyết việc va chạm nhìn vào bàn chải và cố gắng tìm một khe hở khác để giữ nguyên vật liệu gây ra va chạm. Một cách đơn giản để thực hiện điều này là bắt đầu ở vị trí giá trị trùm đầu và sau đó di chuyển theo cách tuần tự qua các vị trí cho đến khi chúng ta gặp phải khe cắm đầu tiên trống. Lưu ý rằng chúng ta có thể cần quay lại vị trí ban đầu [một cách tròn] để che toàn bộ bảng băm. Quá trình giải quyết va chạm này được gọi là địa chỉ mở ở vị trí mà nó cố gắng tìm vị trí hoặc địa chỉ mở tiếp theo trong bảng trùm. Bằng cách truy cập một cách có hệ thống từng vị trí một lần, chúng tôi đang thực hiện một kỹ thuật địa chỉ mở cuộc gọi là dò tìm tuyến tính. địa chỉ mở ở chỗ nó cố gắng tìm vị trí hoặc địa chỉ mở tiếp theo trong bảng băm. Bằng cách truy cập từng vị trí một cách có hệ thống, chúng tôi đang thực hiện một kỹ thuật định địa chỉ mở được gọi là thăm dò tuyến tính

Hình 8 cho thấy một tập hợp các mục số nguyên mở rộng theo hàm băm phương pháp phần còn lại đơn giản [54,26,93,17,77,31,44,55,20]. Bảng 4 ở trên cho thấy các giá trị băm cho các mục gốc. Hình 5 cho thấy nội dung ban đầu. Khi chúng ta cố gắng đặt 44 vào khe 0, xảy ra va chạm. Theo thăm dò tuyến tính, chúng tôi tìm kiếm các tuần tự, khe cắm, cho đến khi chúng tôi tìm thấy một vị trí mở. Trong trường hợp này, chúng tôi đã tìm thấy Khe 1. hiển thị một tập hợp các mục số nguyên mở rộng theo hàm băm phương thức số dư đơn giản [54,26,93,17,77,31,44,55,20]. Bảng 4 ở trên hiển thị giá trị băm cho các mục gốc. Hình 5 hiển thị nội dung ban đầu. Khi chúng tôi cố gắng đặt 44 vào khe 0, xung đột xảy ra. Trong thăm dò tuyến tính, chúng tôi tìm kiếm tuần tự, theo từng vị trí, cho đến khi chúng tôi tìm thấy một vị trí mở. Trong trường hợp này, chúng tôi tìm thấy khe 1.

Một lần nữa, 55 nên đi trong khe 0 nhưng phải được đặt trong Khe 2 vì đây là vị trí mở tiếp theo. Last value of 20 has to khe 9. Vì Slot 9 đã đầy, chúng tôi bắt đầu thực hiện dò tìm tuyến tính. Chúng tôi ghé thăm các khe 10, 0, 1 và 2 và cuối cùng tìm thấy một khe trống ở vị trí 3

Hình 8. Độ phân giải va chạm với tính năng dò tìm tuyến tính

Khi chúng tôi xây dựng một bảng băm bằng địa chỉ mở và thăm dò tuyến tính, điều cần thiết là chúng tôi sử dụng các phương pháp tương tự để tìm kiếm các mục. Giả sử chúng tôi muốn tra cứu mục 93. Khi tôi tính toán giá trị trùm, chúng tôi nhận được 5. Nhìn vào Khe 5 tiết lộ 93 và chúng tôi có thể trả về

>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
2. Nếu chúng ta đang tìm kiếm 20 thì sao? . Chúng tôi không thể đơn giản trả lại
>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
3 vì chúng tôi biết rằng có thể có va chạm. Bây giờ chúng tôi buộc phải thực hiện tìm kiếm tuần tự, bắt đầu từ vị trí 10, tìm kiếm cho đến khi chúng tôi tìm thấy mục 20 hoặc chúng tôi tìm thấy một khe trống

Một bất lợi cho dò tìm tuyến tính là xu hướng phân cụm; . Điều này có nghĩa là nếu nhiều tình huống xảy ra ở cùng một giá trị bạo lực, thì một số vị trí xung quanh xung quanh sẽ được hoàn thiện bằng cách phân tích thăm dò tuyến tính. Điều này sẽ có tác động đến các mục khác đang được thêm vào, vì chúng tôi đã thấy khi chúng tôi cố gắng thêm mục 20 vào trên. Một cụm các giá trị băm đến 0 phải được bỏ qua để cuối cùng tìm thấy một vị trí mở. Cụm này được hiển thị trong Hình 9. phân cụm; . Điều này có nghĩa là nếu nhiều xung đột xảy ra ở cùng một giá trị băm, một số vị trí xung quanh sẽ được lấp đầy bởi độ phân giải thăm dò tuyến tính. Điều này sẽ ảnh hưởng đến các mục khác đang được chèn vào, như chúng ta đã thấy khi cố gắng thêm mục 20 ở trên. Phải bỏ qua một cụm các giá trị được băm thành 0 để cuối cùng tìm được một vị thế mở. Cụm này được hiển thị trong Hình 9 .

Hình 9. Một cụm các mục cho khe 0¶

Một cách để đối phó với phân cụm là mở rộng kỹ thuật thăm dò tuyến tính để thay vì nhìn tuần tự cho khe mở tiếp theo, chúng tôi bỏ qua các khe, từ đó phân phối đồng đều hơn các mục đã có . Điều này sẽ có khả năng làm giảm sự phức tạp xảy ra. Hình 10 cho thấy các mục khi tốc độ phân giải và thỏa mãn được thực hiện với đầu dò cộng với 3 cộng đồng. Điều này có nghĩa là khi xảy ra va chạm, chúng ta sẽ xem xét mọi vị trí thứ ba để khi chúng ta tìm thấy một vị trí trống. Hình 10 hiển thị các mục khi giải quyết va chạm được thực hiện bằng đầu dò “cộng 3”. Điều này có nghĩa là một khi xung đột xảy ra, chúng tôi sẽ xem xét mọi vị trí thứ ba cho đến khi chúng tôi tìm thấy một vị trí trống.

Hình 10. Độ phân giải va chạm bằng cách sử dụng cộng với 3 cộng đồng

Tên chung cho quá trình tìm kiếm một vị trí khác sau khi va chạm đang được thử lại. Với đầu tuyến tính đơn giản, hàm phục hồi là \ [newhashvalue = rehash [OldHashValue] \] trong đó \ [rehash [pos] = [pos + 1] \% sizeoftable \]. Có thể định nghĩa Rehash 3 cộng đồng có thể được định nghĩa là \ [rehash [pos] = [pos+3] \% sizeoftable \]. Nói chung, \ [rehash [pos] = [pos + bỏ qua] \% sizeftable \]. Điều quan trọng cần lưu ý là kích thước của Skip Bỏ qua phải sao cho tất cả các vị trí trong bảng cuối cùng sẽ được truy cập. Nếu không, một phần của bảng sẽ không được sử dụng. Để đảm bảo điều này, người ta thường cho rằng bảng kích thước là nguyên tố. Đây là lý do chúng tôi đã sử dụng 11 trong các ví dụ của chúng tôi. làm lại. Với thăm dò tuyến tính đơn giản, chức năng băm lại là \[newhashvalue = rehash[oldhashvalue]\] trong đó \[rehash . Việc sửa lại “cộng 3” có thể được định nghĩa là . The “plus 3” rehash can be defined as \[rehash[pos] = [pos+3] \% sizeoftable\] . Nói chung, \[rehash[pos] = [pos + skip] \% sizeoftable\] . Điều quan trọng cần lưu ý là kích thước của "bỏ qua" phải sao cho tất cả các vị trí trong bảng cuối cùng sẽ được truy cập. Nếu không, một phần của bảng sẽ không được sử dụng. Để đảm bảo điều này, người ta thường gợi ý rằng kích thước bảng là một số nguyên tố. Đây là lý do chúng tôi đã sử dụng 11 trong các ví dụ của chúng tôi.

Một biến thể của ý tưởng thăm dò tuyến tính được gọi là thăm dò cấp hai. Thay vì sử dụng giá trị bỏ qua không thay đổi trên mạng, chúng tôi sử dụng hàm thử lại để tăng giá trị băm lên 1, 3, 5, 7, 9, v. v. Điều này có nghĩa là nếu giá trị băm đầu tiên là H, các giá trị liên tiếp là \ [h+1 \], \ [h+4 \], \ [h+9 \], \ [h+16 \ . v. . Nói chung, tôi sẽ là i^2 \ [rehash [pos] = [h + i^2] \]. Nói cách khác, thăm dò bậc hai sử dụng một điểm bỏ qua bao gồm các hình vuông liên kết hoàn hảo. Hình 11 cho thấy các giá trị ví dụ của chúng tôi sau khi chúng được đặt bằng kỹ thuật này. thăm dò bậc hai. Thay vì sử dụng giá trị "bỏ qua" không đổi, chúng tôi sử dụng hàm băm lại để tăng giá trị băm lên 1, 3, 5, 7, 9, v.v. Điều này có nghĩa là nếu giá trị băm đầu tiên là h, thì các giá trị tiếp theo là \[h+1\] , . Nói chung, tôi sẽ là i^2 , \[h+9\], \[h+16\], and so on. In general, the i will be i^2 \[rehash[pos] = [h + i^2]\] . Nói cách khác, thăm dò bậc hai sử dụng một lần bỏ qua bao gồm các hình vuông hoàn hảo liên tiếp. Hình 11 hiển thị các giá trị mẫu của chúng tôi sau khi chúng được đặt bằng kỹ thuật này.

Hình 11. Độ phân giải va chạm với thăm dò bậc hai

Một phương pháp thay thế để xử lý vấn đề và yêu cầu là cho phép mỗi khe chứa một tham chiếu đến một bộ sưu tập [hoặc chuỗi] của các mục. Chuỗi cho phép nhiều mục tồn tại cùng một vị trí trong bảng băm. Khi các nhiệm vụ xảy ra, các vật phẩm vẫn được đặt trong khe thích hợp của bảng băm. Khi ngày càng có nhiều đồ vật được xếp vào cùng một vị trí, khó khăn trong việc tìm kiếm đồ vật trong bộ sưu tập tăng lên. Hình 12 cho thấy các mục khi chúng được thêm vào bảng sử dụng chuỗi băm để giải quyết các va chạm. Xâu chuỗi cho phép nhiều mục tồn tại ở cùng một vị trí trong bảng băm. Khi xung đột xảy ra, mục vẫn được đặt trong vị trí thích hợp của bảng băm. Khi ngày càng có nhiều vật phẩm đến cùng một vị trí, độ khó tìm kiếm vật phẩm trong bộ sưu tập sẽ tăng lên. Hình 12 hiển thị các mục khi chúng được thêm vào bảng băm sử dụng chuỗi để giải quyết xung đột.

Hình 12. Volume descriptor va chạm với string

Khi chúng tôi muốn tìm kiếm một mục, chúng tôi sử dụng hàm băm để tạo vị trí nơi nó nên cư trú. Vì mỗi khe chứa một bộ sưu tập, chúng tôi sử dụng một kỹ thuật tìm kiếm để quyết định xem mặt hàng có mặt hay không. Ưu điểm là trung bình có khả năng có ít mục hơn trong mỗi vị trí, vì vậy công việc tìm kiếm có thể hiệu quả hơn. Chúng tôi sẽ xem xét phân tích cho trùm ở cuối phần này

Tự kiểm tra

    Q-1. Trong bảng băm có kích thước 13 vị trí, số nào sẽ có hai khóa sau bản đồ?

  • 1, 10
  • Cẩn thận sử dụng bộ phận không nguyên số modulo
  • 13, 0
  • Đừng chia cho hai, sử dụng toán tử modulo
  • 1, 0
  • 27 % 13 == 1 và 130 % 13 == 0
  • 2, 3
  • Sử dụng toán tử modulo

    Q-2. Giả sử bạn được cung cấp bộ khóa sau để chèn vào bảng băm chứa chính xác 11 giá trị. 113, 117, 97, 100, 114, 108, 116, 105, 99 Điều gì sau đây có thể hiển thị nội dung tốt nhất của bảng băm sau khi tất cả các khóa đã được thêm vào bằng cách sử dụng tính năng dò tìm tuyến tính?

  • 100, __, __, 113, 114, 105, 116, 117, 97, 108, 99
  • Có vẻ như bạn có thể đã làm modulo 2 số học. Bạn cần sử dụng kích thước bảng Hash làm giá trị modulo
  • 99, 100, __, 113, 114, __, 116, 117, 105, 97, 108
  • Use the first proproblem and linear modulo 11 for this value
  • 100, 113, 117, 97, 14, 108, 116, 105, 99, __, __
  • Có vẻ như bạn đang sử dụng số học Modulo 10, sử dụng bảng kích thước
  • 117, 114, 108, 116, 105, 99, __, __, 97, 100, 113
  • Hãy cẩn thận để sử dụng modulo không phân chia nguyên

6. 5. 3. Thực hiện kiểu dữ liệu hiển thị >>> ord['c'] 99 >>> ord['a'] 97 >>> ord['t'] 116 4Thực hiện >>> ord['c'] 99 >

Một trong các bộ sưu tập Python hữu ích nhất là từ điển. Hãy nhớ lại rằng một từ điển là một loại dữ liệu kết hợp mà bạn có thể lưu trữ cặp DATA Key. Key được sử dụng để tra cứu giá trị dữ liệu liên quan. Chúng tôi thường đề cập đến ý tưởng này như một bản đồ. bản đồ

Kiểu dữ liệu lược đồ bản đồ được định nghĩa như sau. Constructor is a collection of links to have thứ tự giữa khóa và giá trị dữ liệu. Các từ khóa trong bản đồ đều là duy nhất để có mối quan hệ một-một giữa từ khóa và giá trị. Các hoạt động được đưa ra dưới đây

  • >>> ord['c']
    99
    >>> ord['a']
    97
    >>> ord['t']
    116
    
    5 Tạo một bản đồ mới, trống. Nó trả về một bộ sưu tập đồ trống
  • >>> ord['c']
    99
    >>> ord['a']
    97
    >>> ord['t']
    116
    
    6 Thêm một cặp giá trị khóa mới vào bản đồ. Nếu khóa đã có trong bản đồ, hãy thay thế giá trị cũ bằng giá trị mới
  • >>> ord['c']
    99
    >>> ord['a']
    97
    >>> ord['t']
    116
    
    7 Chọn một khóa, trả về giá trị được lưu trữ trong bản đồ hoặc
    def hash[astring, tablesize]:
        sum = 0
        for pos in range[len[astring]]:
            sum = sum + ord[astring[pos]]
    
        return sum%tablesize
    
    9 nếu không
  • >>> ord['c']
    99
    >>> ord['a']
    97
    >>> ord['t']
    116
    
    9 Xóa cặp giá trị khóa khỏi bản đồ bằng cách sử dụng câu lệnh của Mẫu
    def hash[astring, tablesize]:
        sum = 0
        for pos in range[len[astring]]:
            sum = sum + ord[astring[pos]]
    
        return sum%tablesize
    
    0
  • def hash[astring, tablesize]:
        sum = 0
        for pos in range[len[astring]]:
            sum = sum + ord[astring[pos]]
    
        return sum%tablesize
    
    1 Trả về số lượng cặp giá trị khóa được lưu trữ trong bản đồ
  • def hash[astring, tablesize]:
        sum = 0
        for pos in range[len[astring]]:
            sum = sum + ord[astring[pos]]
    
        return sum%tablesize
    
    2 Trả về
    >>> ord['c']
    99
    >>> ord['a']
    97
    >>> ord['t']
    116
    
    2 cho một câu lệnh của Mẫu
    def hash[astring, tablesize]:
        sum = 0
        for pos in range[len[astring]]:
            sum = sum + ord[astring[pos]]
    
        return sum%tablesize
    
    4, nếu khóa đã chọn trong bản đồ,
    >>> ord['c']
    99
    >>> ord['a']
    97
    >>> ord['t']
    116
    
    3 khác

Một trong những lợi ích tuyệt vời của từ điển là thực tế là một chìa khoá, chúng ta có thể tìm kiếm giá trị dữ liệu liên quan rất nhanh. Để cung cấp khả năng tra cứu nhanh này, chúng tôi cần triển khai hỗ trợ tìm kiếm hiệu quả. Chúng tôi có thể sử dụng một danh sách để tìm kiếm tuần tự hoặc nhị phân nhưng sẽ tốt hơn nữa khi sử dụng bảng băm như được mô tả ở trên kể từ khi tìm kiếm một mục trong bảng băm có thể tiếp cận hiệu suất \ . \[O[1]\] hiệu suất.

Trong bảng liệt kê 2, chúng tôi sử dụng hai danh sách để tạo một lớp

def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
6 thực hiện kiểu dữ liệu bản đồ. Một danh sách, được gọi là
def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
7, sẽ giữ các mục chính và danh sách bài hát bài hát, được gọi là
def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
8, sẽ giữ các giá trị dữ liệu. Khi tôi tìm kiếm một từ khóa, vị trí tương ứng trong danh sách dữ liệu sẽ giữ nguyên giá trị dữ liệu được liên kết. Chúng tôi sẽ coi danh sách chính là bảng băm bằng cách sử dụng các ý tưởng đã được trình bày trước đó. Lưu ý rằng kích thước ban đầu cho bảng băm được chọn là 11. Mặc dù điều này là tùy ý, nhưng điều quan trọng là kích thước là một yếu tố nguyên tố để thuật toán giải thích mức độ phân tích và áp lực có thể mang lại hiệu quả cao nhất có thể. Danh sách 2 chúng tôi sử dụng hai danh sách để tạo lớp ______16 triển khai kiểu dữ liệu trừu tượng Bản đồ. Một danh sách, được gọi là
def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
7, sẽ chứa các mục chính và một danh sách song song, được gọi là
def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
8, sẽ chứa các giá trị dữ liệu. Khi chúng ta tra cứu một khóa, vị trí tương ứng trong danh sách dữ liệu sẽ chứa giá trị dữ liệu được liên kết. Chúng tôi sẽ coi danh sách khóa dưới dạng bảng băm bằng cách sử dụng các ý tưởng đã trình bày trước đó. Lưu ý rằng kích thước ban đầu cho bảng băm đã được chọn là 11. Mặc dù điều này là tùy ý, nhưng điều quan trọng là kích thước phải là số nguyên tố để thuật toán giải quyết va chạm có thể hiệu quả nhất có thể.

Listing 2

>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
2
def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
9 thực hiện phương pháp phần còn lại đơn giản. Kỹ thuật phân giải và kỹ thuật mong muốn là dò tuyến tính với chức năng Rehash 1 cộng với 1. Hàm
>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
20 [xem Danh sách 3] giả định rằng cuối cùng sẽ có một khoảng trống trừ khi từ khóa đã có trong
>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
21. Nó tính toán giá trị trùm đầu ban đầu và nếu khe đó không trống, hãy lặp lại hàm
>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
22 để đến khi khe trống xảy ra. Nếu một khe cắm không trống chứa từ khóa, giá trị dữ liệu cũ sẽ được thay thế bằng giá trị dữ liệu mới. Đối phó với vấn đề không giải quyết còn khe trống là một bài tập. Danh sách 3 ] giả định rằng cuối cùng sẽ có một ô trống trừ khi khóa đã có sẵn trong
>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
21. Nó tính toán giá trị băm ban đầu và nếu vị trí đó không trống, sẽ lặp lại hàm
>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
22 cho đến khi xuất hiện một vị trí trống. Nếu một vị trí trống đã chứa khóa, giá trị dữ liệu cũ sẽ được thay thế bằng giá trị dữ liệu mới. Xử lý tình huống không còn chỗ trống là một bài tập.

List list 3

>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
9

Tương tự như vậy, hàm

>>> ord['c']
99
>>> ord['a']
97
>>> ord['t']
116
23 [xem Danh sách 4] bắt đầu bằng cách tính toán giá trị ban đầu. Nếu giá trị không nằm trong vị trí ban đầu, ____422 được sử dụng để xác định vị trí tiếp theo có thể. Lưu ý rằng dòng 15 chắc chắn rằng việc tìm kiếm sẽ chấm dứt bằng cách kiểm tra để đảm bảo rằng chúng tôi chưa quay lại vị trí ban đầu. Nếu điều đó xảy ra, chúng tôi đã cạn kiệt tất cả các vị trí có thể và mặt hàng không có mặt. Danh sách 4 ] bắt đầu bằng cách tính giá trị băm ban đầu. Nếu giá trị không có trong vị trí ban đầu, ____422 được sử dụng để xác định vị trí có thể tiếp theo. Lưu ý rằng dòng 15 đảm bảo rằng quá trình tìm kiếm sẽ kết thúc bằng cách kiểm tra để đảm bảo rằng chúng tôi chưa quay lại vị trí ban đầu. Nếu điều đó xảy ra, chúng tôi đã sử dụng hết tất cả các vị trí có thể và vật phẩm không được xuất hiện.

Last method of layer

def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
6 cung cấp chức năng từ điển bổ sung. Chúng tôi cũng tải các phương thức __getItem__ và __setItem__ để cho phép truy cập bằng cách sử dụng`` [] ``. Điều này có nghĩa là một khi
def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
6 đã được tạo ra, toán tử chỉ mục thuộc quyền sẽ có sẵn. Chúng tôi để khôi phục các phương pháp còn lại như các bài tập

Listing 4

def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
5

Version after here for Layer

def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
6 đang hoạt động. Đầu tiên chúng tôi sẽ tạo bảng băm và lưu trữ một số mục có khóa số nguyên và giá trị chuỗi dữ liệu.
def hash[astring, tablesize]:
    sum = 0
    for pos in range[len[astring]]:
        sum = sum + ord[astring[pos]]

    return sum%tablesize
7

Tiếp theo chúng tôi sẽ truy cập và sửa đổi một số mục trong bảng băm. Lưu ý rằng giá trị cho khóa 20 đang được thay thế

Chủ Đề