nsi:tds:deux_points_les_plus_proches
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| nsi:tds:deux_points_les_plus_proches [2021/10/08 18:47] – créée goupillwiki | nsi:tds:deux_points_les_plus_proches [2022/12/12 10:25] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Deux points les plus proches ====== | ====== Deux points les plus proches ====== | ||
| - | On donne un tableau de points du plan avec leurs coordonnées (x ; y). | + | [[https:// |
| - | Quels sont les deux points les plus proches ? | + | {{ : |
| + | |||
| + | On donne un tableau de points du plan avec leurs coordonnées $(x\,; | ||
| + | |||
| + | **Quels sont les deux points les plus proches ?** | ||
| + | |||
| + | ===== Algorithme naïf ===== | ||
| + | |||
| + | Consiste à chercher les distances pour les $\frac{n\, | ||
| + | |||
| + | ===== Algorithme quasi-linéaire ===== | ||
| + | |||
| + | Quasi-linéaire signifie que s'il y a $10\times$ plus de points, le temps de calcul sera quasiment $10\times$ plus long. On comprend que cet algorithme devient beaucoup plus rapide quand le nombre de points augmente. Il faut bien sûr considérer de très grands nombres, par exemple 100 000. Tant qu'il n'y a qu'une centaine de points, la machine calcule très vite sans qu'on perçoive de différence. | ||
| + | |||
| + | Il s'agit d'un algorithme de type [[nsi: | ||
| + | |||
| + | ==== Description générale ==== | ||
| + | |||
| + | On réalise une fonction '' | ||
| + | |||
| + | Si le nombre '' | ||
| + | |||
| + | Sinon on lance le mécanisme habituel de la méthode //diviser pour régner// qui procède en 3 étapes : | ||
| + | |||
| + | === Diviser === | ||
| + | |||
| + | Déterminer une abscisse $x_0$ permettant de couper la liste de points en deux. Ceux à gauche et ceux à droite de $x_0$. On forme ainsi deux ensembles de points que l'on peut appeler $G$ et $D$. | ||
| + | |||
| + | === Régner === | ||
| + | |||
| + | On exécute '' | ||
| + | |||
| + | === Combiner === | ||
| + | |||
| + | C'est le plus compliqué : | ||
| + | * L' | ||
| + | * Nous devons chercher s'il n'y aurait pas une paire de points, l'un dans $G$ et l' | ||
| + | * On sélectionne dans $G$ les points dont l' | ||
| + | * On parcours les points de $B$ par ordonnées croissantes. Pour chaque $P$ ainsi parcouru, on calcule sa distance avec les 7 suivants. On cherche la paire la plus proche. On retient la paire donnant la distance la plus petite. Soit $\delta_B$ cette distance. | ||
| + | * À l' | ||
| + | |||
| + | === Pour faciliter la tâche ==== | ||
| + | |||
| + | Il pourra être utile de trier les points dès le départ selon les $x$ croissants. | ||
| + | |||
| + | ===== Implémentation ===== | ||
| + | |||
| + | Vous devez implémenter cet algorithme et le tester. | ||
| + | |||
| + | Puisqu' | ||
| - | On peut calculer les distances entre chaque paire de points. Pour $n$ points, il y aura $\frac{n\cdot (n-1)}{2}$ distances à calculer. Ce serait donc un algorithme dont le coût est en $n^2$. | ||
| - | Il existe un algorithme en $n\cdot \log(n)$. | ||
nsi/tds/deux_points_les_plus_proches.1633711643.txt.gz · Dernière modification : de goupillwiki
