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 |