Tìm kiếm tuần tự có thể được thực hiện thông qua việc dùng danh sách liên kết biểu diễn các mẫu tin trong tập tin. Một lợi điểm: Để làm cho danh sách liên kết mà giúp việc cho việc tìm kiếm nhanh chóng hơn.
Ch ng Ph n t#ch ph c t p m t s gi i thu t tr%n c u tr'c d li u N i dung T)m ki m tu n t tr%n danh s ch li%n k t C y t)m ki m nh ph n u ti%n v, heapsort H,ng i c4 K thu t b m 1.T)m ki m tu n t tr%n danh s ch li%n k t T)m ki m tu n t sequential search) c th c th c hi n th ng qua vi c d ng danh s ch li%n k t (linked list) bi u di n c c m u tin t p tin M t l i i m: d l,m cho danh s ch li%n k t c- th t m, gi'p cho vi c t)m ki m nhanh ch-ng h n T)m ki m tu n t tr%n m t danh s ch li%n k t cth t Qui c: z l, n't gi danh s+ch li%n k t 21 Z type link = node node = record key, info: integer; next: link end; var head, t, z: link; i: integer; Gi i thu t t)m ki m tu n t tr%n danh s ch li%n k t procedure initialize; begin new(z); z.next: = z; new(head); head.next:= z end; function listsearch (v: integer; t: link): link; begin z.key: = v; repeat t:= t.next until v < = t.key; if v = t.key then listsearch:= t else listsearch: = z end; Gi i thu t t)m ki m tu n t tr%n danh s ch li%n k t t.) function listinsert (v: integer; t: link): link; begin z.key: = v; while t.next.key < v t: = t.next; new(x); x.next: = t.key; t.next: = x; x.key: = v; listinsert: = x; end; T nh ch t: T m ki m tu n t tr"n danh s%ch li"n k t c( th t d*ng trung b nh kho ng N/2 thao t%c so s%nh cho c s t m ki m th,nh c-ng hay kh-ng th,nh Ch ng minh: V i s t)m ki m th,nh c ng, n u gi s r ng m i m u tin danh s ch li%n k t c- x+c xu t b ng (1/N) c t)m th y, s l n so s+nh trung b)nh s l,: (1 + 2+ 1+ N)/N = N(N+1)/(2N) = (N+1)/2 V i s t)m ki m kh/ng th,nh c/ng, n u gi s r ng m i m u tin danh s+ch li%n k t hay n't k t th'c z c- x+c xu t b ng (1/(N+1)) c t)m th y v tr# sau c ng c a qu+ tr)nh t)m ki m, s l n so s+nh trung b)nh s l,: (1 + 2+ 1+ (N+1))/(N+1) = (N+2)(N+1)/(2(N+1)) = (N+2)/2 2.C y t)m ki m nh ph n Trong m t c.y t m ki m nh ph.n binary search tree), t t c c+c m u tin v i kh-a nh h n kh-a t i n't ang x2t th) c y b%n tr+i c a n't v, c+c m u tin v i kh-a l n h n hay b ng kh-a t i n't ang x2t th) c y b%n ph i c a n't 10 13 19 Kh i t o c y nh ph n M t c y r ng tr b%n ph i ch c bi u di n b ng c y c- n n't gi z procedure tree_init; begin new(z); z.1: = z; z.r: = z; new(head); head.key: = 0; head.r: = z; end; T c v th%m v,o Th"m m t n%t v'o c y ta th c hi n m t s t m n%t y tr"n c y, r i g n n%t ki m kh ng th'nh c y v'o v tr ng v i n%t gi z t i i m m' qu tr+nh t+m ki m k t th%c A S E A R C H)nh v minh h a vi c th%m n't P v,o c y nh ph n H 10 8 5 11 11 11 8 11 3 9 11 11 38 ph c t p c a heap sort T#nh ch t: Heapsort d*ng t h n 3MlgM l n so s%nh s p th t M ph n t Gi i h n tr%n n,y xu t ph t t gi i thu t heapsort v, t#nh ch t c a hai t c v th%m v,o/x a b tr%n heap V5ng for th nh t t n MlgM l n so s+nh V5ng for th hai t n 2MlgM l n so s+nh T ng c ng: MlgM 2MlgM = 3MlgM 39 4.K thu t b m K thu t b m Hashin l, m t ph ng ph p t)m ki m c c m u tin m t b ng b ng c c bi n i c c tr kh a th,nh tr# b ng nh ng a ch c u l, t o m t h,m b m hash function kh a t m ki m th,nh m t a ch b ng , chuy n i M t c ch l t ng, nh ng tr kh a kh c n%n nh x th,nh nh ng a ch kh c nhau, nh ng kh ng c h,m b m n,o hai hay nhi u kh a kh c c th b m l, ho,n h o v, th,nh c ng m t v tr# b ng c k ti p l, qu tr)nh gi i quy t ng collisionresolution , i ph v i tr ng h p hai hay nhi u kh a kh c c th b m th,nh c ng m t v tr# b ng 40 H,m b m H,m b m l, h,m bi n th c c tr kh a th,nh nh ng s nguy%n t m [0 M-1], v i M l, s m c tin m, c- th c ch a m t s l ng / nh c- s n M t h,m b m l6 t ng l, h,m b m m, - d t#nh to+n - g n gi ng nh m t h,m :ng u nhi%m; M t ph ng ph+p th/ng th ng nh t b m l, cho M l, m t s nguy%n t v, v i m i tr kh-a k, ta t#nh h k = k mod M y l, m t ph ng ph+p tr c ti p m, d t#nh v, r i kh+ u c+c tr kh-a tr%n b ng b m 41 V# d K#ch th c b ng b m = 101 Gi s m i tr kh-a g m k6 c m3 h-a th,nh m t m3 g m t N u kh- :AKEY; bit, ta c- th coi kh-a y l, m t tr,ng s nh ph n nh sau: 00001 01011 00101 11001 < 323 x 322 x 321 x 320 ng v i tr s th p ph n 44217 M, t ng V), 44217 mod 101 = 80, nh v y kh-a :AKEY; +nh x th,nh 80 T i k#ch th c M c a b ng b m c n ph i l, s nguy%n t ? L6 l, v) ch'ng ta mu n t t c m i k6 t kh-a u tham gia v,o vi c chuy n i m th,nh v tr# Trong th# d tr%n, n u M = 32, h,m b m c a b t k kh-a n,o c ng ch b m m i k6 t sau c ng! 42 m m t kh-a d,i N u kh-a l, m t d5ng k6 t kh+ d,i th) ch'ng ta v n c- th t#nh b ng m t h,m b m m, bi n i kh-a t ng k6 t m t K thu t - th hi n b ng gi i thu t l p nh sau: h:= key[1]; for j:= to key_size begin h:= ((h*32) + key[j]) mod M; /*25 is 32, used for 5-bit code */ end; 43 Ph ng ph p gi i quy t Separate chainin ng : X u ri%ng Trong k thu t b m, ch'ng ta ph i quy t nh d ng c+ch gi i quy t v n hai kh-a kh+c b m th,nh n,o c ng m t gi+ tr a ch M t ph ng ph+p n gi n nh t: t o cho m i v tr# u ri%n x ut tc b ng b m m t danh s+ch li%n k t nh ng tr kh-a m, b m v,o c ng v tr# - c x u tr%n danh s+ch li%n k t, ch'ng Khi c+c tr kh-a c s p cho c- th t n%n type link = node; node = record key, info: integer; next: link end; var heads: array [0 M] of link; t, x: link; 44 X u ri%ng tt Danh s+ch li%n k t cho t ng v tr# b ng b m t o nh gi i thu t sau: c kh i procedure initialize; var i: integer; begin new (z); z.next: = z; for i: = to M-1 begin new (heads [i]); heads [i].next: = z end; end; Trong h)nh v sau tr)nh b,y vi c c c k6 t ch a v,o b ng b m m t d3y 45 Key: A S E A R C H I N G E X A M P L E Hash: 8 2 5 10 A M C E G H I A X N E R S A E L P 46 Ph ng ph p gi i quy t ng : D5 n t#nh Ph ng ph+p x u ri%ng c- th +p d ng tr ng h p M < N M: k#ch th c b ng b m, N: s tr kh-a c- th cC- m t s ph ng ph+p l u N m u tin b ng b m ck#ch th c M m, M > N, nh v,o nh ng v tr# tr ng b ng b m gi i quy t ng Nh ng ph ng ph+p nh v y c g i l, k thu t b m a ch m open addressing hashing Ph ng ph+p a ch m n gi n nh t l, ph ng ph+p d/ n t1nh linear probing : m i c- ng th) d5 n v tr# k ti p b ng b m, t c l, so s+nh tr kh-a c n t)m v i tr kh-a t i m u tin 47 D5 n t#nh C- ba k t qu c- th c- c a s th m d5: - N u hai tr kh-a kh p th) s t)m ki m k t th'c th,nh c/ng - N u kh/ng th y c- m u tin t i v tr#, th) s t)m ki m k t th'c th t b i - Ng c l i, d5 t)m t i v tr# k ti p, ti p t c nh th cho n t)m th y tr kh-a kh p ho c l, m t v tr# r ng 48 Gi i thu t d5 n t#nh procedure hash_initialize; var i: integer; begin for i: = to M a[i].key:= maxint; /* maxint means an empty position */ end; function hash_search(v: integer): integer; var x: integer; begin x: = h(v); while a[x].key maxit and a[x].key v x: = (x+1) mod M; if a[x].key: = v then hash_search: = x else hash_search: = M; end; 49 D5 n t#nh tt function hash_insert (v: integer): integer; var x: interger begin x:= h(v); while a[x].key maxint /* collision */ x: = (x+1) mod M; a[x].key: = v; hash-insert: = x; end; H)nh v sau tr)nh b,y vi c a v,o b ng b m m t d3y c c k6 t ch : A S E A R C H I N G E X A M P L E 50 Key: A S E A R C H I N G E X A M P L E Hash: 18 14 5 13 16 12 S A A C A E E G H I X E L M N P R 51 T#nh ch t c a d5 n t#nh K#ch th c b ng b m d ng cho k thu t d5 n t#nh th ng l n h n b ng b m d ng x u ri%ng, v) ta ph i cM > N, nh ng t ng ch b nh s #t h n v) kh/ng c n l u c+c tr T#nh ch t D/ n t1nh s d ng trung b nh 1t h n i v i m t b ng b m y d i c d/ C/ng th c ch#nh x+c v s l n d5 trung b)nh c n cho m t s t)m ki m kh/ng th,nh c/ng l,: = N u 1/ 1= 2/3, ta v i = N/M c k t qu b c d5 52