Tải bản đầy đủ (.doc) (65 trang)

Giáo án môn cấu trúc dữ liệu và giải thuật

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (459.25 KB, 65 trang )


Ngày soạn

Ngày giảng:
Chương 1
THIẾT KẾ VÀ PHÂN TÍCH GIẢI THUẬT
§1. Mở đầu

A. MỤC TIÊU

1. Kiến thức
Giúp SV nắm được các vấn đề như: dữ liệu, cấu trúc dữ liệu, các bước cần
thực hiện để giải quyết một bài toán tin học.
2. Kỹ năng
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo.
- Rèn kỹ năng xác định cấu trúc dữ liệu, giải thuật một số bài toán cụ thể.
3. Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức.
B. CHUẨN BỊ

1. Giảng viên:
2. Sinh viên:

Giáo án, đồ dùng giảng dạy.
Giáo trình, đồ dùng học tập.

C. PHƯƠNG PHÁP

- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại


D. TÀI LIỆU THAM KHẢO

1. Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội.
2. Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải.
E. TIẾN TRÌNH LÊN LỚP

1. Ổn định tổ chức
Tổng số SV:

Có mặt:

Vắng:

(… có phép)

2. Nội dung bài giảng
Tiêu mục

Hoạt động của thầy - trò

1. Cấu trúc ? Dữ liệu là gì
dữ liệu
+ Dữ liệu có thể hiểu là vật thô mang thông tin, nó là đối tượng để xử lý
trên máy tính.
? Nếu các dữ liệu có quan hệ với nhau thì kết nối chúng như thế nào
+ Các dữ liệu được kết nối với nhau bởi các phép toán
? Có thể đồng nhất các dữ liệu đó được không
+ Không thể đồng nhất các dữ liệu được vì chúng thuộc nhiều dạng
khác nhau.
1



Tiêu mục

Hoạt động của thầy - trò

? Kiểu dữ liệu là gì
- Kiểu dữ liệu là một sự quy định về cấu trúc, miền trị của dữ liệu và tập
các phép toán tác động lên miền trị đó.
?Hãy nêu các kiểu dữ liệu chuẩn (đơn giản) được sử dụng trong TP
Bài toán tình huống: Nhập dữ liệu cho một dãy n số
Vậy với các kiểu dữ liệu đơn giản vừa nêu, bài toán trên có được giải quyết không,
nếu được thì giải quyết như thế nào, nếu không được thì những vấn đề nào cần phải
được xử lý để giải quyết bài toán.

+ Khi giải các bài toán phức tạp, nếu chỉ sử dụng các kiểu dữ liệu đơn
giản thì không thể giải quyết được. Do vậy, ta cần phải tìm đến các cấu
trúc dữ liệu khác được xây dựng từ các kiểu dữ liệu đơn giản đã có.
⇒ Ta có thể hiểu cấu trúc dữ liệu là một mô hình toán học nhằm mô tả
các đối tượng (dữ liệu) và các phép toán thực hiện được trên mô hình đó.
- Trong tin học, khi giải quyết các bài toán thì điều quan trọng là phải
chọn chính xác cấu trúc dữ liệu và từ đó xác định được thuật toán giải
quyết bài toán.
2. Ngôn ngữ ? Em hiểu thế nào là ngôn ngữ lập trình
lậptrình
- Ngôn ngữ lập trình là một hệ thống được ký hiệu hóa để miêu tả
những tính toán (qua máy tính) trong một dạng mà cả con người và máy
đều có thể đọc và hiểu được.
? Máy tính xử lý thông tin như thế nào
- Ngôn ngữ lập trình bao giờ cũng phải kèm theo bộ dịch để dịch sang

ngôn ngữ máy.
- Ngôn ngữ lập trình chia làm 2 loại: biên dịch và thông dịch.
3. Các bước ? Theo em khi giải quyết một bài toán tin học thì các thao tác nào là
cần thực quan trọng nhất mà không thể bỏ qua.
hiện để giải  Xác định bài toán
quyết một ? Thực hiện thao tác này ta sẽ thu được điều gì
bài toán tin - Việc xác định bài toán sẽ cho ta biết phải giải quyết vấn đề gì, với các
giả thiết (input) đã cho và kết quả (input) cần đạt được thỏa mãn những
học
yêu cầu gì.
Khác với bài toán thuần túy toán học chỉ cần xác định rõ giả thiết và kết luận chứ
không cần xác định yêu cầu về lời giải, đôi khi những bài toán tin học ứng dụng
trong thực tế chỉ cần tìm lời giải tốt tới mức nào đó, thậm chí là tới mức chấp nhận
được bởi lời giải tốt nhất đòi hỏi quá nhiều thời gian và chi phí.

 Lựa chọn cấu trúc dữ liệu thích hợp để biểu diễn bài toán
? Cấu trúc dữ liệu được lựa chọn phụ thuộc vào yếu tố nào
2


Tiêu mục

Hoạt động của thầy - trò

- Việc lựa chọn cấu trúc dữ liệu cho bài toán phụ thuộc vào vấn đề cần
giải quyết và những thao tác sẽ tiến hành trên dữ liệu vào.
Có những thuật toán chỉ thích ứng với một cách tổ chức dữ liệu nhất định, đối với
những cách tổ chức dữ liệu khác thì sẽ kém hiệu quả hoặc không thể thực hiện
được. Chính vì vậy thao tác này không thể tách rời thao tác xây dựng thuật toán
giải quyết bài toán.


? Theo em khi lựa chọn cấu trúc dữ liệu, các tiêu chuẩn nào sẽ được
dùng làm tiêu chí để chọn.
- Các tiêu chuẩn khi lựa chọn cấu trúc dữ liệu:
+ Phải biểu diễn được đầy đủ các thông tin và và ra của bài toán.
+ Phải phù hợp với các thao tác theo các bước của thuật toán mà ta đã
xây dựng để giải quyết bài toán.
+ Phải cài đặt được trên máy tính với ngôn ngữ lập trình đang sử dụng.
 Thiết kế thuật toán
? Thuật toán là gì
- Thuật toán là một dãy hữu hạn các thao tác có thể thực hiện, được sắp
xếp theo một trình tự xác định nhằm mô tả quá trình giải quyết một bài
toán, để từ các dữ kiện đầu vào sau một số thao tác ta sẽ có được kết
quả như mong muốn.
? Trình bày các đặc trưng của thuật toán
- Tính dừng: Giải thuật phải kết thúc và đưa ra kết quả sau một số hữu hạn
các thao tác.
- Tính xác định: các thao tác dùng để mô tả giải thuật phải hòan toàn
được xác định, không có sự nhập nhằng, tùy tiện.
- Tính phổ dụng: giải thuật phải áp dụng được với một lớp các bài toán
với input thay đổi chứ không áp dụng cho một trường hợp cụ thể.
Cần lưu ý là tính dừng và tính xác định là điều kiện cần trong quá trình tìm giải thuật, còn tính phổ
dụng chỉ là một tính chất thường thấy vì có nhiều bài toán có input hoàn toàn xác định nhưng không
tồn tại một lớp các bài toán tương tự.

- Dữ liệu đầu vào: mỗi giải thuật bắt buộc phải có một hoặc nhiều đại
lượng vào.
- Dữ liệu đầu ra: sau khi giải thuật được thực hiện xong thì nó phải đưa
ra được kết quả như mong muốn.
 Sử dụng ngôn ngữ lập trình đã lựa chọn để mô tả thuật toán

Sau khi đã xây dựng được thuật toán, ta phải tiến hành lập trình mô tả thuật toán
đó. Muốn lập trình đạt hiệu quả cao, cần phải có kỹ thuật lập trình tốt. Kỹ thuật lập

3


Tiêu mục

Hoạt động của thầy - trò

trình tốt thể hiện ở kỹ năng viết chương trình, khả năng gỡ rối và thao tác nhanh.
Nếu lập trình tốt không phải chỉ cần nắm vững ngôn ngữ lập trình là đủ mà phải
biết cách viết chương trình uyển chuyển, khôn khéo và phát triển dần dần để
chuyển các ý tưởng thành chương trình hoàn chỉnh. Kinh nghiệm cho thấy một
thuật toán hay nhưng do cài đặt vụng về nên khi chạy lại cho kết quả sai hoặc tốc
độ chậm.

 Kiểm thử
Một chương trình viết xong chưa chắc đã chạy được ngay trên máy tính để cho ra
kết quả như mong muốn. Kỹ năng tìm lỗi, sửa lỗi, điều chỉnh lại chương trình cũng
là một kỹ năng quan trọng của người lập trình. Kỹ năng này chỉ có được bằng kinh
nghiệm tìm và sửa lỗi của chính mình.

- Chạy thử và tìm lỗi: các lỗi thường gặp khi lập trình gồm
+ Lỗi cú pháp: lỗi này hay gặp nhất nhưng lại dễ sửa nhất, chỉ cần nắm
vững ngôn ngữ lập trình là đủ.
+ Lỗi cài đặt: việc cài đặt thể hiện không đúng thuật toán đã định, với
lỗi này thì phải xem tổng thể chương trình, kết hợp với các chức năng
gỡ rối để sửa lại cho đúng.
+ Lỗi thuật toán: lỗi này ít gặp nhất nhưng nguy hiểm nhất, nếu nhẹ thì

phải điều chỉnh lại thuật toán, nếu nặng thì có khi phải loại bỏ hoàn toàn
thuật toán sai và làm lại từ đầu.
- Xây dựng các bộ test:
Có nhiều chương trình rất khó kiểm tra tính đúng đắn, nhất là khi ta không biết kết
quả đúng là khi nào. Vì vậy nếu chương trình vẫn chạy ra kết quả thì việc tìm lỗi
rất khó khăn. Khi đó ta nên làm các bộ test để thử chương trình của mình.

 Tối ưu chương trình
Một chương trình đã chạy đúng không có nghĩa là việc lập trình đã xong, ta phải
sửa đổi lại một vài chi tiết để chạy chương trình có thể chạy nhanh hơn, hiệu quả
hơn. Thông thường, trước khi kiểm thử thì ta nên đặt mục tiêu viết chương trình sao
cho đơn giản, miễn sao chạy ra kết quả đúng là được, sau đó khi tối ưu chương
trình, ta xem lại những chỗ viết chưa tốt thì tối ưu lại mã lệnh để chương trình ngắn
gọn hơn, chạy nhanh hơn. Không nên viết tới đâu tối ưu đến đó vì chương trình có
mã lệnh tối ưu thường phức tạp và khó kiểm soát.

? Các tiêu chí nào có thể dùng để đánh giá sự tối ưu của một chương trình
- Các tiêu chí để đánh giá sự tối ưu một chương trình
+ Tính tin cậy: chương trình phải chạy đúng như dự định, mô tả đúng
giải thuật.
+ Tính uyển chuyển: chương trình phải dễ sửa đổi
+ Tính trong sáng: chương trình viết ra phải dễ đọc, dễ hiểu để sau một
4


Tiêu mục

Hoạt động của thầy - trò

thời gian dài khi đọc lại còn hiểu mình làm cái gì, để nếu có điều kiện

còn có thể sửa sai (nếu phát hiện lỗi mới), cải tiến hay biến đổi để được
chương trình giải quyết bài toán khác.
+ Tính hữu hiệu: chương trình phải chạy nhanh và tiêu tốn bộ nhớ ít
nhất có thể được.
Để có một chương trình hữu hiệu, cần phải có giải thuật tốt và những tiểu xảo khi
lập trình, tuy nhiên việc áp dụng quá nhiều tiểu xảo có thể khiến chương trình trở
nên rối, khó hiểu khi sửa đổi. Tiêu chí này chỉ nên dừng ở mức chấp nhận được,
không quan trọng bằng ba tiêu chí trên.
Từ những phân tích trên ta thấy rằng việc làm ra một chương trình đòi hỏi rất
nhiều công đoạn và tiêu tốn khá nhiều công sức. Chỉ một công đoạn không hợp lý
sẽ làm tăng chi phí viết chương trình. Nghĩ ra cách giải quyết vấn đề đã khó, biến ý
tưởng đó thành hiện thực cũng không dễ chút nào.
F. CỦNG CỐ, HỌC TẬP TẠI NHÀ

* Củng cố
Qua bài học này các em nắm được các vấn đề như: dữ liệu, cấu trúc dữ liệu,
các bước cần thực hiện để giải quyết một bài toán tin học.
* Nhiệm vụ học tập tại nhà
- Nghiên cứu lại nội dung bài cũ.
- Tìm hiểu về cách phân tích thời gian thực hiện giải thuật.

5


Ngày soạn

Ngày giảng:
§2. Phân tích thời gian thực hiện giải thuật

A. MỤC TIÊU


1. Kiến thức
Giúp SV nắm được các vấn đề như: khái niệm giải thuật, các cách biểu diễn
giải thuật, độ phức tạp của giải thuật; bước đầu biết xác định độ phức tạp giải thuật
của một số bài toán cụ thể.
2. Kỹ năng
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo.
- Rèn kỹ năng đánh giá độ phức tạp thông qua việc đánh giá một số giải
thuật cụ thể.
3. Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức.
B. CHUẨN BỊ

1. Giảng viên:
2. Sinh viên:

Giáo án, đồ dùng giảng dạy.
Giáo trình, đồ dùng học tập.

C. PHƯƠNG PHÁP

- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại
D. TÀI LIỆU THAM KHẢO

1. Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội.
2. Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải.
E. TIẾN TRÌNH LÊN LỚP


1. Ổn định tổ chức
Tổng số SV:
2. Nội dung bài giảng
Tiêu mục

Có mặt:

Vắng:

(… có phép)

Hoạt động của thầy - trò

1.
Giải - Giải thuật là một dãy hữu hạn các thao tác có thể thực hiện, được sắp
thuật
xếp theo một trình tự xác định nhằm mô tả quá trình giải quyết một bài
toán, để từ các dữ kiện đầu vào sau một số thao tác ta sẽ có được kết
quả như mong muốn.
2.
Các ? Khi GV yêu cầu em đưa ra hướng giải quyết một bài toán thì em
phương
phải thực hiện thao tác nào (sử dụng ngôn ngữ để trình bày các bước giải quyết bài
pháp mô tả toán đó)
giải thuật Đây chính là một trong 3 cách người ta thường dùng để diễn tả (mô tả) thuật giải của một bài toán
6


Tiêu mục


Hoạt động của thầy - trò

a. Phương pháp liệt kê từng bước
- Là phương pháp sử dụng ngôn ngữ tự nhiên để liệt kê các thao tác, các
chỉ thị cần thực hiện để giải quyết bài toán.
- Ví dụ:
? Cho cô biết cách tìm nghiệm của phương trình bậc hai ax2+bx+c = 0
? Cho cô biết cách tìm ước chung lớn nhất của hai số nguyên dương a, b
Các nhóm SV trao đổi rồi trả lời

b. Phương pháp sử dụng lưu đồ
- là phương pháp sử dụng các hình vẽ đã quy định để mô tả giải thuật một
cách trực quan.
- Các khối được sử dụng:
Bắt đầu hoặc kết
thúc giải thuật
Thao tác tính toán
hoặc xuất dữ liệu

Nhập dữ liệu
Kiểm tra điều kiện

Hướng đi của giải thuật

3. Ví dụ

trong đó chỉ có khối dùng để kiểm tra điều kiện là có một đường vào và
2 đường ra còn tất cả các khối khác đều chỉ có một đường vào và một
đường ra.
? Hãy vẽ lưu đồ mô tả giải thuật giải phương trình bậc hai ax 2+bx+c =

0
? Vẽ lưu đồ mô tả giải thuật tìm ước chung lớn nhất của hai số
nguyên dương a, b
? Hãy vẽ lưu đồ mô tả giải thuật biện luận nghiệm của phương trình bậc
nhất ax+b=0
Begin

Begin

a, b, c

a, b

delta := b*b - 4*a*c
0
1
PT có no kép
x := -b/(2*a)

1

a=0

0

1

delta < 0

1


b=0

0

0

delta = 0

PT có 2 no

PT vô no

PT
vô số no

PT
vô no

x:=(-b±SQRT(delta))/(2*a)
End
End

7

no là
x=-b/a


Tiêu mục


Hoạt động của thầy - trò
Begin

Begin

a, b

a, b
1

a=b

b <> 0

0
1

a := a - b

a>b

0

b := b - a

UC = a
End

1

r := a mod b;
a := b;
b := r;

0

UC = a
End

c. Sử dụng ngôn ngữ phỏng trình
- Theo phương pháp này ta sẽ dùng các ký hiệu và quy tắc để mô tả giải
thuật một cách nhất quán.
- Ví dụ 1: mô tả giải thuật tìm UCLN(a.b)
C1: Khi a còn khác b thì thực hiện thao tác sau
Nếu a > b thì a sẽ có giá trị bằng a - b (bớt a đi một lượng b)
Ngược lại thì b sẽ nhận giá trị bằng b - a (bớt b đi một lượng a)
Cho đến khi a = b thì thông báo UCLN của a và b là bằng a (hoặc bằng b).
C2: Khi b còn khác 0 thì thực hiện các thao tác sau
Chia a cho b được phần dư r; a nhận giá trị của b; b nhận giá trị của r
cho đến khi b = 0 thì thông báo UCLN của a và b là a.
4. Độ
phức tạp
tính toán
của thuật
toán

Với một bài toán không chỉ có một giải thuật. Chọn một giải thuật đưa tới kết qủa nhanh
nhất là một đòi hỏi thực tế. Như vậy cần có một căn cứ nào đó để chỉ ra rằng giải thuật
này nhanh hơn giải thuật kia?
Thời gian thực hiện một giải thuật bằng chương trình máy tính phụ thuộc vào rất nhiều

yếu tố. Một yếu tố cần chú ý nhất là kích thước của dữ liệu vào. Dữ liệu vào càng lớn thì
thời gian xử lý càng chậm, chẳng hạn như thời gian sắp xếp một dãy số phụ thuộc vào số
lượng các số thuộc dãy số đó. Nếu gọi n là kích thước dữ liệu đưa vào thì thời gian thực
hiện của giải thuật có thể biểu diễn một cách tương đối như một hàm của n: T(n).
Ta biết rằng phần cứng máy tính, ngôn ngữ viết chương trình và chương trình dịch ngôn
ngữ ấy đều ảnh hưởng tới thời gian thực hiện. Những yếu tố này không giống nhau trên
các loại máy, vì vậy không thể dựa vào chúng để xác định T(n), tức là T(n) không thể
biểu diễn bằng đơn vị thời gian giờ, phút, giây được. Tuy nhiên, không phải vì thế mà
không thể so sánh được các giải thuật về mặt tốc độ.
Nếu thời gian thực hiện một giải thuật là T1(n) = n2 và thời gian thực hiện của một giải
thuật khác là T2(n) = 100n thì khi n đủ lớn, thời gian thực hiện giải thuật T 2 rõ ràng
nhanh hơn giải thuật T1. Khi đó, nếu nói rằng thời gian thực hiện giải thuật tỷ lệ thuận
với n hay tỷ lệ thuận với n2 cũng cho ta một cách đánh giá tương đối về tốc độ thực hiện
của giải thuật đó khi n khá lớn. Cách đánh giá thời gian thực hiện giải thuật độc lập với
máy tính và các yếu tố liên quan tới máy tính như vậy sẽ dẫn tới khái niệm “độ phức tạp
tính toán của giải thuật”

Tại sao phải thiết kế thuật toán có hiệu quả nhất ?
8


Tiêu mục

Hoạt động của thầy - trò

- VD: Bài toán tháp Hà Nội: Có 3 cọc A, B, C. Trên cọc A có n đĩa
được đặt theo thứ tự từ bé đến lớn. Ta cần chuyển n đĩa từ cọc A sang
cọc C, được phép sử dụng cọc B làm trung gian nhưng không được
phép để đĩa lớn trên đĩa bé
? Trình bày cách làm trong thực tế

- Phân tích: + Chuyển n - 1 đĩa từ cọc A sang cọc B
+ Chuyển 1 đĩa từ cọc A sang cọc C
+ Chuyển n - 1 đĩa từ cọc B sang cọc C
? Phải có bao nhiêu lần chuyển nếu ký hiệu số lần chuyển là F(n)
⇒ Phải có F(1) = 1 lần; ... F(n) = 2F(n-1) + 1 với n > 1 lần chuyển
Cụ thể: F(1) = 1 = 21 - 1; F(2) = 2.1 + 1 = 3 = 22 - 1;... F(n) = 2n - 1 (*)
? Sử dụng phương pháp quy nạp toán học chứng minh công thức *
là đúng
+ n = 1 ⇒ F(1) = 1 (đúng)
+ Giả sử đúng với n = k, tức là F(k) = 2k - 1 là đúng
+ Cần chứng minh đúng với n = k + 1
Ta có: F(k+1) = 2F(k) + 1 = 2(2k - 1) + 1 = 2k+1 - 1 (đúng) ⇒ đpcm.
Vậy nếu n = 64 tức là ta phải chuyển 264 - 1 lần chiếc đĩa, giả sử mỗi lần chuyển
một đĩa từ cọc này sang cọc khác cần 1 giây ⇒ để chuyển 64 đĩa ta cần 5.10 11 năm
⇒ và nếu tuổi của vũ trụ là 10 tỷ năm thì cần 50 lần tuổi của vũ trụ để chuyển 64
chiếc đĩa ⇒ Phải tìm thuật toán có hiệu quả nhất. Tuy nhiên có những bài toán
không tồn tại những thuật toán có hiệu quả nhất.

 Đánh giá độ phức tạp theo phương pháp lý thuyết
+ Sử dụng hàm số T(n) để biểu diễn thời gian thực hiện giải thuật
+ Có thể xác định thời gian thực hiện T(n) là số phép toán sơ cấp phải
tiến hành khi thực hiện giải thuật (+, - , *, /, phép so sánh)
 Đánh giá độ phức tạp theo phương pháp toán học: Sử dụng ký hiệu
O để mô tả độ lớn của hàm T(n)
- Định nghĩa: Giả sử n là số nguyên không âm, T(n) và F(n) là các hàm
thực không âm. Khi đó T(n) được xác định: T(n) = O(F(n)) nếu và chỉ
nếu tồn tại các hằng số c, n0 sao cho T(n) ≤ cF(n) ∀ n ≥ n0.
Nghĩa là nếu xét những giá trị n ≥ n0 thì hàm T(n) sẽ bị chặn trên bởi một
hằng số nhân với F(n). Khi đó, nếu T(n) là thời gian thực hiện giải thuật thì
ta nói giải thuật đó có cấp là F(n) (hay độ phức tạp tính toán là O(F(n)).

- Ví dụ: T (n) = 3n 2 + 5n + 4 ≤ 3n 2 + 5n 2 + 4n 2 = 12n 2 ∀n ≥ 1
⇒ Ta có T(n) = O(n2) (Trường hợp này ta nói giải thuật có thời gian
9


Tiêu mục

Hoạt động của thầy - trò
2

thực hiện cấp n .
- Các dạng hàm thể hiện độ phức tạp của giải thuật
Ký hiệu
O(1)
O(Log2n)
O(n)
5.
Xác
định độ
phức tạp
tính toán
của giải
thuật

Tên gọi
Hằng
Lôgarit
Tuyến tính

Ký hiệu

O(n2)
O(nlog2n)
O(n3)
O(2n)

Tên gọi
Bình phương
n log2n
Lập phương


 Quy tắc cộng: Nếu đoạn T có 2 đoạn chương trình T 1 và T2 rời nhau
thì O(T) = O(T1) + O(T2), với thời gian thực hiện chương trình T 1 là
T1(n) = O(f(n)) và thời gian thực hiện chương trình T2 là T2(n) = O(g(n)).
⇒ O(P) = O(max(f(n),g(n)))
- Ví dụ:
? Hãy viết đoạn lệnh tính tổng các phần tử trong mảng một chiều A
S := 0;
For i := 1 To n Do S := S + A[i];
? Đánh giá độ phức tạp của đoạn lệnh trong ví dụ trên
T1(n) = O(1);(do thực hiện phép gán)
T2(n) = O(2n) (thực hiện n lần 2 phép toán: gán và cộng)
⇒ T(n) = O(max(1,2n)) = O(2n)
 Quy tắc nhân: Nếu đoạn chương trình T được biểu diễn bởi hai
đoạn chương trình T1 và T2 lồng nhau thì O(T) = O(T1).O(T2) tức là
O(T) = T(n) = T1(n).T2(n) = O(f(n).g(n)).
- Ví dụ:
? Viết đoạn lệnh để sắp xếp mảng một chiều A theo chiều giảm dần
(tăng dần)
For i := 1 To n - 1 Do

For j := i + 1 To n Do
If A[i] < A[j] Then
Begin
tg := A[i]; A[i] := A[j]; A[j] := tg;
End;
? Đánh giá độ phức tạp của đoạn lệnh trong ví dụ trên
T1(n) = O(n-1) = O(n) (For vòng ngoài chạy n - 1 lần)
T2(n) = O(4(n-1) = O(n) (For trong thực hiện tối đa n - 1 lần và mỗi lần thực hiện 4 phép toán)
⇒ T(n) = O(n.n) = O(n2)
10


Tiêu mục

Hoạt động của thầy - trò

* Chú ý: Khi đánh giá độ phức tạp của giải thuật ta chỉ cần chú ý tới các
bước tương ứng với một phép toán mà ta gọi là phép toán tích cực. Đó là
phép toán thuộc giải thuật mà thời gian thực hiện nó không ít hơn các
phép toán khác (hoặc số lần thực hiện không kém gì các phép toán khác)
- Ví dụ: Tính e x = 1 +

x x2
xn
+
+ ... +
1! 2!
n!

? Viết đoạn lệnh tính ex theo công thức trên

+ Cách 1: S := 1;
For i := 1 to n Do
Begin
P := 1;
For j := 1 To i Do P := P * (x/i);
S := S + P;
End;
T(n) = T1(n).T2(n), trong đó: T1(n) = O(n); T2(n) = T21(n) + T22(n) + T23(n)
? Xác định phép toán tích cực trong đoạn lệnh T2
Lệnh tích cực là lệnh P := P* (x/i) ⇒ T2(n) = T22(n) = O(n)
⇒ T(n) = O(n.n) = O(n2);
+ Cách 2: S := 1; P := 1;
For i := 1 To n Do
Begin
P := P*(x/i);
S := S + P;
End;
T(n) = T1(n)+T2(n)+T3(n), trong đó T1(n) = T2(n) = O(1); T3(n) = ?
? Xác định phép toán tích cực trong đoạn lệnh T3
Lệnh tích cực có thể là P := P* (x/i) hoặc S := S + P ⇒ T3(n) = O(n)
⇒ T(n) = O(max(1,1,n)) = O(n)
Khi đánh giá độ phức tạp của thuật toán, có những trường hợp thừoi gian thực hiện
giải thuật không phụ thuộc vào kích thước dữ liệu mà phụ thuộc vào chính tình
trạng của dữ liệu đầu vào.

6.
Độ
phức tạp
tính toán
với tình

trạng dữ

- Ví dụ 1: Sắp xếp một dãy số theo chiều tăng dần (giảm dần)
Trường hợp dãy đó đã theo đúng thứ tự tăng dần (giảm dần) sẽ khác với trường
hợp dãy số chưa được sắp thứ tự ⇒ Thời gian phân tích giải thuật sẽ phải chú ý tới
T(n) trong trường hợp tốt nhất, xấu nhất và thời gian trung bình.

- Ví dụ 2: Cho biết x có mặt trong dãy A (n phần tử) không?
? Viết đoạn lệnh xử lý yêu cầu trên
11


Tiêu mục

liệu
vào

đầu

Hoạt động của thầy - trò

OK:= False;
i := 1;
While (i <= n) and (not OK) Do
If A[i] = x Then
Begin
OK := True; k := i; Write(k :4);
End
Else i := i + 1;
? Phép toán nào là phép toán tích cực? Trường hợp tốt nhất là

trường hợp nào, trường hợp nào là xấu nhất.

+ Phép toán tích cực là phép so sánh
+ Trường hợp tốt nhất là i = 1 tức là phần tử đầu tiên của dãy A có giá trị bằng x
+ Trường hợp xấu nhất là trường hợp A[n] = x hoặc không tìm thấy
7. Chi phí Khái niệm độ phức tạp tính toán đặt ra là để đánh giá chi phí thực hiện một giải thuật
về mặt thời gian. Nhưng chi phí thực hiện giải thuật còn có rất nhiều yếu tố khác nữa:
thực hiện
không gian bộ nhớ phải sử dụng là một ví dụ. Tuy nhiên, trên phương diện phân tích lý
giải thuật thuyết, ta chỉ có thể xét tới vấn đề thời gian bởi việc xác định các chi phí khác nhiều khi
rất mơ hồ và phức tạp. Đối với người lập trình thì khác, một giải thuật với độ phức tạp
dù rất thấp cũng sẽ là vô dụng nếu không thể cài đặt được trên máy tính. Chính vì vậy,
khi bắt tay cài đặt một thuật toán, ta phải biết cách tổ chức dữ liệu một cách khoa học,
tránh lãng phí bộ nhớ cần thiết. Có một quy luật tương đói khi tổ chức dữ liệu: tiết
kiệm được bộ nhớ thì thời gian thực hiện thường sẽ chậm hơn và ngược lại. Biết cân
đối, dung hòa hai yếu tố đó là một kỹ năng cần thiết của người lập trình.
F. CỦNG CỐ, HỌC TẬP TẠI NHÀ

* Củng cố
Qua bài học này các em nắm được các vấn đề như: khái niệm giải thuật, các
cách biểu diễn giải thuật, khái niệm và cách xác định độ phức tạp của giải thuật; bước
đầu biết xác định độ phức tạp giải thuật của một số bài toán cụ thể
* Nhiệm vụ học tập tại nhà
- Nghiên cứu lại nội dung bài cũ.
- Tìm hiểu về đệ quy và giải thuật đệ quy
Ngày soạn

Ngày giảng:
§3. Đệ quy và giải thuật đệ quy


A. MỤC TIÊU

1. Kiến thức
12


Giúp SV nắm được các vấn đề như: khái niệm đệ quy, cách xây dựng giải thuật
đệ quy của một số bài toán cụ thể.
2. Kỹ năng
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo.
- Rèn kỹ năng xây dựng giải thuật đệ quy thông qua việc tìm hiểu cách xây
dựng giải thuật đệ quy của một số bài toán cụ thể.
3. Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức.
B. CHUẨN BỊ

1. Giảng viên:

Giáo án, đồ dùng giảng dạy.

2. Sinh viên:

Giáo trình, đồ dùng học tập.

C. PHƯƠNG PHÁP

- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại
D. TÀI LIỆU THAM KHẢO


1. Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội.
2. Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải.
E. TIẾN TRÌNH LÊN LỚP

1. Ổn định tổ chức
Tổng số SV:
2. Nội dung bài giảng

Có mặt:

Tiêu mục

Vắng:

(… có phép)

Hoạt động của thầy - trò

1.
Khái - Ví dụ 1: Số tự nhiên được định nghĩa: 1 là số tự nhiên;
n là số tự nhiên thì n + 1 cũng là số tự nhiên
niệm
đệ
quy
- Ví dụ 2: n! = 1 nếu n = 0
n.(n-1)! nếu n ≥ 1

? Trình bày khái niệm đệ quy theo ý hiểu của mình
- Đệ quy là một khái niệm mà để định nghĩa nó ta phải dùng chính nó

để định nghĩa.
? Từ khái niệm đó em có nhận xét gì
- Nhận xét: + Luôn luôn tồn tại một trường hợp đặc biệt phải chấp nhận
+ Luôn dùng chính khái niệm đó để định nghĩa
2. Giải ? Thế nào là giải thuật đệ quy
thuật đệ - Giải thuật đệ quy là giải thuật mà để thiết kế nó ta phải dùng chính
13


Tiêu mục

Hoạt động của thầy - trò

quy

giải thuật đó để thiết kế.
? Phải xác định được các vấn đề nào khi muốn thiết kế một giải thuật
dệ quy
- Lưu ý: Để thiết kế được một giải thuật đệ quy cần phải
+ Định nghĩa được đệ quy
+ Xác định trường hợp đặc biệt để giải thuật dừng
+ Có lời gọi tới chính giải thuật đó nhưng với cấp thấp hơn
 Ví dụ 1: Xây dựng hàm tính n!
?Định nghĩa đệ quy ( n! = 1 nếu n = 0 ; = n.(n-1)! nếu n ≥ 1)
? Xác định trường hợp đặc biệt để giải thuật dừng (n = 0)
? Sử dụng các kiến thức đã học để xây dựng hàm tính n! theo đệ quy
Function GT (n: integer): Longint;
Begin
If n = 0 Then GT := 1
Else GT := n * GT(n-1);

End;
? Hãy chỉ ra lời gọi đệ quy trong giải thuật tính n! như trên
 Ví dụ 2: Bài toán sinh sản thỏ (Phibônaxi)

3. Ví dụ

→ Xuất phát từ 1 cặp thỏ
→ Sau 2 tháng thì bắt đầu sinh sản
→ Mỗi lần sinh đúng một cặp
→ Các con thỏ không bao giờ chết
? Vẽ mô hình thể hiện bài toán trên
? Chỉ rõ số cặp thỏ trong từng tháng
? Ở tháng thứ n, số cặp thỏ là bao nhiêu
Tháng 1: 1 cặp; Tháng 2: 1 cặp; Tháng 3: 2 cặp .... ; Tháng n: F(n-2) + F(n-1) cặp

?Định nghĩa đệ quy ( F(n)! = 1 nếu n = 1 hoặc n = 2 ; =F(n-2)+F(n-1)! nếu n ≥ 2)
? Xác định trường hợp đặc biệt để giải thuật dừng (n = 1 hoặc n = 2)
? Sử dụng các kiến thức đã học để xây dựng hàm tính tổng số cặp thỏ
ở tháng thứ n theo đệ quy
Function F(n: Integer): Integer;
Begin
If (n = 1) or (n = 2) Then F := 1
Else F := F(n-2) + F(n-1);
End;
14


Tiêu mục

Hoạt động của thầy - trò


? Tại sao nói giải thuật là giải thuật đệ quy
Bài tập về nhà:
1. Viết chương trình hoàn chỉnh sử dụng các giải thuật đệ quy đã nghiên
cứu trong giờ lý thuyết
2. Lập trình tìm xâu ngược của một xâu bằng giải thuật đệ quy
(XN = st nếu length(st) = 1; = st[n]+copy(st,1,n-1) nếu n = length(st) > 1)

4. Khử đệ ? Xây dựng hàm tính n! bằng cách sử dụng lệnh lặp For
Function GT(n:integer): longing;
quy
Begin
GT := 1;
For i := 1 To n Do GT := GT * i;
End;
Việc sử dụng các lệnh lặp thay cho đệ quy người ta gọi là khử đệ quy

? Thế nào là khử đệ quy
- Khử đệ quy là cách thay thế một giải thuật đệ quy bởi một giải thuật
không đệ quy.
Bài tập về nhà: Thiết kế lại các hàm sử dụng đệ quy bằng cách sử dụng
các lệnh lặp đã học.
* Mối quan hệ giữa đệ quy và toán học
? Em có nhận xét gì về các lời giải đệ quy
- Lời giải đệ quy dựa trên việc cố định rõ lời giải cho trường hợp đặc
biệt rồi thiết kế sao cho lời giải của bài toán được suy ra từ lời giải của
bài toán nhỏ hơn, cùng loại.
? Nhắc lại cách chứng minh sự đúng đắn của một bài toán bằng
phương pháp quy nạp toán học
- Cách chứng minh sự đúng đắn của một bài toán bằng phương pháp

quy nạp toán học:
+ Chứng minh bài toán đúng với n = 1
+ Giả sử bài toán đúng với n = k
+ Chứng minh bài toán đúng với n = k + 1
- Ví dụ: Chứng minh tính đúng đắn của giải thuật tính n! theo cách đệ
quy bằng phương pháp quy nạp toán học
+ Ta có: n = 0 thì GT(0) = 1 (đúng)
+ Giả sử đúng với n = k tức là GT(k) = k * (k-1) * (k-2) * ... * 2*1.
+ Chứng minh đúng với n = k + 1
Ta có: GT(k+1) = (k+1)*GT(k) = (k+1)*k * (k-1) * (k-2) * ... * 2*1
15


Tiêu mục

Hoạt động của thầy - trò

= (k+1)! ⇒ đpcm.
Bài tập về nhà: Chứng minh tính đúng đắn của các giải thuật đệ quy (đã
xây dựng) bằng phương pháp quy nạp toán học.
F. CỦNG CỐ, HỌC TẬP TẠI NHÀ

* Củng cố
Qua bài học này các em nắm được khái niệm đệ quy, đồng thời biết cách xây
dựng giải thuật đệ quy của một số bài toán cụ thể.
* Nhiệm vụ học tập tại nhà
- Nghiên cứu lại nội dung bài cũ, làm bài tập về nhà.
- Tìm hiểu về con trỏ, biến động và cấu trúc dữ liệu biểu diễn danh sách

16



Ngày soạn

Ngày giảng:
Chương 2. DANH SÁCH
§1. Con trỏ và biến động

A. MỤC TIÊU

1. Kiến thức
Giúp SV nắm được khái niệm và cách sử dụng con trỏ, biến động trong lập trình.
2. Kỹ năng
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo.
- Rèn kỹ năng xác định cấu trúc dữ liệu, giải thuật một số bài toán cụ thể.
3. Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức.
B. CHUẨN BỊ

1. Giảng viên:
2. Sinh viên:

Giáo án, đồ dùng giảng dạy.
Giáo trình, đồ dùng học tập.

C. PHƯƠNG PHÁP

- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại

D. TÀI LIỆU THAM KHẢO

1. Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội.
2. Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải.
E. TIẾN TRÌNH LÊN LỚP

1. Ổn định tổ chức
Tổng số SV:
2. Nội dung bài giảng
Tiêu mục

Có mặt:

Vắng:

(… có phép)

Hoạt động của thầy - trò

1. Biến tĩnh ? Nêu cú pháp chung được dùng để khai báo các biến? Cho ví dụ
Khi sử dụng cách khai báo này, các biến đã khai báo được gọi là biến tĩnh
? Các biến này có đặc điểm gì (luôn được máy tính đánh sẵn ô nhớ trong
RAM để chứa dữ liệu cho dù không sử dụng trong chương trình)

? Thế nào là biến tĩnh
- Biến tĩnh là biến mà máy tính luôn đánh sẵn ô nhớ trong RAM để
chứa các dữ liệu của bài toán.
? Em có nhận xét gì khi máy tinh luôn dành sẵn các ô nhớ trong
RAM cho các biến tĩnh
- Nhận xét: Trong quá trình tính toán, nếu không dùng hết các ô nhớ đã

khai báo thì máy tính luôn dành sẵn các ô nhớ đó ⇒ gây lãng phí bộ nhớ
17


Tiêu mục

Hoạt động của thầy - trò

⇒ Phải có một cơ chế sinh biến để khi cần đến ô nhớ thì tự động sinh ra, còn khi
không cần thì lại xóa bỏ.

2. Biến
động

3. Con trỏ
4.Khaibáo

5. Sinh ô
nhớ động
và thu hồi
bộ nhớ

- Biến động là loại biến không được mô tả bằng từ khóa Var, nó có đặc
điểm là khi cần thì tự động sinh ra, khi không cần thì người lập trình có
thể thu hồi lại bộ nhớ đã cấp phát cho nó.
- Để giữ địa chỉ của các biến này ta phải sử dụng con trỏ.
- Con trỏ là một loại biến đặc biệt nhằm đảm bảo cơ chế giữ địa chỉ của
các biến động để người dùng có thể truy cập thông qua địa chỉ đó.
? Nhắc lại cách khai báo các biến thông qua từ khóa Type
- Cú pháp: Type Pt = ^ Kiểu dữ liệu;

Var Tên biến: Pt;
- Giải thích: + Kiểu dữ liệu là các kiểu dữ liệu đã học (trừ kiểu File);
+ Pt, Tên biến: là tên do người dùng tự đặt
 Thao tác sinh ô nhớ động
- Cú pháp: New (P);
- Ý nghĩa: Tạo ra một biến động (ký hiệu là P^), ô nhớ đó do con trỏ P
trỏ vào.
 Thao tác thu hồi bộ nhớ đã cấp phát cho biến động
- Cú pháp: Dispose(P);
- Ý nghĩa: Thu hồi bộ nhớ đã cấp phát cho biến động P^.
- Chú ý: + Không tồn tại các thao tác đối với con trỏ mà chỉ tồn tại các
thao tác đối với biến động. (Ví dụ: Readln(P^);)
+ Nếu P, Q là 2 biến con trỏ thì lệnh P := Q; có ý nghĩa: P sẽ
trỏ vào ô nhớ mà Q đang trỏ.
+ Khi thao tác với con trỏ phải tuân thủ 3 nguyên tắc:
→ Khi cần thì sinh ra
→ Khi không cần thì thu hồi

6. Ví dụ

→ Không được làm mất địa chỉ
+ P := nil; có ý nghĩa: P không trỏ vào đâu cả
- Ví dụ 1: Viết chương trình giải phương trình bậc nhất bằng cách sử
dụng con trỏ.
- Ví dụ 2: Viết chương trình tìm UCLN(a,b) bằng cách sử dụng con trỏ

F. CỦNG CỐ

Qua bài học này các em nắm được khái niệm, đồng thời biết cách sử dụng
con trỏ, biến động khi giải quyết các bài toán cụ thể.

Ngày soạn
Ngày giảng:
18


§2. Danh sách
A. MỤC TIÊU

1. Kiến thức
Giúp SV hiểu được thế nào là danh sách, biết cách dùng mảng hoặc con trỏ
biểu diễn danh sách và các dạng danh sách móc nối.
2. Kỹ năng
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo.
- Rèn kỹ năng với danh sách thông qua nghiên cứu các thủ tục cài đặt danh
sách bằng mảng một chiều và con trỏ.
3. Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức.
B. CHUẨN BỊ

1. Giảng viên:
2. Sinh viên:

Giáo án, đồ dùng giảng dạy.
Giáo trình, đồ dùng học tập.

C. PHƯƠNG PHÁP

- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại

D. TÀI LIỆU THAM KHẢO

1. Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội.
2. Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải.
E. TIẾN TRÌNH LÊN LỚP

1. Ổn định tổ chức
Tổng số SV:
2. Nội dung bài giảng
Tiêu mục

1. Khái
niệm
2. Các phép
toán trên
danh sách

Có mặt:

Vắng:

(… có phép)

Hoạt động của thầy - trò

? Thế nào là danh sách
- Danh sách là một dãy hữu hạn các phần tử thuộc cùng một lớp đối tượng.
- Giả sử danh sách có n phần tử, ký hiệu: L = (a1, a2,..., an)
? Theo em, trên danh sách các phép toán nào có thể thực hiện được
 Khởi tạo danh sách

Procedure Create (Var L: List);
 Xác định độ dài của danh sách
Function Leng(Var L : List): Integer;
 Loại bỏ phần tử ở vị trí thứ k
Procedure Delete (k: Integer; Var L : List);
19


Tiêu mục

Hoạt động của thầy - trò

 Thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k
Procedure InsertAfter(k: Integer; x: Item; Var L : List);
 Thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ k
Procedure InsertBefore(k: Integer; x: Item; Var L : List);
 Tìm kiếm một phần tử trong danh sách
Function Find(x: Item; L : List) : Boolean;
 Kiểm tra xem danh sách có rỗng không
Function Empty (L : List) : Boolean;
 Kiểm tra xem danh sách đã đầy chưa
Function Full (L : List) : Boolean;
3. Cài đặt a. Sử dụng mảng một chiều
danh sách - Khai báo
Const n = maxilength;
Type List = Record
Element : Array [1..n] Of Item;
count : 0..n;
End;
Var L : List;

- Giải thích: + Element : tên kiểu mảng
+ Item : Tên 1 kiểu dữ liệu - là kiểu dữ liệu các phần tử của mảng
+ count : dùng để đếm số phần tử của mảng
+ List : Tên kiểu bản ghi
- Cài đặt các phép toán
 Khởi tạo danh sách
? Khi khởi tạo danh sách có đặc điểm gì (chưa có phần tử nào)
Procedure Create (Var L: List);
Begin
L.count := 0;
End;
 Xác định độ dài của danh sách
? Trình bày cách xác định độ dài của một danh sách
Function Leng(Var L : List): Integer;
Begin
Leng := L.count;
End;
 Loại bỏ phần tử ở vị trí thứ k
? Vẽ mô hình loại bỏ phần tử ở vị trí thứ k của danh sách
20


Tiêu mục

Hoạt động của thầy - trò

1

2


...

k-1

k

k+1

...

m

Cách làm: Dồn tất cả các phần tử từ vị trí k+1 lên trước một vị trí

? Độ dài của danh sách sẽ thay đổi như thế nào sau khi xóa bỏ phần
tử ở vị trí thứ k trong danh sách
Procedure Delete (k: Integer; Var L : List);
Var i : Integer;
Begin
If k <= L.count Then
Begin
i := k;
While i < L.count Do
Begin
Element[i] := Element[i+1];
i := i + 1;
End;
L.count := L.count - 1;
End;
End;

 Thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k
? Vẽ mô hình thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k
của danh sách
1

2

...

k-1

k

k+1

...

m

Cách làm: Dồn tất cả các phần tử từ vị trí k+1 xuống một vị trí, sau đó đưa
giá trị x vào vị trí k + 1.

? Độ dài của danh sách sẽ thay đổi như thế nào sau khi thêm phần tử này.
Procedure InsertAfter(k: Integer; x: Item; Var L : List);
Var
Begin
If Full(L) Then Writeln(‘Danh sach da day khong them duoc’)
Else
With L Do
Begin

21


Tiêu mục

Hoạt động của thầy - trò

i := count + 1;
While i > k + 1 Do
Begin
Element[i] := Element[i-1];
i := i - 1;
End;
Element[k+1] := x;
count := count + 1;
End;
End;
 Thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ k
? Vẽ mô hình thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ
k của danh sách
1

2

...

k-1

k


k+1

...

m

Cách làm: Dồn tất cả các phần tử từ vị trí k xuống một vị trí, sau đó đưa giá
trị x vào vị trí k.

? Độ dài của danh sách sẽ thay đổi như thế nào sau khi thêm phần tử này.
Procedure InsertBefore(k: Integer; x: Item; Var L : List);
Var i: Integer;
Begin
If Full(L) Then Writeln(‘Danh sach da day khong them duoc’)
Else
With L Do
Begin
i := count + 1;
While i > k Do
Begin
Element[i] := Element[i-1];
i := i - 1;
End;
Element[k] := x;
count := count + 1;
End;
End;
 Tìm kiếm một phần tử trong danh sách
? Trình bày cách tìm kiếm một phần tử trong danh sách
Function Find(x: Item; L : List) : Boolean;

22


Tiêu mục

Hoạt động của thầy - trò

Var ok : Boolean; i : Integer;
Begin
ok := False;
For i := 1 To L.count Do
If x = Element[i] Then
Begin
ok := True;
Break;
End;
Find := ok;
End;
 Kiểm tra xem danh sách có rỗng không
? Danh sách rỗng khi nào
Function Empty (L : List) : Boolean;
Begin
Empty := L.count = 0;
End;
 Kiểm tra xem danh sách đã đầy chưa
? Danh sách đầy khi nào
Function Full (L : List) : Boolean;
Begin
Full := L.count = n;
End;

b. Sử dụng con trỏ
? Tại sao phải sử dụng con trỏ
Phương pháp mô tả như sau: mỗi phần tử của danh sách là một bản ghi, mỗi bản
ghi gồm 2 trường: trường infor dùng để chứa dữ liệu của danh sách, trường next để
liên kết giữa các phần tử của danh sách với nhau; Sử dụng con trỏ Head để trỏ tới
phần tử đầu tiên của danh sách; con trỏ Head không có infor.

?Hãy mô tả hình ảnh danh sách khi sử dụng con trỏ để biểu diễn
Head

a1

a2

...

- Khai báo
Type Pt = ^ List;
List = Record
23

an-1

an

nil


Tiêu mục


Hoạt động của thầy - trò

infor: Item;
next : Pt;
End;
Var Head : Pt;
- Cài đặt các phép toán
 Khởi tạo danh sách
? Khi khởi tạo danh sách có đặc điểm gì (chưa có phần tử nào)
? Viết thủ tục khởi tạo khi sử dụng con trỏ Head để trỏ vào đầu danh sách
Procedure Create (Var Head : Pt);
Begin
Head := nil;
End;
 Xác định độ dài của danh sách
? Trình bày cách xác định độ dài của một danh sách
Function Leng(Var Head : Pt): Integer;
Var d : Integer;
Begin
P := Head; d := 0;
While P <> nil Do
Begin
d := d + 1;
P := P^.next;
End;
Leng := d;
End;
 Thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k
? Vẽ mô hình thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k
của danh sách

P
Head

a1

Q

...

ak-1

2

ak

x

1

ak+1

Q^.next

...

am

nil

Cách làm: P^.next := Q^.next; Q^.next := P; với Q là con trỏ trỏ tới phần tử

thứ k, P là con trỏ trỏ tới phần tử có thông tin x cần chèn vào.

? Hãy xác định con trỏ Q trỏ vào thành phần thứ k của danh sách
Cách làm: Đi từ đầu danh sách (Q := Head) cho tới khi đến phần tử thứ k của danh
sách thì dừng.

24


×