PHÂN TÍCH THIẾT KẾ THUẬT TOÁN VÀ TĂNG TRƯỞNG CỦA HÀM

75 708 0
PHÂN TÍCH THIẾT KẾ THUẬT TOÁN VÀ TĂNG TRƯỞNG CỦA HÀM

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC HUẾ       !"#$%&'( Đề tài: )*+,,- ./012/  Giáo viên hướng dẫn: 34'!56%75 Học viên thực hiện (Nhóm 6): 89:3; 5%:<=%>;5 5%:<?)>;55 8?%9: @?7#%  Lớp: Khoa học máy tính (2014) Huế, 10 – 2014 1 AA ĐẠI HỌC HUẾ 1 LỜI NÓI ĐẦU 3 CHƯƠNG 2 4 MỞ ĐẦU 4 2.1 Thuật toán Sắp xếp chèn (Insertion sort) 4 2.2 Phân tích thuật toán 7 2.3 Thiết kế thuật toán 16 CHƯƠNG 3 33 TĂNG TRƯỞNG CỦA HÀM 33 Tổng quan 33 3.1 Hệ ký hiệu tiệm cận 33 3.2 Khái niệm chuẩn và các hàm thông dụng 44 2 BC Thiết kế và phân tích thuật toán là môn học rất quan trọng và cần thiết cho người làm CNTT. Là nền tảng cơ bản nhất giúp người lập trình hiểu được sâu hơn về hệ thống và có thể tính toán độ phức tạp để từ đó quyết định chọn một phương pháp tối ưu cho hệ thống phần mềm. Nội dung của tiểu luận này là cơ sở lý thuyết ban đầu để phục vụ việc thiết kế phân tích thuật toán và sử dụng các ký hiệu để trình bày độ phức tạp tính toán của chương trình một cách rõ ràng nhất. Nội dung trình bày gồm 2 chương theo tài liệu dịch: D'E%''F5'DGHI3J'EKE' Thomas H. Cormen Charles E. Leiserson Ronald L. Rivest Clifford Stein The MIT Press Cambridge , Massachusetts London, England McGraw-Hill Book Company Boston Burr Ridge , IL Dubuque , IA Madison , WI New York San Francisco St. Louis Montréal Toronto Chương 2: Mở đầu Chương 3: Tăng trưởng của hàm Mặc dù đã rất cố gắng nhưng tiểu luận này chắc không tránh khỏi những sai sót. Nhóm chúng em rất mong nhận được các ý kiến góp ý của thầy hướng dẫn và các bạn. Xin chân thành cảm ơn TS. Hoàng Quang đã tận tình hướng dẫn và tạo điều kiện cho chúng em hoàn thành môn học này. 3 LM 1C Chương này là nền tảng cho phép bạn làm quen và dùng nó để thiết kế và phân tích thuật toán. Ta bắt đầu bằng việc nghiên cứu thuật toán sắp xếp chèn. Thuật toán này giải quyết các bài toán sắp xếp được giới thiệu trong Chương 1. Chúng ta định nghĩa “pseudecode” (mã giả) là từ ngữ quen thuộc với người đọc và lập trình trên máy tính hoặc sử dụng nó để trình bày trong thuật toán. Có những thuật toán đặc biệt mà chúng ta đã chấp nhận nó đã được sắp xếp rất chính xác và sau đó phân tích thời gian chạy của nó. Việc phân tích đã chỉ ra phương pháp làm tăng thời gian với một số lượng các chỉ số đã được sắp xếp. Thuật toán chèn dưới đây chúng ta đã sử dụng phương pháp “Divide-and- conquer” (divide-and-conquer) để thiết kế một thuật toán và sử dụng nó để phát triển thành một thuật toán gọi là thuật toán sắp xếp trộn. Cuối cùng là việc phân tích thời gian chạy của thuật toán sắp xếp trộn. M4N%&'(3O"P"QRHJD'H'DS Thuật toán đầu tiên là thuật toán sắp xếp chèn nhằm giải quyết các bài toán sắp xếp với thông số: Input: Cho một dãy n số (a 1 , a 2 … a n ) Output: Phép hoán vị (a 1 ’ , a 2 ’ … a n ’ ) thỏa mãn a 1 ’ <= a 2 ’ <=….<= a n ’ Ở đây, những con số mà chúng ta sắp xếp được gọi là khoá. Trong chương này, điển hình chúng ta mô tả các thuật toán như là chương trình được viết bằng ngôn ngữ mô phỏng tương tự như ngôn ngữ C, pascal, Java. Sự khác nhau giữa mã giả và mã thật là gì? Chúng ta nhận thấy rằng cho dù ý nghĩa phương pháp hầu hết là trong sáng và xúc tích để đưa ra một thuật toán. Nhiều khi phương pháp trong sáng nhất là Tiếng Anh, vì vậy không phải ngạc nhiên nếu bạn dùng một mệnh đề hoặc một câu Tiếng Anh mà không có từ “real”. Một sự khác nhau giữa mã giả và mã thật là mã giả không được sự quan tâm điển hình với việc cấp phát bộ nhớ của kỹ sư phần mềm. Việc cấp phát bộ nhớ của dữ liệu được hiểu 4 ngầm, các đơn vị đo và xử lý lỗi được đặt ra để diễn đạt thuật toán một cách xúc tích hơn. Chúng ta bắt đầu với thuật toán sắp xếp chèn mà kết quả của thuật toán này là sắp xếp một số phần tử nhỏ. Thuật toán này làm việc như là cách người ta sắp xếp những con bài trên tay. Bắt đầu là tay trái rỗng và các con bài được úp xuống bàn. Sau đó, trong cùng một thời gian chúng ta di chuyển một con bài từ bàn và chèn vào vị trí chính xác trên bàn tay trái. Để tìm vị trí chính xác cho một con bài chúng ta so sánh nó với một con bài đã được sắp xếp sẵn sàng trên tay từ phải qua trái. Tại cùng một thời điểm, những con bài đã được đặt trên bài tay trái được sắp xếp và những con bài này là khởi đầu của những con bài trên đỉnh của bàn. Hình 2.1 Đoạn chương trình mô phỏng dưới đây cho ta giải thuật sắp xếp chèn. Nó thực hiện các thông số đầu vào là một mảng gồm n phần tử tức là chứa đựng n độ dài cần được sắp xếp. Đầu vào của mảng A là một dãy chưa được sắp xếp và sau khi thuật toán kết thúc cho ta một mảng A đã được sắp xếp. .TU"HJ%EJ'EJV7W9X INSERTION-SORT(A) 1 for i ← 2 to length[A] 2 do m ← A[i] {m là khóa } 3 Insert A[i] into the sorted sequence A[1 i - 1]. 4 j ← i - 1 5 5 while j > 0 and A[j] > m 6 do A[j + 1] ← A[j] 7 j ← j - 1 8 A[j + 1] ← m Y<5Z([>TF\"97%&'(HO"P"Q Ở hình bên dưới đây cho ta một mảng A với dãy số chưa được sắp xếp A = (5, 2, 4, 6, 1, 3) Đầu tiên ta xem chỉ số i như là con bài hiện tại đang ở trên tay. Cho vòng lặp For chạy bởi i nó sẽ chia mảng A thành 2 đoạn A[1 j - 1] đây là đoạn cần được sắp xếp và A[j + 1 n] là số con bài còn lại ở trên bàn chưa được đưa vào. Kết quả các bước sắp xếp cho ta một dãy tăng dần như sau: Hình 2.2 (H]EX5G^5Z 1- Thụt đầu dòng để nêu rõ cấu trúc khối. 2- Cấu trúc vòng lặp _FJ, `'D và DJ"J7 và những cấu trúc có điều kiện như if, then và else được thể hiện giống nhau như trong pascal. 3- Ký tự "►" để ghi chú hoặc giải thích một đoạn lệnh. 4- Phép gán nhiều biến cho một giá trị nào đó như: i ← j ← e tức là cả hai biến i và j là có giá trị e nó nên được xem là tương đương như là phép gán j ← e theo sau phép gán i ← j. 5- Biến (như là i, j và key) là biến cục bộ trong thủ tục đã cho trên. Chúng ta không nên sử dụng biến toàn cục với những mục đích không rõ. 6 6- Các thành phần mảng được truy cập bằng cách đặc tả tên mảng theo sau là chỉ số trong các dấu ngoặc vuông. Ví dụ A[i] nêu rõ thành phần thứ i trong mảng A. 7- Dữ liệu phức hợp thường được tổ chức thành các đối tượng bao hàm các thuộc tính hoặc các trường. Để truy cập một trường cụ thể ta dùng tên trường theo sau là tên đối tượng của nó trong các dấu ngoặc vuông. Ví dụ ta xem một mảng như một đối tượng có thuộc tính length nêu rõ số lượng thành phần mà nó chứa. Để đặc tả số lượng thành phần trong mảng A ta viết Length[A]. 8- Việc cấp phát bộ nhớ sẽ được hiểu ngầm. a!&"M4N4N Sắp xếp mảng A =〈31, 41, 59, 26, 41, 58> theo thứ tự tăng dần bằng mô hình chuyển đổi thứ tự theo phương pháp chèn a!&"M4N4M Viết Thủ tục sắp xếp chèn theo thứ tự giảm dần a!&"M4N4b Viết mã giả cho việc tìm kiếm giá trị v trong mảng A theo phương pháp tìm kiếm tuần tự. M4M)#$%&'( Phân tích một thuật toán nghĩa là dự đoán các tài nguyên (resource) mà thuật toán yêu cầu. Đôi khi, các tài nguyên như là bộ nhớ, băng thông mạng, hay là phần cứng máy tính đều là mối quan tâm chính, nhưng thường thì chính thời gian tính toán mới là yếu tố mà chúng ta cần đo lường. Nhìn chung, nhờ việc phân tích một vài thuật toán cho một vấn đề, ta có thể nhận ra thuật toán nào là hiệu quả nhất. Việc phân tích có thể chỉ ra nhiều hơn một thuật toán thích hợp có thể làm được, nhưng một vài thuật toán sử dụng nhiều tài nguyên hơn thường bị loại bỏ ra khỏi quá trình tiến hành. Trước khi chúng ta có thể phân tích một thuật toán, ta phải có một mô hình của kỹ thuật thực hiện mà sẽ được sử dụng, bao gồm các mô hình của 7 những tài nguyên kỹ thuật và các chi phí thực hiện nó. Trong hầu hết cuốn sách này, chúng ta sẽ thừa nhận một vi xử lý có đặc điểm chung, mô hình máy truy cập ngẫu nhiên (RAM), một bộ xử lý chung, làm công nghệ thực thi và và ngầm hiểu rằng các thuật toán của chúng sẽ được thực thi dưới dạng các chương trình máy tính. Trong mô hình RAM, các câu lệnh được thực hiện lần lượt, không cùng thực thi đồng thời. Tuy nhiên, ở chương sau, chúng sẽ có dịp nghiên cứu các mô hình của phần cứng số. Nói đúng ra, một thuật toán ('JS nên có định nghĩa chính xác các câu lệnh của mô hình RAM và các chi phí của chúng. Tuy nhiên, nếu làm như vậy, sẽ trở nên dài dòng và sinh ra chút sự hiểu biết bên trong thiết kế và phân tích thuật toán. Lúc đó, chúng ta phải cẩn thận việc lạm dụng mô hình RAM. Ví dụ, RAM có câu lệnh sắp xếp thì sao? Thì chúng ta có thể sắp xếp trong vừa một câu lệnh. Nhưng RAM sẽ không tồn tại, nếu các máy tính thực không có các câu lệnh. Vì vậy, một gợi ý là làm thế nào các máy tính thực được thiết kế. Mô hình RAM chứa các câu lệnh thường được tìm thấy trong các máy tính thực: số học (cộng, trừ, nhân, chia, chia không có số dư, số thấp nhất, số cao nhất), thao tác dữ liệu (nạp, lưu trữ, sao chép), và điều khiển (tách có điều kiện và không có điều kiện, gọi thủ tục con và gọi lại). Mỗi câu lệnh như thế mất một khoảng thời gian cố định. Các kiểu dữ liệu trong mô hình RAM là số nguyên và dấu phẩy động (floating point). Mặc dù chúng ta không tự nắm rõ một cách đúng đắn độ chính xác trong cuốn sách này (của kiểu dữ liệu), ứng dụng đòi hỏi có sự chính xác về kiểu dữ liệu. Chúng ta còn thừa nhận giới hạn của kích cỡ mỗi từ dữ liệu. Ví dụ, khi làm việc với những đầu vào kích cỡ n, chúng ta thừa nhận rằng các số nguyên được đại diện bởi c*log 2 n bit với hằng số c>=1. Chúng ta yêu cầu c>=1 để mỗi từ (bit) có thể lưu giữ giá trị của n, cho phép chúng ta đưa vào các phần tử đầu vào riêng lẻ, và chúng ta giới hạn c là hằng số để kích cỡ từ không phát triển tùy tiện (nếu kích cỡ từ có thể phát triển tùy tiện, trong thời gian cố định, chúng ta có thể lưu trữ một số lượng lớn dữ liệu trong một từ và vận hành trên nó – rõ ràng là phi thực tế). 8 Một số máy tính thực chứa các câu lệnh không được liệt kê ở trên, và một số câu lệnh miêu tả vùng xám của mô hình RAM. Ví dụ, có phải thời gian cố định của câu lệnh là mũ hóa? Trong trường hợp tổng quát, không mất nhiều câu lệnh để tính x y khi x và y là các số thực. Tuy nhiên, trong trạng thái giới hạn, hàm mũ là sự vận hành hằng số thời gian. Một số máy tính có câu lệnh “shift left” (di chuyển trái), ở đó hằng số thời gian đổi chỗ các bit số nguyên bởi k vị trí sang bên trái. Trong hầu hết các máy tính, việc đổi chỗ các bit số nguyên bằng một vị trí ở bên trái là tương đương nhân với 2. Đổi chỗ các bit k vị trí sang bên trái là tương đương phép nhân 2 k . Vì thế, một số máy tính có thể tính 2 k trong một câu lệnh hằng số thời gian bằng cách đổi chỗ số nguyên 1 qua k vị trí sang trái, ngay khi k không nhiều hơn số các bit trong kí tự máy tính. Chúng ta sẽ nỗ lực để tránh những vùng xám trong mô hình RAM, nhưng chúng ta sẽ xem xét phép tính 2 k như phép tính hằng số thời gian khi k là số nguyên dương đủ nhỏ. Trong mô hình RAM, chúng ta không cố gắng mô hình hóa thứ tự bộ nhớ mà rất phổ biến ở các máy tính cùng thời. Chúng ta không mô hình hóa các khối nhớ hoặc bộ nhớ ảo (mà thường được bổ sung với phân trang theo yêu cầu). Một vài mô hình tính toán cố gắng giải thích tác dụng của thứ tự bộ nhớ. Một ít các vấn đề trong sách này nghiên cứu tác dụng thứ tự bộ nhớ, nhưng ở một số phần, sự phân tích trong sách này sẽ không xem xét đến. Các mô hình bao gồm thứ tự bộ nhớ là một bit phức tạp hơn mô hình RAM, để mà chúng có thể rất khó khăn khi làm việc với chúng. Ngoài ra, việc phân tích mô hình RAM thường là dụng cụ dự báo tuyệt vời hiệu suất của các máy tính thực. Phân tích thậm chí một thuật toán đơn giản trong mô hình RAM có thể được xem là thách thức. Các công cụ tính toán yêu cầu bao gồm các phép tính tổ hợp, lý thuyết xác suất, phương trình đại số và khả năng nhận dạng hầu hết số hạng quan trọng trong công thức. Bởi vì các giải quyết một thuật toán có lẽ khác nhau ở từng đầu vào, nghĩa là chúng ta cần có biện pháp để tóm lược thành các công thức đơn giản, dễ hiểu. Thậm chí chúng ta chọn điển hình chỉ một mô hình máy để phân tích thuật toán được đưa ra, chúng ta còn quay về nhiều sự lựa chọn trong việc quyết định làm thế nào để mô tả phân tích của chúng ta. Chúng ta muốn một cách thật đơn 9 giản để viết, tính toán, và trình bày các đặc tính quan trọng của yêu cầu đầu vào của thuật toán, và các chi tiết dài dòng bị bỏ. )#$c%&HO"P"Q Thời gian thực hiện thủ tục ISERTION-SORT phụ thuộc vào đầu vào: tiến trình sắp xếp hàng ngàn con sẽ số lâu hơn sắp xếp ba con số. Hơn nữa, INSERTION-SORT có thể mất vài khoảng thời gian khác nhau để sắp xếp hai chuỗi đầu vào của cùng một kích cỡ giống nhau, phụ thuộc vào mức độ sắp xếp sẵn của chúng. Nói chung, thời gian thực hiện một thuật toán thường tăng theo kích cỡ đầu vào, do đó theo cách truyền thống, để mô tả thời gian thực hiện chương trình như một hàm kích cỡ đầu vào của chương trình. Để làm được như vậy, chúng ta cần định nghĩa các thuật ngữ: thời gian thực hiện (running time) và kích cỡ đầu vào cẩn thận hơn. Quan điểm tốt nhất của kích cỡ đầu vào phục thuộc vào bài toán đang nghiên cứu. Đối với một số bài toán, như là sắp xếp hay tính toán rời rạc các phép biến đổi Fourier, số đo tự nhiên nhất đó là số lượng các mục trong đầu vào – ví dụ, kích cỡ mảng là n để sắp xếp. Trong một số các bài toán khác, như nhân hai số nguyên, số đo tốt nhất của kích cỡ đầu vào là tổng số các bit để biểu thị cho đầu vào theo ký hiệu nhị phân thông thường. Thỉnh thoảng, việc mô tả kích cỡ đầu vào bằng hai số nguyên thích hợp hơn là một số. Ví dụ, nếu đầu vào của thuật toán là một đồ thị, kích cỡ đầu vào có thể được mô tả bằng số các đỉnh và cạnh của đồ thị. Chúng ta có thể nêu rõ kiểu đo kích cỡ đầu vào nào được sử dụng với mỗi bài toán mà chúng ta nghiên cứu. Thời gian thực hiện một thuật toán trên một đầu vào cụ thể chính là số lượng các phép toán nguyên tố và các bước thực hiện. Sẽ tiện dụng hơn nếu ta định nghĩa khái niệm “bước” để nó càng độc lập với máy càng tốt. Quan trọng, hãy chấp nhận quan điểm sau. Cần có một khoảng thời gian cố định để thực thi từng dòng giải mã của chúng ta. Một dòng có thể mất một khoảng thời gian khác so với dòng kia, nhưng chúng ta sẽ thừa nhận rằng mỗi lệnh thực thi của dòng thứ i mất thời gian c i , mà c i là một hằng số. Quan điểm này là phù hợp với mô hình RAM và nó còn phản ánh cách thực thi giải mã trên hầu hết các máy tính hiện nay. (*) 10 [...]... bài toán con, mỗi bài có kích thước là n/2 và thời gian chạy của nó là 2T(n/2) Combine: Thủ tục MERGE của một mảng con n phần tử tiêu tốn thời gian là Θ(n), vậy C(n)= Θ(n) Khi ta thêm vào hàm D(n) và C(n) cho việc phân tích thuật toán MERGE SORT là ta đang thêm một hàm Θ(n) và một hàm là Θ(1) Tổng của hai hàm này là một hàm có chiều dài n và thời gian thực hiện là Θ(n) Việc thêm nó vào để có một thuật. .. hưởng của chính kích thước dữ liệu vào Khi xem xét dữ liệu đầu vào đủ lớn để chỉ làm sự tăng trưởng của thời gian thực hiện có liên quan, ta đang nghiên cứu hiệu quả tiệm cận của thuật toán Nghĩa là ta đề cập đến cách gia tăng thời gian thực hiện của một thuật toán với kích thước dữ liệu vào trong một giới hạn nào đó, bởi kích cỡ đầu vào gia tăng mà không có ranh giới Thông thường, một thuật toán hiệu... gần đây trong việc cải thiện chính xác chương trình 32 CHƯƠNG 3 TĂNG TRƯỞNG CỦA HÀM Tổng quan Cấp tăng trưởng thời gian thực hiện của một thuật toán, đã được định nghĩa trong Chương 2, cho một đặc tính đơn giản, hiệu quả của thuật toán, cũng cho phép chúng ta so sánh hiệu suất tương đối của các thuật toán thay thế Một khi kích cỡ đầu vào n đủ lớn, phương pháp sắp xếp trộn (merge sort), thời gian thực... T(1).Việc chia bài toán thành các bài toán con mà mỗi bài toán con có kích thước là 1/b bài toán ban đầu (Ví dụ như thuật toán trộn cả a và b đều cùng bằng 2, nhưng ta thấy rằng trong nhiều thuật toán divide-and-conquer thì a và b là khác nhau) Nếu ta mất D(n) lần để chia bài toán thành các bài toán con và C(n) lần để kết hợp các cách giải quyết bài toán con thành cách giải quyết cho bài toán ban đầu Chúng... Chương 4 (của tài liệu dịch) chúng ta sẽ thấy được cách giải quyết chung chung cho mẫu công thức truy hồi này Phân tích thuật toán sắp xếp hòa nhập Mặc dầu mã giả của thuật toán MERGE SORT viết đúng khi một số phần tử là không thể xảy ra, thì cơ sở của công thức truy hồi này phân tích thật đơn giản Nếu chúng ta cho rằng kích cỡ của bài toán gốc là luỹ thừa của 2 Cứ mỗi lần chia thì vùng của hai dãy... A=(5,2,4,7,1,3,2,6) Chiều dài của dãy đã được sắp xếp và hòa nhập lại tăng lên khi thuật toán tăng dần từ đáy lên đỉnh 21 Hình 2.4 2.3.2 Phân tích thuật toán divide and conquer Khi một thuật toán chứa lời gọi đệ quy đến chính nó Thời gian thực hiện của nó có thể được mô tả bởi một công thức truy hồi cân bằng hoặc công thức truy hồi và nó mô tả hầu hết thời gian thực hiện một bài toán có kích cỡ n cùng thời... là hàm bậc hai của n Thông thường như trong trường hợp sắp xếp theo kiểu chèn (insertion sort), thời gian thực thi một thuật toán được cố định với một đầu vào được cho, mặc dù trong các chương sau, chúng ta có thể thấy một số thuật toán ngẫu nhiên mà cách hoạt động của nó có thể biến thiên ngay cả giá trị đầu vào cố định 12 Phân tích trường hợp xấu nhất và trường hợp trung bình Trong việc phân tích. .. “al- Khowarizmi”, một nhà toán học Iran thế kỷ 19 Aho, Hoporoft, Ullman đã ủng hộ tiệm cận phân tích thuật toán là một phương pháp so sánh mối quan hệ thực thi Ông cũng sử dụng phổ biến mối tương quan của công thức truy hồi để mô tả thời gian thực hiện của thuật toán đệ quy Knuth[185] cung cấp một bộ sách giáo khoa xử lý các thuật toán sắp xếp Sự so sánh thuật toán sắp xếp của ông (trang 381) bao gồm... đầu vào là rất nhỏ Chương này cung cấp một số phương pháp chuẩn cho việc đơn giản hóa cách phân tích tiệm cận của các thuật toán Phần tiếp theo bắt đầu định nghĩa một số loại ký hiệu tiệm cận, mà ta đã thấy một ví dụ trong hệ ký hiệu Θ Sau đó trình bày vài quy ước ký hiệu dùng trong suốt quyển sách này, và cuối cùng là ôn lại cách ứng xử của các hàm thường nảy sinh trong quá trình phân tích thuật toán. .. đầu vào cần được kiểm tra, biết rằng phần tử đang được tìm kiếm là tương đương với phần tử khác trong mảng? Trường hợp xấu nhất thì như thế nào? Thời gian thực thi trong trường hợp trung bình và không tối ưu của tìm kiếm tuyến tính trong ký hiệu Θ là gì? Bài tập 2.2-4 Chúng ta bổ sung thuật toán như thế nào để có thời gian thực thi tối ưu tốt? 15 2.3 Thiết kế thuật toán Có nhiều cách để thiết kế một thuật . NÓI ĐẦU 3 CHƯƠNG 2 4 MỞ ĐẦU 4 2.1 Thuật toán Sắp xếp chèn (Insertion sort) 4 2.2 Phân tích thuật toán 7 2.3 Thiết kế thuật toán 16 CHƯƠNG 3 33 TĂNG TRƯỞNG CỦA HÀM 33 Tổng quan 33 3.1 Hệ ký hiệu. Hệ ký hiệu tiệm cận 33 3.2 Khái niệm chuẩn và các hàm thông dụng 44 2 BC Thiết kế và phân tích thuật toán là môn học rất quan trọng và cần thiết cho người làm CNTT. Là nền tảng cơ bản. trong thuật toán. Có những thuật toán đặc biệt mà chúng ta đã chấp nhận nó đã được sắp xếp rất chính xác và sau đó phân tích thời gian chạy của nó. Việc phân tích đã chỉ ra phương pháp làm tăng

Ngày đăng: 11/04/2015, 22:08

Từ khóa liên quan

Mục lục

  • ĐẠI HỌC HUẾ

  • LỜI NÓI ĐẦU

  • CHƯƠNG 2

  • MỞ ĐẦU

    • 2.1 Thuật toán Sắp xếp chèn (Insertion sort)

      • Diễn giải các bước lặp của thuật toán sắp xếp chèn

      • 2.2 Phân tích thuật toán

      • 2.3 Thiết kế thuật toán

      • CHƯƠNG 3

      • TĂNG TRƯỞNG CỦA HÀM

        • Tổng quan

        • 3.1 Hệ ký hiệu tiệm cận

        • 3.2 Khái niệm chuẩn và các hàm thông dụng

Tài liệu cùng người dùng

Tài liệu liên quan