理論的なコンピューターサイエンスで高速アルゴリズムとはどういう意味ですか?


18

ある問題A で時間で実行されているアルゴリズムがあり、誰かが時間で実行されているアルゴリズムを考え出す場合、、以前のアルゴリズムよりも改善されていると考えられますか?O(f(n))O(f(n)/g(n))g(n)=o(f(n))

理論的なコンピューターサイエンスの文脈において、このようなアルゴリズムを考案することは理にかなっていますか?


4
「より高速なアルゴリズム」とは、「漸近的に高速なアルゴリズム」を意味します。
ユヴァルフィルマス

@YuvalFilmus「漸近的に」とはどういう意味ですか
未定義

1
時間内に実行。o(f(n))
ユヴァルフィルマス

回答:


26

いいえ、時間で実行されるアルゴリズムは、必ずしも改善とは見なされません。たとえば、およびと仮定します。その場合、はよりも悪い時間限界です。O(f(n)/g(n))g(n)=o(f(n))f(n)=ng(n)=1/nO(f(n)/g(n))=O(n2)O(f(n))=O(n)

時間で実行されているアルゴリズムを改善するには、時間で実行されているアルゴリズム、つまり、関数時間でアルゴリズムを作成する必要があります。f(n)o(f(n))g(n)g(n)=o(f(n))

あなたが知っているすべては時間でアルゴリズムを実行することをである場合には、アルゴリズムは、時間に実行されているかどうかは明らかではないの改善で、どんなです。これは、大きなOが実行時間の上限に過ぎないためです。代わりに、最悪の場合の時間の複雑さを考慮し、それを単なる大きなではなく、大きなとして推定するのが一般的です。O(f(n))O(g(n))f(n),g(n)ΘO


21
最初の段落でを取る方が良いかもしれません。減少関数を使用すると、少しずるい感じがします。g(n)=1
デビッドリチャービー

1
@DavidRicherby:少しかもしれませんが、OPは実行されているアルゴリズムがあるとは決して言っていないので、単調性を仮定することはできません。O(g(n))
ケビン

7
@Kevinもちろんですが、コンテキストはコンピューターサイエンスであり、コンピューターサイエンスでは、通常、減少しない関数にはbig-O表記が使用されます。おそらく、質問者はそれらの用語で考えていたでしょう。
デヴィッドリチャービー

11

ことを思い出してくださいの表記は、タスクは、乗法因子、低次の項、および定数外異なる入力の大きさ、特に葉のための成長方法を分析することを意味します。O(...)

実際のランタイムがあるアルゴリズムがあると仮定します(実際に命令を数え、正確なタイミングなどを知ることができると仮定すると、これは確かに現代のシステムでは大きな仮定です)。次に、たまたまである新しいアルゴリズムを思いついたとしても、実際の実行時間はです。また、このアルゴリズムを使用するソフトウェアが問題サイズを見ることはないと知っているとします。O(n2)1n2+2n+1O(n)1000n+5000n>10

では、どちらを選択しますか-15000単位の時間を要するアルゴリズム、または121単位のみを要するアルゴリズム ソフトウェアが問題サイズの処理に進化した場合、どれを選びますか?問題のサイズが大きく異なる場合はどうしますか?O(n)O(n2)n>100000


2
「決してN> 10の問題の大きさを見ていない」 -そして我々は、すべてのOの表記を使用していないと思います私たち...だろう
AnoE

5
@AnoE引数のための単純な数字。問題サイズが10対1e5であるか、1e6対1e9であるかを分析する場合でも、同じロジックが適用されます。
twalberg

1
@AnoEほとんどのコンピュータープログラムは、無限に増大する問題のサイズを処理しようとしません。そのため、トレードオフが発生します。そのため、big-Oは理論的なコンピューターサイエンスのためのものであり、この概念は実際のプログラムを改善するために適用できます。
mbomb007

まさに、@ mbomb007。質問のタイトルは、「理論的なコンピューターサイエンスで高速なアルゴリズムとはどういう意味ですか?」です。そして彼はこれを体内に持っています:「理論的なコンピューター科学の文脈において、それは理にかなっています...」。
AnoE

@AnoE経験から、O表記は常にn <10のときに使用されます!それは良いアイデアではありません...しかし、それは完全に完了したものです!
コートアンモン-復帰モニカ

5

一般に、それは、入力のサイズが十分に大きい場合、古いアルゴリズムの最悪の場合の実行時間は新しいものよりも遅いことを意味します。これは、形式と同等です。ここで、は新しいアルゴリズムの時間複雑度、は古いアルゴリズムの時間複雑度です。g(n)o(f(n))gf

ただし、コンピューター科学者は、平均的なケースのパフォーマンスを重視する場合があります。古典的な例はクイックソートです:最悪の場合の実行時間はあるのに対し、時間で実行される他の人は知っていますが、平均ケースが良いため実際に広く使用されています実行時間。さらに、配列がほとんど正しい順序であるなど、野生で最も頻繁に発生する場合に非常に迅速に実行するように微調整することができます。Θ(n2)Θ(nlogn)

そして時には、理論的なコンピューター科学者でさえ、普通の人と同じように「高速」に使用します。たとえば、文字列クラスのほとんどの実装には、短い文字列の最適化(小さい文字列の最適化とも呼ばれます)がありますが、短い文字列の処理速度を上げるだけで、長い文字列の純粋なオーバーヘッドです。入力サイズがますます大きくなると、SSOを使用したString操作の実行時間は短い一定の期間だけ長くなるため、最初の段落で定義したように、StringクラスからSSOを削除すると「高速になります」しかし、実際には、ほとんどの文字列は小さいため、SSOを使用すると、文字列を使用するほとんどのプログラムが高速になります。また、ほとんどのコンピューターサイエンスの教授は、漸近的な時間の複雑さだけを話すように要求するよりもよく知っています。


1

「より高速なアルゴリズム」とは何かという統一された定義はありません。アルゴリズムが他のアルゴリズムよりも速いかどうかを決定する管理機関はありません。

これがなぜなのかを指摘するために、この曖昧な概念を示す2つの異なるシナリオを提供したいと思います。

最初の例は、順序付けられていないデータのリンクリストを検索するアルゴリズムです。配列を使用して同じ操作を実行できる場合、パフォーマンスの大きなOhメジャーに変更はありません。両方の検索はO(n)です。Ohの大きな値だけを見ると、まったく改善しなかったと言えるかもしれません。ただし、ほとんどの場合、配列検索はリンクリストを歩くよりも高速であることがわかっているため、大きなOhが変更されていなくても、アルゴリズムが「高速」になったと判断する場合があります。

ロボットをプログラミングしてPBJサンドイッチを作成する従来の例を使用する場合、別の方法の意味を示すことができます。ピーナッツバターの瓶を開けるポイントだけを考えてください。

Pick up the jar
Grab the lid
Unscrew the lid

Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Grab the lid
Unscrew the lid

私が考えることができる最も学術的な理論的設定でさえ、あなたは、大きなOh記法の結果が同じであっても、最初のアルゴリズムが2番目のアルゴリズムよりも速いことを人々が受け入れることに気付くでしょう。

対照的に、RSA暗号化を破るアルゴリズムを検討できます。現時点では、このプロセスはおそらくO(2 ^ n)であると認識されています。ここで、nはビット数です。n ^ 100をより速く実行する新しいアルゴリズムを考えてみましょう。これは、私の新しいプロセスがO(2 ^ n / n ^ 100)で実行されることを意味します。ただし、暗号の世界では、指数アルゴリズムへの多項式の高速化は、従来、理論的な高速化とはまったく考えられていません。セキュリティの証明を行う場合、攻撃者がこれらのスピードアップの1つを発見する可能性があり、効果がないと想定されています。

したがって、ある状況では、O(n)をO(n)に変更して、より速く呼び出すことができます。別の状況では、O(2 ^ n)をO(2 ^ n / n ^ 100)に変更することができ、意味のあるスピードアップがまったくなかったと主張します。これが、「より高速なアルゴリズム」に対する統一された定義が存在しないと言う理由です。常に文脈依存です。


1

まだコメントすることはできませんが、現在の答えは、正確で有益なものではあるが、この質問の一部には取り組んでいないように感じます。最初に、と同等の式を記述しましょう。A(n)O(f(n))

 0cf< lim supnA(n)f(n)=cf

今、私たちが話していると仮定する任意増加関数私たちは機能を作成でき。g(n)lim supng(n)=h(n)=f(n)g(n)

「改善された」アルゴリズムのランタイムはことが与えられます。元のアルゴリズムのランタイムもます。これは次のように書くことができます。A(n)O(h(n))A(n)O(h(n))

 0ch< lim supnA(n)h(n)=ch

制限の規則を使用して、次のように書くこともできます。

ch=lim supnA(n)h(n)=lim supnA(n)g(n)f(n)=cflim supng(n)

以来場合、これは真であることができる。ch<cf=0

反対の文は次のとおりです場合、。cf0A(n)O(h(n))

すなわち、上の"改善"であるという追加の条件下と任意に増加しています。A(n)A(n)A(n)Θ(f(n))g(n)

さらに、これは、がが「改善」であるかどうかについて結論を出すほど強くないというステートメントを示す必要があります。要するに、はすでにます。A(n)O(f(n))A(n)A(n)O(h(n))


1
あなたの制限は、上限を超えている必要があります。
ユヴァルフィルマス

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