O(n) 時間と O(1) 空間での重複の検索: 詳細な説明
提示された問題には重複の特定が含まれます0 から n-1 までの範囲の数値を含む配列内の要素。課題は、これを O(n) 時間の計算量内で、一定 (O(1)) のメモリ空間のみを使用して効率的に達成することにあります。
提示されたソリューションでは、ハッシュ テーブルやその他の追加データを必要としない独創的な手法が採用されています。構造物。代わりに、配列自体の値を利用して、重複する要素を識別してマークします。
配列の並べ替え:
内側のループは並べ替えます。次のロジックに基づく配列:
while A[A[i]] != A[i] swap(A[i], A[A[i]]) end while
この置換ステップにより、配列内に要素 x が存在する場合、そのインスタンスの少なくとも 1 つが A[x] に配置されることが保証されます。これは後続のステップで重要です。
重複の識別:
外側のループは各要素 A[i]:
[ を検査します。 &&&] for i := 0 ~ n - 1 A[i] != i の場合 A[i]を印刷します 終了する場合 end forfor i := 0 to n - 1 if A[i] != i then print A[i] end if end forA[i] != i の場合、i が配列内の適切な場所に存在しないことを意味します。したがって、これは重複要素であり、出力されます。
時間複雑性分析:
この手法は O(n) 時間で実行されます。 。ネストされたループには、n 回反復する外側のループと、最大で n - 1 回の反復を実行する内側のループがあります (交換するたびに 1 つの要素が正しい位置に近づくため)。したがって、反復の総数は n*(n - 1) によって制限され、これは O(n^2) ですが、n*(n - 1) = n^2 - n として O(n) に単純化できます。 = n(n - 1) = n*n - n空間複雑性分析:
アルゴリズムは、入力のサイズに関係なく、定数スペースのみを使用します。重要な洞察は、置換に使用されるスペースが入力配列内にすでに存在しているということです。追加のストレージ構造は必要ありません。追加メモ:
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3