Thiế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... Thiế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
Trang 1CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
TS Đặng Xuân Thọ Trường Đại học Sư phạm Hà Nội
Trang 3Cấu trúc dữ liệu và giải thuật
Trang 5Mụ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? Cấ
Trang 6Thiế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
Trang 7Thiế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 8Ví 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
Trang 9Ví 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 )
3 Sao lưu lại vào ổ đĩa
Trang 10Ví dụ chiến thuật “chia để trị”
Quản lý lương nhân viên
Tìm kiếm
Cập nhật
Trang 11Lợ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 12Lợ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
Trang 13Phân tích giải thuật
Trang 14Phâ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
Trang 15Phâ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 thuật toán
Trang 16Tạ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!
Trang 17Tạ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 18Tại sao cần thuật toán hiệu quả?
• Ta xét vài trường hợp đơn giản:
Trang 19Tạ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 20Tại sao cần thuật toán hiệu quả?
• Bài toán tháp Hà Nội
Trang 21ĐÁNH GIÁ THỜI GIAN
THỰC HIỆN CỦA GIẢI THUẬT
Trang 22Đá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)
Trang 23Đá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
• Ở giải thuật 1 ta nói giải thuật có độ phức tạp tính toán cấp n và
Trang 24Đá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 C > 0 sao cho
n n
n n
n n
Trang 25Đá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 độ
Trang 26Đá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 27Đánh giá thời gian thực hiện của giải thuật
Trang 30Mộ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:
Trang 33Luyệ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 34Tổng kết
• Hiểu được cách thiết kế thuật toán, sử dụng chiến thuật
chia để trị
• Sau khi thiết kế thuật toán xong, cần phân tích tính đúng
đắn, tính đơn giản của giải thuật
• Thời gian thực hiện của giải thuật phụ thuộc nhiều yếu tố
khác nhau Dẫn đến cần phải có một cách đánh giá chính
xác thời gian thực hiện của giải thuật
• 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
Trang 35Thank you!