“ Una estructura de datos es una forma particular de organizar la información en una computadora de manera tal que pueda se usada eficientemente. ” Paul E. Black - "Dictionary of Algorithms and Data Structures"
“ un algoritmo es un procedimiento computacional bien definido que toma un valor/es como entrada y produce un valor/es como salida. Es por lo tanto una secuencia de pasos que transforman una entrada en una salida. ”
Inter-dependencia entre
Es una colección de nodos, tal que:
nodo, arista, raíz, hoja, subárbol
padre, hijos, hermanos
desde n1 hasta n k , es una secuencia de nodos n 1 , n 2 , ....,n k tal que n i es el padre de n i+1 , para 1 ≤ i < k.
La longitud del camino es el número de aristas, es decir k-1. Existe un camino de longitud cero desde cada nodo a sí mismo. Existe un único camino desde la raíz a cada nodo
Es la longitud del único camino desde la raíz hasta el nodo.
La raíz tiene profundidad cero.
longitud del camino más largo desde el nodo hasta una hoja.
Las hojas tienen altura cero.
La altura de un árbol es la altura del nodo raíz.
es el número de hijos del nodo
N1 es ancestro de N2 y N2 es descendiente de N1, si existe un camino desde N1 a N2
Árboles binarios de búsqueda
Árboles de expresión
a * b + c a * ( b + c )
a * ( ( b * d ) + c ) ) + ( e + ( f * g ) )
En profundidad (DFS): inorden, preorden, postorden
por niveles (BFS)
1. proceso la raiz
2. Si tengo hijo izquierdo, recorro el subarbol izquierdo
3. Si tengo hijo derecho, recorro el subarbol derecho
1. Si tengo subarbol izquierdo, recorro el subarbol izquierdo
2. proceso la raíz
3. Si tengo subarbol derecho, recorro el subarbol derecho
1. Si tengo subarbol izquierdo, recorro el subarbol izquierdo
2. Si tengo subarbol derecho, recorro el subarbol derecho
3. proceso la raíz
utilizamos estructura auxiliar...
encolar raíz
mientras haya nodos en la cola:
desencolo un nodo
proceso el nodo
si tiene hijo izquierdo, encolo hijo izquierdo
si tiene hijo derecho, encolo hijo derecho
utilizamos estructura auxiliar...
1. encolar raíz
2. encolar marca de fin de nivel
3. mientras la cola no sea vacía:
3.1 desencolo un elemento
3.2 mientras elemento no sea fin de nivel
3.2.1 proceso el nodo
3.2.2 si tiene hijo izquierdo, encolo hijo izquierdo
3.2.3 si tiene hijo derecho, encolo hijo derecho
3.2.4 desencolo un elemento
3.3 si la cola no es vacía, encolo marca de fin de nivel
Es un árbol binario completo
MinHeap
* El elemento mínimo está almacenado en la raíz
* El dato almacenado en cada nodo es menor o igual al de sus hijos
MaxHeap
Al reves
Dado que un árbol binario completo es una estructura de datos regular, puede almacenarse en un arreglo, tal que:
La raíz está almacenada en la posición 1
Para un elemento que está en la posición i:
* El hijo izquierdo está en la posición 2*i
* El hijo derecho está en la posición 2*i + 1
* El padre está en la posición i/2
Cuando intentamos encontrar la complejidad de un algoritmo, no nos interesa el número exacto de las operaciones realizadas, Sino la relación entre el número de operaciones y el tamaño del problema a medida que el tamaño crece.
Y nos interesa sobre todod el peor caso, es decir el número máximo de operaciones posibles para un tamaño determinado.
¿cómo es la relación entre cantidad de operaciones y el tamaño de la pila?
Constante o de Orden(1)
siempre tarda lo mismo, independientemente de cuantos elementos haya en la pila¿Cómo es la relación entre cantidad de operaciones y el tamaño de la lista?
Lineal o de Orden(N)
cuando la cantidad de elementos de la lista crece, la cantidad de operaciones básicas crece de manera proporcional a N (si con un elemento se requiren 5 operaciones, con 2 van a ser 10, con 3 => 15, con 4 => 20, ... , N => 5N)¿cómo es la relación entre cantidad de operaciones y el tamaño del árbol?
Logarítmica o de Orden log(N)
cuando la cantidad de elementos de la lista crece, la cantidad de operaciones básicas crece en proporción al logaritmo de N. (si para 1 elemento se requiren 2 op, 16 elementos => 2*4 op, 32 => 2*5, 64 => 2*6, ... N => 2*log(N) )Notación formal para expresar con precisión esa relación
una función
una asociación un valor de entrada con uno de salida
n, log(n), n², ¿Son valores?
NO, son funciones.
Por lo tanto, T(n) es una funcion que devuelve una funcion!
(higher order function, o función de orden superior)
Una función T(N) es O(f(N)) si existen las constantes C y n0 tal que:
Se lee: T de N es de Orden F de N
def potencia(x, n):
if(n == 0):
return 1
else:
return x * potencia(x, n-1)
t(n-1) = t(n-2) + 2
reemplazamos t(n-1) en 1. t(n) = [ t(n-1) ] + 2 t(n) = [t(n-2) + 2] + 2
t(n-2) = t(n-3) + 2 t(n) = [ t(n-2) ] + 2 + 2 t(n) = [ t(n-2) ] + 2 + 2 t(n) = [t(n-3) + 2] + 2 + 2 t(n) = t(n-3) + 2*3 t(n-3) = [t(n-4) + 2] t(n) = t(n-4) + 2 + 3*2 t(n) = t(n-4) + 4*2
t(n) = t(n-i) + 2 * i
n - i = 0 # si despejamos i i = n # reemplazamos i en la expresión general de la recurrencia: t(n) = t(n-i) + 2 * i t(n) = t(n - n) + 2 * n t(n) = t(0) + 2*n t(n) = 1 + 2*n T(n) = O(n)
¿Preguntas?