Sei sulla pagina 1di 16

UNIVERSIDAD TÉCNICA DE MANABÍ

FACULTAD DE CIENCIAS INFORMÁTICAS


DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

NOMBRE: ARIANNA JANELA VINCES ESPINAL

Técnicas de diseño de algoritmos


Algoritmo Fuerza Bruta

C ar acter í s ti cas

 Es el algoritmo más simple posible.


 Consiste en probar todas las posibles posiciones del patrón en el texto.
 Requiere espacio constante.
 Realiza siempre saltos de un carácter.
 Compara de izquierda a derecha.
 Realiza la búsqueda del patrón en un tiempo O(mn).
 Realiza 2n comparaciones previstas de los caracteres del texto.

Ló g i ca

 Se sitúa el patrón en la primera posición, y se compara carácter a carácter hasta


encontrar un fallo o llegar al final del patrón.
 Se pasa a la siguiente posición y se repite el proceso.
 El proceso finaliza al alcanzar el final del texto
 No existe un preprocesamiento del patrón.

D es cr i pci ó n

 No requiere ninguna fase de preproceso previo, ni un espacio extra constante además


del espacio asignado al patrón y al texto.
 Para la búsqueda:
 Consiste en la comparación de todas las posiciones del texto entre 0 y el n-m, si
una ocurrencia del patrón corresponde o no.
 Si encuentra una no ocurrencia, o una ocurrencia total del patrón, salta un
carácter hacia la derecha.
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

E j em plo

Se alinea la primera posición del patrón con la primera posición del texto, y se comparan los
caracteres uno a uno hasta que se acabe el patrón, esto es, se encontró una ocurrencia del
patrón en el texto, o hasta que se encuentre una discrepancia.

Si se detiene la búsqueda por una discrepancia, se desliza el patrón en una posición hacia la
derecha y se intenta calzar el patrón nuevamente.

Algoritmos Voraces
 Algoritmos que implementan una búsqueda miope
 Toman decisiones de acuerdo a la información que tienen en el momento
Ventajas:

 Fáciles de implementar
 Eficientes cuando funcionan de acuerdo al problema
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

Desventajas:

 Para problemas con un gran tamaño en el espacio de búsqueda, suelen ser


ineficientes
Suelen utilizarse en problemas de optimización
Ejemplo
- Considere que nos encontramos en un país con monedas de 100, 20, 10, 5 y 1
- Se debe de crear un algoritmo que permita dar el menor número de monedas
- Si se desea dar a una persona 289 pesos, ¿Qué monedas utilizarías?
El algoritmo es “voraz” porque selecciona la mayor denominación disponible en el
momento y que aun pueda generar una solución válida

DIVIDE Y VENCERÁS
El término Divide y Vencerás en su acepción más amplia es algo más que una técnica de
diseño de algoritmos. De hecho, suele ser considerada una filosofía general para
resolver problemas y de aquí que su nombre no sólo forme parte del vocabulario
informático, sino que también se utiliza en muchos otros ámbitos. En nuestro contexto,
Divide y Vencerás es una técnica de diseño de algoritmos que consiste en resolver un
problema a partir de la solución de subproblemas del mismo tipo, pero de menor
tamaño. Si los subproblemas son todavía relativamente grandes se aplicará de nuevo
esta técnica hasta alcanzar subproblemas lo suficientemente pequeños para ser
solucionados directamente. Ello naturalmente sugiere el uso de la recursión en las
implementaciones de estos algoritmos.
La resolución de un problema mediante esta técnica consta fundamentalmente de los
siguientes pasos:
1. En primer lugar ha de plantearse el problema de forma que pueda ser descompuesto
en k subproblemas del mismo tipo, pero de menor tamaño. Es decir, si el tamaño de la
entrada es n, hemos de conseguir dividir el problema en k subproblemas (donde 1 ≤ k
≤ n), cada uno con una entrada de tamaño nk y donde 0 ≤ nk < n. A esta tarea se le conoce
como división.
2. En segundo lugar han de resolverse independientemente todos los subproblemas,
bien directamente si son elementales o bien de forma recursiva. El hecho de que el
tamaño de los subproblemas sea estrictamente menor que el tamaño original del
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

problema nos garantiza la convergencia hacia los casos elementales, también


denominados casos base.
3. Por último, combinar las soluciones obtenidas en el paso anterior para construir la
solución del problema original. El funcionamiento de los algoritmos que siguen la
técnica de Divide y Vencerás descrita anteriormente se refleja en el esquema general
que presentamos a continuación:
PROCEDURE DyV(x:TipoProblema):TipoSolucion;
VAR i,k,:CARDINAL; s:TipoSolucion;
subproblemas: ARRAY OF TipoProblema;
subsoluciones:ARRAY OF TipoSolucion;
BEGIN
IF EsCasobase(x) THEN
s:=ResuelveCasoBase(x)
ELSE
k:=Divide(x,subproblemas);
FOR i:=1 TO k DO
subsoluciones[i]:=DyV(subproblemas[i])
END;
s:=Combina(subsoluciones)
END;
RETURN s
END DyV;

"Vuelta atrás", (Backtracking).

Estrategia para encontrar soluciones a problemas que satisfacen


restricciones. El término "backtrack" fue acuñado por primera vez
por el matemático estadounidense D. H. Lehmer en los años 1950.

En su forma básica, la idea de backtracking se asemeja a un


recorrido en profundidad dentro de un grafo dirigido. El grafo en
cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea
cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar
soluciones para algún problema. Esto se consigue construyendo soluciones parciales a
medida que progresa el recorrido; estas soluciones parciales limitan las regiones en las
que se puede encontrar una solución completa. El recorrido tiene éxito si, procediendo
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

de esta forma, se puede definir por completo una solución. En este caso el algoritmo
puede bien detenerse (si lo único que se necesita es una solución del problema) o bien
seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra
parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta
el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente
igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos
que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más
vecinos sin explorar, prosigue el recorrido de una solución.

Algoritmo de Backtracking
proc Backtracking (↕X[1 . . . i ]: TSolución,
↑ok: B)
variables L: ListaComponentes
inicio
si EsSolución (X) entonces ok CIERTO
en otro caso
ok FALSO
L=Candidatos (X)
mientras ¬ok ^ ¬Vacía (L) hacer
X[i + 1] Cabeza (L); L Resto (L)
Backtracking (X, ok)
finmientras
finsi
fin

Podemos visualizar el funcionamiento de una técnica de backtracking como la


exploración en profundidad de un grafo.

Cada vértice del grafo es un posible estado de la solución del problema. Cada arco del
grafo representa la transición entre dos estados de la solución (i.e., la toma de una
decisión).

Típicamente el tamaño de este grafo será inmenso, por lo que no existirá de manera
explícita. En cada momento sólo tenemos en una estructura los nodos que van desde el
estado inicial al estado actual. Si cada secuencia de decisiones distinta da lugar a un
estado diferente, el grafo es un árbol (el árbol de estados).

Esencialmente, la idea es encontrar la mejor combinación posible en un momento


determinado, por eso, se dice que este tipo de algoritmo es una Búsqueda en
profundidad. Durante la búsqueda, si se encuentra una alternativa incorrecta, la
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

búsqueda retrocede hasta el paso anterior y toma la siguiente alternativa. Cuando se


han terminado las posibilidades, se vuelve a la elección anterior y se toma la siguiente
opción (hijo [si nos referimos a un árbol]). Si no hay más alternativas la búsqueda falla.
De esta manera, se crea un árbol implícito, en el que cada nodo es un estado de la
solución (solución parcial en el caso de nodos interiores o solución total en el caso de
los nodos hoja).

Normalmente, se suele implementar este tipo de algoritmos como un


procedimiento recursivo. Así, en cada llamada al procedimiento se toma una variable y
se le asignan todos los valores posibles, llamando a su vez al procedimiento para cada
uno de los nuevos estados. La diferencia con la Búsqueda en profundidad es que se
suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van
a conducir a ninguna solución, o a una solución peor de la que ya se tiene. De esta forma
se ahorra espacio en memoria y tiempo de ejecución.

Algunas heurísticas son comúnmente usadas para acelerar el proceso. Como las
variables se pueden procesar en cualquier orden, generalmente es más eficiente
intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con
menores valores posibles). Este proceso poda el árbol de búsqueda antes de que se
tome la decisión y se llame a la subrutina recursiva.

Cuando se elige qué valor se va a asignar, muchas implementaciones hacen un examen


hacia delante (FC, Forward Checking), para ver qué valor restringirá el menor número
posible de valores, de forma que se anticipa en a) preservar una posible solución y b)
hace que la solución encontrada no tenga restricciones destacadas.

Algunas implementaciones muy sofisticadas usan una función de cotas, que examina si
es posible encontrar una solución a partir de una solución parcial. Además, se
comprueba si la solución parcial que falla puede incrementar significativamente la
eficiencia del algoritmo. Por el uso de estas funciones de cota, se debe ser muy
minucioso en su implementación de forma que sean poco costosas
computacionalmente hablando, ya que lo más normal es que se ejecuten en para cada
nodo o paso del algoritmo. Cabe destacar, que las cotas eficaces se crean de forma
parecida a las funciones Heurísticas, esto es, relajando las restricciones para conseguir
mayor eficiencia.

Con el objetivo de mantener la solución actual con coste mínimo, los algoritmos vuelta
atrás mantienen el coste de la mejor solución en una variable que va variando con cada
nueva mejor solución encontrada. Así, si una solución es peor que la que se acaba de
encontrar, el algoritmo no actualizará la solución. De esta forma, devolverá siempre la
mejor solución que haya encontrado.
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

Programación Dinámica
 La programación dinámica es una técnica matemática que se utiliza para la
solución de problemas matemáticos seleccionados, en los cuales se toma una
serie de decisiones en forma secuencial.
 Proporciona un procedimiento sistemático para encontrar la combinación de
decisiones que maximice la efectividad total, al descomponer el problema en
etapas, las que pueden ser completadas por una o más formas (estados), y
enlazando cada etapa a través de cálculos recursivos.
Etapa: es la parte del problema que posee un conjunto de alternativas mutuamente
excluyentes, de las cuales se seleccionará la mejor alternativa.
Estado: es el que refleja la condición o estado de las restricciones que enlazan las etapas.
Representa la “liga” entre etapas de tal manera que cuando cada etapa se optimiza por
separado la decisión resultante es automáticamente factible para el problema
completo.

 La programación dinámica no cuenta con una formulación matemática estándar,


sino que se trata de un enfoque de tipo general para la solución de problemas, y
las ecuaciones específicas que se usan se deben desarrollar para que
representen cada situación individual.
 Comúnmente resuelve el problema por etapas, en donde cada etapa interviene
exactamente una variable de optimización (u optimizadora)
 La teoría unificadora fundamental de la programación dinámica es el Principio
de Optimalidad, que nos indica básicamente como se puede resolver un
problema adecuadamente descompuesto en etapas utilizando cálculos
recursivos.
 “Una política óptima tiene la propiedad de que, independientemente de las
decisiones tomadas para llegar a un estado particular, en una etapa particular,
las decisiones restantes deben constituir una política óptima para abandonar
ese estado”
PARA RESOLVER PROBLEMAS DE PROGRAMACIÓN DINÁMICA SE NECESITA:

 Un grado de creatividad
 Un buen conocimiento de la estructura general de los problemas de
programación dinámica para reconocer cuando un problema se puede resolver
por medio de estos procedimientos y como esto se puede llevar a cabo.
CARACTERÍSTICAS DE LOS PROBLEMAS DE PROGRAMACIÓN DINÁMICA
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

 El problema se puede dividir en etapas que requieren una política de decisión


en cada una.
 Cada etapa tiene cierto número de estados asociados a ella.
 El efecto de la política de decisión en cada etapa es transformar el estado actual
en un estado asociado con la siguiente etapa.
 El procedimiento de solución está diseñado para encontrar una política óptima
para el problema completo.
 Dado un estado actual, una política óptima para las etapas restantes es
independiente de la política adoptada en las etapas anteriores (principio de
optimalidad).
 El procedimiento de solución se inicia al encontrar la política optima para la
ultima etapa.
 Se dispone de una relación recursiva que identifica la política optima par la etapa
n dada la política optima para la etapa (n+1)
RECURSIVIDAD
Existen dos formas de plantear la fórmula de recursividad en los problemas de
programación dinámica:
- Recursividad de Retroceso: el problema se resuelva partiendo de la última etapa
hacia la primera.
- Recursividad de Avance: el problema se resuelve partiendo de la primera etapa
hacia la última.
Las formulaciones de avance y retroceso son en realidad equivalentes en términos de
cálculo. Sin embargo, hay situaciones donde habría alguna diferencia, en la eficiencia
del cálculo, según la formulación que se utilice. Esto sucede en particular en problemas
donde intervine la toma de decisiones conforme transcurre el tiempo. En esto caso las
etapas se designan con base en el estricto orden cronológico de los periodos que ellas
representan y la eficiencia de los cálculos dependerá de si se utiliza formulación de
avance o retroceso.
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

Algoritmos de ordenamiento.
Búsqueda Secuencial
Este algoritmo compara uno a uno los elementos del arreglo hasta recorrerlo por
completo indicando si el número buscado existe. En éste caso no se ordenará la lista de
elementos a diferencia de otros algoritmos.
Su implementación es la siguiente:
Programa: Búsqueda secuencial

Variables

T=10:entero

a[T],temp,i,j,n:entero

x:binario

Inicio

escribir "Llenando arreglo con números aleatorios"

desde i=0 hasta i< T incremento 1 hacer

a[i]=númeroaleatorio

fin desde

escribir "Numero a buscar? "

leer n

x=falso

desde i=0 hasta i< T incremento 1 hacer

si a[i] = n entonces

escribir "Valor encontrado"

escribir "Posición:”, i

x=verdadero

fin si

fin desde

si x=falso entonces

escribir “No se encontró el el número”

fin si
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

escribir “El arreglo era:"

desde i=0 hasta i< T incremento 1 hacer

escribir a[i]
fin desde

Fin

Búsqueda Binaria
Este algoritmo permite buscar de una manera más eficiente un dato dentro de un
arreglo, para hacer esto se determina el elemento central del arreglo y se compara con
el valor que se esta buscando, si coincide termina la búsqueda y en caso de no ser así se
determina si el dato es mayor o menor que el elemento central, de esta forma se elimina
una mitad del arreglo junto con el elemento central para repetir el proceso hasta
encontrarlo o tener solo un elemento en el arreglo. Para poder aplicar este algoritmo se
requiere que el arreglo este ordenado. Su implementación es la siguiente:
Variables

T=10:entero

a[T],temp,i,j,n,b,busca,al,c: entero

x: binario

Inicio

escribir "Llenando arreglo con números aleatorios"

desde i=0 hasta i< T incremento 1 hacer

a[i]=númeroaleatorio

fin desde

escribir "Numero a buscar? "

leer n

//ordenando el arreglo... (burbuja)

desde j=1 hasta j <= t incremento 1 hacer

desde i=0 hasta i<(t – 1) incremento 1 hacer

si a[i] > a[i+1] entonces

temp = a[i]
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

a[i] = a[i+1]

a[i+1] = temp

fin si

fin desde

fin desde

//buscando...

ba = 0

al = t-1

c = (ba+al)/2;

mientras (ba < al) && (busca != a[c])

si busca > a[c]

b = c+1

si no

al = c-1

fin si

c=(b+al)/2;

fin mientras

si busca = a[c]

escribir busca, "encontrado en posición", c

else

escribir “no existe”, busca

fin si

escribir “El arreglo era:"

desde i=0 hasta i< t incremento 1 hacer

escribir a[i]
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

Fin

Algoritmos de ordenamiento de peor caso cuadrático

 Burbuja (Bubble Sort): Complejidad O(n^2)


La Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de
ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con
el siguiente, intercambiándolos de posición si están en el orden equivocado. Es
necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios,
lo cual significa que la lista está ordenada. Este algoritmo obtiene su nombre de la
forma con la que suben por la lista los elementos durante los intercambios, como si
fueran pequeñas "burbujas". También es conocido como el método del intercambio
directo. Dado que solo usa comparaciones para operar elementos, se lo considera un
algoritmo de comparación, siendo uno de los más sencillos de implementar.

 Inserción (Insertion Sort): Complejidad O(n^2)


El ordenamiento por inserción (insertion sort en inglés) es una manera muy natural de
ordenar para un ser humano, y puede usarse fácilmente para ordenar un mazo de cartas
numeradas en forma arbitraria.
Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado.
Después, cuando hay elementos ordenados de menor a mayor, se toma el elemento y
se compara con todos los elementos ya ordenados, deteniéndose cuando se encuentra
un elemento menor (todos los elementos mayores han sido desplazados una posición a
la derecha) o cuando ya no se encuentran elementos (todos los elementos fueron
desplazados y este es el más pequeño). En este punto se inserta el elemento debiendo
desplazarse los demás elementos.

 Selección (Selection Sort): Complejidad O(n^2).


Su funcionamiento es el siguiente:
- Buscar el mínimo elemento de la lista
- Intercambiarlo con el primero
- Buscar el siguiente mínimo en el resto de la lista
- Intercambiarlo con el segundo
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

Y en general:
- Buscar el mínimo elemento entre una posición i y el final de la lista
- Intercambiar el mínimo con el elemento de la posición i

Algoritmos de ordenamiento con peor caso promedio en O(N log N)


El caso promedio del coste de ordenar un vector de n elementos se calcula suponiendo
que el vector corresponde a una permutación aleatoria de sus elementos.
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

Algoritmo de búsqueda.
ARBOLES BINARIOS DE BUSQUEDA

La búsqueda en árboles binarios es un método de búsqueda simple, dinámico y eficiente


considerado como uno de los fundamentales en Ciencia de la Computación. De toda la
terminología sobre árboles, tan sólo recordar que la propiedad que define un árbol
binario es que cada nodo tiene a lo más un hijo a la izquierda y uno a la derecha. Para
construir los algoritmos consideraremos que cada nodo contiene un registro con un
valor clave a través del cual efectuaremos las búsquedas. En las implementaciones que
presentaremos sólo se considerará en cada nodo del árbol un valor del tipo t
Elemento aunque en un caso general ese tipo estará compuesto por dos: una clave
indicando el campo por el cual se realiza la ordenación y una información asociada a
dicha clave o visto de otra forma, una información que puede ser compuesta en la cual
existe definido un orden.

Un árbol binario de búsqueda(ABB) es un árbol binario con la propiedad de que todos


los elementos almacenados en el subárbol izquierdo de cualquier nodo x son menores
que el elemento almacenado en x ,y todos los elementos almacenados en el subárbol
derecho de x son mayores que el elemento almacenado en x.

La figura 1 muestra dos ABB construidos en base al mismo conjunto de enteros:


UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

Obsérvese la interesante propiedad de que si se listan los nodos del ABB en inorden nos
da la lista de nodos ordenada. Esta propiedad define un método de ordenación similar
al Quicksort, con el nodo raíz jugando un papel similar al del elemento de partición del
Quicksort aunque con los ABB hay un gasto extra de memoria mayor debido a los
punteros. La propiedad de ABB hace que sea muy simple diseñar un procedimiento para
realizar la búsqueda. Para determinar si k está presente en el árbol la comparamos con
la clave situada en la raíz, r. Si coinciden la búsqueda finaliza con éxito, si k<r es
evidente que k, de estar presente, ha de ser un descendiente del hijo izquierdo de la raíz,
y si es mayor será un descendiente del hijo derecho. La función puede ser codificada
fácilmente de la siguiente forma:

#define ABB_VACIO NULL


#define TRUE 1
#define FALSE 0

typedef int tEtiqueta /*Algun tipo adecuado*/


typedef struct tipoceldaABB{
struct tipoceldaABB *hizqda,*hdrcha;
tEtiqueta etiqueta;
}*nodoABB;
typedef nodoABB ABB;

ABB Crear(tEtiqueta et)


{
ABB raiz;

raiz = (ABB)malloc(sizeof(struct tceldaABB));


if (raiz == NULL)
error("Memoria Insuficiente.");
raiz->hizda = NODO_NULO;
raiz->hdcha = NODO_NULO;
raiz->etiqueta = et;
return(raiz);
}

int Pertenece(tElemento x,ABB t)


{

if(!t)
return FALSE
else if(t->etiqueta==x)
return TRUE;
else if(t->etiqueta>x)
return pertenece(x,t->hizqda);
else return pertenece(x,t->hdrcha);
}
UNIVERSIDAD TÉCNICA DE MANABÍ
FACULTAD DE CIENCIAS INFORMÁTICAS
DEPARTAMENTO DE INFORMÁTICA Y
ELECTRÓNICA

Referencias
Busqueda Secuencial de Texto. (s.f.). Obtenido de
https://sites.google.com/site/busquedasecuencialdetexto/algoritmo-fuerza-bruta

Cs.buap.mx. (s.f.). Obtenido de


https://www.cs.buap.mx/~iolmos/ada/TecnicasDisenoAlgoritmos.pdf

Cs.upc.edu. (s.f.). Obtenido de https://www.cs.upc.edu/~duch/home/duch/alg_ord.pdf

Ecured.ecu. (s.f.). Obtenido de https://www.ecured.cu/Vuelta_atr%C3%A1s_(backtracking)

Eenube. (s.f.). Obtenido de http://eenube.com/index.php/ldp/algoritmos/30-algoritmos-de-


busqueda-secuencial-binaria-e-indexada

Fernández, J. (s.f.). Decsai.ugr.es. Obtenido de


http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/arb_BB.htm

Flores, I. (s.f.). Ingenieria.unam. Obtenido de


https://www.ingenieria.unam.mx/sistemas/PDF/Avisos/Seminarios/SeminarioV/Sesion6_I
daliaFlores_20abr15.pdf

PereiraTech. (12 de 1 de 2018). Obtenido de https://pereiratechtalks.com/analisis-de-algoritmos-


de-ordenamiento/

Técnicas de diseño de algoritmos. (s.f.). Obtenido de http://www.lcc.uma.es/~av/Libro/

Potrebbero piacerti anche