2017-02-04 2 views
-1

Я создал тип bogo, но хочу его оптимизировать. Он случайным образом перемещает строку, которая была разделена на отдельные символы. Однако, когда он перемещает символы, он может повторять случайную перестановку более одного раза. Например, если слово 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

Я не знаю, питона, так что я не могу реализовать это для вас. Однако одним простым решением, которое вы можете реализовать, является добавление каждого слова в список. Затем, когда вы найдете новое слово, не печатайте его, если оно уже добавлено в список. – nhouser9

+0

Я подозреваю, что эта оптимизация на самом деле не собирается оптимизировать что-либо. Проверка того, что случайная перестановка равна требуемой перестановке, вероятно, быстрее, чем проверка того, является ли она одной из (возможно, многих) перестановок, которые вы пробовали раньше. Я также не совсем уверен, какой смысл оптимизировать богосор, так как это целая цель - быть ужасно неэффективным алгоритмом. – Blckknght

+2

Действительно ли это имеет значение? Кроме того, чтобы проверить, действительно ли произошла случайная перестановка, вероятно, стоит дороже, чем проверка сортировки списка. Вместо этого вы можете систематически перечислить перестановки, чтобы каждый из них генерировался только один раз. – Henry

ответ

2

Можно ли осуществить это?

Да, конечно. Другие люди уже придумали решение этой проблемы. Вы можете использовать Heap's Algorithm или Steinhaus-Johnson-Trotter Algorithm вместо shuffle. Оба алгоритма генерируют все возможные N! перестановки в exatcly N! шагов.

Это также устранит скрытую ошибку. Из documentation из random.shuffle(x):

Обратите внимание, что даже при малых Len (х), то общее число перестановок х может быстро расти больше, чем период большинства случайных чисел генераторов. Это означает, что большинство перестановок длинной последовательности может никогда не генерироваться. Например, последовательность длиной 2080 является наибольшей величиной , которая может вписываться в период произвольного генератора чисел Mersenne Twister.

Ошибка, вероятно, не произойдет в вашем прецеденте, но все же полезно исправить ее (помните о проблеме y2k).

+0

Не то, чтобы мне не разрешили просто, что я вообще не редактирую сообщения других людей только из-за одной незначительной опечатки. :) – MSeifert

+0

Я не знаком с проблемой y2k – funguy

+0

Это проблема прошлого.Многие разработчики предположили, что их программное обеспечение будет старым и забытым до 2000 года (= y2k), поэтому они сэкономили годы как двухзначное число: 19XX. Однако в 1999 году программное обеспечение все еще использовалось и могло привести к неожиданному поведению (люди с отрицательным возрастом и т. Д.). – Socowi

0

Для Python специально существует модуль itertools, а itertools.permutations генерирует итератор всех возможных перестановок. Вы также можете увидеть, какая такая функция может быть реализована там.

Просто для удовольствия: Можно даже просто имитировать Бого-то со следующим фрагментом:

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

Смежные вопросы