Те, що ви просите, можливо, враховуючи ваші обмеження.
Аналіз
Міцність хеш-таблиці - це її швидкий пошук та швидкість вставки. Щоб досягти такої швидкості, потрібно залишити будь-який вигляд порядку в таблиці: тобто всі записи збігаються. Список прийнятно використовувати як запис таблиці, оскільки, хоча обхід O (n), списки, як правило, короткі, якщо хеш-таблиця є достатньо великою, а об'єкти, що зберігаються в таблиці, хешируються за допомогою хорошого алгоритму хешування якості.
Двійкове дерево пошуку (BST) має швидке вставлення та пошук у O (log 2 n). Він також накладає обмеження на елементи, які він зберігає: повинен бути певний спосіб замовити елементи. З огляду на два елементи A і B, що зберігаються в дереві, повинно бути можливо визначити, чи A ставиться перед B або якщо вони мають рівноцінний порядок.
Хеш-таблиця не накладає такого обмеження: елементи в хеш-таблиці повинні мати два властивості. По-перше, повинен бути спосіб визначити, чи є вони рівнозначними; по-друге, повинен бути спосіб обчислити детермінований хеш-код. Замовлення не є вимогою.
Якщо у ваших елементах хеш-таблиці є порядок, тоді ви можете використовувати BST як запис хеш-таблиці для розміщення об'єктів з тим самим хеш-кодом (зіткнення). Однак, завдяки BST, який має пошук і вставку O (log 2 n), це означає, що найгірший випадок для всієї структури (хеш-таблиця плюс BST) технічно кращий, ніж використання списку як запису таблиці. Залежно від впровадження BST, йому буде потрібно більше пам’яті, ніж список, але, швидше за все, не набагато більше.
Зверніть увагу, що звичайно накладні витрати та поведінка BST не приносять нічого до столу в реальних ситуаціях, як хеш-таблиця, тому теоретично низька ефективність списку є прийнятною. Іншими словами, хеш-таблиця компенсує слабкість списку, розміщуючи менше елементів у кожному списку (відро). Однак : проблема спеціально заявила, що хеш-таблиця не може збільшуватися в розмірі, а зіткнення частіші, ніж це характерно для хеш-таблиці.
Впровадження
Я не збираюся тут ставити код, бо, чесно кажучи, це насправді не потрібно, і ви все одно не дали мови.
Що б я зробив, це просто скопіювати будь-яку стандартну таблицю хешу, що містить стандартна бібліотека вашої мови, в новий клас, а потім змінити тип відра таблиці зі списку на дерево. Залежно від мови та її стандартної бібліотеки це може бути дуже тривіальною справою.
Зазвичай я б не виступав за таке кодування копіювання та вставлення. Однак це простий спосіб отримати перевірену в боях структуру даних дуже швидко.