我创建了一个bogo排序但想要优化它。它会随机混洗一个已拆分为单个字符的字符串。然而,当它改变角色时,它可以多次重复随机排列。例如,如果单词是cat,它可能会尝试“tac”。或者'行动'但它可以尝试“尝试”。再次。我想对它进行编码,因此它只尝试一次置换,但我不确定如何做到这一点。这是我在python中的代码。是否有可能实现这个目标?
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 :(得分:2)
是否有可能实现这个目标?
是的,当然。其他人已经想出了解决这个问题的方法。您可以使用Heap's Algorithm或Steinhaus-Johnson-Trotter Algorithm代替shuffle
。两种算法都在exatcly N !步骤中生成所有可能的 N !排列。
这也可以解决隐藏的错误。来自random.shuffle(x)
的{{3}}:
请注意,即使是小len(x),x的排列总数也是如此 可以快速增长大于大多数随机数的时期 发电机。这意味着长序列的大多数排列都可以 永远不会被生成。例如,长度为2080的序列是 最大的,可以适应梅森Twister期间随机 数字生成器。
在您的用例中可能不会出现该错误,但是仍然可以修复它(请记住y2k问题)。
答案 1 :(得分:0)
对于Python,特别是itertools
模块和itertools.permutations
生成所有可能排列的迭代器。您还可以看到可以在那里实现这样的功能。
只是为了好玩:您甚至可以使用以下代码段模拟 bogo-sort:
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.")
答案 2 :(得分:0)
这种方法将优化bogo排序:
ObservableList