質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

3回答

1050閲覧

ループの不変の表明の理解ができていない

konnitiha2

総合スコア30

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/07/16 12:54

下記はクイックソートの疑似コードなのですが、for文の不変の表明が成り立っていないような気がします。
コードの下に私なりにソートされるまでの様子を図にしてみました。
図のtはpivotを表しています。

質問

不変な表明には&&の左側に「l+1からmがx[l]未満である」と書かれていますがそもそも初めてfor文が実行されるタイミングでmとlが同じインデックスを示しているので、l+1はmより右にありますよね?もしそうであれば、l+1からmというのは逆方向を示していておかしくないですか。
同様に、右側も「m+1からi-1がx[l]以上である」と書いてありますが初めてfor文が実行されるタイミングではi-1はm+1よりも左側にある気がします。(わかりにくい文章で申し訳ありません)

不変の表明とは初めてTrueになったタイミングからループを抜けるまでずっとTrueになるということを意味しているのでしょうか
つまり、質問とはfor文のまわり初めの段階ではそもそも比較すらできていないのではないかということです。

よろしければ解答よろしくお願いいたします

void qsort1(l, u){   if (l >= u) return m = l   for i = [l + 1, u]   /* 不変な表明:x[l+1..m] < x[l] && x[m+1..i-1] >= x[l] */  if(x[i] < x[l]) swap(++m, i)  swap(l, m) qsort1(l, m-1) qsort1(m+1, u)

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

それ不変表明なんですかね?
不変表明(invariant)は「ある操作の直前および直後に必ず満たされるべき条件」と考えますが。

投稿2020/07/16 13:10

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

konnitiha2

2020/07/17 02:12

解答ありがとうございます。 参考にしている本にはこのように記載されています。 もう少し考えてみようと思います。 ありがとうございました。
guest

0

存在しない場合は真となる

投稿2020/07/17 05:29

konnitiha2

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

おっしゃる通り、ループ開始時点ではx[l+1..m]やx[m+1..i-1]というものに該当するものが存在しません。つまりこれらは空集合という事になります。
集合論では、空集合はあらゆる集合の部分集合という取り決めがあります。このため、論理学における「PならばQ」という命題において、Pを満たすものが存在しない場合(Pを満たす要素の集合が空集合である場合、あるいはPが常に偽である場合)、この命題は無条件で真となるのです。ミステリーにおいて、Aという人物に完全なアリバイがあって犯行が不可能だとしても(「Aが犯人」が偽だとしても)、Aが犯人と仮定するとそれっぽく辻褄が合ってしまうようなものです。

投稿2020/07/17 02:44

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/07/17 03:02 編集

あー、そーゆーことか。理解した。 範囲 l+1~m 内の任意の要素 L, m+1~i-1 内の任意の要素 U について、 「常に成り立つ」から不変条件か。 んでもって i は最終的に u に到達するから、m を境に 小さい前半 と 大きい後半 に分割される、と。
konnitiha2

2020/07/17 04:09 編集

回答ありがとうございます。つまり不変の表明には論理学の考え方が使われいる。 私が貼った図の一番上の状態ではx[l+1..m]やx[m+1..i-1]が存在しない→空集合であるためTrue、 図の上から2-3こ目の状態では、x[l+1..m]やx[m+1..i-1]が存在し、不変の表明の式がちゃんとTrueになっている。 以上より、このfor文の不変の表明は正しいという認識で正しいでしょうか 追加で一点、x[m+1..i-1]の部分なんですが、x[m+1..i]ではだめなんでしょうか
episteme

2020/07/17 04:23

> x[m+1..i-1]の部分なんですが、x[m+1..i]ではだめなんでしょうか C/C++の配列は 0-origin なので x[N] の最大添字は x[N-1] だからじゃないかと。
konnitiha2

2020/07/17 04:38

お二人ともありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問