Đầu ra Output: Với một tập các dữ liệu đầu vào, giải thuật đưa ra các dữ liệu tương ứng với lời giải của bài toán.. Đơn trị Uniqueness: Các kết quả trung gian của từng bước thực hi
Trang 1CẤU TRÚC DỮ LIỆU
VÀ GIẢI THUẬT
Trang 2Giới thiệu môn học
Môn học CTDL> cung cấp :
Các kiến thức cơ bản về cấu trúc dữ liệu và thuật toán;
Kĩ năng xây dựng, lựa chọn các cấu trúc dữ liệu và các thuật toán hợp lí
Trang 3
Giới thiệu về môn học
Viết (trên máy)
(Điểm điều kiện dưới 3 sinh viên không được thi học phần)
Chuyên cần:
≥80% số tiết học (10)
≤80% số tiết học (0- không được thi học phần)
Trang 4Cấu trúc dữ liệu và giải thuật
Trang 5CHƯƠNG 1 MỞ ĐẦU
Trang 6Chương 1 Mở đầu
A - BÀI TOÁN VÀ THUẬT TOÁN
Cấu trúc dữ liệu và giải thuật
Khái niệm bài toán
Khái niệm về giải thuật (thuật toán, thuật giải)
Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Cấu trúc dữ liệu và các vấn đề liên quan
Khái niệm về cấu trúc dữ liệu
Định nghĩa kiểu dữ liệu
Trang 7B – THIẾT KẾ VÀ PHÂN TÍCH GIẢI THUẬT
Thiết kế giải thuật
Chia để trị
Phân tích giải thuật
Phân tích tính đúng đắn của giải thuật
Phân tích tính đơn giản
Đánh giá thời gian thực hiện của giải thuật
Thời gian thực hiện của giải thuật
Một số quy tắc cơ bản
7
Chương 1 Mở đầu
Trang 8Khái niệm bài toán
Trang 9Phát biểu bài toán
Ví dụ 1: Bài toán tìm ước chung lớn nhất?
Ví dụ 2: Bài toán tìm nghiệm của đa thức 1 biến?
Ví dụ 3: Bài toán kiểm tra tính nguyên tố?
Ví dụ 4: Bài toán quản lý hồ sơ cán bộ?
BLACK BOX
Trang 10Khái niệm giải thuật
Giải thuật hay còn gọi là thuật toán, thuật giải
Định nghĩa: Là tập hữu hạn có thứ tự các bước tác động trên
một đối tượng dữ liệu Input để sau một số hữu hạn lần thực hiện sẽ cho ta kết quả Output
Trang 12 Bước 2 Nếu b > max thì gán max := b;
Bước 3 Nếu c > max thì gán max := c;
Tư tưởng của thuật toán là duyệt lần lượt giá trị của từng số và giữ lại giá trị lớn nhất vào biến max
Trang 16Ví dụ về giải thuật
Một vài nhận xét:
Giải thuật nhận đầu vào là 3 số a, b, c và đưa kết quả ở đầu
ra là Max
Các bước của giải thuật được mô tả chính xác
Giải thuật kết thúc sau 3 bước và đưa ra lời giải của bài
toán, vì vậy giải thuật là hữu hạn
Nếu đầu vào là đã 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
Trang 17Các đặc trưng của giải thuật
Đầu vào (Input): Giải thuật nhận dữ liệu vào từ một tập nào
đó
Đầu ra (Output): Với một tập các dữ liệu đầu vào, giải thuật
đưa ra các dữ liệu tương ứng với lời giải của bài toán
Chính xác (Precision): Các bước của giải thuật được mô tả
chính xác
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
Đơ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ổng quát (Generality): Giải thuật có thể áp dụng để giải
Trang 19Biểu diễn thuật toán
Có nhiều phương pháp biểu diễn thuật toán
Có thể biểu diễn bằng liệt kê các bước
Có thể biểu diễn bằng sơ đồ khối
Có thể mô tả giải thuật dùng giả mã
Trang 20Biểu diễn thuật toán bằng 3 cách?
Bài toán 1: 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?
Bài toán 2: Tìm ước chung lớn nhất của hai số tự nhiên?
Trang 21Mối liên hệ giữa CTDL và Giải thuật
Giải thuật chính là 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 Niklaus Wirth đã tổng kết:
Cấu trúc dữ liệu + Giải thuật = Chương trình
Nếu ta thay đổi cấu trúc dữ liệu thì giải thuật cũng sẽ thay đổi theo
21
Trang 22Mối liên hệ giữa CTDL và Giải thuật
Ví dụ: Danh bạ điện thoại
Họ và tên
Số điện thoại
Trang 23Mối liên hệ giữa CTDL và Giải thuật
Ví dụ: Danh bạ điện thoại
Nếu danh bạ không có tổ chức gì
cả thì dẫn đến giải thuật là tìm
tuần tự từ đầu đến cuối (Cho họ
tên và tìm số điện thoại)
Họ và tên SĐT
Nguyễn Văn D 098123456
Vũ Thị B 091557799 Trần Xuân A 090333999 Quách Thái C 093886868
23
Trang 24Mối liên hệ giữa CTDL và Giải thuật
Ví dụ: Danh bạ điện thoại
Nếu danh bạ (Họ và tên) tổ chức
Trang 25Mối liên hệ giữa CTDL và Giải thuật
Ví dụ: Danh bạ điện thoại
Nếu danh bạ vừa xếp thứ tự
Trần Xuân B 012321432
Vũ Thị B 094325325 Quách Thái B 091987412 Nguyễn Văn B 096666666
25
Trang 26Niklaus Wirth
Cấu trúc dữ liệu + Giải thuật = Chương trình
Trang 27Cấu trúc dữ liệu
và các vấn đề liên
quan
Trang 28Cấu trúc dữ liệu
Khái niệm Cấu trúc dữ liệu
Dữ liệu gồm các phần tử cơ sở như: một kí hiệu, một số… gọi là dữ liệu nguyên tử
Các dữ liệu nguyên tử kết hợp với nhau theo các cách khác nhau thì cho ta các cấu trúc khác nhau
Trang 29Trần B
Vũ D
18 19 18
1A 2A 3A
10 6 8
Trang 30 Nếu gộp các dữ liệu trên cùng một
hàng lại thành một cấu trúc ta có cấu
trúc bản ghi (Toàn bộ bảng là một
mảng các bản ghi)
Nguyễn An | 18 | 1A | 10 Trần B | 19 | 2A | 6
Vũ D | 18 | 3A | 8
Trang 32Kiểu dữ liệu
Định nghĩa: Kiểu dữ liệu T được xác định bởi một bộ (V,O)
với:
V: Tập các giá trị hợp lệ mà một đối tượng kiểu T có thể lưu trữ
O: Tập các thao tác xử lý có thể thi hành trên đối tượng kiểu T
Ví dụ kiểu dữ liệu Ký tự = (V c , O c ) với:
Vc = {a z, A Z}
Oc = {lấy mã ASCII, biến đổi ký tự thường thành ký tự hoa…}
Ví dụ kiểu dữ liệu Số nguyên = (V i , O i ) với:
Trang 33Kiểu dữ liệu
Như vậy, muốn sử dụng một kiểu dữ liệu cần nắm vững cả nội dung dữ liệu được phép lưu trữ và các xử lý tác động trên đó
Các thuộc tính của 1 kiểu dữ liệu bao gồm:
Tên kiểu dữ liệu
Miền giá trị
Kích thước lưu trữ
Tập các toán tử tác động lên kiểu dữ liệu
33
Trang 34Các kiểu dữ liệu cơ bản
Là các loại dữ liệu đơn giản không có cấu trúc và thường là các giá trị vô hướng, ví dụ:
Kiểu có thứ tự rời rạc: số nguyên, ký tự, logic, liệt kê, miền con,…
Kiểu không rời rạc: số thực
Các kiểu cơ sở rất đơn giản và không thể hiện rõ sự tổ chức dữ liệu trong một cấu trúc
Thường chỉ được sử dụng làm nền để xây dựng các kiểu dữ
Trang 35Một số kiểu dữ liệu có cấu trúc
1 Kiểu chuỗi ký tự
Khai báo: Tùy từng ngôn ngữ
Thao tác:
So sánh hai chuỗi
Sao chép hai chuỗi
Kiểm tra một chuỗi nằm trong chuỗi kia
Trang 36Một số kiểu dữ liệu có cấu trúc
Trang 37Một số kiểu dữ liệu có cấu trúc
3 Kiểu cấu trúc bản ghi:
Khai báo:
Typedef struct <tên kiểu struct>
{
<Kiểu dữ liệu> <tên trường>;
<Kiểu dữ liệu> <tên trường>;
…} [<Name>];
Trang 38Tổng kết
Hiểu được khái niệm giải thuật (thuật toán) các đặc trưng cơ bản của giải thuật
Hiểu được mối quan hệ giữa Cấu trúc dữ liệu và Giải thuật
đồng thời nắm rõ việc lựa chọn CTDL cho bài toán là rất quan trọng
Hiểu được khái niệm cơ bản một CTDL, một kiểu dữ liệu và một số kiểu dữ liệu cơ bản có cấu trúc
Trang 39Luyện tập
Trình bày giải thuật
Sắp xếp nổi bọt n phần tử
Kiểm tra một số có phải số nguyên tố hay ko?
Trình bày cách khai báo các kiểu phần tử bên trên dùng ngôn ngữ Pascal hoặc ngôn ngữ #
39
Trang 41Kiểm tra nguyên tố
if (n = 1) then write(‘ko phai ng to’);
check := true;
For i = 2 to round(sqrt(n)) do
If (n mod i = 0) then check := false;
if (check) then write(n,’khong la so nguyen to’)
else write(n,’ la so nguyen to’);
41
Trang 42false
Trang 43false
Trang 46THIẾT KẾ VÀ PHÂN TÍCH GIẢI THUẬT
Trang 47Mục tiêu
Thiết kế giải thuật
Sử dụng chiến thuật nào?
Phân tích giải thuật
Thế nào là phân tích tính đúng đắn của giải thuật?
Phân tích tính đơn giản của giải thuật?
Đánh giá thời gian thực hiện của giải thuật
Tại sao cần đánh giá thời gian thực hiện?
Đánh giá thời gian thực hiện như thế nào?
47
Trang 48Thiết kế giải thuật
Một chương trình tính toán bất kỳ đều có thể chia làm một số bước:
Trang 49Thiết kế giải thuật
Chẳng hạn việc giải phương trình có thể chia làm 3 việc nhỏ hơn:
1 Input hệ số
2 Tính nghiệm
3 Output nghiệm
49
Trang 50Thiết kế giải thuật
Chia nhỏ bài toán: Nếu gọi bài toán là một modul chính thì ta
chia modul chính thành các modul con rồi lại chia các modul con thành các modul con nhỏ hơn cho đến khi ta được các
modul đã biết cách giải rồi
CHIẾN THUẬT “CHIA ĐỂ TRỊ”
Trang 51Ví dụ chiến thuật “chia để trị”
Giám đốc yêu cầu:
“Dùng máy tính để quản lý hồ sơ về lương nhân viên Hàng
tháng phải lập báo cáo về tổng hợp tiền lương lên Ban giám đốc.”
51
Trang 52Ví dụ chiến thuật “chia để trị”
Xác định yêu cầu bài toán:
1.Tìm và hiển thị hồ sơ của một nhân viên bất kỳ
2.Cập nhật thông tin của một nhân viên cho trước
3.In bản tổng hợp chứa thông tin hiện thời
Giải thuật cần thực hiện ba nhiệm vụ chính:
1.Đọc thông tin hồ sơ từ ổ đĩa
2.Xử lý các thông tin này (tìm kiếm, thêm, sửa, xóa )
Trang 53Ví dụ chiến thuật “chia để trị”
Quản lý lương nhân viên
Đọc hồ sơ Xử lý hồ sơ Ghi hồ sơ
Tìm kiếm
Cập nhật
53
Trang 54Lợi ích chiến thuật “chia để trị”
Tư duy sáng sủa: chia vấn đề thành những vấn đề nhỏ hơn và
cứ vậy cho đến khi có thể giải quyết chúng dễ dàng
Lập trình nhanh chóng: chương trình được chia làm nhiều
phần riêng biệt giúp người lập trình tập trung được vào từng phần riêng để phát triển
Trang 55Lợi ích chiến thuật “chia để trị”
Giảm khả năng gặp lỗi: tránh gặp rắc rối vì giảm sự chồng
chéo của mã nguồn và tránh việc sử dụng biến nhập nhằng Nếu gặp lỗi thì ta chỉ việc kiểm tra từng modul và có thể bỏ qua những modul đã kiểm tra một cách chắc chắn
Hỗ trợ làm việc nhóm: từng phần của chương trình có thể
giao cho mỗi thành viên của nhóm, giúp tăng năng suất lập trình
Tăng tính bảo mật thông tin: những modul khi đã được dịch
thì có thể không cần chương trình nguồn nữa Và như vậy ta giữ được chương trình nguồn của riêng mình
55
Trang 56Tinh chỉnh từng bước (Stepwise refinement)
Từ trên xuống (Top-Down Design)
Trang 57Ví dụ về phương pháp tinh chỉnh
Sắp xếp một dãy n số nguyên khác nhau
Phác thảo giải thuật:
Từ dãy các số nguyên chưa sắp xếp, chọn ra số nhỏ nhất, đặt
nó vào cuối dãy đã được sắp xếp
Cứ lặp lại quy trình đến khi dãy chưa được sắp xếp trở thành rỗng
Dãy số chưa sắp xếp và dãy số đã được sắp xếp??
Đòi hỏi chi tiết hơn về cấu trúc dữ liệu và cấu trúc lưu trữ của dãy số đã cho?
57
Trang 58Ví dụ về phương pháp tinh chỉnh
Sắp xếp một dãy n số nguyên khác nhau
Ấn định dãy số đã cho có cấu trúc mảng 1 chiều
Dãy số đã được sắp xếp rồi vẫn để tại chỗ cũ
Trang 59Ví dụ về phương pháp tinh chỉnh
Sắp xếp một dãy n số nguyên khác nhau
Tinh chỉnh bằng ngôn ngữ tựa Pascal
i a a
a , +1, ,
59
Trang 60Ví dụ về phương pháp tinh chỉnh
Sắp xếp một dãy n số nguyên khác nhau
Bước tinh chỉnh tiếp theo
For i:=1 to n do
Begin
So sánh a i với các số từ a i+1 đến a n Nếu (a i > a j ) thì đổi chỗ a i và a j
{Phần tử bé nhất sẽ nằm ở vị trí i}
Trang 61Ví dụ về phương pháp tinh chỉnh
Sắp xếp một dãy n số nguyên khác nhau
Sau khi đã chỉnh lại:
Trang 62Phân tích giải thuật
Trang 63Phân tích tính đúng đắn
Thường làm: Cho chương trình chạy thử với một bộ dữ liệu
đã biết kết quả
Nếu kết quả chương trình khác với kết quả đã biết thì chắc
chắn chương trình sai; nếu bằng thì cũng chưa có kết luận, do
đó đây chỉ là phương pháp tìm ra cái sai mà chưa chứng minh cái đúng
Cho chạy chương trình rồi xem kết quả có phù hợp với thực tế không, nếu phù hợp thì hi vọng đúng, còn không thì chắc chắn sai
Để chứng minh tính chính xác thì phải dùng toán học – hay dùng qui nạp (rất khó)
63
Trang 64Phân tích tính đơn giản và hiệu quả
Tùy thuộc bài toán được dùng thường xuyên hay không, nếu chương trình chỉ dùng một ít lần rồi bỏ đi thì ta ưu tiên tính đơn giản
Bài toán được sử dụng thường xuyên thì ta ưu tiên tính hiệu quả của thuật toán
Tính hiệu quả thể hiện về hai mặt:
Không gian nhớ (chương trình bé chiếm ít bộ nhớ)
Thời gian (chương trình chạy nhanh)
Phần này, chúng ta sẽ chỉ quan tâm đến thời gian thực hiện
Trang 65Tại sao cần thuật toán hiệu quả?
Kỹ thuật máy tính tiến bộ rất nhanh, ngày nay các máy tính lớn có thể đạt tốc độ tính toán hàng trăm triệu phép tính một giây
Vậy thì có bõ công phải tiêu tốn thời gian để thiết kế các thuật toán có hiệu quả không?
Ví dụ sau sẽ trả lời câu hỏi này!
65
Trang 66Tại sao cần thuật toán hiệu quả?
Bài toán tháp Hà Nội
Thuật toán chuyển n đĩa từ cọc 1 sang cọc 2 với cọc trung gian
3 (không đặt đĩa to lên đĩa nhỏ) Cần thực hiện bao nhiêu lần chuyển đĩa?
Trang 67Tại sao cần thuật toán hiệu quả?
Ta xét vài trường hợp đơn giản:
Trường hợp một đĩa:
+ Chuyển đĩa từ cọc 1 sang cọc 2
67
Trang 68Tại sao cần thuật toán hiệu quả?
Trường hợp hai đĩa:
+ Chuyển đĩa thứ nhất từ cọc 1 sang cọc thứ 3
+ Chuyển đĩa thứ 2 từ cọc 1 sang cọc 2
+ Chuyển đĩa thứ nhất từ cọc 3 sang cọc 2
Trang 69Tại sao cần thuật toán hiệu quả?
Bài toán tháp Hà Nội
Trang 70ĐÁNH GIÁ THỜI GIAN THỰC HIỆN CỦA GIẢI THUẬT
Trang 71Đánh giá thời gian thực hiện của giải thuật
Thời gian thực hiện của giải thuật phụ thuộc vào nhiều yếu tố:
Trước hết phụ thuộc vào độ lớn của dữ liệu đầu vào
Thời gian là một hàm của n (kích thước input): T = T(n)
Ngoài ra T còn phụ thuộc vào:
Máy móc thiết bị
Ngôn ngữ lập trình
Tuy nhiên các yếu tố này là không đồng đều do vậy không thể
dựa vào chúng khi xác lập T(n).
Vậy đơn vị của T(n) tính bằng gì?
71
Trang 72Đánh giá thời gian thực hiện của giải thuật
Vậy đơn vị của T(n) tính bằng gì ?
Không thể tính bằng đơn vị cụ thể mà tính bằng: Số lần thực
hiện các lệnh của giải thuật.
Cách tính này có thể hiện được tính nhanh hay chậm của giải thuật hay không?
Giải thuật 1 có thời gian thực hiện là tỉ lệ với n.
Giải thuật 2 có thời gian thực hiện là tỉ lệ với n 2
Với n khá lớn thì giải thuật 1 nhanh hơn giải thuật 2.
T mà ta đánh giá như trên gọi là độ phức tạp tính toán của giải
thuật
Trang 73Đánh giá thời gian thực hiện của giải thuật
Định nghĩa: giả thuật T được gọi là có độ phức tạp tính toán
cấp g(n) nếu như tồn tại hằng số dương N 0 và số nguyên dương
n n
Trang 74Đánh giá thời gian thực hiện của giải thuật
Trang 75Đánh giá thời gian thực hiện của giải thuật
Rõ ràng thời gian thực hiện giải thuật tăng với tốc độ hàm mũ thì độ lớn tăng rất nhanh
75
Trang 76Đánh giá thời gian thực hiện của giải thuật
Tính TBC của một dãy số đọc vào từ bàn phím
Trang 77Đánh giá thời gian thực hiện của giải thuật
Trang 79Một số quy tắc cơ bản (2/4)
Quy tắc lấy max
Nếu ta có T(n) = O(f(n) + g(n)) thì ta cũng có T(n) = O(max(f(n),g(n)))
Chứng minh:
T(n) ≤ C1.f(n) + C2.g(n) ≤ 2C.Max(f(n),g(n))
Suy ra: T(n) = O(max(f(n),g(n)))
79
Trang 80Một số quy tắc cơ bản (3/4)
Quy tắc cộng
T1(n) và T2(n) là thời gian thực hiện của 2 đoạn chương trình P1 và P2;
Với T1(n) = O(f(n)) và T2(n)=O(g(n))
Thời gian thực hiện 2 đoạn chương trình nối tiếp:
T(n) = T 1 (n) + T 2 (n) T(n) = O(max(f(n),g(n)))
Trang 83 Cách thức đánh giá thời gian thực hiện.
Một số quy tắc đánh giá thời gian thực hiện
83
Trang 84Luyện tập
Đánh giá thời gian thực hiện thuật toán:
Giả sử T = 3n 2 + 5n + 4 thì thời gian thực hiện ntn?
Tìm số lớn nhất trong mảng n phần tử.
Kiểm tra 1 số có phải số nguyên tố
Sắp xếp nổi bọt bên trên
Tính n! (đệ quy & ko đệ quy)
Trang 87Yêu cầu bài tập lớn
Trang 88Cách đánh giá điểm giữa kì
Điểm GK1: Bài tập nhóm
Đánh giá chung cả nhóm: điểm nhóm
Đánh giá từng cá nhân: điểm CN
SV tích cực xây dựng bài: điểm cộng
Điểm GK2: Bài tập lập trình
Bài tập về nhà: 30%