1. BÀI 1: GIẢI THUẬT VÀ
CẤU TRÚC DỮ LIỆU
Đỗ Thị Thu Trang - Khoa CNTT
Trường Đại học SPKT Hưng Yên
2. 2
Nội dung
Mở đầu
Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Một số phương pháp biểu diễn thuật toán
Các bước cơ bản để giải quyết bài toán
3. 3
Nội dung
Mở đầu
Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Một số phương pháp biểu diễn thuật toán
Các bước cơ bản để giải quyết bài toán
4. 4
Khái niệm dữ liệu
Tại sao sử dụng máy tính để xử lý dữ liệu?
Nhanh hơn, chính xác hơn
Giải quyết nhiều bài toán đòi hỏi khối lượng tính toán cực
lớn, hoặc những bài toán phức tạp với khối lượng dữ liệu
lớn.
Phương pháp?
Nhờ vào các thuật toán hiệu quả, thông minh Chi phí thấp
Nhờ vào sự nâng cấp cấu hình máy Chi phí cao
5. 5
Khái niệm dữ liệu
Trong tin học: Dữ liệu để biểu diễn các thông tin cần
thiết cho bài toán.
Các dữ liệu máy tính gồm: Dữ liệu đầu vào, dữ liệu
trung gian, dữ liệu đầu ra.
8. 8
Khái niệm Cấu trúc dữ liệu
Cấu trúc dữ liệu (data structure) là một phương thức
cụ thể để lưu trữ và tổ chức dữ liệu trong máy tính
nhằm việc xử lý dữ liệu hiệu quả.
9. 9
Các kiểu cấu trúc dữ liệu
Dữ liệu không có cấu trúc (kiểu dữ liệu đơn hay còn
gọi là kiểu dữ liệu cơ sở):
Mỗi đối tượng dữ liệu là một phần tử đơn lẻ
Ví dụ: int, double, char…
Dữ liệu có cấu trúc:
Được cấu thành bởi các phần tử dữ liệu cơ sở
Ví dụ: Mảng(array), chuỗi (string), danh sách (list), đối
tượng (object).
10. 10
Kiểu dữ liệu cơ sở
Ví dụ: một số kiểu dữ liệu cơ sở trong C#
Kiểu dữ liệu
Kích thước
(bytes)
Mô tả
bool 1 Giá trị logic true/ false
int 4
Số nguyên có dấu có giá trị
từ -2.147.483.647 đến 2.147.483.647
double 8
Kiểu dấu chấm động có giá trị dao động
từ 1,7E-308 đến 1,7E+308,
với 15,16 chữ số có nghĩa
char 2 Ký tự Unicode
11. 11
Kiểu dữ liệu có cấu trúc
Kiểu chuỗi ký tự:
Ví dụ: chuỗi ký tự “BOOKS”
13. 13
Ví dụ cấu trúc dữ liệu
Việc tổ chức CTDL để lưu trữ dữ liệu phục vụ chương trình
máy tính có ý nghĩa rất quan trọng:
Ví dụ: cho 1 bảng thông tin như sau:
Nếu gộp các dữ liệu trên cùng 1 cột thành cùng 1 cấu trúc thì ta có 4
mảng:
14. 14
Ví dụ cấu trúc dữ liệu
Nếu gộp các dữ liệu trên cùng 1 hàng thành một cấu trúc ta có cấu trúc bản
ghi (toàn bộ bảng là 1 mảng các bản ghi) như sau (cấu trúc kiểu file):
15. 15
Ví dụ cấu trúc dữ liệu
Nếu tổ chức dưới dạng đối tượng (object) sẽ có 3 đối tượng
16. 16
Tiêu chuẩn của cấu trúc dữ liệu
Một CTDL tốt phải thỏa mãn:
Phản ánh đúng thực tế
Phù hợp với các thao tác trên đó
Tiết kiệm tài nguyên hệ thống
17. 17
Khái niệm giải thuật
Là tập hữu hạn có thứ tự các bước tác động lên dữ liệu
nào đó để sau một số hữu hạn lần thực hiện sẽ cho ta
kết quả.
18. 18
Đặc trưng của giải thuật
Có dữ liệu Đầu vào (Input)
Có dữ liệu kết quả Đầu ra (Output)
Tính Chính xác (Precision): Các bước của giải thuật
được mô tả chính xác.
Tính Hữu hạn (Finiteness): Giải thuật phải đưa được
đầu ra sau một số hữu hạn bước với mọi đầu vào.
19. 19
Đặc trưng của giải thuật
Tính Đơn trị (Uniqueness): Các kết quả trung gian
của từng bước thực hiện giải thuật được xác định một
cách đơn trị và chỉ phụ thuộc đầu vào và các kết quả
của các bước trước.
Tính Tổng quát (Generality): Giải thuật có thể áp
dụng để giải mọi bài toán có dạng đã cho.
20. 20
Nội dung
Mở đầu
Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Một số phương pháp biểu diễn thuật toán
Các bước cơ bản để giải quyết bài toán
21. 21
Vai trò của cấu trúc dữ liệu
CTDL đóng vai trò quan trọng trong việc kết hợp
thuật toán (còn gọi là thuật giải hay giải thuật) để đư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.
22. 22
Mối liên hệ giữa CTDL & GT
Giải thuật = phép xử lý
Đối tượng của giải thuật chính là dữ liệu được tổ chức
thành các cấu trúc.
CTDL & GT gắn chặt với nhau
Cấu trúc dữ liệu + Giải thuật = Chương trình
Nếu thay đổi cấu trúc dữ liệu thì giải thuật cũng sẽ
thay đổi theo.
23. 23
Ví dụ minh họa
Ví dụ quản lý danh bạ
điện thoại
Dữ liệu gồm:
Họ và tên
Số điện thoại
Yêu cầu xây dựng
chương trình tìm số
điện thoại theo họ tên.
Họ và tên Số ĐT
Nguyễn Văn Bình 098123456
Đỗ Thu Trang 091557799
Trần Bình An 090333999
Quách Thái Hùng 093886868
24. 24
Ví dụ minh họa
Nếu danh bạ không có tổ chức thì giải thuật là tìm tuần tự từ
đầu đến cuối.
Nếu danh bạ (Họ và tên) tổ chức theo thứ tự alphabet thì có
thể tìm kiếm theo giải thuật tìm kiếm nhị phân thời gian
tìm kiếm nhanh hơn
Danh bạ chưa sắp xếp Danh bạ đã sắp xếp
Họ và tên Số ĐT
Nguyễn Văn Bình 098123456
Đỗ Thu Trang 091557799
Trần Bình An 090333999
Họ và tên Số ĐT
Trần Bình An 090333999
Nguyễn Văn Bình 098123456
Đỗ Thu Trang 091557799
25. Ví dụ minh họa
Xây dựng chương trình quản lý điểm thi của 3 sv với 4
môn học như sau:
25
Lựa chọn cách tổ chức dữ liệu để quản lý điểm các
môn học cho từng sinh viên.
26. Ví dụ minh họa
Phương án 1: Sử dụng mảng 1 chiều
Khai báo một mảng Result như sau:
Khi đó trong mảng Result các phần tử được lưu trữ như sau:
26
27. Ví dụ minh họa
Phương án 1: Sử dụng mảng 1 chiều
Để truy xuất điểm số môn j của sinh viên i (là phần tử tại
(dòng i, cột j) trong bảng ban đầu) tương ứng với công thức
xác định chỉ số trong mảng Result:
Bảng điểm(dòng i, cột j) - result[((i-1)*số cột) + j]
Ngược lại, với một phần tử bất kỳ trong mảng, muốn biết đó
là điểm số của sinh viên nào, môn gì, dùng công thức:
result[ i ] bảngđiểm (dòng((i / số cột) +1), cột (i % số cột) )
27
28. Ví dụ minh họa
Phương án 1: Sử dụng mảng 1 chiều
void XuatDiem() //Xuất điểm số của tất cả sinh viên {
const int so_mon = 4;
int sv,mon;
for (int i=0; i<12; i++)
{ sv = i/so_mon;
mon = i % so_mon;
Console.WriteLine(“ Điểm môn ” + mon +” của sinh
viên “ + sv + “ là: “ + result[i];
}
}
28
30. Ví dụ minh họa
Phương án 2: Sử dụng mảng 2 chiều
Để truy xuất điểm số môn j của sinh viên i - là phần tử
nằm ở vị trí (dòng i, cột j) trong mảng:
bảngđiểm(dòng i,cột j) result[ i, j]
30
31. Ví dụ minh họa
Phương án 2: Sử dụng mảng 2 chiều
void XuatDiem() //Xuất điểm số của tất cả sinh viên
{
int so_mon = 4, so_sv =3;
for ( int i=0; i<so_sv; i++)
for ( int j=0; j<so_mon; j++)
Console.WriteLine("Điểm môn ” + j +” của sv” +
i+” là: "+ result[i, j]);
}
31
32. Ví dụ minh họa
Nhận xét:
Phương án 2 cung cấp một cấu trúc lưu trữ phù hợp với dữ
liệu thực tế hơn phương án 1.
Do vậy giải thuật xử lý trên cấu trúc dữ liệu của phương án
2 cũng đơn giản, tự nhiên hơn.
32
33. 33
Nội dung
Mở đầu
Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Một số phương pháp biểu diễn thuật toán
Các bước cơ bản để giải quyết bài toán
34. 34
Phương pháp biểu diễn thuật toán
Ngôn ngữ thuật toán là ngôn ngữ dùng để miêu tả
thuật toán.
Thông thường ngôn ngữ thuật toán bao gồm ba loại:
Ngôn ngữ tự nhiên;
Ngôn ngữ lập trình;
Sơ đồ khối.
35. 35
Ngôn ngữ tự nhiên
Liệt kê tuần tự các bước bằng ngôn ngữ tự nhiên để
biểu diễn thuật toán.
Ưu điểm:
Đơn giản, không cần kiến thức về cách biểu diễn (mã giả,
lưu đồ,…)
Nhược điểm:
Dài dòng, không cấu trúc
Đôi lúc khó hiểu, không diễn đạt được thuật toán.
36. 36
Ví dụ minh họa
Giải phương trình bậc hai ax2 + bx +c = 0.
Mô tả thuật toán:
Bước 1: Nhập các hệ số a,b,c.
Bước 2: Kiểm tra xem các hệ số a có khác 0 hay không?
Nếu a=0 quay lại thực hiện bước 1.
Bước 3: Tính biểu thức = b2 – 4*a*c.
Bước 4: Nếu <0 thông báo phương trình vô nghiệm và
chuyển sang bước 8.
38. 38
Mã giả (pseudocode)
Ngôn ngữ tựa ngôn ngữ lập trình:
Dùng cấu trúc chuẩn hóa, ví dụ; Python, Pascal, C.
Dùng các ký hiệu toán học, biến, hàm.
Ưu điểm
Ngắn gọn hơn
Nhược điểm
Phải biết về ngôn ngữ lập trình
Không trực quan
40. 40
Sơ đồ khối
Là phương pháp mô tả thuật toán sử dụng sơ đồ các
hình khối trên mặt phẳng thể hiện các bước của thuật
toán.
Ưu điểm là rất trực giác và dễ bao quát.
43. 43
Bài tập áp dụng
Bài toán: Cho 3 số nguyên a,b,c. Mô tả giải thuật tìm
số lớn nhất trong 3 số đã cho.
Đưa ra các cách giải bài toán này
So sánh giữa các cách giải bài toán này với các đặc
trưng của giải thuật
44. 44
Bài tập áp dụng
Một vài nhận xét:
Giải thuật có tính chính xác: các bước của giải thuật có
được mô tả chính xác, rõ ràng ko?
Giải thuật có tính duy nhất: với đầu vào đã xác định, kết
quả tại mỗi bước của giải thuật được xác định duy nhất ko?
Giải thuật có tính hữu hạn: giải thuật kết thúc sau một số
bước hữu hạn và đưa ra lời giải của bài toán ko?
Giải thuật có tính tổng quát: giải thuật có thể áp dụng cho
các bài toán có dạng tương tự ko?
45. 45
Nội dung
Mở đầu
Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Một số phương pháp biểu diễn thuật toán
Các bước cơ bản để giải quyết bài toán
46. 46
Bước 1: Xác định bài toán
Việc xác định bài toán tức là phải xác định xem ta phải giải
quyết vấn đề gì? Với giả thiết nào đã cho và lời giải cần phải
đạt những yêu cầu gì?
Khác với bài toán thuần tuý toán học, bài toán tin học ứng
dụng không chỉ cần xác định rõ giả thiết, kết luận mà còn cần
xác định yêu cầu về lời giải.
Ví dụ 3.1, 3.2 trong sách T14
47. 47
Bước 2: Tìm CTDL biểu diễn bài toán
Khi giải một bài toán, ta cần phải định nghĩa tập hợp
dữ liệu để biểu diễn tình trạng cụ thể.
Việc lựa chọn này tuỳ 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 1 cách tổ chức
dữ liệu nhất định, 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.
Vì vậy nên bước xây dựng cấu trúc dữ liệu không thể
tách rời bước tìm kiếm thuật toán giải quyết vấn đề.
48. 48
Bước 2: Tìm CTDL biểu diễn bài toá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 nhập và xuất của
bài toán;
Phải phù hợp với các thao tác của thuật toán mà được lựa
chọn để 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.
49. 49
Bước 3: Xác định thuật toán
Thuật toán là một hệ thống chặt chẽ và rõ ràng các
quy tắc nhằm xác định một dãy thao tác trên cấu trúc
dữ liệu.
Sao cho: Với một bộ dữ liệu vào, sau một số hữu hạn
bước thực hiện các thao tác đã chỉ ra, ta đạt được mục
tiêu đã định.
50. 50
Bước 3: Xác định thuật toán
Các đặc trưng của thuật toán:
Tính đơn nghĩa:
Ở mỗi bước của thuật toán, các thao tác phải rõ ràng, không gây sự
nhập nhằng, lộn xộn, tuỳ tiện, đa nghĩa.
Phân biệt Tính đơn nghĩa và Tính đơn định. (Sách T15)
Tính dừng:
Thuật toán không được rơi vào quá trình vô hạn, phải dừng lại và
cho kết quả sau một số hữu hạn bước.
Tính đúng:
Sau khi thực hiện tất cả các bước của thuật toán theo đúng quá trình
đã tạo, ta phải được kết quả mong muốn với mọi bộ dữ liệu đầu vào.
Kết quả đó được kiểm chứng bằng yêu cầu bài toán.
51. 51
Bước 3: Xác định thuật toán
Các đặc trưng của thuật toán:
Tính phổ dụng:
Thuật toán phải dễ sửa đổi để thích ứng được với bất kỳ bài toán
nào trong một lớp các bài toán và có thể làm việc trên các dữ liệu
khác nhau.
Tính khả thi:
Kích thước phải đủ nhỏ
Thuật toán phải chuyển được thành chương trình
Thuật toán phải được máy tính thực hiện trong thời gian cho phép,
điều này khác với lời giải toán (Chỉ cần chứng minh là kết thúc sau
hữu hạn bước)
52. 52
Bước 4: Lập trình
Kỹ thuật lập 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.
Các bước theo phương pháp tinh chế từng bước
(Stepwise refinement):
Ban đầu, chương trình được thể hiện bằng ngôn ngữ tự nhiên, thể hiện
thuật toán với các bước tổng thể, mỗi bước nêu lên một công việc phải
thực hiện.
Một công việc đơn giản hoặc là một đoạn chương trình đã được học
thuộc thì tiến hành viết mã lệnh bằng ngôn ngữ lập trình.
Một công việc phức tạp thì lại chia ra thành những công việc nhỏ hơn
để lại tiếp tục với những công việc nhỏ hơn đó.
53. 53
Bước 4: Lập trình
Đồng thời phải đưa ra những biểu diễn dữ liệu, cùng
với sự tinh chế các công việc, dữ liệu cũng được tinh
chế dần, có cấu trúc hơn, thể hiện rõ hơn mối liên hệ
giữa các dữ liệu.
Phương pháp tinh chế từng bước là một thể hiện của
tư duy giải quyết vấn đề từ trên xuống, giúp cho người
lập trình có được một định hướng thể hiện trong
phong cách viết chương trình
54. 54
Bước 5: Kiểm thử
Chạy thử và tìm lỗi: 3 loại lỗi
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, đối với lỗi này thì phải xem lại 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.
55. 55
Bước 5: Kiểm thử
Xây dựng các bộ test case
Nhằm kiểm tra tính đúng đắn của chương trình
56. 56
Bước 6: 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, cần phải sửa đổi lại để chương
trình có thể chạy nhanh hơn, hiệu quả hơn.
Các tiêu chuẩn xét tính tối ưu:
Tính tin cậy
Tính uyển chuyển
Tính trong sáng
Tính hữu hiệu
57. Tài liệu tham khảo
57
• https://www.slideshare.net/tuoitrecomvn/slide-1-23854290
Tham khảo, bổ sung thêm về Tổng quan:
https://www.slideshare.net/tuoitrecomvn/slide-1-23854290
Khái niệm thuật toán tối ưu, thuật toán tốt nhất
Khái niệm Giải thuật có từ rất lâu do một nhà toán học người Arập phát ngôn, một trong những thuật toán nổi tiếng có từ thời cổ Hylạp là thuật toán Euclid (thuật toán tìm ước số chung lớn nhất của 2 số)
Khái niệm thuật toán tối ưu, thuật toán tốt nhất
Khái niệm Giải thuật có từ rất lâu do một nhà toán học người Arập phát ngôn, một trong những thuật toán nổi tiếng có từ thời cổ Hylạp là thuật toán Euclid (thuật toán tìm ước số chung lớn nhất của 2 số)
Yêu cầu sinh viên làm: cố gắng sv đưa ra được 2 cách giải
Cách 1: so sánh 2 cặp a>b và b>c a là số lớn nhất
Cách 2: gán 1 giá trị là max, sau đó so sánh các số còn lại nếu số nào lớn hơn thì gán lại max.
Đưa ra tình huống phương pháp nào có tính tổng quát hơn
Đô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í.
Đối với một số bài toán, trước khi tổ chức dữ liệu ta phải viết một đoạn chương trình nhỏ để khảo sát xem dữ liệu cần lưu trữ lớn tới mức độ nào