これはほぼ 3 年前に私に尋ねられたインタビューの質問であり、私はしばらく前にこれについて熟考していました.
次の操作をサポートするデータ構造を設計します: insert_back()、remove_front()、および find_mode()。最高の複雑さが必要です。
私が考えることができる最良の解決策は、挿入と削除に O(logn) 、モードに O(1) でした。これが私がそれを解決した方法です。挿入および削除される要素を処理するためのキュー DS を保持します。また、最大ヒープ順の配列とハッシュ テーブルを保持します。ハッシュテーブルには、整数キーと、その要素のヒープ配列の場所へのインデックスが含まれています。ヒープ配列には順序付けられたペア (カウント、要素) が含まれ、カウント プロパティで順序付けられます。
Insertion : 要素をキューに挿入します。ハッシュテーブルからヒープ配列インデックスの場所を見つけます。存在しない場合は、要素をヒープに追加し、上向きにヒープ化します。次に、最終的な場所をハッシュテーブルに追加します。その場所のカウントを増やし、必要に応じて上向きまたは下向きにヒープ化し、ヒープ プロパティを復元します。
削除 : キューの先頭から要素を削除します。ハッシュ テーブルから、ヒープ配列インデックス内の場所を見つけます。ヒープ内のカウントを減らし、必要に応じて上向きまたは下向きに再ヒープして、ヒープ プロパティを復元します。
検索モード: 配列ヒープ (getMax()) の先頭にある要素がモードを示します。
誰かがより良いものを提案してください。考えられる唯一の最適化は、フィボナッチ ヒープを使用することでしたが、それがこの問題に適しているかどうかはわかりません。