これは宿題ではありません。
最後の N 個のアイテムを最小値で保存するために、小さな「優先キュー」(現時点では配列として実装) を使用しています。これは少し遅いです - O(N) アイテムの挿入時間。現在の実装では、配列内の最大のアイテムを追跡し、配列に収まらないアイテムを破棄しますが、操作の数をさらに減らしたいと考えています。
次の要件に一致するプライオリティ キュー アルゴリズムを探しています。
- queue は配列として実装できますが、これはサイズが固定で、拡張できません。キュー操作中の動的メモリ割り当ては固く禁じられています。
- 配列に収まらないものはすべて破棄されますが、キューはこれまでに遭遇した最小の要素をすべて保持します。
- O(log(N)) の挿入時間 (つまり、要素をキューに追加するには、最大で O(log(N)) かかる必要があります)。
- (オプション) キュー内の *最大* アイテムに対する O(1) アクセス (キューには *最小* アイテムが格納されるため、最大のアイテムが最初に破棄され、操作の数を減らすためにそれらが必要になります)
- 実装/理解が容易。理想的には、二分探索に似たもので、一度理解すると永遠に記憶されます。
- 要素をソートする必要はありません。これまでに遭遇した N 最小値を維持する必要があります。それらが必要になったら、それらすべてに一度にアクセスします。したがって、技術的にはキューである必要はありません。N個の最後の最小値を保存する必要があるだけです。
最初はバイナリ ヒープを使用することを考えていました (配列を介して簡単に実装できます) が、配列がそれ以上大きくならない場合、うまく動作しないようです。リンクされたリストと配列では、物事を移動するのに余分な時間が必要になります。stl プライオリティ キューは大きくなり、動的割り当てを使用します (ただし、これについては間違っている可能性があります)。
それで、他のアイデアはありますか?
--EDIT--
STL 実装には興味がありません。STL 実装 (数人が提案) は、関数呼び出しの数が多いため、現在使用されている線形配列よりも動作が少し遅くなります。
実装ではなく、プライオリティ キューアルゴリズムに興味があります。