Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 1: Một số khái niệm cơ bản về cấu trúc dữ liệu và giải thuật cung cấp cho người học các kiến thức: Các khái niệm, quan hệ giữa giải thuật và cấu trúc DL, vị trí cấu trúc dữ liệu trong một áp dụng tin học, tìm hiểu tổ chức một số CTDL cơ bản. Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 11
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Số tín chỉ: 3
2
Phân bổ thời gian
Giảng lý thuyết trên lớp: 70%
Thực hành : 30%
Tự học/ nghiên cứu : 200 %
Nội Dung Chương Trình
Chương 1: Một số khái niệm cơ bản về cấu trúc
dữ liệu và giải thuật
Chương 2: Danh sách đặc (condensed list)
Chương 3: Danh sách liên kết (linked list)
Chương 4: Cây (tree)
Chương 5: Bảng băm
Chương 6: Đồ thị (Graph)
Tài Liệu Tham Khảo
Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật , Nxb
Khoa học Kỹ thuật, 1995
Deshpande, Kakde, C & data structures,
Massachusetts, 2004(pdf)
Introduction To Algorithms 2NdEdition
Bài soạn của giảng viên
Các tài liệu điện tử/ website
Trang 25
Đánh giá học phần
Kiểm tra/ thi giữa kỳ: 30%
Thi cuối kỳ : 60%
6
CHƯƠNG 1
MỘT SỐ KHÁI NIỆM CƠ BẢN VỀ CTDL VÀ GIẢI THUẬT
Nội Dung
1.1 Các khái niệm
1.2 Quan hệ giữa giải thuật và cấu trúc DL
1.3 Vị trí cấu trúc dữ liệu trong một áp dụng tin
học
1.1 Các khái niệm
Môn học giới thiệu
Các cấu trúc dữ liệu cơ bản
Các giải thuật điển hình trên các cấu trúc dữ liệu đó
Cấu trúc dữ liệu là một kết hợp nhiều
thành phần dữ liệu khác nhau thành một thực thể thống nhất để thể hiện một kiểu dữ liệu
Trang 39
Cấu Trúc Dữ Liệu
Cách tổ chức lưu trữ dữ liệu
Phải biểu diễn đầy đủ thông tin
Phải phù hợp với các thao tác trên đó
Tiết kiệm tài nguyên hệ thống
10
Vai Trò Của Cấu Trúc Dữ Liệu
Cấu trúc dữ liệu đóng vai trò quan trọng trong việc kết hợp và đưa ra cách giải quyết bài toán
CTDL hỗ trợ cho các thuật toán thao tác trên đối tượng được hiệu quả hơn
Các kiểu cấu trúc dữ liệu cơ bản
Bản ghi (struct)
Danh sách liên kết (list)
Thuật toán
Thuật toán: Một dãy hữu hạn các chỉ thị có thể thi
hành để đạt mục tiêu đề ra nào đó
Ví dụ: Thuật toán tính tổng tất cả các số nguyên
dương nhỏ hơn n gồm các bước sau:
Bước 1: S=0, i=1;
Bước 2: nếu i<n thì s=s+i;
Ngược lại: qua bước 4;
Bước 3:
i=i+1;
Quay lại bước 2;
Bước 4: Tổng cần tìm là S.
Trang 413
Các Tiêu Chuẩn Của Thuật Toán
Xác định rõ dữ liệu đầu vào
Xác định rõ kết quả đầu ra
Tính xác định: cùng một dữ liệu đầu vào thì cùng
đưa đến một kết quả đầu ra
Tính khả thi: đơn giản, làm được, thời gian hữu
hạn
sẽ phải kết thúc
14
Sự Cần Thiết Của Thuật Toán
không thể hoàn thành được
Nhờ vào sự tiến bộ của kỹ thuật: tăng cấu hình máy chi phí cao
và chi phí thấp
“Một máy tính siêu hạng vẫn không thể cứu vãn một
thuật toán tồi!”
Biễu Diễn Thuật Toán
Biểu Diễn Bằng Ngôn Ngữ Tự Nhiên
liệt kê để biễu diễn thuật toán
biểu diễn (mã giả, lưu đồ, )
Đôi lúc khó hiểu, không diễn đạt được thuật toán
Trang 517
Lưu Đồ
thể hiện các chức năng khác nhau
A
B
A
Begin
End
Thực hiện A Gọi hàm A Vào / Ra dữ liệu
Điều kiện rẻ nhánh B
Đúng Sai
Nút giới hạn bắt đầu / kết thúc chương trình
18
Biểu Diễn Bằng Lưu Đồ
Bắt đầu a max = a 0
i<n
i = 1
a max là lớn nhất Kết thúc
a max < a i
i = i+1
a max =a i
S
S
Đ
Đ
Tìm phần tử mang giá trị lớn nhất trong mảng
Biểu Diễn Bằng Mã Giả
Pascal, C
Biểu Diễn Bằng Mã Giả
Một số quy ước
1 Các biểu thức toán học
2 Lệnh gán: “=” (AB)
3 So sánh: “==”, “!=”
4 Khai báo hàm (thuật toán)
Thuật toán <tên TT> (<tham số>) Input : <dữ liệu vào>
Output : <dữ liệu ra>
<Các câu lệnh>
End
Trang 621
Biểu Diễn Bằng Mã Giả
5 Các cấu trúc:
Cấu trúc chọn:
if… then … [else …]
Vòng lặp:
while … do
do … while (…)
for … do …
6 Một số câu lệnh khác:
Trả giá trị về: return [giá trị]
Lời gọi hàm: <Tên>(tham số)
22
Biểu Diễn Bằng Mã Giả
Ví dụ: Tìm phần tử lớn nhất trong mảng một
chiều
amax=a0; i=1;
while (i<n)
if(amax<ai) amax= ai; i++;
end while;
Biểu Diễn Bằng Ngôn Ngữ Lập Trình
Dùng ngôn ngữ máy tính (C, Pascal, ) để diễn tả
thuật toán, CTDL thành câu lệnh
Kỹ năng lập trình đòi hỏi cần học tập và thực
hành (nhiều)
chuyển hoá bài toán sang mã chương trình cụ
thể
Nhớ giải thuật (mã giả)
Trang 725
Độ Phức Tạp Của Thuật Toán
Một thuật toán hiệu quả:
Chi phí cần sử dụng tài nguyên thấp: Bộ nhớ,
thời gian sử dụng CPU, …
Nlà khối lượng dữ liệu cần xử lý
f(N)
thuật toán:
26
Phương Pháp Thực Nghiệm
Cài thuật toán rồi chọn các bộ dữ liệu thử nghiệm
bộ dữ liệu đó
Ưu điểm: Dễ thực hiện.
Nhược điểm:
Ảnh hưởng bởi trình độ của người lập trình
tất cả tập các dữ liệu vào của thuật toán: khó khăn và tốn nhiều chi phí
Phương Pháp Xấp Xỉ
Đánh giá giá thuật toán theo hướng tiệm xấp xỉ
tiệm cận qua các khái niệm O()
Ưu điểm: Ít phụ thuộc môi trường cũng như phần
cứng hơn
Nhược điểm: Phức tạp.
Phương Pháp Xấp Xỉ
Ký pháp
Giả sử T(n) là thời gian thực hiện TT và f(n), g(n), h(n) là các hàm xác định dương
nếu các hằng số dương c1 ,c2,n0 sao cho với mọi n>= n0:
c 1 g(n) <= T(n) <= c 2 g(n)
Trang 829
Phương Pháp Xấp Xỉ
Hàm Omega lớn:
T(n) hàm Omega lớn của g(n):
T(n)= Ω(g(n)) nếu c và n0 sao cho với
mọi n>= n0
T(n) >= c.g(n)
30
Phương Pháp Xấp Xỉ
nếu c và n0sao cho với mọi n>= n0 :
T(n) <=c g(n)
g(n) giới hạn trên của T(n).
Ví dụ, nếu T(n) = n2 + 1 thì T(n) = O(n2).
Chọn c=2 và n0 =1, khi đó với mọi n>=1, ta
có T(n)= n2+1 <= 2n2 =2g(n).
Phương Pháp Xấp Xỉ
Các tính chất
O(h(n)) thì f(n)= O(h(n))
Trang 933
Xác định độ phức tạp
Quy tắc hằng số
Nếu P có T(n)= O(c1f(n)) P có độ
phức tạp O(f(n)).
CM: T(n)= O(c1f(n)) nên tồn tại c0>0 và n0>0
để T(n) <= c0.c1f(n) với mọi n>= n0.
Đặt c=c0.c1ta có điều cần CM
34
Xác định độ phức tạp
Quy tắc lấy Max
Nếu P có T(n)= O( f(n)+g(n)) thì P có độ
phức tạp là O( max ( f(n), g(n))).
CM: T(n) = O( f(n)+g(n)) nên tồn tại n0>0 và c>0 để T(n) <= cf(n) + cg(n), với mọi n>= n0
vậy T(n) <= cf(n) +cg(n) <= 2c max (f(n),g(n)) với mọi n>=n0
Từ đó suy điều cần CM
Xác định độ phức tạp
Quy tắc cộng
Nếu P1 có T1 (n) = O( f(n) và P2 có T2(n)=
O(g(n)), khi đó: T1(n) +T2(n) = O(f(n) +g(n)).
CM: Vì T1(n)= O(f(n)) nên các hàng số c1và n1sao
cho T(n) <= c1.f(n) n: n>= n1
Vì T2(n) =O(g(n)) nên các hàng số c2và n2sao
cho T(n) <= c1.g(n) n: n>= n2
Chọn c= max (c1,c2) và n0= max(n1,n2) ta có n:
n>= n0:
T(n) = T1(n) + T2(n) <= c1f(n) + c2g(n)
Xác định độ phức tạp
Quy tắc nhân
Nếu P có T(n)= O(f(n)) Khi đó nếu thực hiện k(n) lần P với k(n)=O(g(n)) thì độ phức tạp là
O(f(n) g(n)).
CM: Thời gian thực hiện k(n) lần đoạn chương trình P sẽ là k(n) T(n), theo định nghĩa:
ck>=0 và nk>0 để k(n) <= ck(g(n)) với mọi n>= nk
cT>=0 và nT>0 để T(n) <= cTf(n) với mọi n>= nT Vậy với mọi n >= max(nT,nk) ta có k(n)T(n) <=
ckcT(f(n)g(n)).
Trang 1037
4 Bài toán và thuật toán
e) Áp dụng đánh giá chương trình
Câu lệnh đơn thực hiện một thao tác
QT hằng số
Câu lệnh hợp thành là dãy các câu lệnh
QT tổng
Câu lệnh rẽ nhánh dạng If then else
QT Max
Các câu lệnh lặp QT Nhân
38
Ví dụ 1
Analysing an Algorithm
• Simple statement sequence
s 1 ; s 2 ; … ; s k
• O(1) as long as kis constant
• Simple loops
for(i=0;i<n;i++) { s; }
where s is O(1)
• Time complexity is n O(1) or O(n)
• Nested loops
for(i=0;i<n;i++)
for(j=0;j<n;j++) { s; }
• Complexity is n O(n) or O(n2)
This part is
O(n)
Analysing an Algorithm
• Loop index doesn’t vary linearly
h = 1;
while ( h <= n ) { s;
h = 2 * h;
}
• h takes values 1, 2, 4, … until it exceedsn
• There are1 + log 2 n iterations
• Complexity O(log n)
Ví dụ 2
Ví dụ 3
Analysing an Algorithm
• Loop index depends on outer loop index
for(j=0;j<n;j++)
for(k=0;k<j;k++){
s;
}
• Inner loop executed
• 1, 2, 3, …., n times
Complexity O(n2)
n
i =
i =1
n(n+1)
2
Distinguish this case -where the iteration count increases (decreases) by a constant O(n k )
from the previous one -where it changes by a factor
O(log n)
Trang 1141
Một số dạng hàm
Đa thức bậc k: P(n), O (nk).
logaf(n), O(log f(n))
Hằng số, O(1)
Hàm mũ O(2n.)
42
4 Bài toán và thuật toán
8
Sự Phân Lớp Theo Độ Phức Tạp Của Thuật Toán
Sử dụng ký hiệu BigO
Độ phức tạp tăng dần
Trang 1245
1.2 Quan hệ giữa giải thuật và cấu trúc DL
Niklaus Wirth:
CTDL + Thuật toán = Chương trình
Data structures + Algorithms =Program
Cấu trúc dữ liệu cụ thể: chọn giải thuật
Giải thuật cụ thể: chọn cấu trúc dữ liệu
46
1.3 Vị trí CTDL trong tin học
Thiết kế cấu trúc dữ liệu và giải thuật
1.4 Tìm hiểu tổ chức một số CTDL cơ bản