如何优化我的bogo排序?

时间:2017-02-04 13:58:23

标签: algorithm python-3.x sorting

我创建了一个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

3 个答案:

答案 0 :(得分:2)

  

是否有可能实现这个目标?

是的,当然。其他人已经想出了解决这个问题的方法。您可以使用Heap's AlgorithmSteinhaus-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