多項式と指数のソリューション、および小さなフットプリントの問題の例?


8

私は今秋、アルゴリズムクラスを教えるときに「実験」を実行する予定です。非常に古い、制限されたコンピューター(主な制限要因はおそらくメモリ(おそらく16KB))と1つのモダン/標準のコンピューターです。遅いコンピューターで実行されている多項式の問題と、速いコンピューターで指数関数の問題を解決するという考えです(そしてもちろん、遅いものが勝ちます)。

問題は、適切な問題を見つけることです。非常に限られたサイズのインスタンスでは実行時間が実際に異なる(そして、好ましくは、データ構造が非常に単純な、プリミティブコンピューターが…プリミティブである)問題です。もともとはソートアルゴリズム(たとえば、2次と線形)について考えていましたが、(bogosortを使用した場合を除き)非常に大きなインスタンスが必要になります。

現在、私が考えた唯一の(かなり退屈な)例は、フィボナッチ数を賢く愚かな方法で計算することです。少し疲れている/使いすぎない、できれば(半)明らかに役立つ何かがあればいいでしょう。アイデア/提案はありますか?


実際、私は疑似多項式(「フィボナッチランクの線形」)と超指数関数的(再帰的)ソリューションを使用して問題を解決することを計画していました。重要な点は、複雑さの明らかな違いです。これにより、弱いコンピュータが簡単に勝つことができます。
Magnus Lie Hetland '25

1
2者間最大重量マッチング(ハンガリー語対ブルートフォース)?
Jukka Suomela、2011年

回答:


6

Neelのコメントをいくぶん一般化する答えは、検索と動的プログラミングの領域を調べることです。これは、覚えていれば素晴らしいパフォーマンスを発揮し、そうでなければひどく機能する素晴らしいアルゴリズムでいっぱいです-考えていた退屈な階乗関数でさえ、これに該当しますカテゴリー。

もちろん、遅いコンピュータのメモリ上限によって制限されますが、それは、高速なコンピュータに対して十分に「意味がある」ことに注意しなければならないことを意味していると思います。具体的なアイデアは次のとおりです。

  • 大きな無向グラフを前提として、2点間のパスを見つけます。高速なコンピューターは、グラフを介して(公正、または終了しない可能性があります!)ランダム検索を実装しますが、低速のコンピューターは穏やかに幅優先または深さ優先の検索を実行します。おそらく、パフォーマンスの違いが顕著になるように、これを複数の試行で実行する必要があります。
  • 有向グラフを取得し、2点間の最短経路を見つけようとします。高速コンピューターはすべての非周期的経路を列挙し(すべてのステップで亀とウサギのサイクル検出アルゴリズムを使用し、bwahahahaha)、低速コンピューターは辛抱強く単一ソースの最短経路を実行します道。
  • 編集距離アルゴリズム?ダイナミックプログラミングよりもナイーブなアルゴリズムは、おそらくここで完全に詰まるでしょう。

最後のアイデアの1つは、(不要な)オカレンスチェックの有無にかかわらず、Prologでいくつかのアルゴリズムを試すことができるということです。しかし、意味的に意味のある発生なしのプロローグがより高速であることをそれらの学生にどれほど素晴らしく見せるか、チェックが速いなら、私は泣きます。また、これは通常、多項式対指数関数ではなく、線形対二次関数です。


9

正規表現マッチングを行うことができます。単純なバックトラッキングマッチャーは、よりスマートなマッチャーが線形時間で処理できる入力の指数動作に簡単にプッシュできます。



1

あなたがアルゴリズムを教えているなら、私はあなたが考えを説明する単純な何かをするべきだと思います。あなたの並べ替えアルゴリズムのアイデアは非常に良いものだと思います。おそらく、プリミティブコンピュータで非再帰アルゴリズムを試してみればうまくいくでしょう。

私は現在、並べ替えアルゴリズムを比較しています。32KBのRAMを搭載したコンピューターで、17,000個の要素を使用してヒープ並べ替えを実行しています。

挿入ソートとヒープソートを試してみます。


しかし、現代のコンピューターでの17000要素の挿入ソートはかなり高速です。(この質問はすでにこれを暗示しています。)
Radu GRIGore 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.