これはインタビューの質問です: 、、および でSet
クラスを実装します。get
put
getRandom
次のオプションを検討します。
- ソート済み/未ソートの連結リスト:
get
- O(N),put
- O(N),getRandom
- O(N) - ソートされていないベクトル (サイズ変更可能な配列):
get
- O(N),put
- ?,getRandom
- O(1) - ソートされたベクトル (サイズ変更可能な配列):
get
- O(logN),put
- ?,getRandom
- O(1) - ハッシュテーブル:
get
- O(1),put
- O(1),getRandom
- O(テーブルサイズ) - 平衡二分探索木:
get
- O(logN),put
- O(logN),getRandom
- O(N)
最良の候補は次のようです。
get/put
よりもはるかに頻度が高い場合は、ハッシュ テーブルgetRandom
getRandom
よりもはるかに頻繁な場合は、並べ替えられたベクトル (サイズ変更可能な配列)get/put
ベクトルとハッシュ テーブルを何らかの方法で組み合わせて、より良いセットを構成できないかと考えています。