Esto es parte de un programa que analiza las probabilidades del póquer, específicamente Texas Hold'em. Tengo un programa con el que estoy contento, pero necesita algunas pequeñas optimizaciones para ser perfecto.¿Cuál es la forma más rápida de ordenar una matriz de 7 enteros?
que utilizan este tipo (entre otros, por supuesto):
type
T7Cards = array[0..6] of integer;
Hay dos cosas acerca de esta matriz que pueden ser importantes al momento de decidir cómo ordenar que:
- Cada artículo es un valor de 0 a 51. No hay otros valores posibles.
- No hay duplicados. Nunca.
Con esta información, ¿cuál es el manera más rápida de ordenar esta matriz? Yo uso Delphi, así que el código pascal sería el mejor, pero puedo leer C y pseudo, aunque un poco más lentamente :-)
Por el momento, uso el quicksort, pero lo curioso es que esto casi no es más rápido que bubblesort! Posible debido a la pequeña cantidad de elementos. La clasificación cuenta durante casi el 50% del tiempo de ejecución total del método.
EDIT:
preguntó Mason Wheeler por eso que es necesario optimizar. Una razón es que el método se llamará 2118760 veces.
Información básica de poker: a todos los jugadores se les reparten dos cartas (el bolsillo) y luego se reparten cinco cartas (las 3 primeras se llaman flop, la siguiente es el turn y la última el river. recoge las cinco mejores cartas para formar una mano)
Si tengo dos tarjetas en el bolsillo, P1 y P2, que utilizarán los siguientes bucles para generar todas las combinaciones posibles:
for C1 := 0 to 51-4 do
if (C1<>P1) and (C1<>P2) then
for C2 := C1+1 to 51-3 do
if (C2<>P1) and (C2<>P2) then
for C3 := C2+1 to 51-2 do
if (C3<>P1) and (C3<>P2) then
for C4 := C3+1 to 51-1 do
if (C4<>P1) and (C4<>P2) then
for C5 := C4+1 to 51 do
if (C5<>P1) and (C5<>P2) then
begin
//This code will be executed 2 118 760 times
inc(ComboCounter[GetComboFromCards([P1,P2,C1,C2,C3,C4,C5])]);
end;
Mientras escribo esto noto una cosa más: los últimos cinco elementos de la matriz siempre serán ordenados, por lo que solo se trata de poner los dos primeros elementos en la derecha posición en la matriz. Eso debería simplificar un poco las cosas.
Entonces, la nueva pregunta es: ¿Cuál es la forma más rápida de ordenar una matriz de 7 enteros cuando los últimos 5 elementos ya están ordenados? Creo que esto podría resolverse con un par (?) De ifs y swaps :-)
Tengo que preguntarme, ¿por qué estás buscando la forma más rápida de ordenar un conjunto tan pequeño? En esa escala, incluso el tipo de burbuja va a terminar en menos de un milisegundo en casi cualquier CPU disponible. –
Clasificación de inserción o selección. – yfeldblum
El comentario de Mason Wheeler me hizo editar la pregunta un poco. La rutina donde se realiza la clasificación se llamará 2118760 veces, por lo que incluso si una clasificación lleva solo un milisegundo, la rutina tomará más de segundos. Esta rutina se llamará 2652 veces para analizar las probabilidades de todas las posibles combinaciones de dos cartas. –