Wenxin Yiyan VS Xunfei Xinghuo VS chatgpt (72) -- アルゴリズム 7.1 の紹介 3 つの質問

3. PARTITION の時間計算量が、サイズ n の部分配列上で Θ(n) であることを簡単に証明してください。

一言で言えば:

まず最初に、PARTITION 関数の具体的な定義を明確にする必要があります。PARTITION 関数は、クイックソート アルゴリズムでよく使用されます。このアルゴリズムでは、一方の部分配列のすべての要素がもう一方の部分配列のすべての要素よりも小さくなるように、配列を 2 つの部分配列に分割します。

PARTITION 関数の基本的なプロセスは次のとおりです。

1. 「ベース」要素 (通常は配列の最初の要素) を選択します。

2. 配列を反復処理し、各要素をベンチマークと比較します。

3. 要素がデータムより小さい場合は、データムの左側に配置し、そうでない場合は右側に配置します。

4. 最後に、配列内の参照要素の位置が PARTITION の分割点になります。

PARTITION の時間計算量が Θ(n) であることを証明しましょう。

1. 最悪の場合、PARTITION は配列内のすべての要素を走査する必要があります。したがって、時間計算量は少なくとも O(n) になります。

2. 最良の場合、配列がすでに順序付けされている場合、PARTITION は分割点を見つけるために n-1 回比較するだけで済みます。したがって、時間計算量は最大でも O(n) です。

したがって、PARTITION の時間計算量は Θ(n) であると結論付けることができます。

ここに画像の説明を挿入

シュンフェイ・スパーク:

証明: 配列AAとするAの長さはnですnの場合、配列を 2 つの部分配列に分割します。1 つは長さiii、および長さn − i nini (0 < i < n 0< i< n0<<n )。

各部分配列について、PARTITION 演算の時間計算量を計算できます。長さiiの場合iの部分配列iii要素を 2 つの部分に分けます。したがって、時間計算量は O(i) です。長さn − i niの場合niの部分配列( n − i ) (ni)( ni )要素を 2 つの部分に分けます。したがって、時間計算量も O(ni) になります。

これら 2 つの操作は連続して実行されるため、合計の時間計算量は O(i)+O(ni)=O(n) となります。これは、スケールnnでnの部分配列では、PARTITION の時間計算量はΘ ( n ) \Theta(n)Θ ( n )

ここに画像の説明を挿入

360 スマートブレイン:

まず、PARTITION アルゴリズムの機能は、サイズ n の配列を 2 つのサブ配列に分割し、左側のサブ配列の要素値が要素値以下になるようにすることであることを明確にする必要があります。右のサブ配列の。

次に、再帰的メソッドを使用して PARTITION アルゴリズムを実装できます。具体的には、配列の最初の要素から走査を開始し、この要素をセパレータとして使用し、配列を 2 つのサブ配列に分割します。左側のサブ配列はセパレータ以下で、右側のサブ配列はセパレータ以下です。区切り文字より大きい配列。次に、すべての部分配列が分割されるまで、左と右の部分配列に対して同じことを再帰的に実行します。

再帰のプロセスでは、配列が 2 つのサブ配列に分割されるたびに、配列全体を 1 回走査する必要があります。配列のサイズは n であるため、合計 n 回走査する必要があります。各走査の時間計算量は O(n) であるため、PARTITION アルゴリズムの合計時間計算量は Θ(n^2) です。

ただし、PARTITION アルゴリズムでは配列を 1 回分割するだけでよいため、その時間計算量は最悪の場合 O(n) にまで低下する可能性があります。これを証明するために、PARTITION アルゴリズムの最悪の場合の時間計算量は O(n) であると仮定できます。この場合、配列は完全にリンク リストに分割されており、各要素はリンク リストのノードであると考えることができます。この時点で、リンクされたリスト全体を走査して区切り文字を見つける必要があり、時間計算量は O(n) です。

したがって、PARTITION は、サイズ n の部分配列に対して時間計算量 Θ(n) を持ちます。

ここに画像の説明を挿入

チャットグラム:

PARTITION アルゴリズムは、配列を 2 つの部分配列に分割するクイックソート アルゴリズムの一部です。一方の部分配列のすべての要素は、もう一方の部分配列のすべての要素よりも小さくなります。以下は、PARTITION アルゴリズムの時間計算量の証明です。

入力配列の長さが n であると仮定すると、PARTITION アルゴリズムは n 回の再帰を実行する必要があります。各再帰では、ピボット要素を選択し、配列を 2 つのサブ配列に分割する必要があります。一方のサブ配列のすべての要素はピボット要素より小さく、もう一方のサブ配列のすべての要素はピボット要素より大きくなります。 。
各再帰では、ピボット要素を見つけるために配列全体を走査する必要があります。したがって、各再帰の時間計算量は O(n) です。PARTITION アルゴリズムは n 回の再帰を実行する必要があるため、合計の時間計算量は O(n^2) です。

ただし、PARTITION アルゴリズムでは、再帰ごとに配列が 2 つのサブ配列に分割され、一方のサブ配列のすべての要素がもう一方のサブ配列のすべての要素よりも小さいことに注意する必要があります。したがって、再帰の過程で、配列のサイズは徐々に減少します。具体的には、k 回の再帰の後、配列の長さは n - 2^k になります。

したがって、PARTITION アルゴリズムの合計時間計算量は次のように表すことができます。

T(n) = ΣT(n - 2^k) (k は 0 から log2(n) まで)

このうち、T(n - 2^k) は、配列の長さが n - 2^k の場合の PARTITION アルゴリズムの実行時間計算量を表します。再帰の性質に従って、上記の式を次のように変形できます。

T(n) = ΣO(n - 2^k) (k は 0 から log2(n) まで)

= O(n log2(n))

したがって、PARTITION アルゴリズムの時間計算量は O(n log2(n)) です。log2(n) の増加率は n よりもはるかに遅いため、PARTITION アルゴリズムの時間計算量は O(n) であると考えることができます。

ここに画像の説明を挿入

トンイ・チェンチアン:

マージソートの考え方を使用して、PARTITION の時間計算量が Θ(n) であることを証明できます。

まず、配列全体を 2 つのサブ配列に分割し、それぞれが PARTITION 操作を再帰的に実行します。2 つのサブ配列が分割された後、2 つのサブ配列の中央の位置を新しい開始点として使用し、同じ長さの 2 つのサブ配列が分割されるまで 2 つのサブ配列を両側に拡張します。

このプロセスは 2 つのソートされた配列をマージすることで実装でき、その時間計算量は O(n) です。配列全体に対して PARTITION 演算を実行する必要があるため、サイズ n の部分配列に対する PARTITION の時間計算量は Θ(n) です。

ここに画像の説明を挿入

天宮:

PARTITION は、順序付けされた配列を 2 つの部分に分割し、各部分の要素が特定の条件を満たすようにする古典的なアルゴリズムです。このアルゴリズムの時間計算量は通常 O(n) であることが証明されていますが、特殊な場合には、より高速な時間計算量が達成される場合もあります。

サイズ n の部分配列上で PARTITION の時間計算量が Θ(n) であることを証明しましょう。

まず、PARTITION アルゴリズムの基本的な考え方を次の疑似コードとして表現できます。

function PARTITION(A, p, r)
    if p < r
        pivot = A[r]
        i = p - 1
        for j = p + 1 to r
            if A[j] > pivot
                i = i + 1
                swap A[i] with A[j]
        swap A[i+1] with A[r]
        return i + 1
    else
        return p

このうち、A は順序配列、p と r はそれぞれ分割される部分配列の左と右の端点です。アルゴリズムの主な考え方は次のとおりです。配列の右端からトラバースを開始し、ピボット (ピボット) として要素を見つけ、ピボットより小さい要素を左に移動し、ピボットより大きい要素をピボットに移動します。右に移動し、最後に左に移動する の部分配列が返されます。

次に、このアルゴリズムの時間計算量が Θ(n) であることを証明しましょう。アルゴリズムの時間計算量が Θ(k) であると仮定すると、次のようになります。

T(n) = 1 + 2 + ... + k = k * (k + 1) / 2
n = T(n) = k * (k + 1) / 2

ここで、T(n) は、サイズ n の部分配列を 2 つの部分に分割するために必要な演算の最小数を表します。このアルゴリズムの時間計算量は Θ(k) であるため、次のとおりです。

T(n) <= n * log(n)

ここで、log(n) は底 2 の対数を表します。したがって、次のことを証明する必要があります。

k * (k + 1) / 2 <= n * log(n)

この不等式については、数学的帰納法を使用して証明できます。まず、k = 1 の場合、明らかに不等式が成り立ちます。k = m の場合、次の不等式が成り立つと仮定します。

k * (k + 1) / 2 <= m * log(m)

次に、k = m + 1 の場合、次を証明する必要があります。

(m + 1) * (m + 2) / 2 <= m + 1 + log(m + 1)

単純化すると、次のようになります。

m^2 + 3m <= m^2 + 3m + 1 + log(m + 1)

転置後、次のようになります。

log(m + 1) - 1 <= 0

対数関数の定義域は正の実数であるため、log(m + 1) - 1 は 0 以下、つまり log(m + 1) <= 1 でなければなりません。これは、m + 1 <= 2、つまり m <= 1 を意味します。これは、m = m という仮定と矛盾するため、この仮定は成り立ちません。したがって、PARTITION アルゴリズムの時間計算量は Θ(n) であることが証明されます。

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

チャットポイント:

PARTITION アルゴリズムの時間計算量が Θ(n) であることを証明する前に、まず PARTITION アルゴリズムの概念を理解しましょう。

PARTITION アルゴリズムは、クイック ソート アルゴリズムの中核部分の 1 つです。これは、配列を 2 つの部分に分割し、特定の要素より小さい値を左側に、特定の要素より大きい値を右側に配置します。簡単に言うと、配列内の要素を再配置し、インデックスの左側の要素がインデックスに対応する要素より小さく、右側の要素がインデックスに対応する要素より大きくなるようにインデックス値を返します。 。

ここで、PARTITION アルゴリズムの時間計算量が Θ(n) であることを証明しましょう。

まず、PARTITION アルゴリズムの基本的な操作である比較と交換を理解する必要があります。

PARTITION アルゴリズムでは、比較演算を使用して、配列内の要素と特定の要素間のサイズ関係を比較します。各比較演算には、O(1) として示される一定の時間がかかります。

スワップ操作は、特定の要素より小さい値が左側に配置され、特定の要素より大きい値が右側に配置されるように、配列内の要素の位置を交換するために使用されます。各スワップ操作にも、O(1) で示される一定時間がかかります。

PARTITION アルゴリズムでは、ループを通じて配列を調べ、特定の要素より小さい値が見つかったときにスワップ操作を実行します。ループの数は配列の長さに依存し、各ループには比較および交換操作が必要です。

したがって、PARTITION アルゴリズム全体の時間計算量は、T(n) = O(n) + T(n-1) として表すことができます。ここで、T(n-1) は、サイズ n のサブアレイの除算演算を表します。複雑さは 1 倍。

T(n) を再帰的に展開すると、次が得られます。

T(n) = O(n) + O(n-1) + O(n-2) + … + O(1)

O(1) はどの定数でも同じであるため、上記の式は次のように簡略化できます。

T(n) = O(n) + O(n-1) + O(n-2) + … + O(1) = O(n + (n-1) + (n-2) + … + 1 )

右側の式は、算術シーケンスの合計公式にさらに簡略化できます。

T(n) = O(n + (n-1) + (n-2) + … + 1) = O((n+1)*n/2)

等差数列の和の公式によれば、(n+1)*n/2 は n(n+1)/2 に簡略化でき、次のようになります。

T(n) = O(n(n+1)/2) = O(n^2/2 + n/2) = O(n^2)

上記の証明は上限、つまり PARTITION アルゴリズムの時間計算量の上限であるため、PARTITION アルゴリズムでは比較要素のサイズに応じて基本演算の実行回数が減少することがわかります。つまり、実際には最悪の場合でもループ回数はn回に達しない。

経験と実践により、ランダムな入力配列の場合、PARTITION アルゴリズムの平均サイクル数は線形、つまり Θ(n) であることが証明されています。これは、ランダム化されたクイックソートの平均的なケースによって証明できます。

したがって、実際の状況と経験によれば、PARTITION アルゴリズムの時間計算量は、サイズ n のサブ配列では Θ(n) であると結論付けることができます。

ここに画像の説明を挿入

ここに画像の説明を挿入

要約する

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_48502062/article/details/132146781