2017-02-12 2 views
0

私はこの機能に少し問題があります。9文字のすべての順列を見つける

def check_possible(input): 
    possibilities = [] 
    solutions = [] 


    dict = dictionary(input) 
    dict.get_dict() 

    words = dict.get_all_words() 

    for L in range(0, len(input)+1): 
     for subset in itertools.permutations(input, L): 
       possibilities.append(subset) 


    for possibility in possibilities: 
     poss = "".join(possibility) 
     if len(poss) > 3 and len(poss) < 9: 
      for item in words: 
       for i in item: 
        if poss in i: 
         solutions.append(poss) 
    return solutions 

は基本的には、パラメータとして9つの文字でリストを取り、そして3及び9文字の間であり、辞書にある利用可能なすべての順列のリストを生成する(26個の辞書ファイルを使用して、各文字のための1、作成しますリスト内に与えられた各文字のサブリスト、次に上記の関数によって生成されたすべての置換をチェックする)。

ので、この関数は返す必要があります:

>>input = ['a', 'b', 'd', 'c', 'e', 'b', 'd', 'e', 'f'] 
<<['dace', ..., 'face', 'decaf', 'bedad', 'ceded', 'faded', 'faced', 'beaded', 'deface', 'decade', 'defaced'] 

この作品、およびそれが正しい値を返しますが、それは10の間になります - 完了するまでに15分。私は同じ結果を達成する方法があるが、より短い時間(好ましくは、1分以内)であるかどうか疑問に思います。

+0

関数内にないときに 'return'は何をしますか? –

+0

私の謝罪は、それは機能にあると考えられていた。 – Notgivinit

+1

[itertools.permutations()](https://docs.python.org/2/library/itertools.html#itertools.permutations)があなたのために作業を行うことができます。ドライ! –

答えて

1

あなたの現在のランタイムの複雑さは、文字から生成された各単語について、辞書全体を線形時間で調べて見つけようとすることです。これは、辞書のサイズが大きくなるにつれて、実際には遅くなります。したがって、複雑さはO(K * D)です。ここで、Kは生成されたサブセットの数です。Dは辞書のサイズです。

あなたが最適化できることの1つは、辞書内の単語を検索することです。あなたはPython setで辞書を保存することができます。これは、任意の要素に対して一定の時間検索をサポートします。これにより、複雑さが改善され、セットの作成にはO(D)、単語のチェックにはO(K)となります。これは全体的にO(D + K)の複雑さにつながり、O(D * K)よりはるかに優れており、おそらく数分ではなく数秒で実行されます。

+0

文字の順列を生成するのに15分かかります。比較部分は比較的高速です(カップル秒)。私はあなたの答えを正しく理解することを願っています。 – Notgivinit

+0

それは正しいとは思わない。順列の数は(9!+ 8!+ 7!+ ..)、これらは約500kであり、数秒で生成されるはずです。実際には私はあなたの最初のループを試して、それは私のマシン上でわずかに実行されます。 –

+0

はい、私は謝罪しました、私は今私のエラーを見た。明日、私はセットを使うための機能を修正します。特別な比較方法を使用して、順列の項目の方が速くなるようにするか、または単に「平文でitem:print(item)内の項目」にしますか?私はまだ初心者ですから、勉強しようとしています。 – Notgivinit

関連する問題