【问题标题】:How can I optimise my bogo sort?如何优化我的 bogo 排序?
【发布时间】:2017-02-04 13:58:22
【问题描述】:

我创建了一个 bogo 排序,但想对其进行优化。它随机打乱已拆分为单个字符的字符串。但是,当它对字符进行洗牌时,它可以多次重复随机排列。例如,如果单词是 cat,它可能会尝试 'tac' 或 'act' 但它可能会再次尝试 '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

【问题讨论】:

  • 我不懂python,所以无法为你实现。但是,您可以实施的一个简单解决方案是将每个单词添加到列表中。那么当你找到一个新单词时,如果它已经被添加到列表中,就不要打印它。
  • 我怀疑这种优化实际上不会优化任何东西。检查随机排列是否等于所需的排列可能比检查它是否是您之前尝试过的(可能很多)排列之一更快。我也不确定优化 bogosort 的目的是什么,因为它的全部目的是成为一个非常低效的算法。
  • 这真的很重要吗?此外,测试是否已经发生随机排列可能比检查列表是否已排序更昂贵。相反,您可以系统地枚举排列,以便每个排列只生成一次。

标签: algorithm python-3.x sorting


【解决方案1】:

能实现吗?

是的,当然。其他人已经想出了解决这个问题的办法。您可以使用Heap's AlgorithmSteinhaus-Johnson-Trotter Algorithm 而不是shuffle。两种算法都以精确的 N ! 个步骤生成所有可能的 N ! 个排列。

这也将修复一个隐藏的错误。来自random.shuffle(x)documentation

请注意,即使对于小的 len(x),x 的排列总数 可以快速增长大于大多数随机数的周期 发电机。这意味着 长序列的大多数排列可以 永远不会生成。例如,一个长度为 2080 的序列是 在 Mersenne Twister 随机周期内可以拟合的最大 数字生成器。

该错误可能不会出现在您的用例中,但最好还是修复它(记住 y2k 问题)。

【讨论】:

  • 不是我不被允许,只是我一般不会因为一个小错误而编辑别人的帖子。 :)
  • 我对 y2k 问题不熟悉
  • 这是过去的问题。许多开发人员认为他们的软件会在 2000 年(= y2k)之前过时并被遗忘,因此他们将年份保存为两位数:19XX。然而,在 1999 年,该软件仍在使用中,可能会导致意外行为(人们的年龄为负数等)。
【解决方案2】:

对于 Python,特别是有 itertools 模块,itertools.permutations 生成所有可能排列的迭代器。您还可以看到谁可以在那里实现这样的功能。

只是为了好玩:您甚至可以使用以下 sn-p 模拟 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.")

【讨论】:

  • itertools.permutations 返回一个迭代器,而不是随机播放时需要使用的列表。我认为你需要使用perms = list(itertools.permutations(word))
  • @Blckknght 你是对的!忘记写那个了。以上编辑。
  • 感谢您的帮助,这是一种有趣的做事方式,可惜您可以做的字符数量有限
【解决方案3】:

这种方法将优化 bogo 排序:

import itertools as itr
def BogoSort(lst):
    perms=list(itr.permutations(lst))
    idx=0
    while True:
        lst=perms[idx]
        for i in range(len(lst)-1):
            if lst[i]<lst[i+1]:
                continue
            else:
                break
        else:
            break
        idx+=1
    print("attempts:",idx+1)
    return lst
        
lst=[9,8,7,6,56,33,0]
print("Sorted Numbers:",*BogoSort(lst))

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2020-06-15
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多