2017-02-04 12 views
-1

私はbogoソートを作成しましたが、最適化します。 1つの文字に分割された文字列をランダムにシャッフルします。しかし、文字をシャッフルすると、ランダム置換を複数回繰り返すことができます。たとえば、単語がcatの場合、 'tac'や 'act'を試してみることができますが、もう一度 'tac'を試すことができます。私はそれをコード化したいので、一回だけ順列を試みますが、どうやってこれを行うのかは分かりません。これはPythonの私のコードです。これを実装することは可能でしょうか?bogoソートを最適化するにはどうすればよいですか?

import random 

i=0 
valid = False 
while not(valid): 
    word = input("Enter word to be mixed > ") 
    if len(word) <= 1: 
     ("not valid!") 
    else: 
     valid = True 

wordlist = list(word) 

resorted = False 
while not (resorted): 
    random.shuffle(wordlist) 
    i += 1 
    print ("attempts", i) 
    print (wordlist) 
    if list(word) == wordlist:   
     print ("Sorted!") 
     break 
+0

:あなたもちょうど次のスニペットと BOGOソートをシミュレートすることができます。ただし、実装できる簡単なソリューションの1つは、各単語をリストに追加することです。新しい単語を見つけたら、それが既にリストに追加されている場合は印刷しないでください。 – nhouser9

+0

私はこの最適化が実際に何かを最適化するつもりはないと思う。ランダム順列が目的の順列と等しいかどうかを確認することは、以前試みた(おそらく多くの)順列の1つであるかどうかを確認するよりもおそらく早いでしょう。私はまた、ボゴソートの最適化のポイントが本当によく分からない。なぜなら、その目的はひどく非効率的なアルゴリズムであるためだ。 – Blckknght

+2

これは本当に重要ですか?ランダム置換がすでに発生しているかどうかをテストすることは、リストがソートされているかどうかを確認するよりもおそらく高価になります。その代わりに、順列を体系的に列挙して、それぞれが一度だけ生成されるようにすることができます。 – Henry

答えて

2

これを実装することは可能でしょうか?

はい、もちろんです。他の人は既にその問題の解決策を考え出していました。 shuffleの代わりにHeap's AlgorithmまたはSteinhaus-Johnson-Trotter Algorithmを使用できます。どちらのアルゴリズムもすべて可能です。N!現時点での順列。Nステップ。

これにより、隠されたバグも修正されます。でも小さいlen(x)は、X の順列の総数はすぐに最も乱数ジェネレータ の期間より大きく成長することができます

注:​​random.shuffle(x)のから。これは、の長いシーケンスの順列は が決して生成されないことを意味します。例えば、長さ2080のシーケンスは、メルセヌント・ツイスター・ランダム 番号ジェネレータの期間内に収まる最大の です。

バグは、おそらくあなたのユースケースには発生しませんが、それは(Y2K問題を覚えて)それにもかかわらず、それを修正するために良いことです。

+0

私はそれが許されていないわけではありません。ちょうど1つのマイナーなタイプミスのために私は一般的に他人の投稿を編集しません。 :) – MSeifert

+0

y2kの問題に精通していない – funguy

+0

これは過去の問題です。多くの開発者は、ソフトウェアが2000年(= y2k)以前には古いと忘れ去られていると考えていたので、19XXという2桁の数字で年を保存しました。しかし、1999年にはソフトウェアはまだ使用されており、予期しない動作(負の年齢を持つ人々など)につながる可能性があります。 – Socowi

0

具体的には、itertoolsモジュールがあり、itertools.permutationsはすべての可能な置換のイテレータを生成します。また、そのような関数を誰がどこに実装できるかを見ることができます。ちょうど楽しみのため

:私はので、私はあなたのためにこれを実装することはできませんのpythonを知らない

import itertools 
import random 

word = input("Enter the word to be mixed >") 
perms = list(itertools.permutations(word)) 

# This is the random part: 
random.shuffle(perms) 

print("Needed", perms.index(tuple(word)), "attempts.") 
+1

'itertools.permutations'はイテレータを返します。シャッフル時に使用する必要があるリストは返しません。私はあなたが 'perms = list(itertools.permutations(word))'を使う必要があると思います。 – Blckknght

+0

@Blckknghtそうです!それを書くのを忘れてしまった。上記で編集されました。 – Hannes

+0

おかげで面白いやり方をしてくれてありがとうございました。あなたができる文字の量には限界があります – funguy

関連する問題