変更リストを別のシステムにプッシュするシナリオがあります。各リストには、挿入、更新、または削除された通知が 0 個以上含まれています。
挿入は簡単です。通知には、ターゲット インデックスとアイテムへのポインターが含まれます。更新は簡単です。アイテムへのポインターを渡します。
削除は簡単に思えます。削除するアイテムのインデックスを渡す必要がありますが、どうすればインデックスを知ることができますか? インデックスはゼロから始まり、連続している必要がありますが、挿入時に作成します。そのため、各項目に対して作成したインデックスを追跡する必要があります。
たとえば、 map: でこれを行うことができますがstd::map<item*, int>
、アイテムを削除すると、それ以降のすべてに番号を付け直す必要があります。これは O(N) です。
これらのアイテムのリストは、O(N) 反復が受け入れられないほど大きくなります。この問題は解決されたと確信していますが、解決策が何と呼ばれるかはわかりません。「リンクされたリスト」に関連するものを検索すると、大量のノイズが発生します。
考えられる解決策の 1 つはスキップ リストです。サブリスト内の各ノードは、スキップするメイン リスト内のノードの数を認識しています。スキップ リストの検索は O(log N) であるため、移動しながら追跡し、インデックスを見つけることができます。 O(log N)、O(log N) 内のアイテムも削除します。
ただし、スキップ リストの実装はやり過ぎのように思えます...もっと簡単な解決策はありますか?
編集:
あなたの提案に感謝しますが、スキップリストがここでこの問題を解決する正しい方法であると確信していると思います.