問題は、実数の配列の各要素の頻度を見つけることです。実数の配列の各要素の頻度を見つける最速のアルゴリズム?
まず解はO(n^2):
for (int i = 0; i < a.length; i++) {
if (freq[i] != -1) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] == a[j]) {
freq[i]++;
freq[j] = -1;
}
}
}
}
第二の溶液のO(nlogn):私は2つの解決策が出ている
double[] a = new double[n]
int[] freq = new int[n]
quickSort(a, 0, a.length - 1);
freq[j] = 1;
for (int i = 0; i < a.length - 1; i++) {
if (a[i] == a[i + 1]) {
freq[j]++;
}
else {
j = i + 1;
freq[j] = 1;
}
}
されていますこの問題のためのより高速なアルゴリズムがあります(O(n)かもしれません)? お手数ですがお寄せいただきありがとうございます。
です。「double」の身元を確認するのは良い方法ではありません。 [すべてのプログラマが浮動小数点について知っておくべきこと](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – amit
注釈として、これは要素の区別の問題です。代数木モデルではO(n)解は存在しない。あなたが倍精度のアイデンティティに固執するつもりなら、ハッシュテーブルを使うこともできますが、もう一度 - それは悪い習慣です。 – amit
@amitなぜ上記のようなケースでハッシュテーブルを使用するのが悪い習慣ですか? – sAm