A 29 90 3 3 46 11 69 51 20 Sang lần thứ 3:
2.3. Thuật toán sắp xếp nhanh phân đoạn (Quick-Sort)
*)ý t-ởng :
- Giả sử ta cần sắp xếp dãy a[1, 2 , n] ta tiến hành phân hoạch dãy đã cho thành 2 thành phần bằng cách:
+ Chọn 1 phần tử làm chốt (khoá) hay còn gọi là lính canh.
+Sau đó chuyển các phần tử có giá trị nhỏ hơn hoặc bằng chốt lên tr-ớc, ng-ợc lại các phần tử có giá trị lớn hơn chốt ra sau.
21 34 34 65 21 67 65 67 54 78 34 54 78 34 65 21 54 67 65 67 54 78 34 21 78 67 78 65 67 21 34 21 54 34 65 54 78
ð Kết quả phân hoạch ta đ-ợc 2 dãy con và chốt đ-ợc đặt vào đúng vị trí trong dãy sắp xếp. Giả sử vị trí đó là K, khi đó ta có:
A[i]<= a[k] ∀i< k ; A[k]< a[i] ∀i> k ;
Quá trình tiếp tục phân hoạch với 2 dãy con mới:
A[1,2, ,k-1], A[k+1, k+2, ,n] cho tới khi đoạn chỉ còn 1 phần tử thì dừng.
*) Thủ tục:
Procedure Swap( var a, b: integer); Var tg: integer; Begin tg:=a; a:=b; b:=tg; End;
Procedure QuickSort(Var A: Mang; L, R: integer); Var i, j, k: integer; Begin If L< R then Begin i:=L ; j:=R+1; k:= A[L] ; While (i<j) do Begin
Repeat inc(i); Until (A[i]> k) or(i> R); Repeat dec(j); Until (A[i]<= k) ;
If (i< j) then Swap(A[i],A[j]); End; Swap(k, A[j]); QuickSort(A, L, j-1); QuickSort(A, j+1, R); End; End; *)Độ phức tạp: TMax(n) = O( n2); TMin(N) = TTB(n) = O(n.log2n); 3. Tỡm ki m tu n t , nh phõn: 3.1. Tìm kiếm tuần tự. *)T- t-ởng: Tỡm ki m tu n t là ph ng phỏp tỡm ki m n gi n nh t. Xu t phỏt t ph n t u tiờn c a m ng, chỳng ta i l n l t theo cỏc ph n
c a m ng cho n khi tỡm ra ph n t cú khúa b ng khúa ó cho thỡ d ng i, ho c ó n h t m ng n u khụng tỡm th y. *)Thủ tục: Procedure Timtuantu; Var i: integer; Begin i:=1; A[n+1]:= x;
while( x<> A[i]) do i:= i+1;
if i<= n+1 then write(x, Co xuat hien trong mang ) else write(x, Khong xuat hien trong mang );
end;
*)Độ phức tạp:-TMin(n) =O(1). Xảy ra khi x=a[1].
TMax(n)= O(n+1). Xảy ra khi x= A[n+1]
TTB(n)= O(n/2). Xác xuất các phần tử là nh- nhau. 3.2. Tìm kiếm nhị phân.
*).T t ng thu t toỏn:Gi s ta cú dóy k[ 1,2,..,n] ó c s p x p t c là dóy khoỏ ó cú th t :( k1 <= k2<=…<=kn).Gi s ta c n tỡm trong n kdau,kdau+1,…,kcuoi i khoỏ tỡm ki m là X, tr c h t ta xột khoỏ n m gi a dóy kgiua v i giua=(dau+cuoi) div 2;
N u kgiua<X thỡ cú ngh a là n t kdau i kgiuach ch a toàn khoỏ < X, ta ti n hành tỡm ki m v i n t kdau+1 n kcuoi
N u kgiua> X thỡ cú ngh a là n t kgiua i kcuoich ch a toàn khoỏ >X, ta i tỡm ki m v i n t kdau i kgiua-1.
N u kgiua =X thỡ vi c tỡm ki m thành cụng ( ta k t thỳc quỏ trỡnh tỡm ki m) Quỏ trỡnh tỡm ki m s th t b i n u n m t b c nào ú , n tỡm ki m là
ng ( t c là dau >cuoi).
*).Th t c:
Procedure TimkiemNP(var k: mang; x:integer) var d,g,c: Integer;
Found: Boolean;
Begin
d:=1;c:=n;Found:=false;
While (d<=c) and (not(Found)) do Begin g:=(d+c) div 2; if k[g] >x then c:=g-1 else if k[g] <x then d:=g+1 else found:=true; End;
If (Found) then write(x, co xuat hien trong mang: ) Else write(x, khong co trong mang );
End;
*). ph c t p :
-Ng i ta ó ch ng minh c ph c t p c a thu t toỏn nh phõn trong tr ng h p:
+T t nh t : TMin=O(1) +Trung bỡnh: TTB =O(log2n)
+X u nh t : TMax = TTB=O(log2n)
Tuy nhiờn, ta c ng khụng th quờn r ng tr c khi s d ng tỡm ki m nh phõn, dóy khoỏ ph i c s p x p r i, t c là th i gian chi phớ cho vi c s p
hay b t i thỡ lỳc ú chi phớ cho vi c s p x p l i n i lờn r t rừ làm b c l nh c m c a ph ng phỏp này.
VI-Cây.
1. nh ngh a và cỏc khỏi ni m:
1.1)Định nghĩa:
-Cây là một cấu trúc phi tuyến, thiết lập trên một hữu hạn các phần tử mà ta gọi là nút , trong đó có một nút đặc biệt gọi là gốc (noot), liên kiết bởi một quan hệ phân cấp, gọi là quan hệ cha- con.
- Cây có thể định nghĩa một các đệ quy nh- sau:
(1).Mỗi nút là một cây. Nút đó cũng là nút của cây ấy.
(2).Nếu n là một nút và n1, n2,...nk lần l-ợt là gốc của cây T1, T2,...,Tk các cây này đôi một không có nút chung. Nếu cho nút n trở thành cha của các nút n1, n2,...nk ta đ-ợc một cây mới T. Cây này có nút n là gốc còn các cây T1, T2,...,Tk trở thành các cây con (subtree) của gốc.
(3).Ng-ời ta quy -ớc 1 cây không có nút nào đ-ợc gọi là cây rỗng. *)Xét cây sau: (T)
1.2)Một số khái niệm:
a)Số các con của một nút đ-ợc gọi là cấp(degree) của nút đó.Nút có cấp bằng 0 đ-ợc gọi là nút lá(leaf) hay nút tận cùng (terminal node).Nút không phải là lá đ-ợc gọi là nút nhánh (branch node).
-Cấp cao nhất của nút trên cây gọi là cấp của cây đó.Ví dụ cây (T) ở hình vẽ trên: A là gốc: B, C, D là con của A; D là cha của G, H, I, J; A có cấp bằng 3, D có cấp bằng 4; Các nút E, F, C, G, K, L, M,...là lá.Các nút B, D, H,...là các nút nhánh. Cây (T) trên có cấp bằng 4.
b)Gốc của cây có mức(level) bằng 1.
-Nếu nút cha có mức là i thì nút con có mức là i+1.Nh- vậy ở cây (T) trên thì: A có mức la1; B, C, D: Có mức là 2; E, F, G, H , I, J có mức là 3; K, L, M có mức là 4.
c)Chiều cao (height) hay chiều sâu(depth) của một cây là số mức lớn nhất của nút có trên cây đó. Cây (T) ở trên có chiều cao là 4.
d)Nếu n1, n2,...nk là dãy các nút mà ni là cha của ni+1 với 1≤ i< k thì dãy đó đ-ợc gọi là đ-ờng đi (path) từ n1 đến nk.
A
B C D
G H I J
E F
-Độ dài của đ-ờng đi ( path length) bằng số nút trên đ-ờng đi đó trừ đi 1. Ví dụ với cây (T): Độ dài từ A tới M bằng 3, độ dài từ D đến K bằng 2.
e)Nếu thứ tự các cây con của một nút đ-ợc coi trọng thì cây đang xét là
cây có thứ tự (ordered tree), ng-ợc lại là cây không có thứ tự (unordered tree).
f)Đối với nút trên cây ngoài khái niệm cha- con ng-ời ta còn mở rộng sang các khái niệm khác theo quan hệ nh- trong gia tộc. Ví dụ cây (T) A, D, H ...đựoc gọi là tiền bối của L; E, G, K... đ-ợc gọi là hậu sinh của A...; Các nút G, H, I, J là các nút anh em.
2.Cây nhị phân, cây tổng quát: 2.1.Cây nhị phân:
a)Định nghĩa:Cây nhị phân là một dạng quan trọng của cấu trúc cây.Nó có đặc điểm: mọi nút trên cây chỉ có tối đa là 2 con. Đối với cây con của mỗi nút thì cũng phân biệt cây con trái và cây con phải. Nh- vậy cây nhị phân là cây có thứ tự.
b)Tính chất:
*)Bổ đề:
- Số l-ợng tối đa của các nút ở mức i trên cây nhị phân là 2i-1 (i≥ 1).
-Số l-ợng tối đa các nút trên một cây nhị phân có chiều cao h là : 2h - 1 (h≥1) *)Đặc điểm:
-Số l-ợng nút trên ở mức thứ i≤ 2i
- Số l-ợng nút lá: ≥ 2h, h độ cao của cây. -Độ cao của cây h≥ [log2(số nút trên cây)] -Số nút trên cây≤ 2(h +1)-1.
c) Cài đặt:
- Sử dụng con trỏ cài đặt nỗi nút bởi một biến động.
Khai báo:
Type
Tree= ^Node; Node= record Info: integer; Left, right: Tree; End;
d)Biểu diễn cây nhị phân trên máy:
*)L-u trữ kế tiếp:
-Xét một cây nhị phân đầy đủ, ta dễ dàng đánh số cho các nút trên cây đó theo thứ tự lần l-ợt từ mức 1 trở lên, hết mức này đến mức khác và từ trái sang phải đối với các nút ở mỗi mức.
-với cách đánh số này thì nếu cha có số thứ tự là i thì rõ ràng con sẽ có số thứ tự là 2i và 2i + 1. Hoặc ng-ợc lại: nếu con có thứ tự là j thì cha sẽ có số thứ tự là [j/2 ] ( [x] chỉ số nguyên d-ới của x .ví dụ [2,25]= 2)
- Nh- vậy ta có thể l-u trữ cây nhị phân bằng 1 véc tơ l-u trữ V, theo nguyên tắc là nút thứ i trên cây sẽ đ-ợc l-u trữ ở V[i]. Và với cách l-u trữ này thì biết phần tử chứa nút cha sẽ suy ra ngay phần tử chứa nút con và ng-ợc lại.
Ta có thể minh hoạ một cách nh- sau :