Quello che stai chiedendo è possibile dati i tuoi vincoli.
Analisi
Il punto di forza di una tabella hash è la sua velocità di ricerca e inserimento rapida. Per ottenere quella velocità, si deve rinunciare a qualsiasi parvenza di ordine nella tabella: cioè le voci sono tutte confuse. Un elenco è accettabile da utilizzare come voce di tabella poiché, sebbene l'attraversamento sia O (n), gli elenchi tendono ad essere brevi supponendo che la tabella hash sia sufficientemente grande e che gli oggetti memorizzati nella tabella siano sottoposti a hash utilizzando un algoritmo di hash di buona qualità.
Un albero di ricerca binario (BST) ha un rapido inserimento e ricerca in O (log 2 n). Impone inoltre una restrizione agli elementi che memorizza: deve esserci un modo per ordinare gli elementi. Dati due elementi A e B memorizzati nell'albero, deve essere possibile determinare se A precede B o se hanno un ordine equivalente.
Una tabella hash non impone tale restrizione: gli elementi in una tabella hash devono avere due proprietà. Innanzitutto, ci deve essere un modo per determinare se sono equivalenti; secondo, ci deve essere un modo per calcolare un codice hash deterministico. L'ordine non è un requisito.
Se gli elementi della tabella hash hanno un ordine, è possibile utilizzare un BST come voce della tabella hash per contenere oggetti con lo stesso codice hash (collisioni). Tuttavia, a causa di un BST con ricerca e inserimento O (log 2 n), ciò significa che il caso peggiore per l'intera struttura (tabella hash più BST) è tecnicamente migliore dell'uso di un elenco come voce di tabella. A seconda dell'implementazione di BST richiederà più spazio di archiviazione di un elenco, ma probabilmente non molto di più.
Si noti che normalmente l'overhead e il comportamento di un BST non portano nulla al tavolo nelle situazioni del mondo reale come secchi di tabella hash, motivo per cui le scarse prestazioni teoriche di un elenco sono accettabili. In altre parole, la tabella hash compensa la debolezza dell'elenco posizionando meno elementi in ciascun elenco (bucket). Tuttavia : il problema specificava che la tabella hash non può aumentare di dimensioni e che le collisioni sono più frequenti di quanto sia tipico in una tabella hash.
Implementazione
Non inserirò qui il codice perché onestamente non è davvero necessario e tu non hai dato una lingua comunque.
Quello che vorrei fare è semplicemente copiare qualsiasi tabella hash standard contenuta nella libreria standard della tua lingua in una nuova classe, quindi cambiare il tipo di bucket della tabella da un elenco a un albero. A seconda della lingua e della sua libreria standard, questa può essere una cosa molto banale da fare.
Normalmente non invoco a copiare e incollare la codifica in questo modo. Tuttavia, è un modo semplice per ottenere una struttura di dati testata in battaglia molto rapidamente.