Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
559,69 KB
Nội dung
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Lý thuyết Phần (Chương 1, 2, 9, 10) Giới thiệu thuật toán đánh giá thuật toán Hàm mũ, mũ hàm logarit Tính đệ quy thuật toán đệ quy Vũ Anh Dũng - Khoa CNTT Thuật toán Giới thiệu thuật toán đánh giá thuật toán Thuật toán : Tập thị với cấu trúc điều khiển mà dựa vào thị tiến hành Tính chất : Rõ ràngg Đúng Dừng Vũ Anh Dũng - Khoa CNTT Thuật toán Giới thiệu thuật toán đánh giá thuật toán Xét toán tìm phần tử lớn thứ k mảng Sắp xếp giảm dần toàn mảng Sắpp xếpp k phần p tử chèn dần Chương giới thiệu thuật toán đủ tốt Xét toán trò chơi ô chữ Vũ Anh Dũng - Khoa CNTT Thuật toán ¾ ¾ ¾ Có thể đánh giá dựa thời gian chạy Làm để đánh ggiá thời ggian chạy ạy chương trình? Đánh ggiá thời ggian chạy ạy khôngg thực ự ự dựa ự mã lệnh chúng Vũ Anh Dũng - Khoa CNTT Một số hàm toán học Hàm mũ Hàm logarit Chuỗi số Phép đồng dư a mod b Vũ Anh Dũng - Khoa CNTT Chứng minh Quy nạp P(n) = 1+2+3+… +n 1+2+3+ +n = n(n+1)/2 Phản chứng Với 16 số ố nguyên ê d dương bấ ta có ó í hiệu số chia hết cho h 15 Vũ Anh Dũng - Khoa CNTT Đệ quy giải thuật đệ quy Khái niệm : Ta nói đối tượng đệ quy bao gồm phận định nghĩa dạng Ví dụ : người giàu, hình TV Số tự nhiên : số ố ttự nhiên hiê X số tự nhiên X-1 số tự nhiên Giai thừa Ví dụ hàm sau : f ( x) = f ( x − 1) + x Vũ Anh Dũng - Khoa CNTT Đệ quy giải thuật đệ quy Giải thuật đệ quy thủ tục đệ quy : Nếu lời giải toán T thực lời giải toán T’ có dạng giống T, lời giải đệ quy Giải thuật tương ứng với lời giải gọi giải thuật đệ quy quy Điểm ý T’ phải “nhỏ nhỏ hơn” T T ¾ ¾ Trường hợp sở Tạo tiến trình Đệ quy trực tiếp ế (directly rescursive) : Chứa lời gọi trực tiếp đến Đệ quy gián tiếp (indirectly rescursive) : Chứa lời gọi đến hàm khác, mà hàm khác lại gọi đến Vũ Anh Dũng - Khoa CNTT Đệ quy giải thuật đệ quy Thiết kế giải thuật đệ quy : Hàm N! Hàm Fibonaci F(n) ( ) = n2 Viết ộ số theo thứ tự ự ngược g ợ lại Ví dụ ụ: 2893 viết lại 3982 Vũ Anh Dũng - Khoa CNTT 10 Các quy tắc Quy tắc – vòng lặp FOR Thời gian chạy vòng lặp for thời gian chạy lệnh bên vòng lặp (kể phép kiểm tra) nhân với số lần lặp Q tắc Quy tắ – Các Cá vòng ò lặp lặ lồng lồ h Phân tích vòng lặp từ Tổng thời gian chạy câu lệnh nhóm vòng lặp lồng thời gian chạy lệnh nhân với cỡ vòng lặp Vũ Anh Dũng - Khoa CNTT 26 Các quy tắc Quy tắc – Các lệnh Đối với lệnh này, đơn cộng dồn Quy tắc – if/else if(condition) else l S2 S1 Thời gian chạy không vượt thời gian chạy phép p p kiểm tra điều kiện ệ cộng ộ g với thời g gian chạy ạy lớn S1 S2 Vũ Anh Dũng - Khoa CNTT 27 Một số trường hợp đệ quy Ví dụ, hàm sau thực vòng lặp đơn giản O(N ): long factorial(int n) { if (n maxSum) maxSum = thisSum; } return maxSum; } Vũ Anh Dũng - Khoa CNTT 31 Các thuật toán cho tổng dãy lớn – Thuật toán Đánh giá thuật toán Số bước tính toán : N −1 N −1 j ∑ ∑ ∑1 i=0 j=i k =i Trước tiên ta có : j ∑1= j − i+1 k =i Vũ Anh Dũng - Khoa CNTT 32 Các thuật toán cho tổng dãy lớn – Thuật toán Tiếp theo : N −1 ∑( j − i +1) = j =i =i ( N − i +1)(N − i) (N−i +1)(N−i) N (N−i +1)(N−i +2) =∑ ∑ 2 i=0 i=1 N−1 N N N = ∑ i − ( N + )∑ i + ( N + 3N + 2)∑1 i =1 i =1 i =1 N ( N + 1)(2 N + 1) N ( N + 1) N + 3N + = − (N + ) + N 2 N + 3N + N = Độ phức tạp tính toán cho thuật toán : O(N 3) Vũ Anh Dũng - Khoa CNTT 33 Các thuật toán cho tổng dãy lớn – Thuật toán 10 11 12 13 14 15 16 17 18 19 20 21 Chúng ta đưa cải tiến thuật toán cách loại bỏ vòng lặp for độ phức tạp O(N 2) Thuật toán : int maxSubSum2(const vector & a) { int maxSum = 0; for( int i = 0; i < a.size( ); i++ ) { int thisSum = 0; for( int j = i; j < a.size( ); j++ ) { thisSum += a[ j ]; if( thisSum > maxSum ) maxSum = thisSum; } } return maxSum; } Vũ Anh Dũng - Khoa CNTT 34 Các thuật toán cho tổng dãy lớn – Thuật toán Thuật toán : y ộ g ba vịị trí : Tổngg lớn dãy Có thể nửa trái hay nửa phải đầu vào, nằm giữa, thuộc hai nửa Hai trường hợp đầu ầ có thểể giải ằ đệ quy Trường hợp cuối, tìm tổng lớn nửa đầu bao gồm phần tử cuối nửa đầu, đầu tìm tổng lớn nửa cuối bao gồm phần tử nửa cuối Hai tổng cộng với Vũ Anh Dũng - Khoa CNTT 35 Các thuật toán cho tổng dãy lớn – Thuật toán Thuật toán : int maxSumRec( const vector & a, int left, int right ) { if( left == right ) // Base case if( a[left] > ) 10 return a[left]; 11 else 12 return 0; 13 14 int center = ( left + right ) / 2; 15 int maxLeftSum = maxSumRec( a, left, center ); 16 int maxRightSum = maxSumRec( a, center + 1, right ); 17 18 int maxLeftBorderSum = 0, leftBorderSum = 0; 19 for( int i = center; i >= left; i ) 20 { 21 leftBorderSum += a[ [ i ] ]; 22 if( leftBorderSum > maxLeftBorderSum ) 23 maxLeftBorderSum = leftBorderSum; 24 } Vũ Anh Dũng - Khoa CNTT 36 Các thuật toán cho tổng dãy lớn – Thuật toán Thuật toán : 25 26 27 28 29 30 31 32 33 34 35 36 } int maxRightBorderSum = 0, rightBorderSum = 0; for( int j = center + 1; j maxRightBorderSum ) maxRightBorderSum = rightBorderSum; } return max3( maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum ); 42 int maxSubSum3( const vector & a ) 43 { 44 return maxSumRec( ( a, , 0, , a.size( ( ) - ) ); 45 } Vũ Anh Dũng - Khoa CNTT 37 Các thuật toán cho tổng dãy lớn – Thuật toán Đánh giá thuật toán : T(1) ( )=1 T(N) = 2*T(N/2) + N T(1) = 1, T(2) = 2*1+2 1+2 = 22*2, 2, T(4) = 22*4+4, 4+4, T(8)= 2*12+8 = 8*4, T(16) = 32*2+16=16*5 Vậy ậy N=2k T(N) ( ) = N*(k+1)=NlogN+N ( ) g T(N) = O(NlogN) Vũ Anh Dũng - Khoa CNTT 38 Các thuật toán cho tổng dãy lớn – Thuật toán Có độ phức tạp tuyến tính O(N ) Thuật ậ toán : int maxSubSum4( const vector & a ) { int maxSum = 0, thisSum = 0; f ( int for( i t j = 0; j < a.size(); i () j++ ) { 10 thisSum += a[ j ]; 11 12 if( thisSum > maxSum ) 13 maxSum = thisSum 14 else if( thisSum < ) 15 thisSum = 0; 16 } 17 18 return maxSum; 19 } Vũ Anh Dũng - Khoa CNTT 39 Thuật toán Euclid Tìm ước số chung lớn Định ị lýý : Định lý 2.1 Nếu M > N, M mod N < M/2 Độ phức tạp tính toán : O(logN ) Vũ Anh Dũng - Khoa CNTT 40 [...]...Đệ quy và giải thuật đệ quy 1 void printOut( int n ) // In số n không âm 2 { 3 printDigit( n % 10 ); 4 if( n >= 10 ) 5 printOut( n / 10 ); 6 7 } Vũ Anh Dũng - Khoa CNTT 11 Đệ quy và giải thuật đệ quy * Bài toán “Tháp Hà Nội” Phát biểu bài toán : Có 3 cọc, cần chuyển đĩa từ cọc A sang... đĩa nhỏ Tất cả các đĩa có kĩch cỡ khác nhau Vũ Anh Dũng - Khoa CNTT 12 Đệ quy và giải thuật đệ quy * Đệ quy quay lui (back tracking): Bài toán tổ hợp hợp, chỉnh hợp Bài toán người mua hàng Bài toán tám quân hậu Vũ Anh Dũng - Khoa CNTT 13 Đánh giá thuật toán Thuật toán đòi hỏi bao nhiêu tài nguyên về không gian và thời gian? Làm sao để ước lượng thời gian chạy của một chương trình? Vũ Anh... (N + ) + N 2 6 2 2 2 N 3 + 3N 2 + 2 N = 6 Độ phức tạp tính toán cho thuật toán 1 : O(N 3) Vũ Anh Dũng - Khoa CNTT 33 Các thuật toán cho bài tổng dãy con lớn nhất – Thuật toán 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Chúng ta đưa ra cải tiến thuật toán 1 bằng cách loại bỏ 1 vòng lặp for và độ phức tạp chỉ còn O(N 2) Thuật toán 2 : int maxSubSum2(const vector & a) { int maxSum = 0;... CNTT 34 Các thuật toán cho bài tổng dãy con lớn nhất – Thuật toán 3 Thuật toán 3 : y con có thể ở một ộ trong g ba vịị trí : Tổngg lớn nhất các dãy Có thể trong nửa trái hay nửa phải của đầu vào, hoặc nằm ở giữa, thuộc về cả hai nửa Hai trường hợp đầu ầ có thểể giải được bằng ằ đệ quy Trường hợp cuối, tìm tổng lớn nhất trong nửa đầu bao gồm cả phần tử cuối cùng của nửa đầu, đầu và tìm tổng... một phép p p cộng, ộ g, và một ộ p phép pg gán)) và dòng g này y được ợ thực ự hiện ệ N lần,, nâng g tổng thời gian chạy lên 4N đơn vị Dòng 2 Nn chứa thời gian khởi tạo i, kiểm tra i < N , và tăng i Thời gian của các thao tác này g yg gồm 1 cho việc ệ khởi tạo, ạ , N + 1 cho các kiểm tra, và N cho các phép tăng, tổng cộng là 2N + 2 Chúng ta còn chưa kể đến thời gian gọi hàm và trả về giá trị nên tổng... maxSum) maxSum = thisSum; } return maxSum; } Vũ Anh Dũng - Khoa CNTT 31 Các thuật toán cho bài tổng dãy con lớn nhất – Thuật toán 1 Đánh giá thuật toán 1 Số bước tính toán : N −1 N −1 j ∑ ∑ ∑1 i=0 j=i k =i Trước tiên ta có : j ∑1= j − i+1 k =i Vũ Anh Dũng - Khoa CNTT 32 Các thuật toán cho bài tổng dãy con lớn nhất – Thuật toán 1 Tiếp theo : N −1 ∑( j − i +1) = j =i =i ( N − i +1)(N − i) 2 (N−i... nghĩa 2.1 T(N) = O(f(N)) nếu có các hằng số dương c và n0 sao cho T(N) ≤ cf(N) khi N ≥ n0 Định nghĩa 2.2 22 T(N) = Ω(g(N)) nếu có các hằng số dương c và à n0 sao cho h T(N) ( ) ≥ cg(N) ( ) khi kh N ≥ n0 T(N) là đại lượng tổng quát của tài nguyên cần dùng Vũ Anh Dũng - Khoa CNTT 15 Các định nghĩa Định nghĩa 2.3 T(N) = Ө (h(N)) nếu và chỉ nếu T(N) = O(h(N)) và T(N) = Ω(h(N)) Định nghĩa 2.4 24 T(N) = o(p(N))... qua các số hạng bậc thấp và vứt bỏ các hằng số Vũ Anh Dũng - Khoa CNTT 21 Bài toán tổng dãy con lớn nhất Cho các số nguyên (có thể âm) A1, A2, , AN tìm ì giá iá trịị lớn lớ nhất hấ của ủ ∑ j k =i Ak Ví dụ: d Với đầ đầu vào à - 2 , 11 11, -4, 4 13, 13 - 5 , - 2 , đáp án là 20 (A2 đến A4) Vũ Anh Dũng - Khoa CNTT 22 Bài toán tổng dãy con lớn nhất Thời gian thuật toán Đầu vào Cỡ N = 10 1 O(N3) 0.000009... 1000, c=1, f(N)=N f(N) N2 N3 tăng nhanh hơn N2, nên ta có thể nói rằng N2 = O(N3) hay N3 =Ω(N2) Xét g(N) = 2N2, thì g(N) = O(N3), và g(N) = O(N2) đều đúng về mặt kỹ thuật nhưng lựa chọn O(N2)là đáp án tốt nhất Vũ Anh Dũng - Khoa CNTT 18 Các quy tắc Quy tắc 1 Nếu T1(N) = O(f(N)) và T2(N) = O(g(N)), O(g(N)) thì (a) T1(N) + T2(N) = O(f(N) + g(N)) ( hay max(O(f(N)) O(g(N))) ), max(O(f(N)), ) (b) T1(N) * T2(N)... phức tạp hàm mũ: fib(n) < (5/2)n Bằng cách tạo một mảng đơn giản và sử dụng vòng lặp, thời gian chạy có thể được rút ngắn một cách cơ bản bả “Đừng tính bất cứ cái gì quá một lần” Vũ Anh Dũng - Khoa CNTT 30 Các thuật toán cho bài tổng dãy con lớn nhất 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Ví dụ trong file MaxSumTest.cpp Thuật ậ toán 1 : int maxSubSum1(const vector & a) { int maxSum