0

2 つのループを使用せずに配列内のアイテムの頻度をカウントする方法があることを知る必要があります。これは、配列のサイズを知らずに行われます。配列のサイズがわかっている場合は、ループせずにスイッチを使用できます。しかし、それよりも汎用性が必要です。クイックソートを変更すると、より良い結果が得られると思います。

Array[n];

TwoDArray[n][2];

最初のループは Array[] に進み、2 番目のループは要素を見つけて 2 次元配列でカウントを増やします。

max = 0;
for(int i=0;i<Array.length;i++){

found= false;

for(int j=0;j<TwoDArray[max].length;j++){

if(TwoDArray[j][0]==Array[i]){
TwoDArray[j][1]+=;
found = true;
break;
}
}

if(found==false){
TwoDArray[max+1][0]=Array[i];
TwoDArray[max+1][1]=1;
max+=;
}

コメントしたり、より良い解決策を提供したりできれば、非常に役に立ちます。

4

3 に答える 3

1

これを実装するには、マップまたはハッシュ テーブルを使用します。キーを配列項目として挿入し、値を頻度として挿入します。

または、配列要素の範囲が大きすぎない場合は、配列も使用できます。配列要素に対応するインデックスの値の数を増やします。

于 2013-06-20T04:48:31.890 に答える
0

これがマップやハッシュ テーブルを使用するよりも優れていると言っているわけではありません (特に重複が多い場合はそうではありませんが、その場合、特定の手法で O(n) ソートに近づけることができるため、これもそれほど悪くはありません。 )、それは単なる代替手段です。

  • 配列をソートする

  • (単一の) for ループを使用して、並べ替えられた配列を反復処理します。

    • 前の要素と同じ要素が見つかった場合は、現在のカウントをインクリメントします

    • 別の要素が見つかった場合は、前の要素とそのカウントを保存し、カウントを 1 に設定します

    • ループの最後に、前の要素とそのカウントを保存します

于 2013-06-20T14:03:13.837 に答える
0

配列内の項目をキーとし、その項目の数を値とするマップを作成します。配列を 1 回パスして、カウントを含むマップを作成します。アイテムごとに、マップでカウントアップを確認し、カウントを増やして、新しいカウントをマップに戻します。

マップの put 操作と get 操作は、一定の時間で実行できます (たとえば、適切なハッシュ関数と適切なサイズのバッキング ストアを備えたハッシュ マップの実装を使用する場合)。これは、配列内の要素の数に比例して時間の頻度を計算できることを意味します。

于 2013-06-20T04:52:10.987 に答える