web-dev-qa-db-ja.com

ソートのカウントに関する基本的な前提。 kはBig Ohとどのように関連していますか?

私はソートを数えることについて(Cormen)を読んでいます。
私はアルゴリズムの構造を理解していますが、ステートメント:

実際には、k = O(n)の場合は通常、カウントソートを使用します。この場合、実行時間はTheta(n)です。

私の心にははっきりしていません。

kは、入力で予期される整数の範囲です。

なぜこのステートメントでkの漸近表記が使用されるのですか?わかりません。

4
user10326

あなたの引用は、整数kの範囲がコレクションnの要素の総数に線形に比例している場合、カウントソートはO(n)のベストケースとワーストケースの時間の複雑さを持ち、そのような場合、非常に効率的なソートです。

Big Oh(およびBachman-Landauファミリーのその他の表記法)は、特定の場合における関数の正確な複雑さの単純化であり、Nが大きくなるにつれて関数の増加する値を示すために使用されます。プログラミングでは、Big Ohは通常、時間の複雑さのコンテキストで使用されます。 n個の値の場合、関数f(n)はg(n)のオーダーで一度に実行されます。したがって、O(g(n) )ただし、Big Ohの数学的構造はそれほど制限されていません。この特定のケースでは、kとNの間の一般的な関係を数値として参照するために使用されています。

簡単に言えば、nがO(n)のオーダーで増加するようにk(n要素のコレクションの値の範囲)が増加すると、カウントソートが効率的になります。これは、たとえば、リストに1とxの間の4の倍数がすべて含まれている場合に当てはまります(この場合、k〜= x、およびn = x/4、つまりk〜= 4n = O(n)を意味します)。条件k = O(n)は、たとえば、1からxまでのすべての完全な正方形のセットに対してfalseになります。2 (その場合、k = x2 しかしn = xなので、k = n2 = O(n2))。その場合、kは正方形(O(n2))Nが線形に増加するとき(O(n))、したがって、カウントソートはより複雑な時間で実行されます(これはO(n2))、Theta(nlogn)で実行された他のソート実装よりもパフォーマンスが低下します。

2
KeithS

カウントソートの複雑さはO(max(k、n))なので、k = O(n)の場合、ソートはO(n) =時間。

0
kevin cline

少なくとも私が解釈すると、それは入力の範囲と入力の数がちょっと似ていると言っているだけです[編集:少なくとも誤解されていますが、複雑さはTheta(n)の条件であり、それは常に真実であるということです。]

たとえば、通常のestimeは、それぞれが32ビットまたは64ビットのような1000、100万、または10億の入力に対して妥当です。

当面は、実際には終了しないという事実を無視して、3桁の入力が500桁(または10,000桁)ある場合にどうなるかを検討してください。そのような場合、個々の加算を実行するのにかかる時間が大幅に増加し始める可能性があります[編集:つまり、一定ではなくなります]。そのため、Theta(n)は正確ではなくなります。通常の場合、定数の要素であるため、追加の時間は無視できます。

0
Jerry Coffin