Ejemplo superadaptativo.
Monday, May 28th, 2007Este sería el esquema de un algoritmo superadaptativo de ordenación por comparación, a modo de ejemplo. Sería muy rápido para datos presentando cualquier tipo de patrón, seguramente en el peor caso sea n log n, pero está lejos de ser óptimo, ni fácil de implementar. Creo firmemente que para ser óptimo debería de basarse en busqueda binaría en lugar de lineal y que el algoritmo resultante será recursivo y sencillo. Buscar “galopando” (exponencialmente, siguiendo los terminos de la sucesión de Fibonacci) también sería más rápido, pero más lento que una busqueda binaría. Además pienso que lo que más importa de un algoritmo es el número de comparaciones, el resto se lo dejo a la implementación.
algoritmo superAdaptativo (v)
ppio
si estaOrdenado(v) entonces
nada;
sinosi estaOrdenadoEnOrdenInverso entonces
invertir(t);
sino
superAdaptativo(maximos);
superAdaptativo(resto);
merge(resto,maximos);
finsi;
fin;
Hay que destacar, que el merge es un merge clasico y lineal, de coste a+b, y que al llamarse con “resto” los datos no serán elementos, sino vectores de elementos consecutivos (para no repetir comparaciones).
Un ejemplo de como debería de funcionar, con números aleatorios.
n=16 log2(16!)=44,25
SuperAdaptativo
4<=6>0<=0<=0<=5<=6>0<=7>0<=7<=8>2<=7<=8>0 comps=15
4>[0<=0<=0<=5]>0<=[0<=7]>[2<=7]>0 | 6<=6<=7<=8<=8 comps=15+5+4=24
[0<=0<=0]<=[0<=0]<=2>0 | 4<=5<=7<=7 comps=24+3+3=30
[0<=0<=0<=0<=0]<=0|2 comps=30+1=31
[0<=0<=0<=0<=0<=0]<=2<=[4<=5<=7<=7]>[6<=6<=7<=8<=8] comps=31+1+1+1=34
[0<=0<=0<=0<=0<=0<=2<=4<=5]<=[6<=6]<=[7<=7]<=[7<=8<=8] comps=32+4=36
SuperAdaptativo Min-Max
4<=6>0<=0<=0<=5<=6>0<=7>0<=7<=8>2<=7<=8>0 comps=15
4>0<=0<=0<=2>0|[0<=0<=5]<=7<=7|6<=6<=7<=8<=8 comps=15+11=26
0<=0|[0<=0]|4>2 comps=26+2=28
[0<=0]<=[0<=0]<=[2<=4]>[0<=0<=5<=7<=7]>[6<=6<=7<=8<=8] comps=28+1+1+1+1=32
[0<=0<=0<=0]<=[0<=0]<=[2<=4]<=[5<=7<=7]>[6<=6<=7<=8<=8] comps=32+4=36
[0<=0<=0<=0<=0<=0<=2<=4<=5]<=[6<=6]<=[7<=7]<=[7<=8<=8] comps=36+3=39
MergesortAdaptativo
4<=6>0<=0<=0<=5<=6>0<=7>0<=7<=8>2<=7<=8>0 comps=15
0<=0<=0<=4<=5<=6<=6 | 0<=0<=7<=7<=8 | 0<=2<=7<=8 comps=15+6+2+3=26
0<=0<=0<=0<=0<=4<=5<=6<=67<=7<=8| 0<=2<=7<=8 comps=26+11=37
0<=0<=0<=0<=0<=0<=2<=4<=5<=6<=6<=7<=7<=7<=8<=8 comps=37+15=52
Quicksort
4 6 0 0 0 5 6 0 7 0 7 8 2 7 8 0
4|0 0 0 0 0 2 0 | 6 5 6 7 7 8 7 8 comps=15
0 0 0 0 0 2 0 ||4|| 6 5 6 7 7 8 7 8 comps=15+6+7=28
||0|| 0 0 0 0 2 0 ||4|| 5 ||6|| 6 7 7 8 7 8 comps=28+5+5=38
||0 0|| 0 0 2 0 ||4 5 6 6 ||7 7 8 7 8 comps=38+3+4=45
||0 0 0|| 0 2 0 ||4 5 6 6 7 || 7 8 7 8 comps=45+2+3=50
||0 0 0 0|| 2 0 ||4 5 6 6 7 7|| 8 7 8 comps=50+1+2=53
0 0 0 0 0 2 4 5 6 6 7 7 7 8 8
Quicksort(no estable)
4 6 0 0 0 5 6 0 7 0 7 8 2 7 8 0
4|0 0 0 0 0 2 0 | 6 5 6 7 7 8 7 8 comps=15
0 0 0 0 0 2 0 ||4|| 6 5 6 7 7 8 7 8 comps=15+6+7=28
0 0 0 0 0 ||0 2 4|| 5 6 ||6|| 7 7 8 7 8 comps=28+4+1+4=37
0 0 0 0 ||0 0 2 4 5 6 6|| 7 7 ||7||8 8 comps=37+1+1=39
0 0 0 ||0 0 0 2 4 5 6 6 7 7 7 8 8|| comps=39+2=41
0 0 ||0 0 0 0 2 4 5 6 6 7 7 7 8 8|| comps=41+1=42
0 0 0 0 0 2 4 5 6 6 7 7 7 8 8
Las barras “|” separan “máximos” de “resto”, y los corchetes [] vectores ya comparados.
La zona entre dos barras “||” está ordenada.