Aquí hay un patrón bastante común para los algoritmos de clasificación:
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]
Estos algoritmos funcionan bien porque los índices i
y j
se eligen cuidadosamente, en función del estado de la lista l
.
Sin embargo, ¿qué pasaría si no pudiéramos ver l
y solo tuviéramos que elegir a ciegas? ¿Qué tan rápido podríamos ordenar la lista entonces?
Su desafío es escribir una función que genere un par aleatorio de índices, dada solo la longitud de l
. Específicamente, debe generar dos índices i, j
, con 0 <= i < j < len(l)
. Su función debería funcionar en cualquier longitud de la lista, pero se puntuará en una lista de longitud 100.
Su puntaje es el número medio de opciones de índice necesarias para ordenar una lista aleatoria uniforme de manera aleatoria de acuerdo con el patrón anterior, donde los índices se eligen de acuerdo con su función.
Calificaré las presentaciones, tomando el número medio de opciones de índice de más de 1000 ensayos en una lista aleatoria uniformemente aleatoria de longitud 100 sin entradas repetidas.
Me reservo el derecho de realizar menos pruebas si la presentación es claramente no competitiva o no finaliza, y realizaré más pruebas para diferenciar a los principales competidores para encontrar un único ganador. Si varias presentaciones principales permanecen dentro del margen de error en el límite de mis recursos computacionales, declararé la presentación anterior como ganadora, hasta que se puedan obtener más recursos computacionales.
Aquí hay un ejemplo de programa de puntuación, en 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
Es posible que su función no mantenga ningún estado mutable, interactúe con variables globales, afecte la lista l
, etc. La única entrada de su función debe ser la longitud de la lista l
y debe generar un par ordenado de enteros en el rango [0, len(l)-1]
(o apropiado para el idioma de su idioma). lista de indexación). No dude en preguntar si hay algo permitido en los comentarios.
Los envíos pueden estar en cualquier idioma de uso gratuito. Incluya un arnés de puntuación si aún no ha publicado uno para su idioma. Puede publicar un puntaje provisional, pero dejaré un comentario con el puntaje oficial.
La puntuación es el número medio de pasos para una lista ordenada en una lista aleatoriamente uniforme de longitud 100. Buena suerte.
fuente
Respuestas:
Python, puntuación = 4508
Half-Life 3 confirmado.
Python, puntaje = 11009
Aparentemente, un tipo de burbuja aleatorio no hace mucho peor que un tipo de burbuja normal.
Distribuciones óptimas para longitud pequeña.
No hay forma de que esto se pueda extender a la longitud 100, pero es interesante mirar de todos modos. Calculé distribuciones óptimas para casos pequeños (longitud ≤ 7) usando el descenso de gradiente y mucho álgebra matricial. La columna k muestra la probabilidad de cada intercambio a la distancia k .
fuente
h
es la distancia entre los elementos intercambiados; No representa el frente ni la parte posterior.Puntuación: 4627
Pruébalo en línea!
Emite índices aleatorios cuya distancia se elige de manera uniforme
[1,1,4,16]
. La idea es tener una combinación de intercambios de 1 paso con intercambios a escalas más grandes.Ajusté manualmente estos valores para listas de longitud 100, y es probable que estén lejos de ser óptimos. Algunas búsquedas automáticas probablemente podrían optimizar la distribución por distancias para la estrategia de pares aleatorios con la distancia elegida.
fuente
Puntuación: 28493
Pruébalo en línea!
Esta solución solo selecciona valores distintos
x
yy
aleatoriamente del rango y los devuelve en orden ordenado. Por lo que puedo decir, esto funciona mejor que elegir yx
luego elegiry
entre los valores restantes.fuente
Python, puntuación: 39525
Pruébalo en línea.
fuente
Python, puntuación ≈ 5000
Probado con un montón de valores de épsilon, 0.25 parece ser el mejor.
Puntuación ≈ 8881
Un enfoque diferente. No es tan bueno, y muere horriblemente con una longitud no divisible por el número de segmentos, pero aún así es divertido de construir.
fuente
Puntuación: 4583
Pruébalo en línea!
No tengo idea de por qué. Acabo de probar las secuencias enumeradas en wikipedia artical para shellsort . Y este parece funcionar mejor. Obtiene una puntuación similar con la publicada por xnor .
fuente
candidates
debería funcionar salir de la función como variable global.Pitón 2 , 4871
Pruébalo en línea!
fuente