Breve descripción del algoritmo: coincidencia de cadenas y cadenas, clasificación, primera búsqueda en profundidad/amplitud, programación dinámica, divide y vencerás, codicioso, retroceso, bifurcación y límite

Tabla de contenido

Breve descripción del algoritmo

básico

Lista de algoritmos típicos

Coincidencia de cadena a cadena

clasificar

Primera búsqueda de profundidad/anchura

programación dinámica

divide y conquistaras

avaro

trazar hacia atrás

rama y atado


Breve descripción del algoritmo

básico

Ejem... En cuanto a los algoritmos, no soy un estudiante de informática. Permítanme decirles que los algoritmos son formas y métodos específicos para resolver problemas que han sido modelados. Se trata de aprender algunos problemas de finalización maduros/formados para la programación. Rutinas de cálculo y ideas.

Lista de algoritmos típicos

Coincidencia de cadena a cadena

básico

Una cadena es una secuencia limitada de cero o más caracteres, también llamada cadena. Una subsecuencia compuesta por caracteres consecutivos en una cadena (baba) es una subcadena de la cadena. El método de codificación de una cadena es la codificación de caracteres, como la codificación ASCII, la codificación Unicode, etc.

Los elementos de una cadena son todos caracteres. Las operaciones de cadena están relacionadas principalmente con operaciones de cadena en lugar de elementos individuales. La mayoría de ellas son operaciones como encontrar la posición de una subcadena, obtener una subcadena en una posición específica y reemplazar una subcadena, como sigue:

activos/operaciones de cadena.jpg

Obviamente, las bibliotecas estándar como string.h proporcionan API de operación de cadenas básicas. Para un uso detallado de la biblioteca estándar de C, consulte la sección "7 Uso de la biblioteca estándar de C" del artículo " Especificaciones de escritura de C y MCU y otros ". .

Algoritmo de coincidencia de cadenas (también llamado coincidencia de patrones de cadenas)

Coincidencia de cadenas, por ejemplo: para encontrar la posición de la subcadena que es la misma que la cadena de patrón P = "ABCDABD" de la cadena principal S = "BBC ABCDAB ABCDADCDABDE".

Algoritmo de coincidencia de patrones de cadenas: algoritmo BF (o algoritmo de fuerza bruta)

¿La cadena principal S que comienza desde la posición i = 0 es la misma que la cadena de patrón P que comienza desde la posición j = 0 carácter por carácter? Si son iguales, tanto i como j se incrementarán en uno y luego juzgarán si coinciden. Si son diferentes, regresaré aquí. Al mismo tiempo, j regresa a la primera posición de la posición inicial coincidente y continúa coincidiendo uno por uno. Una imagen lo explica:

Citado de: 21 Algoritmo de coincidencia de patrones de cadenas (algoritmo BF) - Zhihu (zhihu.com)

activos/algoritmo BF (o algoritmo de fuerza bruta).jpg

Algoritmo rápido de coincidencia de patrones para cadenas-algoritmo KMP

La idea principal es que, en comparación con el algoritmo BF, para acelerar la coincidencia, se deben encontrar algunas reglas. Cuando la coincidencia falla, j no necesita volver al principio de P cada vez, sino de acuerdo con (nota, si no Si no lo entiendo, se recomienda leer el artículo del tutorial que se proporciona a continuación, aquí está el resumen después de comprenderlo) La longitud máxima de elemento común de cada subcadena de prefijo y sufijo de cada cadena en la cadena de patrón se usa para construir la siguiente matriz, y el número de dígitos movidos por j cada vez se ajusta de acuerdo con el siguiente.

clasificar

Primera búsqueda de profundidad/anchura

El recorrido del gráfico generalmente se realiza mediante búsqueda en profundidad (DFS) y búsqueda en amplitud (BFS). "Si piensas en un árbol como un tipo especial de gráfico, DFS es un recorrido de preorden".

programación dinámica

Algunas personas lo entienden como el uso de la idea de "programación dinámica" (escribir objetivos de optimización y ecuaciones de transición de estado (o relaciones recursivas)) para comprender y modelar problemas de modo que se pueda encontrar la solución óptima al problema sin atravesar todas las soluciones posibles. (cortar ramas o eliminar cálculos que probablemente no sean soluciones óptimas para ahorrar tiempo o eliminar subproblemas superpuestos); un método de implementación común es usar caché para almacenar datos para reducir cálculos repetidos (ampliar el proceso de cálculo exhaustivo en un árbol , y luego descubra las partes que se calculan repetidamente y use el almacenamiento en caché para conservar una copia de los resultados que se han calculado repetidamente antes para reducir los cálculos repetidos), y existen muchas otras técnicas y métodos.

divide y conquistaras

Citado de: Cinco algoritmos de uso común: explicación detallada y ejemplos clásicos del algoritmo divide y vencerás_ Blog Deje de pensar en mejores formas - Blog CSDN_ Ejemplos clásicos del algoritmo divide y vencerás .

La idea de diseño del método divide y vencerás es dividir un problema grande que es difícil de resolver directamente en varios problemas idénticos más pequeños para que puedan resolverse por separado y dividirse y conquistarse.

La estrategia de divide y vencerás es: para un problema de tamaño n, si el problema se puede resolver fácilmente (por ejemplo, el tamaño n es pequeño), entonces resuélvelo directamente; de ​​lo contrario, descompóngalo en k subescalas de menor escala. problemas, y estos subproblemas interactúan entre sí. Independientemente y de la misma forma que el problema original, estos subproblemas se resuelven recursivamente y luego las soluciones de cada subproblema se combinan para obtener la solución del problema original. . Esta estrategia de diseño de algoritmos se llama divide y vencerás.

Si el problema original se puede dividir en k subproblemas, 1<k≤n, y todos estos subproblemas se pueden resolver y las soluciones de estos subproblemas se pueden usar para encontrar la solución al problema original, entonces esto El método de divide y vencerás es factible. Los subproblemas generados por el método divide y vencerás suelen ser modelos más pequeños del problema original, lo que facilita el uso de técnicas recursivas. En este caso, la aplicación repetida del método divide y vencerás puede hacer que el subproblema sea consistente con el tipo de problema original, pero su escala se reduce continuamente y, finalmente, el subproblema se reduce hasta el punto en que es fácil resolverlo directamente. encontrar su solución. Esto naturalmente conduce a un proceso recursivo. Divide y conquistarás y la recursividad son como hermanos gemelos, a menudo se usan simultáneamente en el diseño de algoritmos y, por lo tanto, producen muchos algoritmos eficientes.

Algunos problemas clásicos que se pueden resolver mediante el método divide y vencerás:

  • (1) Búsqueda binaria
  • (2) Multiplicación de enteros grandes
  • (3) Multiplicación de matrices de Strassen
  • (4) Cobertura del tablero de ajedrez
  • (5) Combinar clasificación
  • (6) Clasificación rápida
  • (7) Selección de tiempo lineal
  • (8) Problema del par de puntos más cercanos
  • (9) Calendario de todos contra todos
  • (10) Torre de Hanói

Un núcleo del algoritmo de divide y vencerás radica en si los tamaños de los subproblemas son similares. Si lo son, el algoritmo es más eficiente.

El algoritmo divide y vencerás y la programación dinámica resuelven subproblemas y luego fusionan las soluciones; pero el algoritmo divide y vencerás busca subproblemas que son mucho más pequeños que el problema original (porque todavía es muy rápido para computadoras para calcular pequeños problemas de datos), y al mismo tiempo dividir La eficiencia del algoritmo de gobernanza no es necesariamente buena, y la eficiencia de la programación dinámica depende del número de subproblemas. Cuando el número de subproblemas es mucho menor que el número total de subproblemas (es decir, hay muchos subproblemas repetidos), el algoritmo será muy eficiente.

avaro

Citado de: Cinco algoritmos de uso común: explicación detallada y ejemplos clásicos de algoritmo codicioso_ Blog Deje de pensar en mejores formas - Blog CSDN_ Algoritmo codicioso .

El algoritmo codicioso (también conocido como algoritmo codicioso) significa que al resolver un problema, siempre tome la mejor decisión en ese momento. En otras palabras, sin considerar la solución óptima general, lo que hizo fue solo una solución óptima local en cierto sentido. El algoritmo codicioso no puede obtener la solución óptima general para todos los problemas, pero puede producir la solución óptima general o una solución aproximada a la solución óptima general para una amplia gama de problemas.

la idea basica

  1. Construya un modelo matemático para describir el problema.

  2. Divida el problema a resolver en varios subproblemas.

  3. Resuelva cada subproblema y obtenga la solución óptima local del subproblema.

  4. La solución óptima local del subproblema se sintetiza en una solución del problema original.

El proceso de implementación del algoritmo.

  1. Partiendo de una solución inicial al problema;

  2. mientras puede dar un paso adelante hacia un objetivo general determinado;

  3. Encuentre un elemento de solución de una solución factible;

  4. Una solución factible al problema se compone de todos los elementos de la solución.

Hay un problema con este algoritmo.

  1. No hay garantía de que la solución final obtenida sea la mejor;
  2. No se puede utilizar para encontrar la solución máxima o mínima del problema;
  3. Sólo puede encontrar el rango de soluciones factibles que satisfacen ciertas restricciones.

Cita de: ¿ Qué es la programación dinámica? ¿Cuál es el significado de programación dinámica? - Zhihu (zhihu.com)  explica las deficiencias del algoritmo codicioso: 

Primero echemos un vistazo a algo que encontramos a menudo en la vida: supongamos que usted es una persona rica y lleva suficientes billetes con denominaciones de 1, 5, 10, 20, 50 y 100 yuanes. Ahora tu objetivo es recolectar una cierta cantidad w, usando la menor cantidad de billetes posible.

Basándonos en la experiencia de la vida, obviamente podemos adoptar esta estrategia: si puedes usar 100, intenta usar 100, en caso contrario intenta usar 50... y así sucesivamente. Bajo esta estrategia, se utilizaron 666=6×100+1×50+1×10+1×5+1×1, y se utilizaron un total de 10 billetes.

Esta estrategia se llama " codiciosa ": suponiendo que la situación que enfrentamos es "necesitamos recuperar w", la estrategia codiciosa reducirá la "parte que aún debe recuperarse" lo antes posible . Si puede reducir w en 100, intente reducirlo en 100. De esta forma, la siguiente situación a la que nos enfrentamos es recuperar w-100. La experiencia de vida a largo plazo muestra que la estrategia codiciosa es correcta.

Sin embargo, si cambiamos la denominación de un conjunto de billetes, la estrategia codiciosa puede no funcionar. Si las denominaciones de los billetes de un país extraño son 1, 5 y 11, cuando obtengamos 15, nuestra codiciosa estrategia saldrá mal:

15=1×11+4×1 (la estrategia codiciosa usa 5 billetes)

15=3×5 (estrategia correcta, solo usa 3 billetes)

¿Por qué esto es tan? ¿Qué hay de malo en la estrategia codiciosa?

Miope.

Como acabo de decir, el programa de la estrategia codiciosa es: "Intenta hacer más pequeña la w que enfrentas a continuación". De esta manera, la estrategia codiciosa dará prioridad al uso de 11 para reducir w a 4 cuando w = 15; pero en este problema, el costo de obtener 4 es muy alto, por lo que se debe usar 4 × 1. Si se usa 5, w se reducirá a 10. Aunque no es tan pequeño como 4, solo se necesitan dos 5 yuanes para formar 10.

Aquí encontramos que la avaricia es una estrategia que sólo considera la situación inmediata .

trazar hacia atrás

Citado de: Algoritmo de retroceso de leetcode (retroceso) Resumen del retroceso del blog-CSDN blog_leetcode de _wonner_ .

El algoritmo de retroceso, también llamado método heurístico, es un método para buscar sistemáticamente soluciones a problemas. La idea básica del algoritmo de retroceso es: avanzar desde un camino, avanzar si puede, retroceder si no puede e intentar otro camino nuevamente.

rama y atado

Citado de: Cinco algoritmos de uso común: explicación detallada y ejemplos clásicos de algoritmos de rama y enlace_ Blog Deje de pensar en mejores formas - Blog CSDN_ Explicación detallada de ejemplos de algoritmos de rama y enlace .

Retroceso comparativo

  • El objetivo de la solución del método de retroceso es encontrar todas las soluciones en el espacio de soluciones que satisfagan las condiciones de restricción. Presumiblemente, el objetivo de la solución del método de rama y límite es encontrar una solución que satisfaga las condiciones de restricción, o encontrar la solución. entre las soluciones que satisfacen las condiciones de restricción, un determinado valor de función objetivo alcanza una solución máxima o mínima, que es la solución óptima en cierto sentido.
  • Otra diferencia muy grande es que el método de retroceso busca el espacio de la solución primero en profundidad, mientras que el método de ramificación y límite busca el espacio de la solución primero en amplitud o primero en costo mínimo.

Supongo que te gusta

Origin blog.csdn.net/Staokgo/article/details/132922554
Recomendado
Clasificación