Вот довольно распространенный шаблон для алгоритмов сортировки:
def sort(l):
while not is_sorted(l):
choose indices i, j
assert i < j
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
Эти алгоритмы работают хорошо, потому что индексы i
и j
выбираются тщательно, исходя из состояния списка l
.
Однако, что, если мы не могли видеть l
, и просто пришлось выбирать вслепую? Как быстро мы могли бы отсортировать список тогда?
Ваша задача - написать функцию, которая выводит случайную пару индексов, учитывая только длину l
. В частности, вы должны вывести два индекса i, j
, с 0 <= i < j < len(l)
. Ваша функция должна работать с любой длиной списка, но она будет оценена в списке длиной 100.
Ваша оценка - это среднее число вариантов выбора индексов, необходимых для сортировки равномерно случайно перемешанного списка в соответствии с описанным выше шаблоном, где индексы выбираются в соответствии с вашей функцией.
Я оцениваю количество заявок, принимая среднее число вариантов индекса за 1000 испытаний в равномерно случайно перемешанном списке длиной 100 без повторяющихся записей.
Я оставляю за собой право проводить меньше испытаний, если заявка явно неконкурентная или не прекращается, и я буду проводить больше испытаний, чтобы выделить лучших конкурентов и найти единственного победителя. Если на верхнем уровне моих вычислительных ресурсов останется несколько лучших заявок, я объявлю более раннюю отправку победителем до тех пор, пока не будут использованы дополнительные вычислительные ресурсы.
Вот пример программы скоринга в Python:
import random
def is_sorted(l):
for x in range(len(l)-1):
if l[x] > l[x+1]:
return False
return True
def score(length, index_chooser):
steps = 0
l = list(range(length))
random.shuffle(l)
while not is_sorted(l):
i, j = index_chooser(length)
assert (i < j)
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
steps += 1
return steps
Ваша функция может не поддерживать любое изменяемое состояние, взаимодействовать с глобальными переменными, влиять на список l
и т. Д. Единственным вводом вашей функции должна быть длина списка l
, и она должна выводить упорядоченную пару целых чисел в диапазоне [0, len(l)-1]
(или в соответствии с вашим языком. индексация списка). Не стесняйтесь спрашивать, разрешено ли что-то в комментариях.
Материалы могут быть на любом бесплатном языке. Пожалуйста, включите привязной ремень, если он еще не был опубликован для вашего языка. Вы можете опубликовать предварительную оценку, но я оставлю комментарий с официальным результатом.
Оценка - это среднее число шагов в отсортированном списке в равномерно случайно перемешанном списке длиной 100. Удачи.