2017-11-07 6 views
2

私は現在TCRC Introduction to Algorithms第3版の教科書の第2章を読んでおり、私はこのアルゴリズムのループ不変量の著者の解釈を読んでいます。私は初期化とメンテナンスの両方について著者の論理を理解しています。しかし、終結は、私がうんざりしているものです。著者は終了時に、j = n + 1と主張する。しかし、アルゴリズムの擬似コードでは、jは2からnまでループする。だから、j = n - 1ではないはずですか?挿入ソートアルゴリズムの不変の終了ループでj = n + 1となるのはなぜですか?

EDIT:挿入のための本の擬似コードソートされます。

for j = 2 to A.length 
    key = A[j] 
    // Insert A[j] into sorted sequence A[1...j - 1] 
    i = j - 1 
    while i > 0 and A[i] > key 
     A[i + 1] = A[i] 
     i = i - 1 
    A[i + 1] = key 

EDIT:慎重にそれを読んだ後、私は終了時に、なぜJ = N + 1をようやく理解しています。これはforループが2からn(包括的に)になるためです。したがって、jがnを超えた後にループが終了し、終了時にj = n + 1となる理由です。私は助けに感謝します。

+1

あなたは擬似コードを提供することはできますか? – BlackBear

+0

問題のテキストを入力する必要があります。あなたが何を投稿したかを知る方法はありません。 – Prune

+0

ようこそStackOverflowへ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [on topic](http://stackoverflow.com/help/on-topic)および[How to Ask](http://stackoverflow.com/help/how-to-ask)をここで適用してください。 – Prune

答えて

1

免責事項:これは完全に間違っている可能性があります...それはちょうど脳の唾です。

サイドノート:このループ中にjがインクリメントされるため、開始点は終了条件とは無関係です。

for j = 2 to A.length //A.length = n in your question 

この疑似コードには多少の曖昧さがあります。

最初に、jはこのforループの外側で定義され、ループが終了すると終了値を持つと仮定します。がDukelingさんのコメント

第二に、@見、あなたのコードは、インデクサとしてjを使用して、配列を標的にされていますA[j]

曖昧さは、それが含むかA.length除くされ、for j = 2 to A.lengthに単語toに存在しますか?このインデクサA[j]

は、一般的なケースであり、A[j]でインデクサため、jの有効な範囲は[0...A.length -1]

あるいくつかの言語、すなわち別の範囲、使用しています:[1...A.length]を私がするので、これは作者が意図していると思うA[0]全くヒットしていない。それは(条件をテストし、それが虚偽であることを確認するために)ループを壊す前に

その場合は....とfor条件刻みjは、それから...あなたはj = A.length + 1を取得します。サイドノートとして

:言語のような一般的なC

、配列は[0...A.length -1]から有効範囲を持っています。

そして、このCの例では、cが終了した後A.lengthの値を持っています

int c = 0; 
for (c = 3; c < A.length; c++) 
{ 

} 
//c = A.length after the loop is completed. 
+1

'j'がループの外側に定義されているとは本当に考える必要はありません。' j'は定義されている場所に関係なく最後の時刻をインクリメントします。 – Dukeling

+0

@Dukeling:あなたは最初の部分は正しいですが、2番目の部分については、0のインデックスに焦点を当てると、OPの混乱の原因となったと思います。確かに。 – Stefan

+0

擬似コード規約を読んだ後、著者はOPの擬似コードと同じセクションを使用していますが、著者がインデックスnを指定していると思います(n + 1の位置にあります)。配列の最後の要素 – JoeyCentral

関連する問題