Brève description de l'algorithme - correspondance de chaînes et de chaînes, tri, première recherche en profondeur/largeur, programmation dynamique, diviser pour régner, gourmand, retour en arrière, branchement et liaison

Table des matières

Brève description de l'algorithme

basique

Liste des algorithmes typiques

Correspondance chaîne à chaîne

trier

Recherche en profondeur/largeur d'abord

programmation dynamique

diviser et conquérir

cupide

Retour en arrière

branche et lié


Brève description de l'algorithme

basique

Ahem... En ce qui concerne les algorithmes, nous ne sommes pas des étudiants en informatique. Permettez-moi simplement de dire que les algorithmes sont des moyens et des méthodes spécifiques pour résoudre des problèmes qui ont été modélisés. Ils consistent à apprendre des problèmes de complétion matures/formés pour la programmation, des routines et des idées de calcul. .

Liste des algorithmes typiques

Correspondance chaîne à chaîne

basique

Une chaîne est une séquence limitée de zéro ou plusieurs caractères, également appelée chaîne. Une sous-séquence composée de caractères consécutifs dans une chaîne (bave) est une sous-chaîne de la chaîne. La méthode de codage de la chaîne est le codage de caractères tel que le codage ASCII, le codage Unicode, etc.

Les éléments d'une chaîne sont tous des caractères. Les opérations sur les chaînes sont principalement liées aux opérations sur les chaînes plutôt qu'à des éléments individuels. La plupart d'entre elles sont des opérations telles que la recherche de la position d'une sous-chaîne, l'obtention d'une sous-chaîne à une position spécifiée et le remplacement d'une sous-chaîne, comme suit :

actifs/opérations de chaîne.jpg

Évidemment, les bibliothèques standard telles que string.h fournissent des API d'opération de chaîne de base. Pour une utilisation détaillée de la bibliothèque standard C, veuillez vous référer à la section " 7 Utilisation de la bibliothèque standard C " de l'article " Spécifications d'écriture C & MCU et autres ". .

Algorithme de correspondance de chaînes (également appelé correspondance de modèles de chaînes)

Correspondance de chaîne, par exemple : pour trouver la position de la sous-chaîne qui est la même que la chaîne de modèle P = "ABCDABD" à partir de la chaîne principale S = "BBC ABCDAB ABCDADCDABDE".

Algorithme de correspondance de modèle de chaîne-algorithme BF (ou algorithme de force brute)

La chaîne principale S commençant à partir de la position i = 0 est-elle la même que la chaîne de modèle P commençant à partir de la position j = 0 caractère par caractère ? S'ils sont identiques, i et j seront incrémentés de un et détermineront ensuite s'ils sont identiques. match. S'ils sont différents, je reviendrai ici. En même temps, j revient à la première position de la position de départ correspondante et continue de correspondre un par un. Une photo explique :

Extrait de : 21 Algorithme de correspondance de modèles de chaînes (algorithme BF) - Zhihu (zhihu.com)

actifs/algorithme BF (ou algorithme de force brute).jpg

Algorithme de correspondance de modèles rapide pour l'algorithme de chaînes-KMP

L'idée principale est que par rapport à l'algorithme BF, afin d'accélérer l'appariement, trouvez quelques règles. Lorsque l'appariement échoue, j n'a pas besoin de revenir au début de P à chaque fois, mais selon (attention, si vous ne Si vous ne comprenez pas, il est recommandé de lire l'article du didacticiel ci-dessous. , voici le résumé après compréhension) La longueur maximale d'élément commun de chaque sous-chaîne de préfixe et de suffixe de chaque chaîne dans la chaîne de modèle est utilisée pour construire le tableau suivant, et le nombre de chiffres déplacés de j à chaque fois est ajusté en fonction du suivant.

trier

Recherche en profondeur/largeur d'abord

Le parcours graphique est généralement effectué à l'aide d'une recherche en profondeur d'abord (DFS) et d'une recherche en largeur d'abord (BFS). "Si vous considérez un arbre comme un type particulier de graphique, DFS est un parcours de pré-ordre."

programmation dynamique

Certaines personnes le comprennent comme l'utilisation de l'idée de « programmation dynamique » (écriture d'objectifs d'optimisation et d'équations de transition d'état (ou relations récursives)) pour comprendre et modéliser des problèmes afin que la solution optimale au problème puisse être trouvée sans parcourir toutes les solutions possibles. (couper des branches, ou supprimer les calculs qui ne sont probablement pas des solutions optimales pour gagner du temps, ou supprimer les sous-problèmes qui se chevauchent) ; une méthode de mise en œuvre courante consiste à utiliser le cache pour stocker les données afin de réduire les calculs répétés (étendre le processus de calcul exhaustif dans une arborescence , puis découvrez les parties qui sont calculées à plusieurs reprises et utilisez la mise en cache pour conserver une copie des résultats qui ont été calculés à plusieurs reprises auparavant afin de réduire les calculs répétés), et il existe de nombreuses autres techniques et méthodes.

diviser et conquérir

Cité de : Cinq algorithmes couramment utilisés - Explication détaillée et exemples classiques de l'algorithme Diviser pour régner_ Arrêtez de penser à de meilleures façons Blog - Blog CSDN_ Exemples classiques de l'algorithme Diviser pour régner .

L'idée de conception de la méthode diviser pour régner est de diviser un problème important difficile à résoudre directement en un certain nombre de problèmes identiques plus petits afin qu'ils puissent être résolus séparément et divisés et conquis.

La stratégie diviser pour régner est la suivante : pour un problème de taille n, si le problème peut être facilement résolu (par exemple, la taille n est petite), alors résolvez-le directement ; sinon, décomposez-le en k sous-ensembles à plus petite échelle. problèmes, et ces sous-problèmes interagissent les uns avec les autres. Indépendamment et sous la même forme que le problème d'origine, ces sous-problèmes sont résolus de manière récursive, puis les solutions de chaque sous-problème sont combinées pour obtenir la solution du problème d'origine . Cette stratégie de conception d’algorithmes s’appelle diviser pour régner.

Si le problème initial peut être divisé en k sous-problèmes, 1<k≤n, et que ces sous-problèmes peuvent tous être résolus et que les solutions de ces sous-problèmes peuvent être utilisées pour trouver la solution au problème initial, alors ceci La méthode diviser pour régner est réalisable. Les sous-problèmes générés par la méthode diviser pour régner sont souvent des modèles plus petits du problème original, ce qui facilite l'utilisation de techniques récursives. Dans ce cas, l'application répétée de la méthode diviser pour mieux régner peut rendre le sous-problème cohérent avec le type de problème d'origine, mais son ampleur continue de diminuer. Finalement, le sous-problème est réduit au point où il est facile de le trouver. sa solution directement. Cela conduit naturellement à un processus récursif. Diviser pour régner et récursivité sont comme des frères jumeaux, souvent utilisés simultanément dans la conception d'algorithmes, et produisent ainsi de nombreux algorithmes efficaces.

Quelques problèmes classiques qui peuvent être résolus en utilisant la méthode diviser pour régner :

  • (1) Recherche binaire
  • (2) Multiplication de grands entiers
  • (3) Multiplication matricielle de Strassen
  • (4)Couverture de l'échiquier
  • (5) Tri par fusion
  • (6) Tri rapide
  • (7) Sélection de temps linéaire
  • (8) Problème de paire de points les plus proches
  • (9) Calendrier du tournoi à la ronde
  • (10) Tour de Hanoï

Un élément central de l’algorithme diviser pour mieux régner réside dans la question de savoir si les tailles des sous-problèmes sont proches. Si elles sont proches, l’algorithme est plus efficace.

L'algorithme diviser pour régner et la programmation dynamique résolvent tous deux des sous-problèmes puis fusionnent les solutions ; mais l'algorithme diviser pour régner recherche des sous-problèmes beaucoup plus petits que le problème d'origine (car il est toujours très rapide pour ordinateurs pour calculer de petits problèmes de données), et en même temps diviser L'efficacité de l'algorithme de gouvernance n'est pas nécessairement bonne, et l'efficacité de la programmation dynamique dépend du nombre de sous-problèmes. Lorsque le nombre de sous-problèmes est beaucoup plus petit que le nombre total de sous-problèmes (c'est-à-dire qu'il existe de nombreux sous-problèmes répétés), l'algorithme sera très efficace.

cupide

Cité de : Cinq algorithmes couramment utilisés - Explication détaillée et exemples classiques d'algorithmes gourmands_ Arrêtez de penser à de meilleures façons Blog - Blog CSDN_Algorithme gourmand .

L'algorithme glouton (également connu sous le nom d'algorithme glouton) signifie que lorsque vous résolvez un problème, faites toujours le meilleur choix du moment. En d’autres termes, sans considérer la solution optimale globale, ce qu’il a fait n’était qu’une solution optimale locale dans un certain sens. L’algorithme glouton ne peut pas obtenir la solution optimale globale pour tous les problèmes, mais il peut produire la solution optimale globale ou une solution approximative de la solution optimale globale pour un large éventail de problèmes.

L'idée de base

  1. Construisez un modèle mathématique pour décrire le problème.

  2. Divisez le problème à résoudre en plusieurs sous-problèmes.

  3. Résolvez chaque sous-problème et obtenez la solution optimale locale du sous-problème.

  4. La solution locale optimale du sous-problème est synthétisée en une solution du problème original.

Le processus de mise en œuvre de l'algorithme

  1. Partir d’une première solution au problème ;

  2. tandis que peut faire un pas en avant vers un objectif global donné ;

  3. Trouver un élément de solution d'une solution réalisable ;

  4. Une solution réalisable au problème est composée de tous les éléments de solution.

Il y a un problème avec cet algorithme

  1. Il n'y a aucune garantie que la solution finale obtenue soit la meilleure ;
  2. Il ne peut pas être utilisé pour trouver la solution maximale ou minimale du problème ;
  3. Il ne peut trouver que l’éventail de solutions réalisables qui satisfont à certaines contraintes.

Citation de : Qu'est-ce que la programmation dynamique ? Quelle est la signification de la programmation dynamique ? - Zhihu (zhihu.com)  explique les lacunes de l'algorithme glouton : 

Jetons d’abord un coup d’œil à quelque chose que nous rencontrons souvent dans la vie : supposons que vous soyez une personne riche et que vous ayez suffisamment de billets de banque d’une valeur de 1, 5, 10, 20, 50 et 100 yuans. Votre objectif est désormais de collecter un certain montant w, en utilisant le moins de billets possible.

En nous basant sur l'expérience de vie, nous pouvons évidemment adopter cette stratégie : si vous pouvez en utiliser 100, essayez d'en utiliser 100, sinon essayez d'en utiliser 50... et ainsi de suite. Dans le cadre de cette stratégie, 666=6×100+1×50+1×10+1×5+1×1, et un total de 10 billets ont été utilisés.

Cette stratégie est appelée « gourmande » : en supposant que la situation à laquelle nous sommes confrontés est « nous devons rattraper w », la stratégie gourmande réduira la « partie qui reste encore à rattraper » le plus rapidement possible . Si vous pouvez réduire w de 100, essayez de le réduire de 100. De cette façon, la prochaine situation à laquelle nous sommes confrontés est de rattraper w-100. L'expérience de vie à long terme montre que la stratégie gourmande est correcte.

Cependant, si nous changeons la dénomination d’un ensemble de billets, la stratégie gourmande risque de ne pas fonctionner. Si les coupures des billets d’un pays étranger sont 1, 5 et 11, alors lorsque nous en arriverons à 15, notre stratégie avide tournera mal :

15=1×11+4×1 (la stratégie gourmande utilise 5 billets)

15=3×5 (stratégie correcte, n'utilisez que 3 billets)

Pourquoi cela est-il ainsi? Quel est le problème avec la stratégie gourmande ?

Myope.

Comme je viens de le dire, le programme de la stratégie gourmande est le suivant : "Essayez de réduire la taille de votre prochain adversaire." De cette façon, la stratégie gloutonne donnera la priorité à l’utilisation de 11 pour réduire w à 4 lorsque w=15 ; mais dans ce problème, le coût pour obtenir 4 est très élevé, donc 4×1 doit être utilisé. Si 5 est utilisé, w sera réduit à 10. Bien qu'il ne soit pas aussi petit que 4, il suffit de deux 5 yuans pour faire 10.

Nous constatons ici que la cupidité est une stratégie qui ne considère que la situation immédiate .

Retour en arrière

Cité de : algorithme de backtracking leetcode (backtracking) Résumé du blog-CSDN de _wonner_ blog_leetcode backtracking .

L’algorithme de backtracking est également appelé méthode heuristique. Il s’agit d’une méthode de recherche systématique de solutions aux problèmes. L'idée de base de l'algorithme de retour en arrière est la suivante : avancez d'un chemin, avancez si vous le pouvez, revenez en arrière si vous ne pouvez pas et réessayez un autre chemin.

branche et lié

Cité de : Cinq algorithmes couramment utilisés - Explication détaillée et exemples classiques d'algorithmes de branchement et de liaison_ Arrêtez de penser à de meilleures façons Blog - Blog CSDN_ Explication détaillée des exemples d'algorithmes de branchement et de liaison .

Retour en arrière comparatif

  • L'objectif de la méthode de backtracking est de trouver toutes les solutions dans l'espace de solutions qui satisfont aux conditions de contrainte. Vraisemblablement, l'objectif de la méthode de branchement et de liaison est de trouver une solution qui satisfait les conditions de contrainte, ou de trouver la solution parmi les solutions qui satisfont aux conditions de contrainte.Une certaine valeur de fonction objectif atteint une solution maximale ou minimale, qui est la solution optimale dans un certain sens.
  • Une autre très grande différence est que la méthode de backtracking recherche l'espace de solution d'une manière en profondeur d'abord, tandis que la méthode de branchement et de liaison recherche l'espace de solution d'une manière en largeur d'abord ou d'une manière au coût minimum.

Je suppose que tu aimes

Origine blog.csdn.net/Staokgo/article/details/132922554
conseillé
Classement