さて、あなたは近くにいます-しかし、ソートされた配列からの挿入/削除はO(n)
(確率1/2で、挿入された要素は配列の前半にあり、右にシフトする必要があるため)、まだ何かが欠けています以下のすべての要素、およびこれらの少なくともn / 2があるため、この操作の全体的な複雑さはO(n)
平均+最悪の場合です)
ただし、ソートされたDSをスキップリスト/バランスの取れたBSTに切り替えると、O(logn)
挿入/削除とO(1)
最小/最大/中央値/サイズ(キャッシュあり)が表示されます。
編集:
O(logN)
挿入の場合は(にを減らさない限りpeekMedian()
)Omega(logN)
、より適切に並べ替えることができるため、より適切に並べ替えることはできませんO(NlogN)
。
まず、中央値は、挿入する「高」要素ごとに1つの要素を右に移動することに注意してください(ここでは、高は> =現在の最大値を意味します)。
したがって、繰り返し実行することにより、次のようになります。
while peekMedian() != MAX:
peekMedian()
insert(MAX)
insert(MAX)
ソートされた配列の「上位」半分を見つけることができます。
同じアプローチを使用するとinsert(MIN)
、配列の下半分を取得できます。
o(logN)
(小さなo表記、Theta(logN)
挿入とO(1)よりも優れていると仮定すると、より優れpeekMedian()
たソートが得られますO(NlogN)
が、ソートにはOmega(NlogN)
問題があります。
=> <=
したがって、中央値はまだですが、insert()
それよりも優れていることはありません。O(logN)
O(1)
QED
EDIT2:挿入の中央値を変更します:
挿入前のツリーサイズが2n+1(奇数)の場合、古い中央値はインデックスn + 1にあり、新しい中央値は同じインデックス(n + 1)にあるため、要素が古い中央値の前に追加された場合-最後の中央値の前のノードを取得する必要があります-それが新しい中央値です。その後に追加された場合は、何もしないでください。古い中央値も新しい中央値になります。
リストが偶数(2n要素)の場合、挿入後にインデックスを増やす必要があります(nからn + 1に)。したがって、新しい要素が中央値の前に追加された場合は何もしません。古い要素の後に追加された場合は何もしません。中央値、古い中央値から次のノードとして新しい中央値を設定する必要があります。
注:ここでは、次のノードと前のノードはキーに従って続くノードであり、インデックスはノードの「場所」を意味します(最小が最初で最大が最後)。
私は挿入のためにそれを行う方法を説明しただけで、同じ考えが削除にも当てはまります。