3

メモリに関する制約がない場合、特定の配列を O(n) で重複してソートするアルゴリズムはありますか?

4

2 に答える 2

12

場合によります。下限と上限の両方(および最大精度/値の長さ)で入力を何らかの方法でバインドできる場合は、基数ソートを使用できますO(n). 同様に、バケット ソートO(n)は最良の場合でも複雑になる可能性がありますがO(n^2)、悪い入力の場合は悪化します。

ただし、一般に、入力をバインドできず、比較ベースの並べ替えを使用する必要がある場合は、それO(n log n)が最適であることを証明できます。

固定精度整数または浮動小数点数 (通常は最大 64 ビット) をソートする場合、値は効果的に制限され、基数ソートが可能になります。

値の最大ビット長が制限されている場合でも、ビット長が長いほど、定数は大きくなります。実際、並べ替える n 個の値があり、各値の長さまたは精度が最大 m ビットである場合、アルゴリズムの複雑さは O(nm) になります。

于 2012-09-03T01:20:26.690 に答える
4

はい。スペースの複雑さに関する制限がない場合は、配列を o(n) 時間の複雑さでソートできます。

  • k (k =10) 要素の配列があるとします。
  • そして(みましょう)あなたの配列は次のとおりです:N [2,6,4,4,1,1,9,5,2,2]

  • さて、私たちの考慮事項として、スペースに関する制限はありません。

  • サイズ p の 2 次元配列 (temp_number[i][j]) があり (理論的には、p は無限であると見なされます)、インデックス i に何らかのフラグが含まれ、インデックス j にリンク リストが含まれているとします。

ここで、配列 N のすべての要素が temp_number[ ][ ] のインデックスに配置されるように temp_number[ ][ ] を埋め、フラグ = 1 にし、それ以外の場合はフラグ = 0 を保持します。

temp_number[0][1] = [1][1->1->null]
 temp_number[1][1] = [1][2->2->2->null]
 temp_number[2][1] = [0][3->null]
 temp_number[3][1] = [1][4->4->null]
 temp_number[4][1] = [1][5->null]
temp_number[5][1] = [1][6->null]
temp_number[6][1] = [0][null]
temp_number[7][1] = [0][null]
temp_number[8][1] = [1][9->null] & so on...
  • これで、単一のループでflag=1を持つすべての要素を取得できます。
  • ここでは、このようにしているのではないことに注意してください

    if(number1 > number2) { //ソートロジック... }

    したがって、ここではループが1 つしかないため、複雑度 0(n) を取得できます。

于 2012-09-04T08:49:13.277 に答える