Chaînage interne : un algorithme possible pour la suppression
Problématique
Une méthode classique de résolution  de collisions dans les méthodes de hachage consiste à ranger les synonymes dans une liste linéaire chaînée représentée dans un tableau. D'ou l'appellation de la méthode : chaînage interne. Une liste contient des groupes de synonymes. Quand une collision se produit sur une case k, on parcourt la liste des débordements commenêant en k. Si la donnée n'est pas trouvée, on cherche un emplacement vide dans le tableau. Une bonne faêon de rechercher une position vide c'est de parcourir le tableau à partir de la position R (initialisée à N+1 avec N la taille du tableau). On décrémente R une ou plusieurs fois jusqu'à ce que l'on trouve une position vide. Ainsi, à un moment donné, toutes les positions p telles que p > R sont occupées.

Si la recherche et l'insertion sont faciles pour leur compréhension, la  suppression mérite reflexion.

Nous proposons ci-après une solution possible à l'opération de suppression :

 

Implémentation

- une table TDON [1..Max] de sous tableaux

Chaque sous tableau [1..B] peut contenir B données

- une table TLIEN [1..Max] de lien contenant les données en débordements des sous tableaux

- une table TNBR[1..Max] contient le nombre d'éléments de chaque sous tableau

 

Algorithme de suppression :

 

1. Rechercher la donnée

Si elle existe soit I l'entrée dans la table TDON et J la position dans le sous tableauc correspondant à l'entrée I

 2. supprimer la donnée en procédant par simple déplacement du dernier vers la position J.

 

3. Si l'entrée I n'a pas de suivant, l'algorithme s'arrête.

 

4. sinon, chercher s’il existe plus loin dans la liste des sous tables une donnée d telle que la liste qui commence en h(d) contient (passe ou traverse) le maillon I. h étant la fonction de hachage utilisée.

 

5. Si une telle donnée existe, K est son indice dans TDON et Ind l'indice dans sa sous table.

déplacer cette donnée au maillon I position J, poser I:= K et J := Ind et recommencer la suppression de cette donnée à partir de 2.

 

6. Sinon faire une coupe : couper la liste en deux en mettant tout simplement Nil dans TLIEN(I).

 
Solution en Z    Z

  {

            Chaînage interne

            Capacité de la case > 1

            Recherche - Insertion - Suppression

            Réalisation D.E  ZEGOUR

 }

   SOIT

       F UN FICHIER DE ENTIERS BUFFER Donnee ;

       Tdon UN VECTEUR ( 100 ) DE VECTEUR ( 5 ) ;

       Tlien UN VECTEUR ( 100 ) DE ENTIER ;

       Tnb UN VECTEUR ( 100 ) DE ENTIER ;

       M UN ENTIER ;

       B UN ENTIER ;

       Nile UN ENTIER ;

       R UN ENTIER ;

       N UN ENTIER ;

       H UNE FONCTION ( ENTIER ) ;

       Init , Inserer , Rechercher , Suprimer DES ACTIONS ;

       Generer_donnees UNE ACTION ;

       Chercher UNE ACTION ;

       Exist UNE FONCTION ( BOOLEEN ) ;

       Imprimer UNE ACTION ;

      {

 Génère un fichier de n données aléatoires

 Initialise la table, Insère les n données du fichier , puis  les Supprime.

 Montre les tables après toutes les insertions et après toutes les

 suppressions

       }

     

   DEBUT

       M := 100 ;

       B := 5 ;

       Nile := - 1 ;

       R := M ;

       APPEL Init ;

       APPEL Generer_donnees ;

       OUVRIR ( F , 'don.pas' , 'A' ) ;

       TQ NON FINFICH ( F )

           LIRESEQ ( F , Donnee ) ;

           APPEL Inserer ( Donnee )

       FTQ ;

       FERMER ( F ) ;

       ECRIRE ( 'table avant' ) ;

       APPEL Imprimer ;

       ECRIRE ( 'Suppression ...' ) ;

       OUVRIR ( F , 'don.pas' , 'A' ) ;

       TQ NON FINFICH ( F )

           LIRESEQ ( F , Donnee ) ;

           APPEL Suprimer ( Donnee )

       FTQ ;

       FERMER ( F ) ;

       ECRIRE ( 'table après' ) ;

       APPEL Imprimer ;

     

   FIN

  { Génère un fichier avec n  données aléatoires }

   ACTION Generer_donnees ;

   SOIT

       K UN ENTIER ;

     

   DEBUT

       OUVRIR ( F , 'don.pas' , 'N' ) ;

       POUR K := 1 , 490

           Donnee := ALEANOMBRE ( 5000 ) ;

           ECRIRESEQ ( F , Donnee )

       FPOUR ;

       FERMER ( F ) ;

     

   FIN

  {Initialise les tables}

   ACTION Init ;

   SOIT

       I , J DES ENTIERS ;

       V UN VECTEUR ( 5 ) ;

     

   DEBUT

       INIT_VECT ( V , [ 0 , 0 , 0 , 0 , 0 ] ) ;

       POUR I := 1 , M

           AFF_ELEMENT ( Tlien [ I ] , - 1 ) ;

           AFF_ELEMENT ( Tnb [ I ] , 0 ) ;

           AFF_ELEMENT ( Tdon [ I ] , V ) ;

         

       FINPOUR

   FIN

  {Fonction de hachage}

   FONCTION H ( Nombre ) : ENTIER ;

   SOIT

       Nombre UN ENTIER ;

     

   DEBUT

       H := MOD ( Nombre , M ) + 1

   FIN

  {Imprime les tables}

   ACTION Imprimer ;

   SOIT

       I UN ENTIER ;

     

   DEBUT

       POUR I := 1 , M

           ECRIRE ( I , ':' , ELEMENT ( Tnb [ I ] ) , ELEMENT ( Tdon [ I ] ) , ELEMENT ( Tlien [ I ] ) )

       FPOUR ;

     

   FIN ;

  {

 Recherche d'une donnée D

 Si D existe, Trouv est vrai. I est sa coordonnée dans Tdon et  J sa coordonnée dans la sous table

 Si D n'existe pas, Trouv est faux. I est l'indice du dernier maillon visité

 }

   ACTION Rechercher ( D , Trouv , I , J )

   SOIT

       I , J DES ENTIERS ;

       Trouv , Arret DES BOOLEENS ;

       D UN ENTIER ;

     

   DEBUT

       I := H ( D ) ;

       Trouv := FAUX ;

       Arret := FAUX ;

       TQ NON Trouv ET ( I <> Nile ) ET ( NON Arret )

           J := 1 ;

           TQ ( J <= ELEMENT ( Tnb [ I ] ) ) ET NON Trouv

               SI ELEMENT ( ELEMENT ( Tdon [ I ] ) [ J ] ) = D

                   Trouv := VRAI

               SINON

                   J := J + 1

               FSI

           FTQ ;

           SI NON Trouv

               SI ELEMENT ( Tlien [ I ] ) <> Nile

                   I := ELEMENT ( Tlien [ I ] ) ;

                  

               SINON

                   Arret := VRAI

               FSI

           FSI

       FTQ

   FIN

  { Insérer une donnée d }

   ACTION Inserer ( D ) ;

   SOIT

       D UN ENTIER ;

       I , J DES ENTIERS ;

       Trouv UN BOOLEEN ;

     

   DEBUT

       APPEL Rechercher ( D , Trouv , I , J ) ;

       SI NON Trouv

           SI ELEMENT ( Tnb [ I ] ) < B

               AFF_ELEMENT ( ELEMENT ( Tdon [ I ] ) [ ELEMENT ( Tnb [ I ] ) + 1 ] , D ) ;

               AFF_ELEMENT ( Tnb [ I ] , ELEMENT ( Tnb [ I ] ) + 1 )

           SINON

          /* Collision */

               Trouv := FAUX ;

               TQ NON Trouv ET ( R >= 1 )

                   SI ELEMENT ( Tnb [ R ] ) < B

                       Trouv := VRAI

                   SINON

                       R := R - 1

                   FSI

               FTQ ;

               SI NON Trouv

                   ECRIRE ( 'saturation de la table' )

               SINON

              /* inserer la donnee */

                   AFF_ELEMENT ( ELEMENT ( Tdon [ R ] ) [ ELEMENT ( Tnb [ R ] ) + 1 ] , D ) ;

                   AFF_ELEMENT ( Tnb [ R ] , ELEMENT ( Tnb [ R ] ) + 1 ) ;

                  /* chainage */

                   AFF_ELEMENT ( Tlien [ I ] , R )

               FSI

           FSI

       SINON

           ECRIRE ( 'Donnée ' , D , ' existe' ) ;

         

       FSI

   FIN

  {

 Cherche s'il existe dans une sous table T de taille Taille,

 une donnée d telle que la liste qui commence en h(d) contient le maillon I

 Si une telle donnée existe, Ind est son indice dans T

 }

   ACTION Chercher ( T , Taille , I , Trouv , Ind )

   SOIT

       I UN ENTIER ;

       T UN VECTEUR ( 5 ) ;

       Trouv UN BOOLEEN ;

       Ind UN ENTIER ;

       Taille UN ENTIER ;

       V UN ENTIER ;

     

   DEBUT

       Ind := 1 ;

       Trouv := FAUX ;

       TQ ( Ind <= Taille ) ET NON Trouv

           V := ELEMENT ( T [ Ind ] ) ;

           SI Exist ( I , H ( V ) )

               Trouv := VRAI

           SINON

               Ind := Ind + 1

           FSI

       FTQ

   FIN

  { Détermine si  la liste de tete N contient le maillon I }

   FONCTION Exist ( I , N ) : BOOLEEN ;

   SOIT

       N , I UN ENTIER ;

       Trouv UN BOOLEEN ;

       P UN ENTIER ;

     

   DEBUT

       P := N ;

       Trouv := FAUX ;

       TQ NON Trouv ET ( P <> Nile )

           SI ( P = I )

               Trouv := VRAI

           SINON

               P := ELEMENT ( Tlien [ P ] ) ;

             

           FSI

       FTQ ;

       Exist := Trouv ;

     

   FIN

  {Surprime une donnée d }

   ACTION Suprimer ( D ) ;

   SOIT

       D UN ENTIER ;

       I , J , K , Ind DES ENTIERS ;

       Trouv UN BOOLEEN ;

       L UNE LISTE ;

       Continue UN BOOLEEN ;

     

   DEBUT

       APPEL Rechercher ( D , Trouv ,  I , J ) ;

       SI Trouv

           Continue := VRAI ;

           TQ Continue

               AFF_ELEMENT ( ELEMENT ( Tdon [ I ] ) [ J ] , ELEMENT ( ELEMENT ( Tdon [ I ] ) [ ELEMENT ( Tnb [ I ] ) ]

               ) ) ;

               SI ELEMENT ( Tlien [ I ] ) = Nile

                   Continue := FAUX ;

                   AFF_ELEMENT ( Tnb [ I ] , ELEMENT ( Tnb [ I ] ) - 1 ) ;

                  

               SINON

                   Trouv := FAUX ;

                   K := ELEMENT ( Tlien [ I ] ) ;

                   TQ ( K <> Nile ) ET NON Trouv

                       APPEL Chercher ( ELEMENT ( Tdon [ K ] ) , ELEMENT ( Tnb [ K ] ) , I , Trouv , Ind ) ;

                       SI NON Trouv

                           K := ELEMENT ( Tlien [ K ] )

                       FSI

                   FTQ ;

                   SI Trouv

                       AFF_ELEMENT ( ELEMENT ( Tdon [ I ] ) [ B ] , ELEMENT ( ELEMENT ( Tdon [ K ] ) [ Ind ] ) ) ;

                       I := K ;

                       J := Ind ;

                     

                   SINON

                       ECRIRE ( 'Une coupe' ) ;

                      /* Couper la liste en 2 */

                       AFF_ELEMENT ( Tlien [ I ] , Nile ) ;

                       AFF_ELEMENT ( Tnb [ I ] , ELEMENT ( Tnb [ I ] ) - 1 ) ;

                       Continue := FAUX

                   FSI

               FSI

           FTQ ;

         

       SINON

           ECRIRE ( 'Donnée ' , D , 'inexistante' ) ;

         

       FSI

   FIN

 

Données
Création d'un fichier de 490 données aléatoires.
Résultats
Donnée 3193 existe 
Donnée 3423 existe 
Donnée 1692 existe 
Donnée 1613 existe 
Donnée 644 existe 
Donnée 2730 existe 
Donnée 2191 existe 
Donnée 4616 existe 
Donnée 4819 existe 
Donnée 3309 existe 
Donnée 1954 existe 
Donnée 1637 existe 
Donnée 359 existe 
Donnée 2528 existe 
Donnée 1617 existe 
Donnée 3182 existe 
Donnée 1050 existe 
Donnée 3605 existe 
Donnée 80 existe 
Donnée 4006 existe 
Donnée 1654 existe 
Donnée 2444 existe 
Donnée 1097 existe 
table avant 
1 : 2 4300 1100 0 0 0 -1 
2 : 3 701 3801 4301 0 0 -1 
3 : 5 3802 2902 702 2802 2 71 
4 : 2 3303 2703 0 0 0 -1 
5 : 5 3204 4 804 2504 2304 55 
6 : 5 1005 3605 605 2205 3805 -1 
7 : 5 306 4006 3506 1406 1806 80 
8 : 2 2707 507 0 0 0 -1 
9 : 0 0 0 0 0 0 -1 
10 : 5 2709 1009 3309 3709 709 26 
11 : 4 2310 1510 3510 3610 0 -1 
12 : 2 611 1411 0 0 0 -1 
13 : 5 4212 3812 2412 1912 4012 88 
14 : 5 1613 4313 4713 1513 1013 -1 
15 : 5 1914 1114 914 1814 14 -1 
16 : 5 2015 15 3915 1815 1515 97 
17 : 2 4616 2916 0 0 0 -1 
18 : 3 717 3417 1617 0 0 -1 
19 : 0 0 0 0 0 0 -1 
20 : 4 819 2419 1719 4819 0 -1 
21 : 5 920 4420 20 2320 3820 67 
22 : 5 821 3221 3121 3021 4021 -1 
23 : 5 4922 4022 1222 1822 222 -1 
24 : 3 3423 3923 1823 0 0 -1 
25 : 5 4924 3224 1724 1224 1362 -1 
26 : 5 4725 2509 4232 4443 4825 25 
27 : 5 226 2426 2726 826 2926 58 
28 : 5 3927 527 4788 1864 3067 26 
29 : 5 2528 1728 3628 4428 3128 99 
30 : 5 629 1529 29 1829 2729 75 
31 : 5 330 2730 1430 3030 4730 70 
32 : 5 1831 631 4631 1931 431 65 
33 : 5 932 232 2532 532 1232 57 
34 : 5 2633 3133 261 1930 1993 28 
35 : 5 1634 1444 1669 2437 1215 34 
36 : 5 4335 4535 1635 1835 3935 -1 
37 : 5 2536 3836 2136 2436 1175 35 
38 : 5 337 4737 1637 4537 2369 35 
39 : 5 2238 3238 2638 2538 3638 58 
40 : 5 1739 4239 4939 2439 4773 -1 
41 : 5 2040 1240 640 2540 1040 97 
42 : 5 4041 4064 2158 4757 3856 37 
43 : 5 4642 2642 1542 942 3799 42 
44 : 5 1643 843 2443 243 4643 26 
45 : 5 644 3944 2944 2444 3947 35 
46 : 5 2845 4045 145 2345 45 -1 
47 : 5 3246 4046 4246 546 4746 -1 
48 : 5 1447 3847 3547 4947 2047 45 
49 : 5 948 1148 4248 1248 4348 82 
50 : 5 2849 649 4449 1849 1449 91 
51 : 5 2050 1250 3150 1050 2250 -1 
52 : 5 151 1351 2351 451 4151 -1 
53 : 5 3352 3152 1952 1152 2152 100 
54 : 5 553 3153 1453 2553 1689 43 
55 : 5 1954 1654 3754 4654 1804 -1 
56 : 5 1455 2055 3855 1355 1555 91 
57 : 5 4456 2756 3156 3166 2232 42 
58 : 5 1828 2368 2883 3838 3626 54 
59 : 5 3058 2658 958 1058 3070 58 
60 : 5 4459 4059 359 3659 2859 -1 
61 : 5 3560 60 4660 3460 4460 98 
62 : 5 4161 1374 2596 1875 206 59 
63 : 5 4462 1162 3962 4662 806 62 
64 : 5 1563 4463 4163 1663 1363 68 
65 : 5 4264 3264 1264 731 2872 63 
66 : 5 2165 2465 1765 3465 885 65 
67 : 5 1766 2666 2166 3366 2420 57 
68 : 5 367 2067 167 3286 2863 66 
69 : 5 968 4368 1468 168 3868 58 
70 : 5 3969 3469 4769 1369 1830 38 
71 : 5 70 3470 4670 4802 89 68 
72 : 5 971 2071 2571 1971 4371 85 
73 : 5 172 872 1684 4199 3081 71 
74 : 5 4173 3773 3573 3673 2573 40 
75 : 5 4374 2074 1029 484 728 73 
76 : 5 1475 2075 4275 2575 2175 92 
77 : 5 3076 1976 1176 1776 676 -1 
78 : 5 577 1977 977 177 580 75 
79 : 5 578 4478 378 78 4178 81 
80 : 5 4579 879 1079 4898 2906 78 
81 : 5 80 4090 4340 2278 4075 80 
82 : 5 2781 2481 3581 2381 1348 73 
83 : 5 282 582 4882 3182 1097 81 
84 : 5 2783 1083 3983 3183 3683 99 
85 : 5 4284 3584 4184 4171 2097 83 
86 : 5 385 4785 4285 3085 4185 97 
87 : 5 3486 1686 2452 4052 1294 85 
88 : 5 387 2987 2287 2312 3955 87 
89 : 5 2288 1888 1940 755 1697 88 
90 : 5 4789 4589 2289 3289 1597 89 
91 : 5 590 390 4290 449 1055 89 
92 : 5 1191 2191 3491 495 1275 81 
93 : 5 4392 3092 1692 4992 4092 -1 
94 : 5 793 3193 993 2293 2093 34 
95 : 5 2194 1694 1794 2094 2294 87 
96 : 5 3695 1795 595 1395 4195 92 
97 : 5 3096 4615 2560 3840 4485 90 
98 : 5 3197 1797 2052 483 3160 97 
99 : 5 3798 3698 428 4683 4852 98 
100 : 5 899 252 4599 652 1352 99 
Suppression ... 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Donnée 3193 inexistante 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Donnée 3423 inexistante 
Donnée 1692 inexistante 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Donnée 1613 inexistante 
Donnée 644 inexistante 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Donnée 2730 inexistante 
Une coupe 
Donnée 2191 inexistante 
Une coupe 
Donnée 4616 inexistante 
Une coupe 
Une coupe 
Une coupe 
Donnée 4819 inexistante 
Une coupe 
Une coupe 
Donnée 3309 inexistante 
Donnée 1954 inexistante 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Une coupe 
Donnée 1637 inexistante 
Donnée 359 inexistante 
Donnée 2528 inexistante 
Donnée 1617 inexistante 
Donnée 3182 inexistante 
Donnée 1050 inexistante 
Donnée 3605 inexistante 
Donnée 80 inexistante 
Donnée 4006 inexistante 
Donnée 1654 inexistante 
Donnée 2444 inexistante 
Donnée 1097 inexistante 
table après 
1 : 0 1100 1100 0 0 0 -1 
2 : 0 4301 3801 4301 0 0 -1 
3 : 0 4802 4802 2802 2802 4802 -1 
4 : 0 2703 2703 0 0 0 -1 
5 : 0 1804 1804 2504 2504 1804 -1 
6 : 0 3805 2205 605 2205 3805 -1 
7 : 0 206 806 806 206 206 -1 
8 : 0 507 507 0 0 0 -1 
9 : 0 0 0 0 0 0 -1 
10 : 0 2509 2509 3709 3709 2509 -1 
11 : 0 3610 3510 3510 3610 0 -1 
12 : 0 1411 1411 0 0 0 -1 
13 : 0 2312 2312 1912 1912 2312 -1 
14 : 0 1013 1513 4713 1513 1013 -1 
15 : 0 14 1814 914 1814 14 -1 
16 : 0 1215 4615 1215 1815 1215 -1 
17 : 0 2916 2916 0 0 0 -1 
18 : 0 1617 3417 1617 0 0 -1 
19 : 0 0 0 0 0 0 -1 
20 : 0 4819 1719 1719 4819 0 -1 
21 : 0 2420 2420 2320 2320 2420 -1 
22 : 0 4021 3021 3121 3021 4021 -1 
23 : 0 222 1822 1222 1822 222 -1 
24 : 0 1823 3923 1823 0 0 -1 
25 : 0 1224 1724 1724 1224 1362 -1 
26 : 0 4825 4825 4825 4443 1362 -1 
27 : 0 3626 3626 826 826 3626 -1 
28 : 0 527 527 1864 1864 1362 -1 
29 : 0 1828 728 728 1828 1828 -1 
30 : 0 1029 1029 1829 1829 1029 -1 
31 : 0 1930 1830 1930 3030 1930 -1 
32 : 0 731 731 1931 1931 731 -1 
33 : 0 4232 4232 2232 532 2232 -1 
34 : 0 3133 3133 1993 1864 1864 -1 
35 : 0 1634 2437 2437 2437 1930 -1 
36 : 0 3935 1835 1635 1835 3935 -1 
37 : 0 2436 2136 2136 2436 1864 -1 
38 : 0 2437 4537 1637 4537 2437 -1 
39 : 0 3838 3838 2538 2538 3838 -1 
40 : 0 2439 4939 4939 2439 4773 -1 
41 : 0 4340 1940 1940 4340 4340 -1 
42 : 0 4041 2158 2158 4757 1864 -1 
43 : 0 942 1542 1542 942 2158 -1 
44 : 0 4443 4443 243 243 4443 -1 
45 : 0 1444 2444 2944 2444 1444 -1 
46 : 0 45 2345 145 2345 45 -1 
47 : 0 4746 546 4246 546 4746 -1 
48 : 0 3947 3947 4947 4947 3947 -1 
49 : 0 1348 1348 1248 1248 1348 -1 
50 : 0 449 449 1849 1849 449 -1 
51 : 0 2250 1050 3150 1050 2250 -1 
52 : 0 4151 451 2351 451 4151 -1 
53 : 0 4052 2452 4052 4852 4052 -1 
54 : 0 2553 1453 1453 2553 2158 -1 
55 : 0 4654 3754 3754 4654 1804 -1 
56 : 0 3955 3955 3955 755 755 -1 
57 : 0 3856 3156 3156 2232 4232 -1 
58 : 0 4757 2368 4757 2158 2158 -1 
59 : 0 2158 1058 958 1058 2158 -1 
60 : 0 2859 3659 359 3659 2859 -1 
61 : 0 2560 3160 2560 3460 2560 -1 
62 : 0 261 261 4064 4064 4788 -1 
63 : 0 1362 4662 3962 4662 4064 -1 
64 : 0 2863 2863 1663 1663 2863 -1 
65 : 0 1864 4064 1264 4064 4064 -1 
66 : 0 3465 1765 1765 3465 4788 -1 
67 : 0 3166 3366 2166 3366 3166 -1 
68 : 0 3067 167 167 2863 4788 -1 
69 : 0 2368 2368 168 168 2368 -1 
70 : 0 1669 1669 1369 1369 1669 -1 
71 : 0 3070 4670 4670 4802 3070 -1 
72 : 0 4171 4171 1971 1971 4171 -1 
73 : 0 2872 872 2872 3799 4788 -1 
74 : 0 4773 4773 3673 3673 4773 -1 
75 : 0 1374 2074 1374 1374 3799 -1 
76 : 0 1175 1175 1875 1175 4075 -1 
77 : 0 676 1776 1176 1776 676 -1 
78 : 0 177 977 977 177 206 -1 
79 : 0 2278 2278 78 78 2278 -1 
80 : 0 1079 1079 1079 206 206 -1 
81 : 0 580 580 580 2278 3799 -1 
82 : 0 3081 2381 3581 2381 3081 -1 
83 : 0 3182 4882 4882 3182 3799 -1 
84 : 0 2883 483 4683 2883 2883 -1 
85 : 0 1684 484 4184 484 3799 -1 
86 : 0 885 4485 885 3085 885 -1 
87 : 0 3286 1689 1689 1828 3799 -1 
88 : 0 2287 2287 2287 2312 1689 -1 
89 : 0 4788 1888 4788 1689 4052 -1 
90 : 0 1689 1689 3289 3289 1689 -1 
91 : 0 4090 4290 4290 4090 4090 -1 
92 : 0 3491 4075 3491 4075 1175 -1 
93 : 0 4092 4992 1692 4992 4092 -1 
94 : 0 1993 1993 2293 2293 1993 -1 
95 : 0 1294 1294 2094 2094 1294 -1 
96 : 0 495 495 1395 1395 495 -1 
97 : 0 2596 2596 2097 3799 4052 -1 
98 : 0 1097 2097 1097 1097 2097 -1 
99 : 0 4898 3698 4898 2883 3799 -1 
100 : 0 3799 4199 652 652 3799 -1