あなたが求めていることは、あなたの制約を考えると可能です。
分析
ハッシュテーブルの強みは、検索と挿入の速度が速いことです。その速度を得るには、テーブル内の順序の類似性を放棄する必要があります。つまり、エントリがすべて乱雑になります。リストはテーブルエントリとして使用できます。トラバーサルはO(n)ですが、ハッシュテーブルが十分に大きく、テーブルに格納されているオブジェクトが良質のハッシュアルゴリズムを使用してハッシュされると、リストは短くなる傾向があります。
二分探索木(BST)には、O(log 2 n)での高速挿入と検索があります。また、格納する要素に制限を課します。要素を順序付ける方法が必要です。ツリーに2つの要素AとBが格納されている場合、AがBの前に来るか、または同等の順序を持っているかを判断できる必要があります。
ハッシュテーブルにはそのような制限はありません。ハッシュテーブルの要素には2つのプロパティが必要です。まず、それらが同等であるかどうかを判断する方法が必要です。次に、決定論的なハッシュコードを計算する方法が必要です。注文は必須ではありません。
ハッシュテーブル要素に順序がある場合、BSTをハッシュテーブルエントリとして使用して、同じハッシュコード(衝突)を持つオブジェクトを保持できます。ただし、O(log 2 n)ルックアップおよび挿入を行うBSTにより、構造全体(ハッシュテーブルとBST)の最悪のケースは、テーブルエントリとしてリストを使用するよりも技術的に優れていることを意味します。BSTの実装に応じて、リストより多くのストレージが必要になりますが、それほど多くは必要ありません。
通常、BSTのオーバーヘッドと動作は、実際の状況ではハッシュテーブルバケットとしてテーブルに何ももたらさないことに注意してください。これが、リストの理論的なパフォーマンスの低下を許容する理由です。つまり、ハッシュテーブルは、各リスト(バケット)に配置するアイテムを少なくすることで、リストの弱点を補います。ただし、この問題は、ハッシュテーブルのサイズを大きくすることはできず、ハッシュテーブルでの典型的な衝突よりも頻繁に衝突が発生することを具体的に述べています。
実装
正直なところ、それは本当に必要ではなく、とにかく言語を与えなかったので、ここにコードを入れるつもりはありません。
言語の標準ライブラリに含まれる標準ハッシュテーブルを新しいクラスにコピーし、テーブルバケットタイプをリストからツリーに変更するだけです。言語とその標準ライブラリによっては、これは非常に簡単なことです。
通常、私はこのようなコピーと貼り付けのコーディングを推奨しません。ただし、これは非常に迅速に戦闘テスト済みのデータ構造を取得する簡単な方法です。