整数のストリームを読み込んだとします。同じ整数がストリームに複数回現れることがあります。今では、最も頻繁に出現するN個の整数のキャッシュを保持したいと考えています。キャッシュは、ストリーム要素の頻度によってソートされます。最も頻繁な要素をキャッシュするデータ構造
どのようにJavaで実装しますか?
整数のストリームを読み込んだとします。同じ整数がストリームに複数回現れることがあります。今では、最も頻繁に出現するN個の整数のキャッシュを保持したいと考えています。キャッシュは、ストリーム要素の頻度によってソートされます。最も頻繁な要素をキャッシュするデータ構造
どのようにJavaで実装しますか?
int、insideのオブジェクトモデルを作成してCountプロパティを作成します。 Vectorコレクションを拡張するSortedVectorコレクションを作成します。整数が現れるたびに、ベクトルが存在しない場合はベクトルに追加します。それ以外の場合は、countプロパティ+ = 1を更新して、Vector内のCollections.sort(this)を呼び出します。
あなたは番号の範囲を知っています使用しますか?もしそうなら、配列を使うのが理にかなっています。たとえば、数値の範囲が0から10の間であることがわかっていたら、サイズ10の配列を作成します。この配列の各要素は、指定した数を見た回数を数えます。次に、最も頻繁に見られる番号を覚えておくだけです。
array[10];
freq_index = -1;
freq_count = -1;
readVal(int n){
array[n]+=1;
if array[n] > freq_count
freq_index = n;
freq_count = array[n];
}
数字の分布がまばらな場合はもちろん、このアプローチは悪いです。
私は優先キューを試してみました。
あなたがバイナリインデックス付きの木を使用したい、リンク内のコードは(コードAFAICT同じになる)C++のためのものであり、Javaのに変換することはかなり簡単です:
public class MyData implements Comparable<MyData>{
public int frequency = 0;
public Integer data;
@Override
public int compareTo(MyData that) {
return this.frequency - that.frequency;
}
}
それはこれに興味深い部分は、それらの数を処理する方法であるPriorityQueue
に保存されています現在トップNキャッシュには存在しない。キャッシュ内のストリームから固定数の異なる整数のみを格納する必要がありますか? – Joel