Những gì bạn đang yêu cầu là có thể đưa ra các ràng buộc của bạn.
Phân tích
Điểm mạnh của bảng băm là tốc độ tra cứu và chèn nhanh. Để có được tốc độ đó, người ta phải từ bỏ bất kỳ giao dịch nào trong bảng: tức là các mục nhập đều bị xáo trộn. Một danh sách được chấp nhận để sử dụng làm mục nhập bảng vì trong khi truyền tải là O (n), các danh sách có xu hướng ngắn giả sử bảng băm đủ lớn và các đối tượng được lưu trữ trong bảng được băm bằng thuật toán băm chất lượng tốt.
Cây tìm kiếm nhị phân (BST) có chức năng chèn và tra cứu nhanh tại O (log 2 n). Nó cũng áp đặt một hạn chế đối với các yếu tố mà nó lưu trữ: phải có một số cách để đặt hàng các yếu tố. Cho hai phần tử A và B được lưu trữ trong cây, có thể xác định xem A đến trước B hay chúng có thứ tự tương đương.
Bảng băm áp đặt không hạn chế như vậy: các phần tử trong bảng băm phải có hai thuộc tính. Đầu tiên, phải có một cách để xác định xem chúng có tương đương không; thứ hai, phải có một cách để tính mã băm xác định. Đặt hàng không phải là một yêu cầu.
Nếu các thành phần bảng băm của bạn có một đơn đặt hàng, thì bạn có thể sử dụng BST làm mục nhập bảng băm để giữ các đối tượng có cùng mã băm (va chạm). Tuy nhiên, do BST có tra cứu và chèn O (log 2 n), điều đó có nghĩa là trường hợp xấu nhất cho toàn bộ cấu trúc (bảng băm cộng với BST) về mặt kỹ thuật tốt hơn so với sử dụng danh sách làm mục nhập bảng. Tùy thuộc vào việc thực hiện BST, nó sẽ yêu cầu nhiều dung lượng hơn một danh sách, nhưng có thể không nhiều hơn.
Xin lưu ý rằng thông thường, chi phí hoạt động và hành vi của BST không mang lại điều gì cho bảng trong các tình huống trong thế giới thực như các thùng bảng băm, đó là lý do tại sao hiệu suất kém về mặt lý thuyết của danh sách có thể chấp nhận được. Nói cách khác, bảng băm bù cho điểm yếu của danh sách bằng cách đặt ít mục hơn trong mỗi danh sách (nhóm). Tuy nhiên : vấn đề được nêu cụ thể là bảng băm không thể tăng kích thước và va chạm thường xuyên hơn so với điển hình trong bảng băm.
Thực hiện
Tôi sẽ không đặt mã ở đây vì thật lòng nó không thực sự cần thiết và dù sao bạn cũng không đưa ra một ngôn ngữ nào.
Những gì tôi sẽ làm chỉ đơn giản là sao chép bất kỳ bảng băm tiêu chuẩn nào mà thư viện tiêu chuẩn của ngôn ngữ của bạn chứa vào một lớp mới, sau đó thay đổi loại nhóm bảng từ danh sách thành cây. Tùy thuộc vào ngôn ngữ và thư viện tiêu chuẩn của nó, đây có thể là một việc rất nhỏ.
Thông thường tôi sẽ không ủng hộ việc sao chép và dán mã hóa như thế này. Tuy nhiên, đây là một cách dễ dàng để có được cấu trúc dữ liệu được thử nghiệm rất nhanh.