Un algorithme est une séquence d'instructions exécutées dans un ordre prédéterminé afin de résoudre un problème ou de terminer un travail. Une fonction est un bloc de code qui peut être appelé et exécuté depuis d’autres parties du programme.
Un ensemble d'instructions pour résoudre un problème ou effectuer une certaine activité. En informatique, les algorithmes sont utilisés pour un large éventail d’opérations, depuis les mathématiques fondamentales jusqu’au traitement de données complexes.
L'un des algorithmes courants utilisés en C est l'algorithme de tri. Un algorithme de tri organise une collection d'éléments dans un certain ordre, par exemple numériquement ou alphabétiquement.
Il existe de nombreux algorithmes de tri, chacun présentant des avantages et des inconvénients. Les algorithmes de tri les plus courants en C sont le tri rapide, la fusion et le tri.
L'une des fonctionnalités clés de C est la prise en charge des pointeurs. Cela permet une manipulation efficace des structures de données telles que des tableaux, des files d'attente, etc. Cela le rend adapté à la mise en œuvre d'algorithmes nécessitant une manipulation de données complexe, telle que le tri et la recherche algorithmique.
L'un des exemples célèbres de bibliothèque logicielle implémenté en C est la bibliothèque de modèles standard (STL). Cette bibliothèque fournit une grande variété d'algorithmes pour des tâches telles que le tri, la recherche et la manipulation de structures de données.
Caractéristiques de l'algorithme
Il définit plusieurs fonctionnalités importantes de l'algorithme, notamment :
Analyse d'algorithme
L'analyse algorithmique est le processus d'évaluation des performances des algorithmes en termes d'efficacité, de complexité et d'autres critères. Généralement, cela est effectué pour évaluer de nombreux algorithmes et sélectionner la solution optimale pour un certain problème ou un logiciel.
L’analyse des algorithmes implique généralement de mesurer leur complexité temporelle et spatiale.
Comme pour la complexité spatiale, qui décrit la quantité de mémoire ou d'espace disque nécessaire, la complexité temporelle décrit la durée pendant laquelle un algorithme détermine pour effectuer une tâche.
qu'est-ce qu'une interface
Il existe différentes manières d'analyser la complexité temporelle des algorithmes, telles que la notation Big O et Omega. Le symbole Omega fournit une limite supérieure pour la complexité temporelle de l'algorithme, tandis que le symbole Omega fournit une limite inférieure.
En plus de mesurer la complexité temporelle et spatiale, l’analyse des algorithmes inclut également d’autres critères tels que la stabilité, le parallélisme et l’évolutivité.
Ils comprennent deux types d'analyse.
ils sont:-
- Analyse préalable.
- Analyse postérieure.
Analyse préalable
Prior est une méthode d'analyse d'algorithmes qui se concentre sur l'estimation des performances d'un algorithme en fonction de ses propriétés mathématiques sans réellement exécuter l'algorithme.
Cette approche vous permet d'analyser la complexité temporelle et spatiale des algorithmes et d'autres métriques sans avoir besoin d'implémenter et d'exécuter les algorithmes.
Analyse postérieure
L'analyse a posteriori, quant à elle, est une méthode d'analyse d'algorithme qui exécute réellement l'algorithme et mesure ses performances.
Cette approche fournit des informations plus précises et détaillées sur les performances de l’algorithme, mais nécessite la mise en œuvre et l’exécution de l’algorithme.
Complexité de l'algorithme
La complexité algorithmique est une mesure permettant de mesurer l'efficacité et les performances de l'algorithme. Les algorithmes sont généralement évalués en termes de temps et d’espace nécessaires pour résoudre un problème ou atteindre un objectif spécifique.
Deux facteurs sont utilisés dans la complexité de l'algorithme.
ils sont:-
- Facteur temps.
- Facteur d'espace.
Facteur temps
- Le temps dont un algorithme a besoin pour accomplir une tâche est appelé complexité temporelle. Il est généralement mesuré par le nombre d'opérations ou d'étapes qu'un algorithme doit effectuer pour résoudre un problème.
- La complexité temporelle d'un algorithme est importante car elle détermine le temps nécessaire à son exécution et peut avoir un impact significatif sur les performances du programme et du système.
- La complexité temporelle d'un algorithme peut être exprimée en utilisant la notation Big O, une manière d'exprimer une limite supérieure sur la complexité temporelle d'un algorithme.
- Un algorithme de complexité temporelle O(n) signifie que le temps nécessaire à l'exécution de l'algorithme est directement proportionnel à la taille des données d'entrée (n).
- D'autres complexités temporelles courantes sont la complexité quadratique O(n^2) et la complexité logarithmique O(log n).
Analyse spatiale
- D'autre part, la complexité spatiale fait référence à la quantité de mémoire ou d'espace de stockage requise pour exécuter l'algorithme.
- Ceci est important car cela détermine le nombre de ressources requises pour exécuter des algorithmes pouvant affecter les performances globales de votre application ou de votre système.
- Si la complexité spatiale de l'algorithme est O(n), il utilise une quantité de mémoire qui augmente linéairement avec la taille de l'entrée.
- Si l'algorithme a une complexité spatiale O(1), il utilise une quantité fixe de mémoire quelle que soit la taille de l'entrée.
Comment écrire un algorithme
1. Définissez d’abord le problème que vous souhaitez que l’algorithme résolve.
Par exemple, supposons que nous souhaitions écrire un algorithme pour trouver la valeur maximale à partir d’une liste de nombres.
commande grep sous Linux
2. Décomposez le problème en étapes plus petites et gérables.
- Initialisez la variable 'max' à la première valeur de la liste.
- Pour chaque valeur suivante de la liste, comparez avec « max ».
- Si la valeur est supérieure à « max », définissez « max » sur cette valeur.
- Continuez ainsi jusqu'à ce que chaque valeur de la liste ait été comparée.
- Renvoie la valeur finale « max ».
3. Écrivez votre algorithme en pseudocode ou dans un langage de programmation.
Algorithme écrit en pseudo code :
MAX (list) max = list[0] For i = 1 the length of the list list IF[i] > max max = list[i] End for Maximum return Maximum end
4. Testez votre algorithme pour vous assurer qu’il est correct et efficace.
Vous pouvez tester l'algorithme en saisissant différentes listes de nombres et en vérifiant qu'il renvoie la valeur correcte maximale. Vous pouvez également analyser la complexité temporelle de votre algorithme pour déterminer dans quelle mesure il s'adapte à des entrées plus importantes.
Exemple:-
Entrée : [1, 5, 2, 7, 3]
Sortie : 7.
Explication : 7 est la valeur maximale de la liste.
5. Optimisez l'algorithme.
Recherchez des moyens d’optimiser les algorithmes pour les rendre plus rapides et plus efficaces. Cela peut impliquer de modifier le pseudocode ou de mettre en œuvre des structures de données ou des algorithmes plus efficaces.
Écriture de base d'algorithmes
Exemple : - La somme de deux entiers.
Étape 1 - Commencer
Étape 2 - Déclarer trois entiers a, b, c
Étape 3 - Définir les valeurs de a et b
Étape 4 - Additionner les valeurs de a et b
Étape 5 - Enregistrez la sortie de l'étape 4 en c
np.où
Étape 6 - Imprimer c
Étape 7 - Arrêt
Type d'algorithmes utilisés en langage C.
1. Algorithmes de tri
C fournit un riche ensemble de types de données et d'opérateurs qui peuvent être utilisés pour implémenter divers algorithmes de tri tels que le tri à bulles, le tri par insertion et le tri rapide.
Ces algorithmes sont utiles dans de nombreuses applications car ils peuvent être utilisés pour trier des données de différentes tailles et types.
Il existe différents algorithmes de tri.
ils sont:-
(i) Tri à bulles : Un algorithme de tri simple qui compare à plusieurs reprises les composants proches et les désactive s'ils sont en panne.
L'algorithme de tri à bulles est : -
- Commencez avec une liste d’éléments non triés.
- Comparez les deux premiers éléments de la liste. Si le premier élément est plus grand que le deuxième élément, échangez-les.
- Passez à la paire d'éléments suivante et répétez l'étape 2 jusqu'à ce que la fin de la liste soit atteinte.
- Pour chaque élément de la liste, répétez les étapes 2 et 3 une fois de plus. c'est ce qu'on appelle des laissez-passer.
- Répétez les étapes 2 à 4 pour toute la liste. Au fur et à mesure que vous répétez les passes, les éléments « bouillonnent » jusqu'à leur position correcte dans la liste triée.
- Une fois qu'une passe est terminée et qu'aucun échange n'est effectué, la liste est triée et l'algorithme peut s'arrêter.
- La liste triée finale est renvoyée.
(ii) Tri par insertion : une méthode de tri qui crée une liste triée un élément individuel à la fois en plaçant chacun à l'endroit approprié.
L'algorithme de tri par insertion est : -
- Initialisez une liste triée vide et une liste non triée des éléments à trier.
- Le premier membre de la liste non triée doit être pris et placé à la position appropriée dans la liste triée.
- Répétez l'étape 2 pour chaque élément suivant de la liste non triée.
- Comparez l'élément actuel avec les éléments de la liste triée, en commençant par l'élément immédiatement à gauche.
- Échangez les deux éléments si l'élément actuel est plus petit que l'élément à sa gauche.
- Si l'élément actuel est plus grand que l'élément à sa gauche, insérez-le à sa position correcte dans la liste triée.
- Répétez les étapes 4 à 6 pour chaque élément suivant de la liste non triée.
- Une fois tous les éléments traités, la liste triée contiendra tous les éléments dans le bon ordre.
- Le processus de tri est terminé.
(iii) Tri par sélection : une méthode de tri qui démarre systématiquement la liste triée avec le plus petit détail de la liste non ordonnée.
L'algorithme de tri par sélection est : -
- Commencez par définir l’élément principal de la liste comme élément min.
- Répétez l’opération pour les éléments restants de la liste, en comparant chacun d’eux au minimum actuel.
- Définissez un nouveau minimum si un élément s'avère plus petit que l'existant.
- Remplacez le minimum actuel par le premier élément de la liste chaque fois qu'elle atteint sa conclusion.
- Pour la partie restante non triée de la liste, répétez les étapes 2 à 4, mais commencez par le deuxième élément de la liste (car le premier élément est déjà trié).
- Continuez à trier la liste de cette manière jusqu'à ce que tout soit trié.
(iv) Tri rapide : Un algorithme de tri diviser pour régner qui choisit un élément pivot et divise la liste en sous-listes selon que les éléments sont inférieurs ou supérieurs au pivot. Après cela, les sous-listes sont triées à plusieurs reprises jusqu'à ce que la liste complète soit triée.
L'algorithme de tri rapide est : -
- Choisissez un élément pivot dans la liste. Il s'agit généralement du premier élément, mais il peut aussi s'agir d'un élément aléatoire ou de la médiane de la liste.
- Divisez la liste en deux sous-listes : une contenant des éléments inférieurs au pivot et une contenant des éléments supérieurs au pivot.
- Triez récursivement la sous-liste contenant des éléments inférieurs au pivot en utilisant le même processus.
- Utilisez la même procédure pour trier de manière récursive la sous-liste des entrées plus grandes que le pivot.
- Concaténez les sous-listes triées avec l'élément pivot entre les deux pour former une liste entièrement triée.
- Renvoie la liste entièrement triée.
(v) Beaucoup va : L'algorithme de tri diviser pour régner divise la liste en deux moitiés, trie chaque moitié, puis fusionne les deux moitiés dans l'ordre trié.
Algorithme de tri par fusion :
- Créez deux sous-listes à partir de la liste : une avec des éléments sous le pivot et une avec des éléments au-dessus du pivot.
- Produit une nouvelle sous-liste triée en fusionnant de manière itérative les sous-listes jusqu'à ce qu'une seule sous-liste existe. Ce sera votre liste triée.
- Étapes pour fusionner deux sous-répertoires : -
- Créez une liste vide pour contenir les éléments triés.
- Compare le premier élément de chaque sous-liste.
- Ajoute le plus petit élément à la nouvelle liste et le supprime de la sous-liste parent.
- Répétez les étapes 2 et 3 jusqu'à ce qu'une liste soit complètement vide.
- Ajoute les éléments restants des autres sous-listes à une nouvelle liste.
- Remplace la sous-liste fusionnée par la nouvelle liste triée.
- Répétez ce processus jusqu'à ce que toutes les sous-listes soient fusionnées en une seule liste triée.
(vi) Tri par tas : Un algorithme de tri qui trie les éléments à l'aide d'une structure de données appelée tas.
Voici l'algorithme de classification :
- Empilez le reste des éléments. En partant de la racine, chaque nœud est comparé à ses enfants, en échangeant les nœuds avec leurs enfants plus âgés jusqu'à ce que la propriété max heap soit satisfaite.
- Répétez les étapes 2 et 3 avec les éléments nouvellement empilés, à l'exception du dernier élément dans la bonne position.
- Répétez ce processus jusqu'à ce qu'il ne reste qu'un seul élément dans la pile. C'est maintenant réglé.
(vii) Tri par base : Un algorithme de tri qui trie les éléments en fonction du ou des chiffres de leur représentation binaire.
L'algorithme pour le tri Radix est : -
- déterminer le nombre de chiffres contenus dans le plus grand élément de la liste d'entrée.
- Initialisez une variable, par exemple l'emplacement du chiffre, à 1, qui représente l'emplacement actuel du chiffre.
- Créez une liste vide pour chaque valeur numérique possible de 0 à 9.
- Parcourez la liste d'entrée et ajoutez chaque élément à la liste appropriée en fonction de la valeur de la position actuelle du chiffre.
- Concaténez toutes les listes ensemble pour former la nouvelle liste dans l'ordre des listes de chiffres.
- Multipliez digitPlace par 10 pour passer au chiffre suivant.
- Répétez les étapes 4 à 6 pour chaque chiffre jusqu'à ce que tous les chiffres du plus grand élément aient été pris en compte.
- La liste finale sera triée par ordre croissant selon les chiffres des éléments.
- Renvoie la liste triée finale.
2. Algorithmes de recherche
C fournit également les outils nécessaires pour implémenter divers algorithmes de recherche, tels que la recherche linéaire et la recherche binaire. Ces algorithmes peuvent trouver rapidement des éléments spécifiques dans un ensemble de données, ce qui les rend utiles pour un large éventail d'applications.
Il existe de nombreux types d'algorithmes de recherche.
java synchroniser
Ils sont:-
(i) Recherche linéaire : Un algorithme de recherche de base qui examine chaque élément de la liste un par un jusqu'à ce qu'il trouve l'élément souhaité.
Algorithme de recherche linéaire : -
- Définir l'entrée de l'algorithme : l'entrée d'un algorithme de recherche linéaire est une liste d'éléments (ou un tableau) et un élément cible que nous recherchons.
- Initialisez une variable appelée 'index' à -1 : Cette variable servira à stocker l'index de l'élément cible s'il est trouvé.
- Parcourez la liste des éléments : en commençant par le premier élément, vérifiez chaque élément de la liste un par un.
- Comparez l'élément présent à l'élément souhaité pour l'évaluation : conservez l'index de l'élément actuel dans la variable index et quittez la boucle si l'élément moderne et l'élément goal sont identiques.
- Renvoie l'index de l'élément cible : une fois la boucle terminée, renvoie la valeur stockée dans la variable d'index. Si l'élément cible n'est pas trouvé, la valeur de l'index sera -1.
(ii) Recherche binaire : Un algorithme de recherche qui fonctionne en divisant la liste en moitiés et en effectuant des recherches à l'intérieur de ces moitiés est plus susceptible d'inclure l'élément.
Algorithme de recherche binaire : -
- Entrée : une liste triée de n éléments et un élément cible x.
- Initialiser les variables : définissez l'indice bas sur 0, l'indice haut sur n-1 et le milieu sur (bas + haut)/2.
- Démarrer une boucle : Pendant que l'indice bas est inférieur ou égal à l'indice haut, répétez les étapes suivantes.
- Comparez l'élément médian avec x : si l'élément médian est égal à x, renvoie l'index médian.
- Mettez à jour l'index bas ou haut : si x est supérieur à l'élément mid, définissez l'index bas sur mid + 1. Sinon, définissez l'index haut sur mid - 1.
- Mettez à jour l'index mid : Mid = (low+high)/2.
- Fin de la boucle : Si l'indice bas est supérieur à l'indice haut, alors x n'est pas dans la liste, et l'algorithme renvoie un échec.
- Sortie : l'index de x dans la liste ou le message d'échec.
(iii) Recherche en profondeur d'abord : Un algorithme de recherche qui examine chaque branche autant que possible avant de faire demi-tour.
Les directives suivantes s'appliquent à la recherche en profondeur :
- sélectionnez le sommet ou le nœud de départ du graphique pour commencer.
- Ajoutez une marque de visite au premier sommet.
- Placez directement le sommet de début dans une pile.
- Jusqu'à ce que la pile soit vide, répétez les actions suivantes : -
- Supprimez le sommet supérieur de la pile.
- Marquez comme visité et insérez dans la pile chaque voisin non visité du sommet éclaté.
- Continuez ce processus jusqu'à ce que tous les sommets du graphique aient été visités.
- Une fois que tous les sommets ont été visités, l'algorithme est terminé et une recherche en profondeur d'abord est effectuée sur le graphique.
(iv) Recherche en largeur d'abord : Un algorithme de recherche qui explore tous les voisins d'un nœud avant de passer au niveau suivant.
L'algorithme pour la recherche en largeur d'abord est : -
- Commencez par le nœud racine ou l'état initial.
- Ajoutez le nœud racine à une file d'attente.
- Vérifiez si la file d'attente est vide ; si oui, terminez l'algorithme.
- Prenez le premier élément de la file d’attente et marquez-le comme visité.
- Amplifiez le nœud contemporain en ajoutant tous ses voisins non visités à la file d'attente.
- Jusqu'à ce que le nœud souhaité soit localisé ou que la file d'attente soit vide, répétez les étapes 3 à 5.
- Renvoie le chemin de l'état préliminaire à l'état cible si le nœud objectif est trouvé.
- Terminez l'ensemble de règles et signalez que l'état de l'objectif n'a pas été identifié si la file d'attente est vide.
(v) Recherche d'interpolation : Un algorithme de recherche qui utilise les valeurs des éléments recherchés pour estimer la position dans l'index.
monflixer
Il est important que le tableau soit réparti uniformément. Sinon, c'est un algorithme.
Cela fonctionne comme prévu.
L’algorithme peut être résumé comme suit.
- Obtenez la liste d’entrée et la valeur clé à rechercher.
- Initialisez les variables inférieures et supérieures au premier et au dernier index de la liste.
- Si la valeur inférieure est inférieure ou égale à la valeur supérieure, alors : -
- Calculez l'emplacement estimé à l'aide de la formule suivante :
pos = bas + ((haut - bas) / (arr[haut] - arr[bas])) * (x - arr[bas]). - Renvoie la position si la valeur de position estimée est une valeur clé.
- c) Si la valeur de position estimée est inférieure à la valeur clé, réglez-la à une valeur inférieure.
Position + 1. - d) Si la valeur de la position estimée est supérieure à la valeur de réglage de la touche, position - 1 vers le haut.
- Calculez l'emplacement estimé à l'aide de la formule suivante :
- Si la valeur clé n'est pas trouvée, renvoyez -1 pour indiquer que la valeur ne figure pas dans la liste.
(vi) Recherche sautée : méthode de recherche qui parcourt la liste par étapes de longueur constante jusqu'à ce qu'elle trouve l'élément pertinent ou détermine qu'il n'est plus présent.
L'algorithme de recherche par saut est le suivant :
- Tout d’abord, définissez la taille du saut sur la racine carrée du nombre d’éléments du tableau.
- Définit une variable nommée « actuel » sur le premier élément du tableau.
- Parcourt le tableau en sautant par taille de saut tout en incrémentant une variable appelée « saut ».
- Passez au saut suivant si l'élément existant est plus petit que l'élément souhaité.
- Si l'élément actuel est plus grand que l'élément cible, effectuez une recherche linéaire entre l'élément actuel et l'élément de saut précédent pour trouver l'élément cible.
- Si l'élément cible n'est pas trouvé dans le tableau, il renvoie -1 pour indiquer qu'il n'est pas dans le tableau.
- Si l'élément est trouvé, il renvoie l'index de l'élément dans le tableau.
3. Algorithmes graphiques
La prise en charge par C des pointeurs et des structures de données telles que les tableaux et les listes chaînées le rend adapté à la mise en œuvre d'algorithmes qui manipulent des graphiques, comme la recherche du chemin le plus court entre deux nœuds dans un graphique.
Il existe différents types d'algorithmes graphiques.
ils sont:-
4. Algorithmes cryptographiques
C prend en charge les opérations de bas niveau et la manipulation efficace des données, ce qui le rend idéal pour implémenter des algorithmes utilisés en cryptographie, tels que les algorithmes de cryptage et de déchiffrement des données.
Il existe différents types d'algorithmes de chiffrement.
Ils sont:-
Avantages de l'algorithme
Les algorithmes présentent de nombreux avantages.
ils sont:-
Inconvénients de l'algorithme
Les algorithmes sont très utiles pour la programmation, mais ils présentent des inconvénients.
ils sont:-