2012-05-02 12 views
8

が、私はそれが文字の特定のセットのためのアナグラムを生成作っています、私の現在のアプローチは、以下のとおりです。 反復を伴わない順列のためのアルゴリズム?プログラムで

  1. は、すべての文字のすべての組み合わせを取得
  2. 各併用群
  3. の順列を取得します。
  4. ソート結果の並べ替えアルファベット順
  5. 私の質問は、順列の数学に関連するエントリが重複

を削除します。私はそれが可能な場合、配列のサイズを計算することが可能ですか?複写されたエントリを削除した後に残っているすべてのエントリを保存する必要があるかどうかは疑問です。

私の質問の漠然としたことについてお詫び申し上げますが、私はまだ組み合わせと順列についてもっと研究しています。私は、組み合わせと順列の理解が広がり、自分のプログラムに慣れてきたら(私は去年の夏の私の余暇プロジェクトでした)、私の目標を詳述しようとします。

+0

[改変なしの変型/並べ替え](http://stackoverflow.com/questions/1900197/generating-variations-without-repetitions-permutations-in-java)をご覧ください。さまざまなソリューションがいくつかあります。 – hariprasad

答えて

2

もしn要素、及び一つの要素のa[0]複製、別の要素のa[1]複製などa[k]までを持っている場合は、(重複まで)異なる順列の総数はn!/(a[0]! a[1]! ... a[k]!)あります。

FYIあなたがGuavaで、興味があるなら、あなたは

Collection<List<Character>> uniquePermutations = 
    Collections2.orderedPermutations(Lists.charactersOf(string)); 

を書くことができ、その結果、重複し、すべての会計処理、文字のユニーク順列だろう。 .size()メソッドを呼び出すこともできますし、ヒントの実装を調べることもできます。 (開示:私はグアバに貢献します)

+0

彼は重複の数を求めていませんでした。 – keuleJ

+1

"重複エントリの削除後に残りのエントリをすべて格納するのに必要な配列サイズを計算することが可能かどうかは疑問です。"それは私にはっきりとした順列の数を求めているようです。 –

+0

はい/いいえ質問のように私に聞こえます:) – aviad

0

すべての置換を生成することは本当に悪い考えです。たとえば、「オーバーフロー」という単語には40320の置換があります。あなたの単語の長さが増えるにつれて、メモリ消費量は本当に高くなります。

あなたが解決しようとしている問題は、ある単語が別の単語のアナグラムであるかどうかを調べるまで減らすことができます。

次に、各文字が何回出現するか(26タプルになる)をカウントし、これらのタプルを互いに比較することで解決できます。

関連する問題