0

したがって、BinaryTree をトラバースしており、ノードに文字列が含まれているだけでなく、ファイルの読み取り中に文字列が複数回出現した場合も同様です。ファイルの読み取り中に最も多く出現した上位 10 語のみを探しているので、基本的には int 値を比較しているだけです。

私の問題は、カウント値が大きい場合に新しいノードを比較して挿入する効果的な方法を見つけようとしていることです。それで、私が木を持っているとしましょう...

   5
  /  \
 3    10
/       \

1 15

配列のサイズが 3 しかないとします。配列は 5 まで空なので、1 から始めます。5 に達すると次のようになります...

[1]、[3]、[5]

10 に達すると、すべてよりも大きくなりますが、並べ替えておきたいので、3 を 1 に、5 を 3 に、10 を 5 にシフトする必要があります。これを行うためのより効果的な方法があるかどうかを知りたいです。数字が大きくなるたびにシフトします。10,000 ワード以上のテキスト ファイルを読み取るので、できるだけ高速にしたいと考えています。

別のデータ構造がこれに適している場合は、お知らせください。私はキューまたはリンクリストを考えていましたが、配列はサイズが10しかないため、無駄なスペースが少ないと考えました。私は学生なので、優しくしてください:-x.

4

2 に答える 2

1

1 つの方法は、いくつかのデータ構造を使用することです。Map と Min-Heap を使用する推奨される方法は次のとおりです。

  • ファイルから単語を読み取っているときは、ハッシュ マップ (word, word_count) でそのカウントを維持します。
  • サイズ 10 の最小ヒープを維持します。マップ内の単語を更新するたびに、そのカウントを増やします。このカウントを最小ヒープの最上位要素と比較します。word_count > value_at_top の場合、一番上の要素を置き換えてヒープ化します。
  • ファイルからの読み取りが完了すると、このヒープには、ヒープ内で最も頻繁に使用される上位 10 個の要素が含まれます。
于 2012-10-31T06:55:27.937 に答える
0

うーん、いつでもソートされていない ArrayList にスローして、ソートを実行できます。

List<Node> myArrayList = new ArrayList<Node>();
//Arbitrarily add subtract, replace, etc.
Collections.sort(myArrayList);

それが私の提案です!

于 2012-10-31T06:28:21.367 に答える