ÌÜèçìá 7ï: ÁËÃÏÑÉÈÌÏÉ ÁÍÁÆÇÔÇÓÇÓ ÓåéñéáêÞ ÁíáæÞôçóç Ç áðëïýóôåñç ìýèïäïò áíáæþôçóçò åßíáé ç óåéñéáêþ sequetial) ãñáììéêþ liear). Áí êáé ç ìýèïäïò åßíáé áðïëýôùò ãíùóôþ áðü ôï áíôéêåßìåíï ôùí Äïìþí ÄåäïìÝíùí, åðáíáëáìâüíïõìå åëü éóôá óçìåßá ùò åéóáãùãþ óôï ðáñüí ìüèçìá. Ç åðüìåíç äéáäéêáóßá sequetial1 õðïèýôåé üôé áíáæçôåßôáé ç ôéìþ key óôïí ðßíáêá A ðïõ ðåñéý åé áôáîéíüìçôá óôïé åßá, êáé åðéóôñýöåé ôç èýóç ôïõ êëåéäéïý óôïí ðßíáêá Þ ôçí ôéìþ 0 áí ôï êëåéäß äåí õðüñ åé ðåñßðôùóç áíåðéôõ ïýò áíáæþôçóçò). procedure sequetial1key); 1. i <-- 1; 2. while i<=) do 3. if A[i]=key the retur i 4. else i <-- i+1; 5. retur 0 Ç äéáäéêáóßá áõôþ ìðïñåß íá âåëôéùèåß õéïèåôþíôáò ôçí ôå íéêþ ôïõ êüìâïõ öñïõñïý setiel), ïðüôå ç ìýèïäïò èá õëïðïéçèåß èåùñþíôáò ìßá áêüìç èýóç óôïí ðßíáêá ìå ôç ìïñöþ A[+1] <-- key. Áí êáé ðñáêôéêü ç äéáäéêáóßá èá âåëôéùèåß, óå èåùñçôéêü åðßðåäï óå êüèå ðåñßðôùóç èá éó ýïõí ïé åðüìåíåò ðñïôüóåéò õðïèýôïíôáò üôé ç ðéèáíüôçôá áíáæþôçóçò ôïõ êëåéäéïý A[i] åßíáé p i = 1/, ãéá 1 i i. Ðñüôáóç. Ç åðéôõ Þò áíáæþôçóç óå ðßíáêá ìå áôáîéíüìçôá êëåéäéü Ý åé ðïëõðëïêüôçôá È1), È) êáé È) óôçí êáëýôåñç, óôç åéñüôåñç êáé óôç ìýóç ðåñßðôùóç, áíôßóôïé á. Áðüäåéîç. Ç êáëýôåñç êáé ç åéñüôåñç ðåñßðôùóç óõìâáßíïõí üôáí ç áíáæþôçóç ôåñìáôßæåôáé ìå ôçí åîýôáóç ôçò ðñþôçò êáé ôçò ôåëåõôáßáò èýóçò ôïõ ðßíáêá, áíôßóôïé á. Ãéá ôç ìýóç ðåñßðôùóç éó ýåé üôé: E = 1 + 2 +... + áðü üðïõ ðñïêýðôåé ç áëþèåéá ôçò ðñüôáóçò. = + 1 2 Ðñüôáóç. Ç áíåðéôõ Þò áíáæþôçóç óå ðßíáêá ìå áôáîéíüìçôá êëåéäéü Ý åé ðïëõðëïêüôçôá 83
È) óôçí êáëýôåñç, óôç åéñüôåñç êáé óôç ìýóç ðåñßðôùóç. Áðüäåéîç. Óå êüèå ðåñßðôùóç èá óáñùèåß ïëüêëçñïò ï ðßíáêáò, äçëáäþ A =, êáé Üñá ç ðñüôáóç éó ýåé. Áí õðïèýóïõìå üôé ï ðßíáêáò ðåñéý åé ôáîéíïìçìýíá óôïé åßá, ôüôå ãéá ôçí åðéôõ Þ áíáæþôçóç éó ýåé ç áíùôýñù ðñüôáóç áëëü ãéá íá åðéôá ýíïõìå ôçí áíåðéôõ Þ áíáæþôçóç ðñýðåé íá ìåôáôñýøïõìå ôç äéáäéêáóßá sequetial1 ùò åîþò. procedure sequetial2key); 1. doe <-- false; i <-- 1; 2. while i<=) do 3. if A[i]>key the i <-- i+1 4. else if A[i]=key the retu i 5. else retur 0 Ðñüôáóç. Ç áíåðéôõ Þò áíáæþôçóç óå ðßíáêá ìå ôáîéíïìçìýíá êëåéäéü Ý åé ðïëõðëïêüôçôá È1), È) êáé È) óôçí êáëýôåñç, óôç åéñüôåñç êáé óôç ìýóç ðåñßðôùóç, áíôßóôïé á. Áðüäåéîç. ¼ôáí áíáæçôïýìå Ýíá ìç õðáñêôü êëåéäß, ôüôå áõôü ìðïñåß íá áíþêåé óå Ýíá áðü + 1 ìåóïäéáóôþìáôá ðïõ ó çìáôéêü) äçìéïõñãïýíôáé áðü ôéò ôéìýò ôùí óôïé- åßùí ôïõ ðßíáêá åðüíù óôçí åõèåßá ôùí áêåñáßùí. Ç êáëýôåñç êáé ç åéñüôåñç ðåñßðôùóç óõìâáßíïõí üôáí ôï áíáæçôïýìåíï key åßíáé ìéêñüôåñï áðü ôï ðñþôï óôïé åßï êáé ìåãáëýôåñï áðü ôï ôåëåõôáßï óôïé åßï ôïõ ðßíáêá, áíôßóôïé á. Ãéá ôç ìýóç ðåñßðôùóç èá ðñýðåé íá åîåôüóïõìå + 1 ðåñéðôþóåéò êáé íá ëüâïõìå ôï ìýóï üñï ôïõò. Áí ôï key åßíáé ìéêñüôåñï áðü ôï ðñþôï óôïé åßï, ôüôå áñêåß ìßá óýãêñéóç ãéá íá ôåñìáôéóèåß ç äéáäéêáóßá. Áí ôï key åßíáé ìåãáëýôåñï áðü ôï i-ïóôü êáé ìéêñüôåñï áðü ôï i + 1)-ïóôü óôïé åßï ãéá i < ), ôüôå áñêïýí i + 1 óõãêñßóåéò. Áí ôï key åßíáé ìåãáëýôåñï áðü ôï -ïóôü óôïé åßï, ôüôå áñêïýí óõãêñßóåéò. Óõíåðþò éó ýåé: A = 1 + 2 +... + + + 1 = 1 + 2 +... + + + 1 1 + 1 áðü üðïõ ðñïêýðôåé ç áëþèåéá ôçò ðñüôáóçò. ÄõáäéêÞ ÁíáæÞôçóç = + 2 2 1 + 1 Êëáóéêü ðáñüäåéãìá ôùí áëãïñßèìùí ôçò ïéêïãåíåßáò Äéáßñåé êáé Âáóßëåõå åßíáé ç ðáíôá ïý ðáñïýóá äõáäéêþ áíáæþôçóç biary search). ¼ðùò ãíùñßæïõìå ç áíáæþôçóç áõôþ åöáñìüæåôáé óå ðßíáêåò ðïõ ðåñéý ïõí ôáîéíïìçìýíá óôïé åßá. Õðåíèõìßæïíôáò üóá ôïíßóèçêáí óôï ðñïçãïýìåíï ìüèçìá ó åôéêü ìå ôçí áðïôåëåóìáôéêüôçôá ôùí áíáäñïìéêþí êáé ôùí åðáíáëçðôéêþí ìåèüäùí, óôç óõíý åéá ðáñïõóéüæïõìå ôçí åðáíáëçðôéêþ äéáäéêáóßá biary iterate êáé ôçí áíáäñïìéêþ äéáäéêáóßá biary rec ðïõ äåß íïõí ôçí ßäéá èåùñçôéêþ óõìðåñéöïñü. 84
procedure biary_iteratekey); 1. botto <-- 1; top <-- ; 2. while botto<=top) do 3. iddle <-- top+botto) div 2; 4. if A[iddle]=key the retur iddle 5. else if A[iddle]>key the top <-- iddle-1 6. else botto <-- iddle+1 7. retur 0 procedure biary_reckey, left, right); 1. if left>right the retur 0; 2. iddle <-- top+botto) div 2; 3. if A[iddle]=key the retur iddle 4. else if A[iddle]>key the 5 biary_reckey, left, iddle-1) 5. else biary_reckey, iddle+1, right); Ìðïñïýìå íá ðåñéãñüøïõìå ôç ëïãéêþ ôùí ðñïçãïýìåíùí äéáäéêáóéþí ùò åîþò. óôù üôé áíáæçôïýìå ôï áêýñáéï êëåéäß key óå Ýíá ðßíáêá A[1..] ìå ôáîéíïìçìýíïõò áêåñáßïõò áñéèìïýò. Óõãêñßíïõìå ôï êëåéäß key ìå ôï ðåñéå üìåíï ôçò ìåóáßáò èýóçò ôïõ ðßíáêá A, ðïõ åßíáé ç èýóç iddle. Óôï óçìåßï áõôü ôñßá åíäå üìåíá ìðïñåß íá óõìâïýí: 1. ôá äýï óôïé åßá åßíáé ßóá, ïðüôå ï óêïðüò ìáò åðéôåý èçêå, 2. ôï key åßíáé ìéêñüôåñï áðü ôï A[iddle], ïðüôå åßìáóôå âýâáéïé üôé ôï key áðïêëåßåôáé íá âñßóêåôáé óôïí õðïðßíáêá A[iddle..top]. ôóé óõíå ßæïõìå óôïí õðïðßíáêá A[botto..iddle-1] åîåôüæïíôáò ôï ìåóáßï óôïé åßï ôïõ, 3. ôï key åßíáé ìåãáëýôåñï ôïõ A[iddle], ïðüôå ôï key óáöþò äåí âñßóêåôáé óôïí õðïðßíáêá A[botto..iddle]. ôóé, óõíå ßæïõìå êáé ðüëé åîåôüæïíôáò ôï ìåóáßï óôïé åßï ôïõ õðïðßíáêá A[iddle+1..top]. Ïé áíùôýñù äéáäéêáóßåò åðéóôñýöïõí ôç èýóç ôïõ key ìýóá óôïí ðßíáêá. Áí ôï key âñßóêåôáé ðñüãìáôé ìýóá óôïí A, ôüôå åðéóôñýöåé ôç óõãêåêñéìýíç èýóç, åíþ óôçí áíôßèåôç ðåñßðôùóç åðéóôñýöåé ôçí ôéìþ 0. Óôç óõíý åéá èá åîåôüóïõìå áíáëõôéêü ôç äõáäéêþ áíáæþôçóç. Ìßá âáóéêþ õðüèåóç ðïõ ãßíåôáé óôï óçìåßï áõôü åßíáé üôé ç óýãêñéóç åßíáé ôñéþí äñüìùí 3- way copariso). ÄçëáäÞ, ìå ìïíáäéáßï êüóôïò áðïöáóßæïõìå íá åðéëýîïõìå Ýíá ìåôáîý ôñéþí äñüìùí. ÊÜèå öïñü, ëïéðüí, ðïõ ç óýãêñéóç ôïõ key ìå ôï ìåóáßï óôïé åßï ôïõ ðßíáêá äåí êáôáëþîåé óå éóüôçôá, ç óýãêñéóç åðáíáëáìâüíåôáé óå õðïðßíáêá ìéóïý ìåãýèïõò óå ó Ýóç ìå ôï ìýãåèïò ôïõ áñ éêïý. ÅðïìÝíùò åýêïëá ðñïêýðôåé ç áíáäñïìéêþ åîßóùóç: T 0) = 0 T ) = 1 if key = A[iddle] = 1 + T + 1)/2 1) if key < A[iddle] = 1 + T + 1)/2 ) if key > A[iddle] 85
Áðëïðïéïýìå ôç ó Ýóç áõôþ èåùñþíôáò ôç åéñüôåñç ðåñßðôùóç äçëáäþ, áãíïïýìå ôï äåýôåñï óêýëïò) êáé üôé = 2 k 1 ãéá êüðïéï áêýñáéï áñéèìü k. ôóé ðñïêýðôåé: T 2 k 1) = 1 + T 2 k 1 1) ìå áñ éêþ óõíèþêç T 0) = 0. ôóé äéáäï éêü Ý ïõìå: T ) = 1 + 1 + T 2 k 2 1) ) = 1 + 1 + 1 + T 2 k 3 1)) ). = i + T 2 k i 1) = k + T 0) = k = lg + 1) ôóé, ëïéðüí, ãéá = 2 k 1 ðñïêýðôåé üôé ç ðïëõðëïêüôçôá ôçò äõáäéêþò áíáæþôçóçò åßíáé ëïãáñéèìéêþ. Åýêïëá ìðïñåß íá áðïäåé èåß üôé ç ðïëõðëïêüôçôá åßíáé È lg + 1) ) ãéá ôõ üí. Êáôáêåñìáôéóìüò Ìå ôïí üñï êáôáêåñìáôéóìüò hashig) äçëþíåôáé Ýíá ðïëý åõñý áíôéêåßìåíï, ôüóï óå èåùñçôéêü åðßðåäï üóï êáé óå ðñáêôéêü. Ôï ðñüâëçìá ôïõ ó åäéáóìïý áðïôåëåóìáôéêþí ôå íéêþí êáôáêåñìáôéóìïý ðñïêýðôåé ëüãù ôùí ðïëëþí äéáöïñåôéêþí ðåñéâáëëüíôùí êáé åöáñìïãþí üðïõ ìðïñåß íá åöáñìïóèåß, üðùò óå ðåñéðôþóåéò ìåôáãëùôôéóôþí, âüóåùí äåäïìýíùí, áíüêôçóçò ðëçñïöïñéþí êëð. Õðü ðñïûðïèýóåéò ïé ìýèïäïé ôïõ êáôáêåñìáôéóìïý Ý ïõí ðïëý êáëþ êáé óôáèåñþ åðßäïóç, ðïõ õðåñôåñåß ôçò äõáäéêþò áíáæþôçóçò ðïõ åîåôüóáìå ðñïçãïõìýíùò. ÅíáëëáêôéêÞ ïíïìáóßá ôïõ êáôáêåñìáôéóìïý åßíáé ìåôáó çìáôéóìüò êëåéäéïý óå äéåýèõíóç key to address trasfratio). Ï ìåôáó çìáôéóìüò áõôüò åðéôõã Üíåôáé ìå ôç âïþèåéá ôçò óõíüñôçóçò êáôáêåñìáôéóìïý hashig fuctio), ç ïðïßá üìùò äåí åßíáé áìöéìïíïóþìáíôç. ÄçëáäÞ, åßíáé äõíáôüí äýï äéáöïñåôéêü êëåéäéü íá áíôéóôïé ßæïíôáé óôçí ßäéá äéåýèõíóç ôïõ ðßíáêá. Ôï öáéíüìåíï áõôü ïíïìüæåôáé óýãêñïõóç collisio) êáé áðïôåëåß ôï ìåéïíýêôçìá ôçò ìåèüäïõ. ÏõóéáóôéêÜ, êüèå ìýèïäïò êáôáêåñìáôéóìïý ðñïôåßíåé êáé ìßá äéáöïñåôéêþ ôå íéêþ åðßëõóçò ôùí óõãêñïýóåùí. Ôï åñþôçìá ðïõ ôßèåôáé åßíáé ðüóï óõ íü ìðïñåß íá åìöáíéóèåß ðåñßðôùóç óýãêñïõóçò. Óôï åñþôçìá áõôü áðáíôü ôï åðüìåíï ðáñüäåéãìá ôïõ ðáñáäüîïõ ôùí ãåíåèëßùí birthday paradox). Ôï ðáñüäïîï ôùí ãåíåèëßùí. óôù üôé åðéëýãïíôáé ôõ áßá Üôïìá áðü ôï ðëþèïò. ÊÜèå öïñü åëýã ïõìå áí ôï åðéëåãüìåíï Üôïìï Ý åé ãåíýèëéá ôçí ßäéá çìýñá ìå ôïõò Þäç åðéëåãýíôåò. Ç åñþôçóç åßíáé ðüóá Üôïìá ðñýðåé íá åðéëåãïýí þóôå ç ðéèáíüôçôá äýï Þ ðåñéóóüôåñá Üôïìá íá Ý ïõí ôçí ßäéá çìýñá ãåíýèëéá íá åßíáé ðåñéóóüôåñï áðü 50%. Êáô áñ Þí õðïèýôïõìå üôé üëåò ïé çìýñåò ôïõ ñüíïõ åßíáé éóïðßèáíï íá åßíáé çìýñåò ãåíåèëßùí. Óå ìßá ôýôïéá ðåñßðôùóç, ç ðéèáíüôçôá äýï Üôïìá íá Ý ïõí ôçí ßäéá çìýñá 1 ãåíýèëéá åßíáé 365 ãåíýèëéá åßíáé 1-1 365, ïðüôå ç ðéèáíüôçôá äýï Üôïìá íá ìçí Ý ïõí ôçí ßäéá çìýñá. Ïìïßùò, ç ðéèáíüôçôá ôï ôñßôï åðéëåãüìåíï Üôïìï íá ìçí 86
Ý åé ãåíýèëéá ìå ôïõò äýï ðñïçãïýìåíïõò åðéëåãýíôåò åßíáé 1-2 365. Ìå ôç ëïãéêþ áõôþ êáôáëþãïõìå üôé ðñýðåé íá ðñïóäéïñßóïõìå ôï i åêåßíï ãéá ôï ïðïßï éó ýåé ç ó Ýóç: 1 1 365 ) 1 2 365 )... 1 i 365 ) 1/2 Áîéïðïéþíôáò ôç ó Ýóç 1 + x e x ðïõ éó ýåé ãéá êüèå x üðùò åßäáìå óå ðñïçãïýìåíï ìüèçìá), ðñïêýðôåé ç éóïäýíáìç ó Ýóç: e 1/365 e 2/365... e i/365 1/2 e 1/365 i j j=1 1/2 1 i j l 1 365 2 = l 2 j=1 1 ii + 1) l 2 365 2 Ìå êáôüëëçëç Üëãåâñá êáé ëýíïíôáò ôçí ðáñáãüìåíç ôåôñáãùíéêþ åîßóùóç öèüíïõìå óôï óõìðýñáóìá üôé ç æçôïýìåíç ôéìþ åßíáé i = 23. Ôï áðïôýëåóìá áõôü èåùñåßôáé ðáñüäïîï, êáèþò êüðïéïò èá áíýìåíå üôé ç óõãêåêñéìýíç ðéèáíüôçôá äçëáäþ, äýï Þ ðåñéóóüôåñá Üôïìá íá Ý ïõí ôçí ßäéá çìýñá ãåíýèëéá íá åßíáé ðåñéóóüôåñï áðü 50%) èá óõíýâáéíå ãéá Ýíá ìåãáëýôåñï óýíïëï áôüìùí. Áðü ôï ðáñüäïîï áõôü ìðïñïýìå íá óêåöôïýìå ôçí áíáëïãßá óå ó Ýóç ìå ôïí êáôáêåñìáôéóìü, äçëáäþ üôé ïé 365 çìýñåò áíôéóôïé ïýí óå èýóåéò åíüò ðßíáêá, åíþ ôá Üôïìá áíôéóôïé ïýí óå êëåéäéü ðïõ åéóüãïíôáé óôïí ðßíáêá. Ìå âüóç ôç äõùíõìéêþ êáôáíïìþ ðñïêýðôåé üôé ç ðéèáíüôçôá êáôü ôçí åéóáãùãþ êëåéäéþí, k áðü áõôü íá óõìðýóïõí óôçí ßäéá èýóç åßíáé: ) k 1 1 1 ) k ) k Ãéá áñêåôü ìåãüëï ç ðñïçãïýìåíç ó Ýóç ðñïóåããßæåôáé áðü 1/ek!). Áðü ôçí ðñïçãïýìåíç äõùíõìéêþ êáôáíïìþ óõíüãåôáé üôé áí óå ðßíáêá 1000 èýóåùí åéóá- èïýí = 1000 êëåéäéü, ôüôå ï ç ðéèáíüôçôá óå ìßá èýóç ôïõ ðßíáêá íá áíôéóôïé- çèïýí k êëåéäéü ðñïêýðôåé ùò åîþò:. k ðéèáíüôçôá k óõãêñïýóåùí % 0 37 1 37 2 18 3 6 4 1.5 5 0.3 Óõíåðþò, ç ðéèáíüôçôá íá ðáñïõóéáóèïýí óõãêñïýóåéò åßíáé óçìáíôéêüôáôç êáé ãéá ôï ëüãï áõôü Ý ïõí ðñïôáèåß ôüóåò ðïëëýò ôå íéêýò áíôéìåôþðéóçò ôïõ ðñïâëþìáôïò. 87
ÃñáììéêÞ ÁíáæÞôçóç Ï áíïéêôüò êáôáêåñìáôéóìüò ope addressig) åßíáé ìßá ïéêïãýíåéá áëãïñßèìùí ðïõ äåí ñçóéìïðïéïýí äåßêôåò ãéá ôï åéñéóìü ôùí ðéíüêùí. Óôçí ïéêïãýíåéá áõôþ áíþêïõí áñêåôýò ôå íéêýò, ìåôáîý ôùí ïðïßùí ç ãñáììéêþ áíáæþôçóç liear probig), ç ôåôñáãùíéêþ áíáæþôçóç quadratic probig), êáé o äéðëüò êáôáêåñìáôéóìüò double hashig). Ôçí áðëïýóôåñç ôå íéêþ ôçò ãñáììéêþò áíáæþôçóçò èá åîåôüóïõìå óôç óõíý åéá. Ç åðüìåíç äéáäéêáóßá isert ðáñéóôü ôïí áëãüñéèìï åéóáãùãþò õðïèýôïíôáò üôé ï ðßíáêáò A Ý åé èýóåéò. Óýìöùíá ìå ôç ìýèïäï áõôþ, êáôü ôçí åéóáãùãþ åíüò êëåéäéïý êáëåßôáé ç óõíüñôçóç êáôáêåñìáôéóìïý ðïõ äßíåé ôç äéåýèõíóç ôïõ ðßíáêá üðïõ èá ðñýðåé íá åéóá èåß ôï êëåéäß. Áí ç èýóç äåí åßíáé êáôåéëçììýíç, ôüôå ôï êëåéäß åéóüãåôáé êáé ç äéáäéêáóßá ôåñìáôßæåé. Áí ç èýóç åßíáé êáôåéëçììýíç, ôüôå äïêéìüæåôáé ç åðüìåíç èýóç äéáäï éêü ìý ñé íá ôïðïèåôçèåß ôï êëåéäß Þ íá ãßíïõí ðñïóðüèåéåò, ãåãïíüò ðïõ äçëþíåé üôé ï ðßíáêáò åßíáé ðëþñçò. procedure isertkey); 1. address <-- hashkey); cout <-- 0; 2. while A[address]<>0) ad cout<=) do 3. cout <-- cout+1; 4. address <-- address+1) od ; 5. if A[address]=0 the 6. A[address] <-- key; retur true 7. else retur false Ôï åðüìåíï ó Þìá äåß íåé Ýíá ðáñüäåéãìá ôçò äïìþò áõôþò ìå = 11 êáé = 8. Ðéï óõãêåêñéìýíá, åéóüãïíôáé ìå ôç óåéñü ôá êëåéäéü 52, 12, 71, 56, 5, 10, 19 êáé 90, åíþ ç ñçóéìïðïéïýìåíç óõíüñôçóç êáôáêåñìáôéóìïý åßíáé: hashkey) = key od a) 0 1 2 3 4 5 6 7 8 9 10 12 71 52 b) 12 56 71 52 g) d) e) 12 56 71 5 52 10 12 56 71 5 52 19 10 12 56 90 71 5 52 19 10 Ó Þìá 11: ÐáñÜäåéãìá êáôáêåñìáôéóìïý ìå ãñáììéêþ áíáæþôçóç. Ðáñüìïéï åßíáé êáé ôï óêåðôéêü ôïõ áëãïñßèìïõ áíáæþôçóçò, üðùò öáßíåôáé óôçí åðüìåíç äéáäéêáóßá isert, ðïõ åðéóôñýöåé ôç äéåýèõíóç ôïõ ðßíáêá üðïõ ôï êëåéäß åßíáé áðïèçêåõìýíï Þ åðéóôñýöåé ôçí ôéìþ -1 áí ôï êëåéäß äåí õðüñ åé óôïí ðßíáêá. 88
procedure searchkey); 1. address <-- hashkey); cout <-- 0; 2. while A[address]<>key) ad cout<=) do 3. cout <-- cout+1; 4. address <-- address+1) od 5. if cout= the retur -1 else retur address Èá áíáëýóïõìå ôçí åðßäïóç ôçò ìåèüäïõ ãéá ôçí ðåñßðôùóç ôçò åðéôõ ïýò êáé ôçò áíåðéôõ ïýò áíáæþôçóçò, Å êáé Á áíôßóôïé á, äçëáäþ üôáí áíáæçôïýìå Ýíá õðáñêôü Þ áíýðáñêôï êëåéäß ìýóá óôïí ðßíáêá. ÕðïèÝôïõìå üôé ç óõíüñôçóç êáôáêåñìáôéóìïý ðáñüãåé ìßá ôõ áßá äéüôáîç ôùí êëåéäéþí, ïðüôå ïé èýóåéò óôïí ðßíáêá åîåôüæïíôáé ìå ôõ áßï ôñüðï. Áñ éêü èá áó ïëçèïýìå ìå ôçí áíåðéôõ Þ áíáæþôçóç. Ïé ðáñüìåôñïé ðïõ õðåéóýñ ïíôáé óôçí áíüëõóç ôçò åðßäïóçò ôçò ìåèüäïõ åßíáé ôï ìýãåèïò ôïõ ðßíáêá, ôï ðëþèïò ôùí êëåéäéþí êáé ï ðáñüãïíôáò öüñôùóçò load factor) α = / 1. Áò õðïèýóïõìå üôé ìßá áíåðéôõ Þò áíáæþôçóç áðáéôåß i ðñïóðåëüóåéò 1 i ) óôïí ðßíáêá. Óôçí ðåñßðôùóç áõôþ èá ãßíïõí i 1 ðñïóðåëüóåéò óå êáôåéëçììýíåò èýóåéò ôïõ ðßíáêá, åíþ ç i-ïóôþ èá ðñïóðåëüóåé ìßá êåíþ èýóç. ÅðïìÝíùò, áí åîáéñýóïõìå áõôþí ôçí ïìüäá ôùí i óõíå üìåíùí èýóåùí, ìýíïõí i èýóåéò åê ôùí ïðïßùí êáôåéëçììýíåò åßíáé ïé i + 1 èýóåéò. Ôï ðëþèïò ) ôùí i, åíþ ôï i + 1 ôñüðùí ðïõ ìðïñåß íá åìöáíéóèåß áõôþ ç ðåñßðôùóç åßíáé óýíïëï ôùí ðåñéðôþóåùí åßíáé ðñïóðåëüóåéò åßíáé: ). Óõíåðþò, ç ðéèáíüôçôá íá áðáéôçèïýí i i ) P i = i + 1 ) ñá éó ýåé: A = i P i = + 1) + 1 i) P i Èåùñïýìå ôï ôåëåõôáßï Üèñïéóìá êáé åðåîåñãáæüìáóôå ôï ðåñéå üìåíü ôïõ: + 1 i) P i = i + 1) i)! 1)! i+1)! ) = ) i + 1 ) ÅðïìÝíùò åðéóôñýöïíôáò óôï A Ý ïõìå: A = + 1) ) i + 1 ) 89
Ìå âüóç ôçí ôáõôüôçôá ôùí óõíäõáóìþí, ôçí ïðïßá ãíùñßæïõìå áðü ôï äåýôåñï ìüèçìá, Ý ïõìå äéáäï éêü: ) A = + 1) ) + 1 ) =... = + 1 + 1 1 1 α Ôï áðïôýëåóìá áõôü åîçãåßôáé êáé äéáéóèçôéêü. Ôï α äçëþíåé ôï ðïóïóôü ôùí êáôåéëçììýíùí èýóåùí, ïðüôå ôï 1 α äçëþíåé ôï ðïóïóôü ôùí êåíþí èýóåùí. 1 ñá áíáìýíïõìå íá åêôåëýóïõìå 1 α ðñïóðåëüóåéò ðñéí íá åíôïðßóïõìå ìßá êåíþ èýóç. Ãéá íá öèüóïõìå óôçí áíôßóôïé ç Ýêöñáóç ãéá ôçí åðéôõ Þ áíáæþôçóç áñêåß íá ðáñáôçñþóïõìå üôé ôï ðëþèïò ôùí ðñïóðåëüóåùí ãéá ôçí åýñåóç åíüò êëåéäéïý éóïýôáé ìå ôï ðëþèïò ôùí ðñïóðåëüóåùí ðïõ åßíáé áðáñáßôçôåò ãéá ôçí åéóáãùãþ ôïõ äçëáäþ, i 1 ðñïóðåëüóåéò óå êáôåéëçììýíåò èýóåéò êáé ìßá ðñïóðýëáóç óå êåíþ èýóç). Óõíåðþò êáôáëþãïõìå üôé: E = 1 1 A = 1 i=0 1 i=0 + 1 i + 1 = + 1 H +1 H +1 ) + 1 l + 1) l + 1)) = + 1 + 1 l + 1 1 α l 1 1 α Óôéò ßäéåò åêöñüóåéò ãéá ôá E êáé A ìðïñïýìå íá êáôáëþîïõìå óôçñéæüìåíïé óå Ýíá äéáöïñåôéêü óêåðôéêü. óôù üôé ìå P i óõìâïëßæïõìå ôçí ðéèáíüôçôá íá áðáéôçèïýí áêñéâþò i ðñïóðåëüóåéò ãéá ìßá áíåðéôõ Þ áíáæþôçóç, ïðüôå éó ýåé: E = 1 + i P i óôù åðßóçò üôé ìå Q i óõìâïëßæïõìå ôçí ðéèáíüôçôá íá áðáéôçèïýí ôïõëü éóôïí i ðñïóðåëüóåéò, ïðüôå éó ýåé ç ó Ýóç: i P i = i=0 Ôï ðñüâëçìá, ëïéðüí, áíüãåôáé óôïí ðñïóäéïñéóìü ôïõ Q i. Ðñïöáíþò, éó ýåé 1 Q 1 = α, Q 2 = Q 1 1, åíþ ãåíéêþò éó ýåé: Q i = 1 1... i + 1 ) i i + 1 = α i i=0 Åðáíåñ üìåíïé óôç ó Ýóç ãéá ôï E) Ý ïõìå: E = Q i 1 + α + α 2 + α 3 +... = Q i 1 1 α 90
Êáôáêåñìáôéóìüò ìå Áëõóßäåò ÁíáöÝñáìå üôé ç ïéêïãýíåéá ôùí ìåèüäùí êáôáêåñìáôéóìïý ìå áíïéêôþ äéåýèõíóç äåí ñçóéìïðïéåß åðéðëýïí þñï ðýñáí ôïõ þñïõ ôïõ óõãêåêñéìýíïõ ðßíáêá. Ìßá Üëëç ìåãüëç ïéêïãýíåéá ìåèüäùí êáôáêåñìáôéóìïý ñçóéìïðïéåß áëõóßäåò ðïõ îåêéíïýí áðü ôéò èýóåéò ôïõ ðßíáêá êáé ìðïñïýí íá åðåêôáèïýí äõíáìéêü. Óå åðßðåäï ôýðùí õðïèýôïõìå üôé õðüñ åé ìßá äïìþ record ìå äýï ðåäßá, üðïõ ôï ðñþôï ðåäßï data áöïñü óôá êáèáñü äåäïìýíá, åíþ ôï äåýôåñï ðåäßï ptr ðáñéóôü ôï äåßêôç ðñïò ôïí åðüìåíï êüìâï ôçò áëõóßäáò. Ôï äéðëáíü ó Þìá äåß íåé Ýíá ðáñüäåéãìá ôçò äïìþò áõôþò ìå = 11 êáé = 8 ôá ßäéá êëåéäéü ìå ôï ðñïçãïýìåíï ðáñüäåéãìá). Ðéï óõãêåêñéìýíá, ðñýðåé íá Ý ïõìå õð üøç ìáò üôé ç ðáñáëëáãþ áõôþ ëýãåôáé ìýèïäïò ìå îå ùñéóôýò áëõóßäåò separate chaiig) êáèþò õðüñ åé êáé ç ìýèïäïò ôùí óýìöõôùí áëõóßäùí coalesced chaiig), ç ïðïßá üìùò äåí èá ìáò áðáó ïëþóåé óôç óõíý åéá. Ï øåõäïêþäéêáò chaisearch ðïõ áêïëïõèåß äåß íåé ôç äéáäéêáóßá åðéôõ ïýò êáé áíåðéôõ ïýò áíáæþôçóçò. 0 1 2 3 4 5 6 7 8 9 10 56 90 5 19 10 12 71 52 Ó Þìá 12: ÐáñÜäåéãìá êáôáêåñìáôéóìïý ìå áëõóßäåò. procedure chaisearchkey); 1. address <-- hashkey); j <-- A[address]; 2. while j<>il) do 3. if j.data=key the retur true 4. else j <-- j.ptr 5. retur false Èá åîåôüóïõìå êáô áñ Þí ôçí ðåñßðôùóç ôçò áíåðéôõ ïýò áíáæþôçóçò. ÕðïèÝôïíôáò ìßá ôõ áßá óõíüñôçóç êáôáêåñìáôéóìïý, áíáìýíïõìå üôé êüèå êëåéäß èá êáôåõèõíèåß óå ïðïéáäþðïôå èýóç áðü ôéò èýóåéò ôïõ ðßíáêá ìå ôçí ßäéá ðéèáíüôçôá 1/ åíôïëþ 1). Óôç óõíý åéá ç áíáæþôçóç èá óõíå éóèåß óôçí áíôßóôïé ç áëõóßäá åíôïëýò 3-5), ðïõ èá äéáó ßóåé ìý ñé ôýëïò ôçò þóôå íá åðéóôñáöåß ç Ýíäåéîç false. ÅðïìÝíùò, ç åðßäïóç åîáñôüôáé áðü ôï ìþêïò ôçò áëõóßäáò, êáé åö üóïí óõíïëéêü Ý ïõí åéóá èåß êëåéäéü óå üëåò ôéò áëõóßäåò, Ýðåôáé üôé ôï ìýóïò ìþêïò ôçò áëõóßäáò åßíáé / = α. ñá, ç ðïëõðëïêüôçôá ôçò áíåðéôõ ïýò áíáæþôçóçò åßíáé È1+α) óôç ìýóç ðåñßðôùóç. Ãéá íá åîåôüóïõìå ôçí ðåñßðôùóç ôçò åðéôõ ïýò áíáæþôçóçò èá õðïèýóïõìå üôé êüèå íýï êëåéäß åéóüãåôáé óôï ôýëïò ôçò áíôßóôïé çò áëõóßäáò. ÅðïìÝíùò ôï 91
ðëþèïò ôùí ðñïóðåëüóåùí ðïõ èá ðñáãìáôïðïéçèïýí ãéá ìßá åðéôõ Þ áíáæþôçóç åßíáé ìßá ìïíüäá ðåñéóóüôåñï áðü ôï ðëþèïò ðïõ áðáéôïýíôáé ãéá ôçí åéóáãùãþ ôïõ áíôßóôïé ïõ êëåéäéïý. ¼ôáí åéóüãåôáé ôï i-ïóôü êëåéäß, ôï ìþêïò ôçò áíôßóôïé çò áëõóßäáò åßíáé i 1)/. ÅðïìÝíùò éó ýåé: E = 1 = 1 + 1 1 + i 1 ) 1) 2 = 1 + 1 i 1) = 1 + α 2 1 2 Óõíåðþò êáé ðüëé ðñïêýðôåé üôé ç ðïëõðëïêüôçôá åßíáé È1 + α) óôç ìýóç ðåñßðôùóç. Óôï óçìåßï áõôü ðñýðåé íá ðñïóå èåß üôé óôçí ðåñßðôùóç ôçò áíïéêôþò äéåýèõíóçò éó ýåé α 1, áëëü óôçí ðåñßðôùóç ôùí áëõóßäùí äåí éó ýåé áõôüò ï ðåñéïñéóìüò. ÅðïìÝíùò ç åðßäïóç ôçò åðéôõ ïýò êáé ôçò áíåðéôõ ïýò áíáæþôçóçò åßíáé éêáíïðïéçôéêþ üôáí ôï åßíáé ôçò ôüîçò ôïõ, åðïìýíùò ôï α åßíáé ôçò ôüîçò ôçò ìïíüäáò. 2) 92