Este repositorio, usaré Python para implementar algunos algoritmos famosos. Los algoritmos se organizan de acuerdo con la estrategia utilizada. Cada algoritmo tendrá una explicación del problema que intenta resolver y algunos recursos relevantes.
(El objetivo de este repositorio es crear una hermosa lectura para todos estos algoritmos brillantes que he revisado).
Contenido:
Esta sección, hablaré sobre la famosa estrategia de división y conquista y mostraré algunas aplicaciones de esta estrategia.

El procedimiento estándar para la multiplicación de dos números de N-dígitos requiere una serie de operaciones elementales proporcionales a. En cuanto al algoritmo Karatsuba, reduce el tiempo de ejecución a la mayoría
Idea clave
El paso básico del algoritmo de Karatsuba es una fórmula que le permite calcular el producto de dos grandes números y usar tres multiplicaciones de números más pequeños, cada uno con aproximadamente la mitad de dígitos que o, además de algunas adiciones y cambios de dígitos.
Propiedades
Back to Top
El peor tiempo de ejecución para este algoritmo es.
GIF anterior muestra cómo funciona la clasificación de fusión: 
Idea clave
Divida la lista no organizada en n sublistas, cada uno que contiene 1 elemento (una lista de 1 elemento se considera ordenada) y fusione repetidamente sublistas para producir nuevos sublistas clasificados hasta que solo quede 1 sublista restante. Esta será la lista ordenada.
Propiedades
Back to Top
Idea clave
Al igual que la figura anterior, cuando primero tomamos un elemento desde la sub-array de la derecha en la operación de fusión, eso indica que el elemento derecho es más pequeño que (longitud de la sub-matriz izquierda-el índice del elemento izquierdo).
A medida que avanza el algoritmo, agregue todas las inversiones nos darán las inversiones totales.
Propiedades
Back to Top
Propiedades
Back to TopEsta sección hablaré sobre dos algoritmos que han usado variable aleatoria en el interior.

Idea clave
Quicksort primero divide una gran matriz en dos sub-matrices más pequeñas: los elementos bajos y los elementos altos en relación con un elemento elegido al azar. Quicksort puede ordenar recursivamente las subrayas. Entonces, el punto de clave en el tipo rápido es elegir el elemento de partición.
Propiedades
Back to Top
Idea clave
Al repetir los tiempos del algoritmo de contracción con opciones aleatorias independientes y devolver el corte más pequeño, la probabilidad de no encontrar un corte mínimo es
Propiedades
Back to TopColocar estructuras de datos como una sección independiente es engañoso; Sin embargo, introduciré problemas desconcertantes que se resuelven elegantemente por las estructuras de datos. Algunas estructuras de datos pueden tener una estrategia de diseño de algoritmo que aún no se ha revisado.

Idea clave
BFS se utiliza para contar nodos accesibles desde un nodo fuente en un gráfico no dirigido o dirigido. Los nodos accesibles se imprimen en el orden encontrado. Se usa una cola para almacenar los nodos de color gris (ver el GIF a continuación). El término "amplitud" en BFS significa encontrar un nodo accesible con la longitud más corta. La amplitud extiende el borde entre los nodos visitados y los nodos no descubiertos.

Propiedades
Back to Top
Idea clave
Y DFS se usa en el gráfico dirigido y dice cuántos nodos puede alcanzar un nodo fuente e imprimirlos por el orden que los encontramos. Usamos Stack para almacenar los nodos que clasificamos como puntos de inicio para el gráfico. La "profundidad" en su nombre significa que este algoritmo irá tan profundamente como sea posible para una fuente dada y cuando alcance el punto final, vuelve al nodo de inicio.

Propiedades
Back to Top
El problema mediano de mantenimiento es que si se leen enteros de un flujo de datos, encuentre una mediana de elementos leídos de manera eficiente. Por simplicidad, suponga que no hay duplicados.
Idea clave
Podemos usar un montón máximo en el lado izquierdo para representar elementos que son menos que la mediana efectiva, y un montón mínimo en el lado derecho para representar elementos que son mayores que la mediana efectiva. Cuando la diferencia entre el tamaño de dos montones es mayor o igual a 2, cambiamos un elemento a otro montón de tamaño más pequeño.
Propiedades
Back to Top
Idea clave
A través de una simple observación, descubrimos que Tranpose of Graph tiene el mismo SCC que el gráfico original. Ejecutamos DFS dos veces. La primera vez, lo ejecutamos en G y calculamos el tiempo de finalización para cada vértice. Y luego, ejecutamos DFS en G^t pero en el bucle principal de DFS, considere los vértices en orden de disminución del tiempo de finalización.
Propiedades
Back to Top
Idea clave
En un gráfico no dirigido, podemos usar esta estructura de datos para averiguar cuántos SCC. La siguiente figura muestra cómo funciona.

Propiedades
Back to Top En esta sección, voy a introducir algoritmos codiciosos, una poderosa estrategia de diseño de algoritmos.
Desde Wikipedia, un algoritmo codicioso es un paradigma algorítmico que sigue a los problemas que resuelven la heurística de hacer la decisión localmente óptima en cada etapa [1] con la esperanza de encontrar un óptimo global. En muchos problemas, una estrategia codiciosa no produce en general una solución óptima, pero, sin embargo, una heurística codiciosa puede producir soluciones localmente óptimas que se aproximan a una solución óptima global en un tiempo razonable.
En el problema de selección de actividades, cada actividad tiene su propio peso y longitud. Y nuestro objetivo es minimizar la suma de peso*longitud. Es un ejemplo muy fácil y excelente para mostrar cómo funciona el algoritmo codicioso y proporcionar una prueba elegante utilizando la técnica de intercambio de argumentos.
Idea clave
Si clasificamos la actividad por peso/longitud, podemos demostrar que una estructura óptima existente no puede ser mejor que esta disposición. 
Como la figura mostrada anteriormente, consideramos el costo causado por dos actividades que varían de manera diferente en dos disposiciones (I, J). Descubrimos que el costo en el algoritmo codicioso es más pequeño que la estructura óptima por el valor de wi*lj - wj*li, que es mayor o igual a 0.
Propiedades
Back to Top
Idea clave
Ordenamos la matriz de acuerdo con su tiempo de finalización. El algoritmo puso el primer trabajo cuyo tiempo de inicio es más grande que el tiempo de finalización del último trabajo.
Propiedades
Back to Top
Una forma de codificar este libro es usar la codificación de longitud fija. Como se muestra a continuación:

En cuanto a la codificación de Huffman, la estructura real del árbol se ve así:

Idea clave
Mantenemos un árbol binario y creamos un nuevo nodo como padre para dos letras menos frecuentes. Y la clave para este nuevo nodo es la suma de claves para sus dos hijos. Repetimos esto hasta que no queden nodos en este "libro".

Propiedades
Back to TopEl algoritmo de Dijkstra es un algoritmo para encontrar las rutas más cortas entre los nodos en un gráfico. Sin embargo, tiene un requisito previo, todas las rutas deben ser mayores o iguales a 0.

Idea clave
Nodos separados en dos grupos, un grupo está marcado como se explora. Y actualizamos la distancia desde el grupo inexplorado hasta el grupo explorado por la distancia más corta.
Propiedades
Back to Top
Idea clave
El algoritmo puede describirse informalmente como realizando los siguientes pasos:
Inicialice un árbol con un solo vértice, elegido arbitrariamente del gráfico.
Cultive el árbol por un borde: de los bordes que conectan el árbol a los vértices que aún no están en el árbol, encuentre el borde de peso mínimo y transfiéralos al árbol.
Repita el paso 2 (hasta que todos los vértices estén en el árbol).
Propiedades
Back to Top
Idea clave
Muy similar a SCC, podemos detener temprano el algritmo para controlar el número de clases en nuestro gráfico, lo que quiere decir que podemos agrupar el gráfico.
Propiedades
Back to Top En esta sección, voy a introducir algoritmos dinámicos, una poderosa estrategia de diseño de algoritmos.
Desde Wikipedia, la programación dinámica (también conocida como optimización dinámica) es un método para resolver un problema complejo al dividirlo en una colección de subproblemas más simples, resolver cada uno de esos subproblemas solo una vez y almacenar sus soluciones.

Entonces, si la longitud de la barra es 8 y los valores de diferentes piezas se dan de la siguiente manera, entonces el valor máximo obtenible es 22 (cortando dos piezas de longitudes 2 y 6).
Idea clave
Vemos que una descomposición consiste en una primera pieza de longitud que corté el extremo izquierdo, y luego un resto de la longitud a la derecha n-i. Entonces, el pseudocodo parece:

El árbol de recursión que muestra llamadas recursivas resultantes de una llamada Cut_rod (P, N) parece:

Para guardar el cálculo repetido para pequeños subproblemas, memorizamos una matriz para almacenar estos valores.
Propiedades
Back to Top
Idea clave
Estructura óptima:

Propiedades
Back to Top Idea clave
De CLRS, la estructura óptima para este problema es:

Propiedades
Back to Top Idea clave
Este algoritmo se basa en una observación muy intuitiva. Supongamos que tenemos un subconjunto {1, 2, 3, 4, ..., k} (denote como v (k)) del grupo de vértices originales {1, 2, 3, ..., n}. Si P es un camino más corto de I a J en V (K), tenemos dos casos. Primero, si K no está en P, P debe ser una ruta más corta en V (K-1). Segundo, si K está en P, entonces podemos separar el camino en dos, P1: I K, P2: K j. y P1 debe ser el camino más corto de I a K con V (K-1), P2 debe ser el camino más corto de K a J con V (K-1).

Propiedades
Back to Top Desde Wikipedia, un problema de decisión NP-completado es uno que pertenece tanto a las clases de complejidad NP y NP-Hard. En este contexto, NP significa "tiempo polinomial no determinista". El conjunto de problemas completos de NP a menudo se denota por NP-C o NPC.
En esta sección, voy a presentar tres problemas de NPC muy famosos y explicar los algoritmos de aproximación para abordarlos.

Idea clave
Es muy difícil encontrar una cubierta mínima de vértice, pero podemos encontrar una cubierta aproximada con el máximo el doble de los vértices en tiempo polinomial.

Propiedades
Back to Top
Idea clave
El algoritmo de aproximación para TSP es un algoritmo codicioso (CLRS P1114). Aquí, también quiero introducir un algoritmo exacto para TSP utilizando programación dinámica.
Subproblema: para cada destino j ∈ {1,2, ..., n}, cada subconjunto s ⊆ {1,2, ..., n} que contiene 1 y j, que Ls, j = longitud mínima de una ruta de 1 a j que visite precisamente los vértices de S [exactamente una vez cada uno]. Entonces, la recurrencia correspondiente:

Propiedades
Back to Top 3-SAT es uno de los 21 problemas completos de KARP NP, y se utiliza como punto de partida para demostrar que otros problemas también son np.
Aquí, presento el algoritmo de Papadimitriou para 2-sat (este es un algoritmo muy muy interesante , por lo que decido presentarlo a pesar de que 2-SAT no es NPC).
Idea clave
Elija una asignación inicial aleatoria y elija una cláusula arbitraria insatisfecha arbitraria y voltee el valor de una de sus variables. Aquí está el pseudocódigo:

Un trato casual con cláusulas nos daría una probabilidad muy grande de encontrar la respuesta real. El mecanismo se encuentra en un término físico (caminata aleatoria). Si está interesado, le recomiendo que pase por cómo la caminata aleatoria se relacionó con Papadimitriou.
Propiedades
Back to Top