II-Phân tích và thiết kế thuật toán1.Khái niệm về thuật toán: Thuật toán là một dãy hữu hạn các b-ớc, mỗi b-ớc mô tả chính xác các thao tac cần đ-ợc thực hiện để giải quyết bàitoán.Và sa
Trang 15 Thu t toán xây d ng bao óng b c c u c a quan h
II-Phân tích và thi t k thu t toán.
1 Khái ni m thu t toán
2 Thi t k thu t toán: Các chi n l c chia tr , thi t k t trên xu ng,thi t k t d i lên và tinh ch nh t ng b c
3 Phân tích thi t k thu t toán: ph c t p c a thu t toán, xác nh
ph c t p c a tho t toán t t nh t, trung bình, x u nh t
4 M t s các bài toán có ph c t p a th c, hàm m , v n h b c
ph c t p c a 1 bài toán
III- quy và thu t toán quy:
1 Khái ni m v quy, thu t toán quy
2 Thi t k thu t toán quy, ng d ng c a thu t toán quy
3 Thu t toán quay lui và ng d ng
2 Các ph ng pháp s p x p hi n i: (Phân n, vung ng, hoà nh p):
Ý t ng, VD minh ho thu t toán, ph c t p c a thu t toán
3 Tìm ki m tu n t , nh phân: Ph ng pháp thuât toán, ánh giá ph c
p c a thu t toán
Trang 22 Chu trình Euler, thu t toán tìm chu trình và ng i Euler
3 Chu trình Haminton và ng i Haminton
4 Duy t th , tìm ki m theo chi u sâu, tìm ki m theo chi u r ng
5 Cây khung và cây khung v i giá tr c c ti u, thu t toán Kruskal
6 Bài toán bao óng truy n ng, s p x p topo và ng d ng
7 ng i ng n nh t, thu t toán Dijstra, thu t toán floyd
Trang 3C NG C U TRÚC D LI U VÀ GI I THU T
I-Quan hệ:
1.Quan hệ và biểu diễn quan hệ:
a)Định nghĩa: Cho 2 tập A và B , tích đề các A và B
AxB= {(a,b)/ a∈ A ,b∈ B} phân biệt thứ tự Một tập con R ⊆ AxB gọi
là quan hệ trên A và B
-Nếu B≡ A thì ta nói R là một quan hên trên A, và R⊆ AxA
VD: Cho hai tâp hợp: A={ a, b, c} ;B= { 1, 2}
AxB= {(a,1), (a,2), (b,1), (b,2), (c,1), (c,2)}
R= {(a,1), (b,2), (c,2)} ⊆ AxB
-Khi (a, b)∈ R thì ta nói aRb (hay a có quan hệ R với b)
-Khi (a, b)∉ R⇔ a không có quan hệ R với b
b)Biểu diễn quan hệ:Quan hệ R⊆ AxB ta có thể biểu diễn quan hệ bằngcác cách sau:
-Liệt kê: Liệt kê mọi phần tử của R
Trang 43.Quan hệ t-ơng đ-ơng:
-R ⊆ AxA đ-ợc gọi là quan hệ t-ơng đ-ơng trên A nếu nó có các tínhchất:
+Phản xạ: ∀ ∈a A aRa:+Đối xứng: ( , )
4.Quan hệ bao đóng bắc cầu:
-Giả sử R là quan hệ trên A, R có thể có tích chất bắc cầu hoặc khôngchứa R S là quan hệ bắc cầu, R ⊆ S
-Quan hệ bắc cầu nhỏ nhất trên A chứa R đ-ợc gọi là bao đóng bắccầu cảu quan hệ R.Ký hiệu [ ]R
Nhân xét:+ Nếu bản thân R có tính chất bắc cầu thì bao đóng bắc cầutrùng R không thì phải thêm 1 vài phần tử nữa vào tập R để trở thành bắccầu
VD: A={a, b, c}, R={(a,b), (b,c)}
[ ]R ={(a,b), (b,c), (a,c)}
+Bao đóng bắc cầu còn đ-ợc gọi là bao đóng truyền ứng
5.Thuật toán xây dựng bao đóng bắc cầu
Trang 5*)Xét A và B : A=(aij); B=(bij) với kích th-ớc :
VD1: Cho A={a, b, c} và R={ (a,a), (a,c), (b.b), (c,a), (c,b)}
Dùng thuật toán trên tìm bao đóng bắc cầu:R
Trang 6II-Phân tích và thiết kế thuật toán
1.Khái niệm về thuật toán: Thuật toán là một dãy hữu hạn các b-ớc, mỗi
b-ớc mô tả chính xác các thao tac cần đ-ợc thực hiện để giải quyết bàitoán.Và sau hữu hạn các b-ớc đó, từ input của bài toán ta đ-ợc output củabài toán
VD: Thuật toán tìm UCLN của 2 số nguyên d-ơng a và b
2.Thiết kế thuật toán:
-Các bài toán phức tạp và đa dạng việc giải quyết trên ma trận là rất khókhăn.Tuy nhiên đối với những bài toán lớn hay bài toán phức tạp thì ta có thểphân chia bài toán lớn thành các bài toán nhỏ hơn(modul ch-ơng trình nhỏhơn) Ta lại có thể chia các bài toán nhỏ thành các modul nhỏ ứng với cácphần việc cơ bản mà ta đã biết cách giảI quyết, nh- vậy việc tổ chức lời giảiCủa bài toán sẽ đ-ợc thực hiện theo một cấu trúc phân cấp nh- sau:
Chiến thuật giải quyết bài toán theo tinh thần nh- vậy chính là chiến thuật
Chia để trị ->Để thực hiện đ-ợc chiến thuật này ng-ời ta dùng cách thiết
kế từ trên xuống <top-down> hoặc có thể sử dụng ph-ơng pháp từ d-ới
Trang 7a)Chiến l-ợc thiết kế thuật toán từ trên xuống:
-Nếu quá trình từng b-ớc triển khai và chi tiết hoá ch-ơng trình ngày càng
đi vào chiều sâu thì ph-ơng pháp giải bài toán đ-ợc gọi là từ trên xuống
*)ý t-ởng: Giả sử ta giải quyết 1 bài toán lớn T thì khi đó ta sẽ chia bài toán
T thành các bài toán con Nếu các bài toán con này ch-a có thuật giải thì talại cỏ thể chia các bài toán con này thành các modul nhỏ ứng với các phầnviệc cơ bản mà ta đã biết cách giải quyểt
-Thiết kế giải thuật top-down là việc giải quyyết bài toán đ-ợc định h-ớng rõràng tránh đ-ợc việc xa đà vào các chi tiết phụ quản lý đối t-ợng rõ ràng.Đây
là nền tảng của lập trình có cấu trúc hay còn gọi là h-ớng thủ tục.Bài toán
đ-ợc chia thành nhiều modul t-ơng đối độc lập nhiều ng-ời tham gia giảiquyết và ít ảnh h-ởng lẫn nhau đối với giải thuật phức tạp
- Ph-ơng pháp này còn hạn chế nh- quản lý độ phức tạp, quản lý và pháttriển hệ thống
b)Chiến l-ợc thiết kế thuật toán từ d-ới lên:
-Ph-ơng pháp đi đến lời gíải bài toán, trong đó ng-ời lập trình tr-ớc hết
nghiên cứu ngôn ngữ lập trình sẵn có rồi kết hợp những chỉ thị thành nhữngthủ tục hoặc hàm đơn giản hoặc thành những nhóm tiêu biểu cho bài toáncần giải Sau đó các thủ tục, hàm này đ-ợc sử dụng ở các thủ tục hay hàmcấp cao hơn.Ph-ơng pháp đó đ-ợc gọi là từ d-ới lên ( từ d-ới độ sâu của cáclệnh máy nguyên thuỷ đến bài toán trên cao )
*)ý t-ởng: Để giải một bài toán nào đó, ta cần chọn ra trong số các ch-ơng
trình đã biết, một số modul( đoạn ch-ơng trình con) Mỗi modul sẽ thực hiệnmột số chức năng nhất định.Việc chọn các modul đ-ơc xác định bởi nhữngsuy nghĩ khác nhau: Sự dễ hiểu của các chức năng mà mỗi modul cần thựchiện, kích th-ớc đoạn ch-ơng trình, cấu trúc dữ diệu, sự giống nhau có thể cóvới những công việc mới và khả năng chuyển cho những ,modul đã biết ấynhững nhiệm vụ mới Mỗi modul cần xác định những mối liên hệ giữa dữliệu vào và những dữ liệu ra Việc lập trình và kiểm thử đ-ợc tiến hành theonhững modul ấy Sau đó các modul đ-ợc hợp nhật vào các đơn vi lớn hơntrên cơ sở những mối liên hệ đã định tr-ớc Các đơn vị này lại đ-ợc kiểm thử,sửa chữa các thiếu sót, các bất hợp lý có thể xuất hiện trong quá trình hợpnhất cuối cùng các đã có lại đ-ợc hợp nhất trong ch-ong trình chung để giảiquyết bài toán đặt ra
-Một ứng dụng hay dùng nhất của kỹ thuật này là sửa chữa những ch-ơngtrình, những đoạn ch-ơng trình, những ch-ơng trình con đã có của một lờigiải bài toán nào đó đã biết để đ-ợc ch-ơng trình giải bài toán mới
c)Tinh chỉnh từng b-ớc, làm mịn dần.
-Tinh chỉnh từng b-ớc là ph-ơng pháp thiết kế thuật giải găn liền với lậptrình Nó phản ánh tinh thần của quá trình modul hoá bài toán và thiết kếkiểu top-down.Thoạt đầu ch-ơng trình thể hiện giải thuật đ-ợc trình bày
Trang 8bằng ngôn ngữ tự nhiên phản ánh ý chính của công việc cần làm.Càng ở cácb-ớc sau các lời lẽ đặc tả công việc xử lý sẽ đ-ợc thay thế dần bởi các câulệnh h-ớng tới các lệnh của ngôn ngữ lập trình, ta gọi đó là các b-ớc tinhchỉnh Nh- vậy nghĩa là quá trình thiết kế giải thuật và phát triển ch-ơngtrình sẽ đ-ợc thể hiện dần dần từ dạng ngôn ngữ tự nhiên, qua giả ngôn ngữrồi đến ngôn ngữ lập trình và đi từ mức làm cái gì đến mức làm thế nào ,
ngày càng sát với các chức năng với các câu lệnh của ngôn ngữ lập trình đãchọn
- Trong quá trình xây dựng thuật giải, ban đầu thuật giải đ-ợc viết d-ới dạng
dễ nhận biết.Theo thuật giải này, ở những b-ớc nào đó sẽ gặp khó khăn khimã hoá, hoặc là ch-ơng trình chạy sẽ mất nhiều thời gian có khi vi phạm đếntính hiệu quả của thuật giải, thì ta tìm cách cải tiến, chi tiết hoá ở nhữngb-ớc đó.Ta có thể chi tiết thêm hoặc là cải tiến để thuật giải tốt hơn, số thaotác mà máy thực hiện ít đi hoặc tiết kiệm bộ nhớ khi l-u trữ dữ liệu Ta bámtheo quá trình máy tính thực hiện ch-ơng chình để thấy đ-ợc những chỗ bấthợp lý hoặc không cần thiết mà điều chỉnh thuật giải cho tốt hơn
3.Phân tích thuật toán:
a)Độ phức tạp của thuật toán:
-Khi nói đến độ phức tạp của thuật toán ng-ời ta th-ờng đề cập đến độ phứctạp về thời gian và độ phức tạp về dung l-ợng nhớ
-Khi thiết kế thuật toán th-ờng ta dung hoà 2 tiêu chí ở trên theo nghĩa thuậttoán vừa chạy nhanh vừa tốn ít bộ nhớ Tuy nhiên ng-ời ta th-ờng đề cập tới
VD: Cho hàm : T(n)= n2+3n+2.Suy ra:
T(n)= n2+3n+2≤ n2+3n2+2n2
⇒ T(n)≤ 6n2 ∀n≥ 1
⇒T(n)=O(n2) Độ phức tạp bình ph-ơng(f(n)=n2, c=6, n0=1)
b) Các quy tắc đánh giá độ phức tạp của thuật toán:
-Để đánh giá độ phức tạp của thuật toán ng-ời ta sử dụng 2 quy tắc: Quy tắccộng và quy tắc nhân
*)Quy tắc cộng: Giả sử có 2 đoạn ch-ơng trình P1 và P2 thực hiện tuần tự, và
có độ phức tạp t-ớng ứng lần luợt là: T1(n)= O(f(n))
T2(n)= O(g(n)Khi đó độ phức tạp của đoạn ch-ơng trình bao gồm P1và P2 sẽ là:
T(n)= O(max(f(n), g(n)))
Trang 9VD: Nếu g(n)≤ f(n) ∀n ≥ n0⇒ O(f(n)+ g(n))= O(f(n).
Chẳng hạn: O(n4 +n2)= O(n4)
O(n +nlog2n)= O(n)
*)Quy tắc nhân: Giả sử có 2 đoạn ch-ơng trình P1, P2 thực hiẹn lồng nhau,
có độ phức tạp lần l-ợt là:T1(n)= O(f(n))
T2(n)= O(g(n))Khi đó độ phức tạp của đoạn ch-ơng trình gồm cả P1, P2 là:
T(n)= O(f(n).g(n))+VD: for i:= 1 to n do
for j:=1 to n do x:= x+1
Thời gian thực hiện thuật toán là: O(n.n)= O(n2)
-Ng-ời ta đánh giá độ phức tạp của thuật toán trong 3 tr-ờng hợp:
Tốt nhât (Tmin(n)), xấu nhất (Tmax(n)), trung bình (TTB(n)).Khi phân tích thờigian thực hiện giải thuật ta sẽ phải xét tới: đối với mọi dữ liệu vào có kicksth-ớc n thì T(n) trong tr-ờng hợp thuận lợi tốt nhất là nh- thế nào? Rồi T(n)trong tr-ờng hợp xấu nhất? Và T(n) trung bình?Nh-ng ng-ời ta th-ờng đánhgiá giải thuật qua giá trị xấu nhất của T(n), khi mà trong tr-ờng hợp T(n)trung bình khó xác định
c) M t s cỏc bài toỏn cú ph c t p a th c, hàm m , v n h b c
ph c t p c a 1 bài toỏn:
-Thông th-òng ta chia bài toán thành 3 lớp:
+1-Lớp bài toán giải đ-ợc có đọ phức tạp đa thức
+2-Lớp bài toán np đầy đủ
+3-Lớp bài toán giải đ-ợc bằng thuật toán có độ phức tạp hàm mũ-Lớp bài toán (2) và (3) : Các bài toán bất khả thi, trong đó chúng khó có thểthực hiện trên máy tính điện tử do thời gian thực hiện quá lớn.Khi đó ta cầnchia chúng thành các lớp con riêng biệt và đ-a các lớp con về lớp các bàitoán có độ phức tạp đa thức
-Lớp bài bài toán có độ phức tạp đa thức, ta cố gắng giảm số mũ k xuống:
Trang 10III-Đệ quy và thuật toán đệ quy:
1.Khái niệm về đệ quy, thuật toán đệ quy:
a)Khái niệm đệ quy: Ta nói một đối t-ợng là đệ quy nếu nó bao gồm chính
nó nh- một bộ phận hoặc nó đ-ợc định nghĩa d-ới dạng của chính nó
b)Thuật toán đệ quy: Nếu lời giải cảu bài toán T đ-ợc thực hiện bởi bài toán
, có dạng nh- T thì đó là một lời giải đệ quy.Giải thuật chứa lời giả đệ quygọi là giải thuật đệ quy
-Một thủ tục gọi là thủ tục đệ quy nếu trong thủ tục đó có lời gọi 1 cách trựctiếp hay gián tiếp
VD2: Hãy tính số hạng thứ n của dãy Fibonaci {1, 1, 2, 3, 5, 8, 13, 21, }
Function F(n: byte): Longint;
Trang 11*)Thuật toán: Để chuyển n đĩa từ A sang C ta lấy B làm trung gian:
+Chuyển n-1 đĩa từ A sang B, lấy C làm trung gian
+Đem 1 đĩa từ A sang C
+ Chuyển n-1 đĩa từ B sang C, lấy A làm trung gian
2 Thi t k thu t toỏn quy, ng d ng c a thu t toỏn quy.
-Khi bài toỏn ang xột ho c ang x lý c nh ngh a d i d ng quythỡ vi c thi t k cỏc gi thu t quy t ra r t thu n l i H u nh nú ph nỏnh r t sỏt n i dung c a nh ngh a ú
-Chỳ ý: i v i 2 bài toỏn VD1 và VD2 trong m c 1b nờu trờn thỡ vi cthi t k cỏc gi i thu t quy t ng ng khỏ thu n l i vỡ c hai u thu c
ng tớnh giỏ tr hàm mà nh ngh a quy c a hàm ú xỏc nh c ddàng Nh ng khụng ph i lỳc nào tớnh quy trong cỏch gi i bài toỏn c ng
th hi n rừ nột và n gi n nh v y V y thỡ v n nào c n l u tõm khithi t k m t gi i thu t quy? Cú th tr l i cõu h i qua vi c gi ỏp cỏccõu h i sau:
(2.1).Cú th nh ngh bài toỏn d i d ng m t bài toỏn cựng lo i,
Trang 12(2.2).Nh th nào là kích th c c a bài toán c gi m i m i l n
i quy?
(2.3).Tr ng h p c bi t nào c a bài bài toán c coi là tr ng h psuy bi n
3 Thu t toán quay lui và ng d ng
-Thu t toán quay lui dùng gi i bài toán li t kê các c u hình.M i c uhình c xây d ng b ng cách xây d ng t ng ph n t , m i m t ph n t
*)Mô hình c a thu t toán quay lui c mô t nh sau:
{ th t c này cho x nh n l n l t các giá tr mà nó có th nh n}
<ghi nh n vi c cho x i nh n giá tr V (n u c n) >;
<N u n, b ghi nh n x i : = V th giá tr khác> ;
End;
End;
End;
-Thu t toán quay lui s b t u b ng l i gi i Try(1)
Ta có th trình bày b ng quá trình tìm ki m l i gi i c a thu t toán quay lui
Try(3)
Trang 13Cây liệt kê lời giải theo thuật toán quay lui.
VD1 Liệt kê các dãy nhị phân độ dài n
Biểu diễn dãy nhị phân d-ới dạng b1, b2, bn, trong đó bi∈ {0, 1} Thủ tục
đệ quy Try(i) xác định bi, trong đó các giá trị đề cử là 0 và 1.Các giá trị này mặc nhiên đ-ợc chấp nhận mà không phải thoả mãn điều kiện gì (vì thế bài toán không cần biến trạng thái) Thủ tục Init nhập giá trị n và khởi gán biến đếm dem. Thủ tục Result đ-a ra dãy tìm đ-ợc
Một con mã di chuyển theo luật cờ vua đ-ợc đặt trong 1 ô với toạ độ
đầu là (x1,y1) Hãy tìm 1 đ-ờng đi với n2 1 b-ớc đi sao cho mọi ô trên bàn
cờ đều đ-ợc mã nhảy đến đúng một lần
Trang 14Xác định bài toán:
a Input
- Một bảng vuông kích th-ớc n x n
- Toạ độ của vị trí thứ nhất của quân mã
- Tám n-ớc đi có thể của quân mã đ-ợc biểu diễn bởi hình sau :
X1
Y1
b.Output
- Một bảng vuông trên đó có đánh dấu vị trí theo thứ tự từ 1 (vị trí đầu) đến
n2 (vị trí cuối ) của quân mã
- Từ vị trí k đến vị trí k +1 phải theo đúng luật đi của quân mã (nghĩa là chỉ
đ-ợc sử dụng 1 trong 8 n-ớc đi mô tả ở trên)
c Xác định các thao tác chế biến thông tin:
- Lần l-ợt xác định các vị trí của quân mã (từ 2 đến n2) sao cho quânmã :
*Di chuyển đúng luật
*Mỗi ô chỉ đ-ợc đi 1 lần
d Thiết kế thuật toán
* Ta sẽ biểu diễn bàn cờ bằng 1 ma trận vuông cấp n
Sở dĩ thể hiện mỗi ô cờ bằng 1 số nguyên thay cho giá trị boole (để
đánh dấu ô đã đ-ợc đi qua ch-a) là vì ta muốn lần dò theo quá trình dichuyển của con ngựa
Ta quy -ớc nh- sau :
dd([x,y]) = 0 <x,y> ngựa ch-a đi qua
dd([x,y]) = 1 <x,y> ngựa đã đi qua ở b-ớc thứ i (1<=i<=n2) *Các khả năng chọn lựa cho x1 ? Đó chính là các n-ớc đi của ngựa mà
Trang 15Hàng x
cột yMột ph-ơng pháp đơn giản để có đ-ợc u,v từ x,y là ta dùng 2 mảng a và bl-u trữ các sai biệt về toạ độ Nếu dùng 1 chỉ số k để đánh số b-ớc đi kế thì chi tiết đó đ-ợc thể hiện bởi : u = x+a[k];v=y+b[k];k=1->8;
Điều kịên chấp nhận đ-ợc có thể đ-ợc biểu diễn nh- kết hợp của các điềukiện :
Ô mới phải thuộc bàn cờ (1<=u<=n va 1<=v<=n) và ch-a đi qua ô đó,nghĩa là dd([u,v]) = 0;
*Để ghi nhận n-ớc đi hợp lệ ở b-ớc i, ta gán dd([u,v]) = i; và để huỷ bỏ 1n-ớc đi thì ta gán dd([u,v]) =0;
*Ma trận dd ghi nhận kết quả nghiệm Nếu có <x,y> sao cho dd<x,y> = 0 thì
đó ko phải lời giải của b.toán, còn ng-ợc lại la dd chứa đ-ờng đi của ngựa
*thuật toán nh- sau:
(1,2) (2,1) Toạ độ (a,b)
Trang 16-Danh sách tuyến tính là danh sách trong đó 2 phần tử kề nhau có mối quan
hệ tuyến tính
VD: Một hệ tuyến tính i, j Kí hiệu: L= ( a1, a2 , an) Khi đó:
N= 0 danh sách rỗng
n> 0 : a1, an t-ơng ứng là phần tử đầu tiên, cuối cùng của danh sách
ai+1, ai-1 t-ơng ứng là phần tử đi tr-ớc ai và đi sau ai n là độ dài danh sách
1.2)Cài t danh sỏch liờn k t n.Cỏc phộp toỏn x lý, ng d ng
*)Khai bỏo d li u :
Type
Pointer = ^Node;
Node = Record;
Trang 17Info: Data;
End;
*)Khëi t¹o danh s¸ch liªn kiÕt:
Danh s¸ch rçng à First= Nil
1.2.1)Tìm ki m m t ph n t trong danh sách:Gi s c n tìm ki m ph n t
có tr ng thông tin là x Phép tìm ki m c th c hi n t ph n t u cho
n khi tìm th y ph n t có tr ng thông ti x ho c n cu i danh sách (không tìm th y )
-Hàm Search tr v a ch c a ph n t u tiên ho c tr v giá tr Nil n ukhông tìm th y
-T ng t nh i v i danh sách c, phân bi t hai tr ng h p:
While (p<> Nil) And( Not Found) do
If p^.info= x then Found:= True
Trang 18-Đối với danh sách liên kết, việc thêm hoặc huỷ một phần tử khỏi danhsách nhanh hơn so với danh sách đặc Chỉ cần thay đổi vùng liên kết củaphần tử mằn ở vị trí cần thêm huỷ.
• Thêm vào đầu danh sách: Gọi p là địa chỉ của phần tử có tr-ờng thôngtin NewItem mới đ-ợc thêm vào, khi đó First trở thành phần tử thứ 2sau p Nh- vậy ta cần thực hiện các b-ớc sau:
+ Cho vùng liên kết của p trỏ vào First
+ Cho First trỏ vào p
Thủ tục:Chèn 1 nút mới info là x , và tr-ớc p.Chèn một nút mới vào sau nút
đ-ợc trỏ bởi P, hoán đổi tr-ờng thông tin
Procedure InsertBefore(X:Data;Var L:List;P:Pointer); Var Q: Pointer;
Trang 19+Cho vïng liªn kÕt cña P trá vµo vïng liªn kÕt cña Q
+ Cho vïng liªn kÕt cña Q trá vµo P
1.2.3.Lo¹i bá mét phÇn tö khái danh s¸ch:
• Lo¹i bá phÇn tö p ë ®Çu danh s¸ch: chØ cÇn cho con trá First vµo
Trang 20• Loại bỏ phần tử p đứng ngay sau phần tử Q:Cho vùng liên kết của
đơn nút đầu tiên đ-ợc trỏ bởi L:
a)Nhập liên tục các số khác 0 In danh sách
b)Đếm số l-ợng các nút
c)Bổ xung một nút sau nút thứ k
d)Loại bỏ một nút tr-ớc nút k
e)Chèn 1 danh sách mới sau nút đ-ợc trỏ bởi p
f)Đảo ng-ợc danh sách đã cho.
C
D E
Trang 21Write( Vi tri k= ); readln(k);
Write( Nhap gia tri cua nut moi: ); Readln(x); Q:= L;
Trang 222.Danh sách liên kết đôi(Doubly Linked List):
2.1.Khái niêm:-Danh sách liên kết đôi là danh sách mà mỗi phần tử của
Trang 23Tổ chức danh sách liên kết đôi nh- sau:
-Khởi tạo danh sách liên kết đôi:
Danh sách rỗng à First= Nil và Last= Nil
2.2.1.Thêm một phần tử vào danh sách liên kết đôi:
a) Thêm P vào đầu danh sách:
-Thuật toán:
+B1: Cho liên kết Next của P trỏ tới con trỏ First
+B2: Cho liên kết Prev của P rỗng
+B3: Nếu danh sách ban đầu khác rỗng thì cho liên kết Prev của First trỏ
đến P
+B4:Cho First trỏ đến P
+B5: Nếu danh sách ban đầu rỗng thì cho Last trỏ đến P
Function InsertFirst( x: Data): Pt;
Var
Prev Data Next
Prev Data Next
Prev Data Next Prev Data Next
Trang 24If P= First then First:= R;
If P= Last then Last:= L;
Dispose(P);
End;
3.Stack và queue liờn k t :
3.1.Ngăn Xếp(Stack):
3.1.1.Khái niệm: Ngăn xếp( stack) là một kiểu danh sách tuyến tính đặc
biệt mà phép bổ xung và loại bỏ luôn thực hiện ở một đầu đ-ợc gọi là
đỉnh(Top)
- Ngăn xếp hoạt động theo nguyên tắc: Vào sau ra tr-ớc (Last in firstout) Do đó stack còn đ-ợc gọi là danh sách kiểu LIFO.Stack có thể rỗng ,nghĩa là không có phần tử nào
3.1.2.Cài đặt:
a)Sử dụng mảng tĩnh:
Trang 25(1).Khëi t¹o: S.Top:= 0
Procedure StackInit; {Khoi tao stack rong}
Begin
S.Top:=0;
End;
(2).KiÓm tra rçng: S.Top= 0?
(3).KiÓm tra ®Çy: S.Top= Max?
Var S: Stack; {con tro danh sach}
(1).Khëi t¹o Stack rçng:
Procedure StackInit;
Begin
S:= Nil;
End;
(2).KiÓm tra Stack rçng: S= Nil;
(3).KiÓm tra Stack ®Çy, kh«ng ®Çy?
Trang 26(4).Thªm x vµo ®Çu Stack S :
Procedure Push(x: Data; S: Stack);{ §Èy gi¸ trÞ x vµo Stack}
(5).L©y 1 gi¸ trÞ ra khái ng¨n xÕp
Procedure Pop( var S: Stack; var x: Data);
Pop:= S^.info; {Gan ket qua cho ham}
Q:= S^.Next; {Giu lai nut tiep theo S^( nut duoc day vao ds)}
Dispose(S);{Giai phong bo nho cap cho S^, cap nhat lai
Trang 273.2.1.Khái niệm: Hàng đợi là một kiểu danh sách đ-ợc trang bị 2 phép toán
bổ xung một phần tử vào cuối danh sách (Rear) và loại bỏ một phần tử ở
đầu danh sách (Front)
-Có thể hình dung hàng đợi nh- một đoàn ng-ời xếp hàng mua vé: Ng-ời
nào xếp hàng tr-ớc thì mua vé tr-ớc Theo quy tắc vào tr-ớc ra tr-ớcQueue có tên gọi là danh sách kiểu FIFO( First in first Out)
3.2.2.Cài đặt:
a)Mô tả Queue bằng mảng :
- Ta dùng hai chỉ số First và Last, First l-u chỉ số đầu của Queue còn Lastl-u chỉ số cuối của Queue Khởi tạo Queue rỗng: First:=1 và Last:= 0;+ Để thêm 1 phần tử vào Queue, ta tăng Last lên 1 và đ-a giá trị đó vàophần tử thứ Last
+Để loại 1 phần tử khỏi Queue, ta lấy giá trị ở vị trí First và tăng First lên 1+Khi Last tăng hết khoảng chỉ số của mảng thì mảng đã đầy, không thể
đẩy phần tử thêm vào nữa
+Khi First > Last tức là Queue đang rỗng
⇒Nh- vậy chỉ 1 phần tử của mảng từ vị trí First tới Last đ-ợc sử dụng làmQueue
Program QueueByArray;
Const Max= 10000;
Var
Queue: Array[1 Max] of Integer;
First, Last: Integer;
Procedure QueueInit; {Khoi tao hang doi}
Trang 28If last= Max then Last:= 1
Else Last:= Last+1;
If First= Max then First:=1
Else First:= First+1;