Về bản chất, độ phức tạp giải thuật là một hàm ước lượng (có thể không chính xác) số phép tính mà giải thuật cần thực hiện (từ đó dễ dàng suy ra thời gian thực hiện của giải.. thuật) đối[r]
(1)Giải thuật gì? Giải thuật gì?
Giải thuật (hay cịn gọi thuật tốn - tiếng Anh Algorithms) tập hợp hữu hạn thị để thực thi theo thứ tự để thu kết mong muốn Nói chung giải thuật độc lập với ngơn ngữ lập trình, tức giải thuật triển khai nhiều ngơn ngữ lập trình khác
Xuất phát từ quan điểm cấu trúc liệu, số giải thuật quan trọng:
Giải thuật Tìm kiếm: Giải thuật để tìm kiếm phần tử cấu trúc liệu
Giải thuật Sắp xếp: Giải thuật để xếp phần tử theo thứ tự Giải thuật Chèn: Giải thuật để chèn phần từ vào cấu trúc liệu
Giải thuật Cập nhật: Giải thuật để cập nhật (hay update) phần tử tồn cấu trúc liệu
Giải thuật Xóa: Giải thuật để xóa phần tử tồn từ cấu trúc liệu Đặc điểm giải thuật
Khơng phải tất thủ tục gọi giải thuật Một giải thuật nên có đặc điểm sau:
Tính xác định: Giải thuật nên rõ ràng không mơ hồ Mỗi giai đoạn (hay bước) nên rõ ràng mang mục đích định
Dữ liệu đầu vào xác định: Một giải thuật nên có nhiều liệu đầu vào xác định
Kết đầu ra: Một giải thuật nên có nhiều liệu đầu xác định, nên kết nối với kiểu kết bạn mong muốn
Tính dừng: Các giải thuật phải kết thúc sau số hữu hạn bước
Tính hiệu quả: Một giải thuật nên thi hành với nguồn có sẵn, tức có khả giải hiệu vấn đề điều kiện thời gian tài nguyên cho phép
Tính phổ biến: Một giải thuật có tính phổ biến giải thuật giải lớp vấn đề tương tự
(2)Cách viết giải thuật?
Bạn đừng tìm, khơng có tiêu chuẩn cho trước để viết giải thuật Như bạn biết, ngơn ngữ lập trình có vòng lặp (do, for, while) lệnh điều khiển luồng (if-else), … Bạn sử dụng lệnh để viết giải thuật
Chúng ta viết giải thuật theo cách thức theo bước Viết giải thuật tiến trình thực thi sau bạn định vị rõ ràng vấn đề cần giải Từ việc định vị vấn đề, thiết kế giải pháp để giải vấn đề sau viết giải thuật
Ví dụ viết giải thuật
Bạn theo dõi ví dụ minh họa để thấy rõ bước cách viết giải thuật Tất nhiên ví dụ đơn giản ví dụ minh họa mở đầu cho cách viết giải thuật thơi, nên nghĩ đơn giản tốt
Bài toán: Thiết kế giải thuật để cộng hai số hiển thị kết quả. Bước 1: Bắt đầu
Bước 2: Khai báo ba số a, b & c
Bước 3: Định nghĩa giá trị a & b Bước 4: Cộng giá trị a & b
Bước 5: Lưu trữ kết Bước vào biến c Bước 6: In biến c
Bước 7: Kết thúc
Các giải thuật nói cho lập trình viên cách để viết code Ngồi ra, bạn viết giải thuật cho tốn sau:
Bước 1: Bắt đầu
Bước 2: Lấy giá trị a & b Bước 3: c ← a + b
Bước 4: Hiển thị c Bước 5: Kết thúc
(3)Tất nhiên, việc viết tên bước tùy ý
Chúng ta viết giải thuật để tìm giải pháp để xử lý tốn Một tốn giải theo nhiều cách khác
Do đó, tốn có nhiều lời giải Vậy lời giải thích hợp cho tốn Mời bạn tiếp tục theo dõi
Phân tích giải thuật
Hiệu giải thuật phân tích dựa góc độ: trước triển khai sau triển khai:
Phân tích lý thuyết: Có thể coi phân tích dựa lý thuyết Hiệu giải thuật đánh giá việc giả sử tất yếu tố khác (ví dụ: tốc độ vi xử lý, …) số không ảnh hưởng tới triển khai giải thuật
Phân tích tiệm cận: Việc phân tích giải thuật tiến hành sau tiến hành ngơn ngữ lập trình Sau chạy kiểm tra đo lường thông số liên quan hiệu giải thuật dựa thông số thời gian chạy, thời gian thực thi, lượng nhớ cần dùng, …
Chương tìm hiểu phân tích lý thuyết Cịn phân tích tiệm cận tìm hiểu chương
Độ phức tạp giải thuật (Algorithm Complexity)
(4)thuật) liệu đầu vào (Input) có kích thước n Trong đó, n số phần tử mảng trường hợp tốn xếp tìm kiếm, độ lớn số tốn kiểm tra số nguyên tố, …
Giả sử X giải thuật n kích cỡ liệu đầu vào Thời gian lượng nhớ sử dụng giải thuật X hai nhân tố định hiệu giải thuật X:
Nhân tố thời gian: Thời gian đánh giá việc tính số phép tính (chẳng hạn phép so sánh thuật toán xếp)
Nhân tố nhớ: Lượng nhớ đánh giá việc tính lượng nhớ tối đa mà giải thuật cần sử dụng
Độ phức tạp giải thuật (một hàm f(n)) cung cấp mối quan hệ thời gian chạy và/hoặc lượng nhớ cần sử dụng giải thuật
Độ phức tạp nhớ (Space complexity) phân tích giải thuật
Nhân tố nhớ giải thuật biểu diễn lượng nhớ mà giải thuật cần dùng vòng đời giải thuật Lượng nhớ (giả sử gọi S(P)) mà giải thuật cần sử dụng tổng hai thành phần sau:
Phần cố định (giả sử gọi C) lượng nhớ cần thiết để lưu giữ liệu biến (phần độc lập với kích cỡ vấn đề) Ví dụ: biến đơn giản, …
Phần biến đổi (giả sử gọi SP(I)) lượng nhớ cần thiết biến, có kích cỡ phụ thuộc vào kích cỡ vấn đề Ví dụ: cấp phát nhớ động, cấp phát nhớ đệ qui, …
Từ trên, ta có S(P) = C + SP(I) Bạn theo dõi ví dụ đơn giản sau: Giải thuật: tìm tổng hai số A, B
Step - Bắt đầu
Step - C ← A + B + 10 Step - Kết thúc
Ở có ba biến A, B C số Do đó: S(P) = 1+3
Bây giờ, lượng nhớ phụ thuộc vào kiểu liệu biến cho tích tổng với nhớ cho kiểu liệu tương ứng
(5)Nhân tố thời gian giải thuật biểu diễn lượng thời gian chạy cần thiết từ bắt đầu kết thúc giải thuật Thời gian yêu cầu biểu diễn hàm T(n), T(n) đánh số bước