Các giải thuật trong C++

Một phần của tài liệu CTDL 2005 chuong 12 (Trang 26 - 27)

Bảng băm theo phương pháp nối kết trong C++ có định nghĩa đơn giản như sau:

class Hash_table {

public:

// Specify methods here. private:

List<Record> table[hash_size]; };

Ở đây lớp List có thể là bất kỳ một hiện thực liên kết tổng quát nào của một danh sách đã học trong chương 4. Để được nhất quán, các phương thức của bảng băm nối kết sẽ chứa mọi phương thức của hiện thực bảng băm trước kia của chúng ta. Constructor của bảng băm chỉ đơn giản gọi các constructor cho từng danh sách của mảng. Trong khi đó việc dọn dẹp xóa sạch các phần tử trong bảng băm nối kết lại là một việc hoàn toàn khác, chúng ta cần dọn dẹp từng danh sách tại mỗi vị trí trong bảng băm. Việc này có thể được thực hiện nhờ phương thức clear()

Chúng ta còn có thể sử dụng các phương thức trong đóng gói List để truy xuất bảng băm. Bản thân hàm băm không khác so với bảng băm theo phương pháp địa chỉ mở. Để truy xuất dữ liệu, chúng ta có thể đơn giản sử dụng phiên bản liên kết của hàm sequential_search trong phần 7.2. Cốt lõi của phương thức

Hash_table::retrieve

sequential_search( table[hash(target)], target, position);

Chi tiết của việc chuyển đổi hàm này thành một hàm đầy đủ được xem như bài tập. Tương tự, cốt lõi của việc thêm dữ liệu vào bảng băm là

table[hash(new_entry)].insert( 0, new_entry );

Ở đây chúng ta chọn cách khi thêm phần tử mới vào thì nó sẽ được đứng tại vị trí đầu của danh sách liên kết, do đây là cách dễ nhất. Như chúng ta đã thấy, cả hai việc thêm vào và truy xuất phần tử này đều đơn giản hơn là phương pháp địa chỉ mở, do việc giải quyết đụng độ không còn là vấn đề nữa.

Việc loại phần tử ra khỏi bảng băm nối kết cũng đơn giản hơn rất nhiều so với bảng băm địa chỉ mở. Để loại một phần tử với một khóa cho trước, chúng ta chỉ cần tìm tuần tự phần tử đó trong danh sách liên kết có chứa nó và loại nó ra khỏi danh sách này. Đặc tả của phương thức loại bỏ như sau:

Error_code Hash_table::remove(const Key &target, Record &x);

post: Nếu bảng có chứa phần tử có khóa bằng target, thì phần tử này được chép vào x và được loại khỏi bảng băm, phương thức trả về success. Ngược lại phương thức trả về not_present.

Hiện thực của phương thức này cũng được dành lại như bài tập.

Một phần của tài liệu CTDL 2005 chuong 12 (Trang 26 - 27)

Tải bản đầy đủ (PDF)

(34 trang)