k番目に大きい要素の高速検索をサポートするキューデータ構造を必要とする問題に直面しています。
このデータ構造の要件は次のとおりです。
キュー内の要素は必ずしも整数である必要はありませんが、互いに比較可能である必要があります。つまり、2つの要素を比較すると、どちらが大きいかがわかります(同じでもかまいません)。
データ構造は、エンキュー(末尾の要素を追加)およびデキュー(先頭の要素を削除)をサポートする必要があります。
キュー内でk番目に大きい要素をすばやく見つけることができます。plsnotekは定数ではありません。
エンキュー、デキュー、およびk番目に大きい要素の検索操作はすべて同じ頻度で発生すると想定できます。
私の考えは、修正された平衡二分探索木を使用することです。このツリーは、すべてのノードiが別のフィールドn iで拡張されていることを除いて、通常の平衡二分探索ツリーと同じです。niは、ルートノードiを持つサブツリーに含まれるノードの数を示します。前述の操作は次のようにサポートされます。
簡単にするために、すべての要素が異なると仮定します。
Enqueue(x):xが最初にツリーに挿入され、対応するノードがノードtであると仮定して、pair(x、pointer to node t)をキューに追加します。
デキュー:(e1、ノード1)が先頭の要素であり、ノード1がe1に対応するツリーへのポインターであるとします。ツリーからノード1を削除し、キューから(e1、ノード1 )を削除します。
K番目に大きい要素の検出:ルートノードがノードルートであり、その2つの子がノード左とノード右(すべて存在すると仮定)であると仮定すると、Kをnルートと比較します。3つのケースが発生する可能性があります。
K <nが残っている場合、nルートの左側のサブツリーでK番目に大きい要素が見つかります。
K> n root -n rightの場合、 nrootの右側のサブツリーで(Kn root + n right)番目に大きい要素が見つかります。
それ以外の場合、nルートは必要なノードです。
3つの操作すべての時間計算量はO(log N)です。ここで、Nは現在キューにある要素の数です。
上記の操作を高速化するにはどうすればよいですか?どのようなデータ構造とどのように?