Optimiser F7 par tri et parcours à deux pointeurs

This commit is contained in:
rabot
2026-10-21 11:15:03 +02:00
parent 1c7970b554
commit 02fcd4b443
3 changed files with 94 additions and 5 deletions
+18
View File
@@ -313,3 +313,21 @@ des transactions imposerait de reconstruire l'index. F6 garde **M = 3** et
`indexer_par_id` a **M = 2**. Les tests comparent les pointeurs renvoyés
à une recherche linéaire sur des identifiants permutés pour les tailles
1 à 128, et vérifient les recherches hors bornes et dans un tableau vide.
### F7 — Tri et deux pointeurs pour les paires opposées
Une copie des transactions est triée avec F1 pour préserver l'ordre du
tableau d'entrée. Deux pointeurs partent ensuite des extrémités : une somme
négative fait avancer le pointeur gauche, une somme positive fait reculer
le droit. Pour deux montants opposés, on compte leurs multiplicités `a` et
`b` et on ajoute `a × b`. Pour un groupe de `z` zéros, on ajoute
`z(z - 1) / 2` : chaque paire d'indices distincts est comptée une seule fois.
Le tri coûte `O(n log n)` et chaque pointeur traverse au plus `n` éléments,
soit **`O(n log n)`** au total au lieu de `O(n²)`, avec `O(n)` de mémoire.
F7 passe de **M = 4 à M = 3** ; l'auxiliaire `compter_paires_triees` a
**M = 9**. Les tests comparent le compteur à l'énumération de toutes les
paires sur les **97 655 tableaux** de longueur 1 à 7 à montants dans
`[-2, 2]`, ainsi que sur une entrée vide. Ils vérifient aussi que les
transactions d'origine restent inchangées, notamment en présence de
doublons et de plusieurs zéros.