Giải bài toán bằng máy tính Giải quyết một bài toán : Mục tiêu Phương pháp Giải quyết bài toán tin học cần phải: Tổ chức biểu diễn các đối tượng thực tế Xây dựng trình t
Trang 1Gi ả ng viên: Ths Nguy ễ n Th ị Khiêm Hòa
Chương 1: Tổng quan
Trang 2Nội dung
Trang 3Mục tiêu
Tìm hiểu các nội dung:
Thiết kế và phân tích được thuật toán
Hiểu rõ về kiểu dữ liệu, kiểu dữ liệu trừu
tượng, cấu trúc dữ liệu
Đánh giá độ phức tạp của thuật toán
Trang 4Giải bài toán bằng máy tính
Giải quyết một bài toán :
Mục tiêu
Phương pháp
Giải quyết bài toán tin học cần phải:
Tổ chức biểu diễn các đối tượng thực tế
Xây dựng trình tự các thao tác xử lý trên các
đối tượng dữ liệu đó
Trang 5Giải bài toán bằng máy tính
Cấu trúc dữ liệu
+ Thuật toán Chương trình
Trang 6Kiểu dữ liệu trừu tượng _ADT
Kiểu dữ liệu
Kiểu dữ liệu trừu tượng
ADT - abstract data type
Kiểu dữ liệu trừu tượng: T = <V, O>
V: Values - miền giá trị
O: Operators – các thao tác
Trang 7 Cấu trúc dữ liệu (Data structure): Cách tổ
chức dữ liệu cho bài toán
Có một số cấu trúc dữ liệu riêng của ngôn
ngữ lập trình được gọi là CTDL tiền định
Cấu trúc dữ liệu
Trang 8 Phản ánh đúng thực tế
Phù hợp với thao tác
Tiết kiệm tài nguyên hệ thống
Đánh giá cấu trúc dữ liệu
Trang 9Cấu trúc lưu trữ (trong/ngoài)
trên bộ nhớ (trong/ngoài) của máy tính được
gọi là cấu trúc lưu trữ
một cấu trúc dữ liệu
Trang 10Thuật toán
Định nghĩa
Lý thuyết thuật toán quan tâm đến những vấn đề sau:
Giải được bằng thuật toán
Tối ưu hóa thuật toán
Triển khai thuật toán
Trang 12Diễn đạt thuật toán
Dạng lưu đồ (sơ đồ khối)
Dạng ngôn ngữ tự nhiên (Ngôn ngữ liệt
kê từng bước)
Ngôn ngữ lập trình
Dạng mã giả
Trang 13Diễn đạt thuật toán
Nút điều khiển: trong đó ghi điều
kiện cần kiểm tra trong quá trình tính toán
Nút khởi đầu ,kết thúc Cung
Các ký hiệu biểu diễn thuật toán bằng sơ đồ
khối
Trang 15Diễn đạt thuật toán
Ví dụ 1: Thuật toán xác định n là số nguyên tố
Bước 1: Nhập n
Bước 2: Nếu n ≤ 1 n ko nguyên tố dừng
Bước 3: Nếu n ≥ 2, gán i 2
Bước 4: Nếu i ≥ √n hay n chia hết cho i bước 6
Bước 5: Gán i i+1, trở lại bước 4
Bước 6:
Nếu i > √n n nguyên tố dừng
Ngược lại, n không là nguyên tố dừng
Trang 16Diễn đạt thuật toán
Ví dụ 2: Thuật toán tìm phần tử thứ n
của dãy số Fibonacci
Bước 1: Nhập n
Bước 2: Nếu n=1 hay n=2 f n =1 dừng
Bước 3: Nếu n > 2, gán a1, b1, i1
Bước 4: Gán ca+b, ab, bc
Bước 5:
Nếu i = n - 2 f n =c dừng
Ngược lại i i+1, quay lại bước 4
Trang 18Mối quan hệ giữa Cấu trúc dữ liệu và thuật toán
Đối tượng xử lý của thuật toán chính là
dữ liệu
Với một cấu trúc dữ liệu, sẽ có những
thuật toán tương ứng
Thuật toán thường thay đổi khi cấu trúc
dữ liệu thay đổi
Trang 19Thiết kế thuật toán
Từ bài toán đến chương trình
•Ngôn ngữ lập
trình:
•PASCAL, C/C++,
JAVA, …
Trang 20 Module hoá và việc giải quyết bài
toán
Chiến thuật chia để trị (divide-conquer):
Để thực hiện chiến thuật này, thường có
Trang 21 Tinh chỉnh từng bước:
Biểu diễn ý tưởng bằng ngôn ngữ tự nhiên
Chi tiết hóa các công việc nhỏ hơn dùng mã
giả rồi đến ngôn ngữ lập trình
Thiết kế thuật toán
Trang 22 Ví dụ: Bài toán sắp xếp một dãy n số, theo thứ tự tăng dần
Trang 23- So sánh min với các số từ x i+1 -> x n
Nếu x[j] > min thì min = x[j] với j [i+1,n]
Thiết kế thuật toán
Trang 24for (i= 1; i <= n-1; i++)
{ min =x[i]; vt =i;
for(j = i+1; j <=n; j++)
if (x[j] < min)
{ min = x[j] ;
vt =j;
}
if (vt!=i) {
x[vt] = x[i];
x[i] = min }
Thiết kế thuật toán
Trang 25Phân tích thuật toán
Khi xây dựng thuật toán cần đặt ra các yêu cầu:
Tính đúng đắn
Tính đơn giản
Không gian
Thời gian
Trang 26 Giải quyết bài toán
Phải đứng trước việc lựa chọn giải thuật nào?
Dựa trên cơ sở nào để lựa chọn ?
Thuật toán dễ hiểu, cài đặt và gỡ lỗi
Thuật toán sử dụng hiệu quả tài nguyên máy tính,
đặc biệt chạy càng nhanh càng tốt
Phân tích thuật toán
Trang 27 Độ phức tạp không gian (Space complexity)
Dung lượng bộ nhớ mà thuật toán đòi hỏi
Độ phức tạp thời gian (Time complexity)
Thời gian thực hiện thuật toán
Đánh giá độ phức tạp thuật toán
Trang 28Phân tích thời gian thực hiện thuật toán
Thời gian thực hiện giải thuật phụ thuộc
vào các yếu tố sau:
Dữ liệu vào
Tốc độ thực hiện các phép toán của máy tính
(phần cứng máy tính)
Trình biên dịch
Trang 29 Định nghĩa:
Phép toán cơ bản là phép toán có thể thực hiện
với thời gian bị chặn bởi một hằng số không phụ thuộc vào kích thước dữ liệu
Để tính toán thời gian thực hiện thuật
toán ta đếm số phép toán cơ bản mà
thuật toán thực hiện
Phân tích thời gian thực hiện thuật toán
Trang 30 Ký hiệu: T(n)
Thời gian tính tốt nhất
Thời gian tính trung bình
Thời gian tính xấu nhất
Các loại thời gian tính
Trang 31Ký hiệu tiệm cận
, O,
Được sử dụng để mô tả thời gian tính
của thuật toán
Được xác định đối với các hàm nhận
giá trị nguyên không âm
Dùng để so sánh tốc độ tăng của hai
hàm
Trang 32Ký hiệu O
Ký hiệu O (big-Oh): hàm f(n) và g(n), ta
nói:
f(n) = Ο(g(n)), nếu tồn tại các hằng số dương c
và n o sao cho f(n) ≤ cg(n) khi n ≥ n o
Ký hiệu này dùng để chỉ chặn trên của một hàm
Ý nghĩa: Tốc độ tăng của hàm f(n) không
lớn hơn hàm g(n) Hay có thể nói g(n) là
cận trên tiệm cận của f(n)
Trang 35 Định nghĩa
f(n) = (g(n)), nếu tồn tại các hằng số dương
c 1 , c 2 và n 0 sao cho c 1 g(n) f(n) c 2 g(n) với
mọi n> n 0
f(n)
Ký hiệu
Trang 36Biểu diễn đồ thị đánh giá thời gian tính
của thuật toán
)) (
( )
( )
Trang 37)) (
( )
Biểu diễn đồ thị đánh giá thời gian tính
của thuật toán
Trang 39Thời gian tính của thuật toán
O(f(n)): là thời gian tính xấu nhất
(f(n)) : là thời gian tính tốt nhất
(f(n)) : là thời gian tính trung bình
Trang 40Một số qui tắc về ký hiệu O lớn
f = O(f)
f = O(g) và g = O(h) thì f = O(h)
f = O(g) và h=O(r) thì fh = O(gr)
f =O(g) và h=O(r) thì f+h = O(g+r)
f =O(g) thì af = O(g) với mọi a>0
f là đa thức bậc k thì f(n) là O(n k )
Trang 44Thời gian tính của lệnh if-else là O(max(f(n),g(n)))
Trang 45Các qui tắc tổng quát
Câu lệnh switch được đánh giá tương tự
như lệnh if-else
Các lệnh lặp: for, while, do-while
Cần đánh giá số tối đa các lần lặp, giả sử đó
Trang 47Ví dụ 3: for (int i=0; i<n-1; i++)
for (int j=0; j<i; j++)
int k+=1;
O(n 2 )
O(n 2 )
O(n 2 )
Trang 48Một số ví dụ
int MaxSubSum1(const int a[], int n) {
int maxSum=0;
for (int i=0; i<n; i++)
for (int j=i; j<n; j++)
}
Trang 49return maxSum;
}
Trang 52temp=a[j-1]; (4) a[j-1] = a[j]; (5) a[j] = temp; (6) }
}
Trang 53n(n i)
(n
1 n
1 i
Trang 58Phân tích các hàm đệ quy
Gọi T(n) là thời gian chạy của hàm đệ quy F
Khi đó, thời gian chạy của các lời gọi hàm ở trong hàm F sẽ là T(m) (với m < n)
Trước hết, phải đánh giá thời gian chạy của hàm
F trên dữ liệu nhỏ nhất n = 1, giả sử T(1) = a
(điều kiện dừng)
Sau đó, đánh giá thời gian chạy của các câu lệnh
trong thân của hàm F
Tìm ra quan hệ đệ quy biểu diễn thời gian chạy
của hàm F thông qua lời gọi hàm
Trang 59Sự phân lớp của giải thuật
Trang 60Sự phân lớp của giải thuật
Trang 61Đánh giá độ phức tạp trong ba trường hợp
Ví dụ: Thuật toán tìm kiếm tuần tự
int sequenceSearch(int x, int a[], int n)
Trang 62Đánh giá độ phức tạp trong ba trường hợp
tìm, số lượng phép so sánh là 2 T(n) ~ O(2) = O(1)
số lượng phép so sánh là 2n T(n) ~ O(n)
2i phép so sánh, vậy trung bình cần (2+4+6+…+2n)/n=2(1+2+…+n)/n=n+1
T(n) ~ O(n)
Trang 63Kiến thức Toán học bổ trợ về Tổng các chuỗi
Tổng các BP:
Logarithms:
x a = b log x b = a
N large
for 3
6
) 1 2
+
+ +
i
N N
i N
N
S
1
2 / ) 1
( 2
1 )
Trang 64Kiến thức Toán học bổ trợ về Tổng các chuỗi
Đặc biệt khi A = 2
2 0 + 2 1 + 2 2 + … + 2 N = 2 N+1 - 1
-1 k
and N
large
for
| 1
|
1
1
+
i k
1
1 1
N N
i
i
Trang 65Q&A