3 Định tuyến trên mạng ngang hàng
2.1 Bảng địa chỉ trực tiếp
Các thao tác như: thêm, xóa và tra cứu được thực hiện trên S rõ ràng có độ phức tạp làO(1) về thời gian vì mỗi phần tửek được lưu trữ ở vị trí thứk trong bảng T (xem Hình 2.1).
2.1.2 Bảng băm
Ví dụ ta muốn biểu diễn tập con S ⊆ I gồm năm phần tử, có các khóa lần lượt là KS ={20,41,12,23,4}. Để lưu trữ S theo phương pháp bảng địa chỉ trực tiếp thì mảng T phải có tối thiểu là 41 phần tử ({T[1], T[2], . . . , T[41]}). Khi đó,
chỉ có đúng năm vị trí được sử dụng cịn là 35 vị trí lãng phí. Để tránh lãng phí bộ nhớ, ta sử dụng một hàm h (h : KI → N) nào đó, chẳng hạn ta chọn hàm
h(k) = (k mod 5) + 1, lúc này, ta sẽ lưu trữ các phần tử của tập S theo nguyên tắc như sau [25]: T[h(k)] = ek ek ∈S N U LL ek ∈/S (2.2)
Vì tập giá trị của hàm h chỉ có năm phần tử nên ta chỉ cần một mảng có đúng năm phần tử là đủ để lưu trữ các phần tử của S. Chi phí cho việc tính giá
trị của hàm h là O(1), do đó các thao tác thêm, xóa và tra cứu vẫn có độ phức
tạp về thời gian là O(1) không đổi.
Trong trường hợp lực lượng của tập I rất lớn thì việc lưu trữ các phần tử của
I bằng bảng địa chỉ trực tiếp là không thể. Hơn nữa, nếu tập S thực sự được lưu trữ có lực lượng nhỏ hơn rất nhiều so với lực lượng của I của thì phần nhiều khơng gian được cấp phát cho bảng địa chỉ trực tiếp không được sử dụng.
Với phương pháp địa chỉ trực tiếp thì mục dữ liệu có khố là k sẽ được lưu vào đúng vị trí k cịn với phương pháp bảng băm thì mục dữ liệu có khố là k
sẽ được lưu vào vị tríh(k) nên vẫn đảm bảo độ phức tạp O(1) cho thao tác truy cập đến mục dữ liệu có khố k. Ta gọi h là hàm băm và T là bảng băm. Trong đó, chúng ta sử dụng h(k) để tìm vị trí để lưu trữ phần tử có khố là k. Ở đây,
hàm băm h ánh xạ mỗi khoá thuộc I vào các vị trí của một bảng băm T[1..n],
với n nhỏ hơn rất nhiều so với m.
h:KI → {1,2, . . . , n}
Ta nói, mục dữ liệu có khố là k được băm vào vị trí h(k) và h(k) là giá trị băm của k. Hàm băm làm giảm phạm vi của các chỉ số mảng và vì vậy sẽ làm
giảm kích thước của mảng. Ban đầu kích thước của mảng cần dùng để lưu trữ là m(= |KI|) thì giờ giảm xuống cịn n (xem Hình 2.2).
Sử dụng bảng băm đã giải quyết được hạn chế lãng phí bộ nhớ của phương pháp bảng địa chỉ trực tiếp nhưng lại xuất hiện thêm vấn đề khác đó là đụng độ (collision). Mảng T trong bảng địa chỉ trực tiếp có đủ chỗ để lưu trữ m phần tử nhưng đối với bảng băm thì kích thước của mảngT rõ ràng khơng đủ lưu trữ tất cả các phần tử của tập I và hàm bămh khơng phải là một song ánh nên hai khóa có thể có giá trị băm trùng nhau. Mỗi vị trí trong mảng T chỉ có thể lưu trữ được một phần tử của S. Để giải quyết hạn chế này, người ta đã đưa ra hai
phương pháp là: i) bảng băm mở và ii) bảng băm đóng (hay địa chỉ mở) [1].