正しいように見えるが正しくないアルゴリズムと証明の例


15

プログラミングコースの入門では、アルゴリズムが期待どおりに機能することを証明する初期化-メンテナンス-終了方法について学習しています。しかし、すでに正しいことがわかっているアルゴリズムが正しいことを証明するだけで済みました。アルゴリズムが正しくないことを示すように依頼されたことはありません。

正しく見えるが正しくないアルゴリズムの古典的な例はありますか?Initialization-Maintenance-Terminationのアプローチが、一見しただけでは理解できない何かをキャッチするケースを探しています。


5
おそらく興味深い:cs.stackexchange.com/q/29475/755
DW

5
これは非常に重要な教育学的質問だと思うからです。cstheoryの範囲外ですが、私はそれのためのより良いプラットフォームを知りません。cstheoryコミュニティには多くのアルゴリズムのインストラクターがいます。ほとんどのアルゴリズム設計コースでは、正しい既存のアルゴリズムと、既知の手法を使用して簡単に解決できる問題にのみ生徒をさらします。これにより、学生にとって非常に魅力的な印象が強化され、一見もっともらしいアルゴリズムが正しいという直感的な感覚を安全に信頼できます。優れたアルゴリズム設計コースでは、逆のことが行われます。
ニールヤング

3
このようなコレクションが欲しいです。
チャンドラチェクリ

回答:


20

2D極大値

n×nA

(i,j)A[i,j]

A[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

太字のセルはそれぞれ極大値です。すべての空でない配列には、少なくとも1つのローカル最大値があります。

O(n2)

AXXA(i,j)X(i,j)(i,j)

AXAX(i,j)A

AA

(i,j)AA(i,j)

アルゴリズムは、再帰的に自身を呼び出しますn2×n2A(i,j)

T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

したがって、次の定理を証明しました。

O(n)n×n

それとも私たち?


最初に読んだとき、私が見つけた唯一の間違いは、再発の解決策でした。それが唯一の間違いですか?
ラドゥグリゴール

1
繰り返しは正しいです。アルゴリズムは違います!
ニールヤング

1
ああ、はい、私は再発で愚かな間違いを犯しました。私は問題を見ています:あなたが存在することを証明する最大値は(必ずしも)あなたが見つけるものではありません。そして、何あなたが見つけることはXを無視
ラドゥグリゴール

3
(2143300101230001023002222222333233300323000032300)

2
AA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.