[eside-ghost] Quereis currar en google? Haced algoritmos!
Borja Sotomayor
borja en borjanet.com
Mar Ene 30 02:12:03 CET 2007
Jelou!
> [...un monton de cosas que no entiendo...]
xDDD
> Evidentemente estoy dando palos de ciego, asi que lo que diga
> igual^H^H^H^H^Hseguramente no tiene sentido...
> Segun la wikipedia, un kd-tree es un caso particular de arboles bsp.
> Segun tengo entendido, para casos genericos 3d (en vez del caso tipico
> de mapa de doom "3d-pero-casi-2d"), suele ser mejor usar octrees que
> bsp; igual eso mejoraría la velocidad?
No conozco los octress, pero en general hay que tener cuidado al
distinguir entre "complejidad" y "velocidad". Cuando hablamos de
complejidad, generalmente hablamos de cuanto crece el tiempo de
ejecución de un algoritmo en función de la cantidad de datos que entran
al algoritmo.
Por poner el ejemplo clásico de toda la vida, supongamos que estoy
haciendo algo con una lista de N elementos, y que tardo k segundos (una
cantidad constante) en procesar cada elemento. Entonces:
Numero de elementos Tiempo de ejecución
------------------- -------------------
1 1*k
2 2*k
3 3*k
... ...
N N*k
Mi algoritmo, en este caso, tendría tiempo lineal, porque el tiempo de
ejecución depende linealmente de N (que es la unica variable; recordemos
que k es una constante). Y esto lo denotamos como O(N)
Sin embargo, si al procesar cada elemento tengo que realizar N
operaciones (p.ej, porque tengo un bucle anidado), cada una con k
instrucciones, entonces tengo lo siguiente:
Numero de elementos Tiempo de ejecución
------------------- -------------------
1 1*N*k
2 2*N*k
3 3*N*k
... ...
N N*N*k = (N^2)*k
Esto es tiempo cuadratico, O(N^2). Fijaos como lo que realmente nos
interesa es cuanto crece el tiempo de ejecución en función de "N", y que
"k" no resulta muy importante.
Claro, alguien puede encontrar un nuevo algoritmo en el que "k" (el
numero de operaciones constantes que realizamos en cada iteración) se
reduce bastante. Por ejemplo, si optimizo mi codigo para reducir "k"
hasta la mitad, mi programa ejecutará el doble de rápido. Sin embargo,
la *complejidad* del algoritmo seguirá siendo la misma, y en cuanto N
empiece a crecer, pues seguiré encontrandome con que un algoritmo
cuadratico resulta bastante lamentable comparado con uno lineal.
En fin, con todo esto quiero decir que igual podemos encontrarnos con
otras estructuras de datos que, efectivamente, ejecutan más rapidamente
porque reducen "k" mucho, pero que mantienen la misma complejidad (y lo
que les importa en el problema de los globos y las balas es la complejidad)
P.D.- Mirando por Wikipedia y otras webs, parece que los Octrees y los
Quadtrees, al buscar el punto más cercano a otro dado, tienen una
complejidad de O(n) (aunque en algunos casos particulares tienen una
complejidad media de O(log n). Aunque O(n) es una complejidad más que
aceptable para muchas aplicaciones, es peor que lo que piden en el
problema (en el que una complejidad de O(log n), en el kd-tree, sería mejor)
Un saludo,
--
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Borja Sotomayor, University of Chicago
Ph.D. Student, Department of Computer Science
Ryerson 257-C, 1100 East 58th Street, Chicago, IL
GT4 Tutorial: http://gdp.globus.org/gt4-tutorial/
BorjaNet: http://www.borjanet.com/ borja en borjanet.com
·····························································
"Dis maschine vill run und run!"
-- Kurt Gödel (on the Turing Machine)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Más información sobre la lista de distribución eside-ghost