リンクリストを扱うCプログラミングクラスの割り当てがあります。リンクリストを効率的に検索
1つの関数は、ルートポインタとIdを取り、リストを検索して削除します。私はすでにこれらのIDに基づいてリンクリストをソートしました。
リンクリストを効率的に検索する方法はありますか?その割り当ては、彼らがより良い方法であることを強く示唆していますが、私はひどく非効率的でなくてはならない、または線形検索を使用することなく、それを行う方法を考えることはできません。
リンクリストを扱うCプログラミングクラスの割り当てがあります。リンクリストを効率的に検索
1つの関数は、ルートポインタとIdを取り、リストを検索して削除します。私はすでにこれらのIDに基づいてリンクリストをソートしました。
リンクリストを効率的に検索する方法はありますか?その割り当ては、彼らがより良い方法であることを強く示唆していますが、私はひどく非効率的でなくてはならない、または線形検索を使用することなく、それを行う方法を考えることはできません。
リンクされたリスト内の各ノードには、次のノード(およびオプションで前のノード)へのポインタしか含まれていないため、リストを検索する唯一の方法は線形です。
ただし、リストをソートするので、プロセスでバイナリツリーを構築できます。その後、そのツリーを使用してO(n)
の代わりにO(log n)
という時間の複雑さでリストを検索することができます。
まだバイナリツリーについて何も学んでいません。うまくいけば、彼はすぐにその資料をカバーします。助けてくれてありがとう – Mitchel0022
単一リンクリストまたはダブルリンクリスト? doubleの場合、バイナリツリーを表現し、log(n)のルックアップ時間を短縮することができます(ただし、バランスの取れたツリーの場合は最適です)。 – karakfa
ソートされた配列を検索する明白な方法は、バイナリ検索することです。次のノードのIDが検索キーより大きい(またはソート方法によってはそれ以下)場合は、検索を終了してパフォーマンスを少し向上させることができます。 ['skip list'](https://en.wikipedia.org/wiki/Skip_list)を実装することで劇的なパフォーマンス向上を得ることができますが、それは非常に大きなアドオンです。 –
誰が良い方法ですか?とにかく、より効率的な検索が必要な場合は、リンクされたリストを捨てて、別のものを使用します。リンクされたリストを線形より速く検索する方法はありません。もちろん、リンクされたリストに加えてツリーや配列などを作成して検索することもできますが、リストを検索することはありません。実際には、リンクされたリストを破棄し、関係なく、何かを使用します。仕事が何であれ、それは仕事のための正しいツールではありません。しかし**あなたの全体の割り当てはそのまま**これは電子を費やす価値がない純粋な推測です –