Вот довольно распространенный шаблон для алгоритмов сортировки:
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. Удачи.
источник
Ответы:
Питон, оценка = 4508
Half-Life 3 подтвержден.
Python, счет = 11009
По-видимому, рандомизированная пузырьковая сортировка не делает все намного хуже, чем нормальная пузырьковая сортировка.
Оптимальные распределения для малой длины
Это никак не может быть расширено до длины 100, но в любом случае интересно посмотреть. Я вычислил оптимальные распределения для небольших случаев (длина ≤ 7), используя градиентный спуск и множество матричной алгебры. В столбце k показана вероятность каждого обмена на расстоянии k .
источник
h
это расстояние между замененными элементами; это не представляет спереди или сзади.Счет: 4627
Попробуйте онлайн!
Вывод случайных индексов, расстояние между которыми выбирается равномерно
[1,1,4,16]
. Идея состоит в том, чтобы иметь комбинацию одношаговых свопов со свопами в больших масштабах.Я вручную подправил эти значения для списков длиной 100, и они, вероятно, далеки от оптимальных. Некоторый машинный поиск мог бы, вероятно, оптимизировать распределение по расстояниям для стратегии случайной пары с выбранным расстоянием.
источник
Счет: 28493
Попробуйте онлайн!
Это решение просто выбирает различные значения для
x
иy
случайным образом из диапазона и возвращает их в отсортированном порядке. Насколько я могу судить, это работает лучше, чем выбор, аx
затем выборy
из оставшихся значений.источник
Питон, оценка: 39525
Попробуйте онлайн.
источник
Питон, оценка ≈ 5000
Опробовано несколько значений эпсилона, 0,25 кажется лучшим.
Оценка ≈ 8881
Другой подход. Не так хорошо, и он ужасно умирает с длиной, не делимой на количество сегментов, но все же интересно строить.
источник
Счет: 4583
Попробуйте онлайн!
Понятия не имею почему. Я только что попробовал последовательности, перечисленные в Википедии, artical для сортировки оболочек . И этот, кажется, работает лучше всего. Он получил аналогичный счет с одним опубликованным xnor .
источник
candidates
выход из функции в качестве глобальной переменной должен работать.Python 2 , 4871
Попробуйте онлайн!
источник