Le Bricolage | Complexite

Exercice Complexité des Algorithmes : Le bricolage

Exercice Analyse & Conception des Algorithmes : Le Bricolage

Dans une boite à outils, vous disposez de n écrous de diamètres tous différents et des n boulons correspondants. Mais tout est mélangé et vous voulez appareiller chaque écrou avec le boulon qui lui correspond. Les différences de diamètre entre les écrous sont tellement minimes qu’il n’est pas possible de déterminer à l’œil nu si un écrou est plus grand qu’un autre. Il en va de même avec les boulons. Par conséquent, le seul type d’opération autorisé consiste à essayer un écrou avec un boulon, ce qui peut amener trois réponses possibles : soit l’écrou est strictement plus large que le boulon, soit il est strictement moins large, soit ils ont exactement le même diamètre.

  1. Ecrire un algorithme simple en O(n^2) essais qui appareille chaque écrou avec son boulon.
  2. Supposons qu’au lieu de vouloir appareiller tous les boulons et écrous, vous voulez juste trouver le plus petit écrou et le boulon correspondant. Montrer que vous pouvez résoudre ce problème en moins de 2n−2 essais.
  3. Prouver que tout algorithme qui appareille tous les écrous avec tous les boulons doit effectuer Ω(nlogn) essais dans le pire des cas. Problème ouvert : proposer un algorithme en O(n^2) essais pour résoudre ce problème.

Correction.

1 - Algorithme :

#include <stdio.h>

void apparierBoulonsEtEcrous(int boulons[], int ecrous[], int n) {
    for (int i = 0; i < n; i++) {
        int boulonCourant = boulons[i];
        for (int j = 0; j < n; j++) {
            if (ecrous[j] == boulonCourant) {
                printf("Le boulon %d correspond à l'écrou %d\n", boulonCourant, boulonCourant);
                break;
            }
        }
    }
}

int main() {
    int n;
    printf("Entrez le nombre de boulons/écrous : ");
    scanf("%d", &n);

    int boulons[n], ecrous[n];
    printf("Entrez les diamètres des %d boulons : ", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &boulons[i]);
    }

    printf("Entrez les diamètres des %d écrous : ", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &ecrous[i]);
    }

    apparierBoulonsEtEcrous(boulons, ecrous, n);

    return 0;
}

Explication de l'Algorithme :

  • Cet algorithme utilise une approche de force brute pour appareiller chaque boulon avec son écrou correspondant.
  • La fonction apparierBoulonsEtEcrous prend deux tableaux d'entiers (boulons et ecrous) ainsi que la taille n.
  • Dans la boucle externe, chaque boulon est pris un par un et comparé avec tous les écrous dans la boucle interne.
  • Lorsqu'un boulon et un écrou correspondent (c'est-à-dire qu'ils ont le même diamètre), l'algorithme affiche un message indiquant que le boulon correspond à l'écrou.

Note : Pour appareiller les boulons et les écrous, il suffit de prendre un boulon arbitrairement, de le tester avec tous les écrous.On trouve alors le bon en au plus n tests et il suffit alors de recommencer avec tous les autres boulons.On obtient donc le résultat en au plus n(n−1) 2 = O(n^2) tests.

2 - Le plus petit écrou et son boulon Le principe est de numéroter les boulons et les écrous de 1 à n, de manière arbitraire, et de faire progresser des compteurs (par exemple i et j) pour marquer le minimun courant dans l’une des catégories, et la structure en cours de test dans l’autre.

début

while (i≤n) && (j ≤n) do

si i=j=n alors  sortir de la boucle ;

si ecrou.i = boulon.j alors s’en souvenir et faire i := i+1;

si ecrou.i < boulon.j alors j := j +1; min = ecrou;

si ecrou.i > boulon.j alors i := i+1; min = boulon;

fin.

A la fin de cette boucle,

– si min=écrou, l’écrou i est le plus petit.

– si min=boulon, le boulon j est le plus petit. Et dans les deux cas, on sait déjà quel est l’élémentquicorrespond:eneffet,lecompteurdel’autrecatégorievautn+1(oundansun cas spécial),et on a donc déjà rencontré le minimum. la seule raison possible pour laquelle il n’a pas été conservé est donc qu’il ait été testé avec l’autre minimum. Pour le cas spécial ou i=j=n, le dernier test est inutile : en effet, on sait que l’un des deux, est minimum, et que une fois le boulon minimum atteind, j reste fixe : d’où le boulon n est minimum, et son homologue a soit déjà été trouvé, soit est l’écrou restant. Cette boucle effectue donc au plus 2∗n−2 tests.

3 - Algorithme d’appareillage des écrous et de leur boulon

On note f(T) le nombre de feuilles de l’arbre et h(T) sa hauteur.

Si T est un arbre ternaire h(T)≥[log3f(T)]. Par induction sur la hauteur de T :

– Pour h(T) = 0 l’arbre à une feuille donc on a bien h(T)≥[log3f(T)].

– Pour h(T) > 0 un arbre ternaire a trois fils, le fils gauche fg, le fils central fc, et le fils droit fd de hauteur inférieur à h(T)−1.On suppose que h(T) ≥[log3f(T)] est vrai pour h(T) ≤ k k étant fixé on veut démontrer que cette propriété est vrai aussi pour h(T) = k +1. Les feuilles d’un arbre sont aussi celles de ses fils. Donc

Arbre bricolage

f(T) = f(fd)+f(fg)+f(fd)
de plus :
h(T)≤h(fd)+1

h(T)≤h(fg)+1

h(T)≤h(fc)+1

or par induction comme h(T) = k +1, h(fg)≤k, h(fg)≤k,et h(fg)≤k

on a : k = h(fc)≤[log3f(fc)]

h(fd)≤[log3f(fd)]

h(fg)≤[log3f(fg)] Donc f(fc),f(fg),f(fd)≤3^k or : f(T) = f(fc)+f(fg)+f(fd) donc : f(T)≤3×3^k = 3^(k+1)

D’ où on en déduit que : h(T)≥log3f(T) Il y a !n agencements boulons-écrous possibles donc l’arbre de décision, qui est ternaire a pour hauteur : log3!n∼nlog3n, donc la complexité dans le pire cas de l’algo est de : Ω(n×logn).

Si vous avez trouvé les exercices corriges sur la Complexité des Algorithmes & Structure de donnée de Mr JoëlYk intéressants et utiles, pourquoi ne pas les partager avec d'autres personnes qui pourraient également en bénéficier ? Partagez ce lien sur les réseaux sociaux ou envoyez-le à vos amis et collègues. Vous pourriez aider quelqu'un à améliorer ses compétences en programmation ou à trouver des solutions à des problèmes complexes. N'oubliez pas que la connaissance doit être partagée pour grandir. Merci pour votre soutien et votre partage !

Contact WhatsApp : +237 658395978 | Réaliser Par Joël_Yk

  • Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam