Đang tải... (xem toàn văn)
Giải thuật nâng cao tài liệu đào tạo chuyên ngành công nghệ thông tin bao gồm kiến thức về đồ thị. Tự động hóa quá trình thu thập dữ liệu từ nhiều nguồn khác nhau như cơ sở dữ liệu khách hàng, trang web, mạng xã hội, email marketing, và các nguồn khác. Điều này giúp đảm bảo rằng dữ liệu được cập nhật và đầy đủ.
Trang 1Advanced algorithms
Trang 2Chapter 1.
Algorithm and algorithm complexity
Trang 3Algorithm and algorithm complexity
Problem (in informatics)
Trang 4BÀI TOÁN
• Trong phạm vi tin học, ta xem bài toán là một công việc nào đó mà ta muốn máy tính thực hiện.
• Khi dùng máy tính giải bài toán, ta cần quan tâm trước hết đến hai yếu tố: đưa vào máy tính thông tin gì (Input) và cần lấy ra thông tin gì (Output) ?
• Do đó, để phát biểu một bài toán tacần phải trình bày rõ Input và Outputcủa bài toán đó và mối quan hệ giữaInput và Output.
Trang 5Ví dụ
• Giải phương trình dạng ax2 + bx + c = 0
• Tìm tất cả phương án để đặt n quân hậu trên bàn cờ n n
• Cho dãy n số, tìm dãy con tăng dài nhất (dãy con này không
nhất thiết chứa các phần tử liên tiếp nhau)
• Tìm một số nguyên tố lớn (từ hàng nghìn đến hàng triệu chữ số)
• Tính 21000
Trang 6THUẬT TOÁN
Thuật toánđể giải một bài toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác ấy, từ Input của bài toán, ta nhận được Output của bài toán.
Although there is no universally agreed-on wording to describe this notion, there is general agreement about what the concept
Trang 7• Đầu ra (Output): Với mỗi tập các dữ liệu đầu vào, thuật
toán đưa ra các dữ liệu tương ứng với lời giải của bài toán.
• Chính xác (Precision): Các bước của thuật toán được mô
tả chính xác.
• Hữu hạn (Finiteness): Thuật toán cần phải đưa được đầu
ra sau một số hữu hạn (có thể rất lớn) bước với mọi đầu vào.
• Đơn trị (Uniqueness): Các kết quả trung gian của từng
bước thực hiện thuật toán được xác định một cách đơn trị và chỉ phụ thuộc vào đầu vào và các kết quả của các bước trước.
• Tổng quát (Generality): Thuật toán có thể áp dụng để giải
Trang 8Ngôn ngữ biểu diễn thuật toán
• Ngôn ngữ sơ đồ khối • Ngôn ngữ mã giả
• Ngôn ngữ lập trình• Ngôn ngữ tự nhiên
Trang 9của thuật toán là đánh giá lượng tài nguyên các loại mà thuật toán đòi hỏi sử dụng Có hai loại tài nguyên quan trọng: Thời gian
(thời gian tính ) và bộ nhớ.
• Khi nói đến độ phức tạp là ý nóiđến độ phức tạp thời gian tính.
Trang 10Kích thước dữ liệu đầu vào của bài toán
Ta gọi kích thước dữ liệu đầu vào (hay độ dài dữ liệu vào) của bài toán là số bít cần thiết để biểu diễn nó.
Ta sẽ tìm cách đánh giá thời gian tính của thuật toán bởi một hàm của độ dài dữ liệu vào.
Thời gian tính của thuật toán phụ thuộcvào dữ liệu vào.
Trang 11Phép toán cơ bản
Ta gọi 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.
Phép toán so sánh, phép gán
Phép toán cơ bản: Đo thời gian tính bằng đơn vị đo nào ?
Số lượng phép toán mà ta cần máy tínhthực hiện.
Trang 12Các loại thời gian tính
Để tính toán thời gian tính của thuật toán ta
sẽ đếm số phép toán cơ bản mà nó phải
thực hiện.
• Thời gian tối thiểu cần thiết để thực hiệnthuật toán với mọi bộ dữ liệu đầu vào kích
thước n Thời gian như vậy sẽ được gọi là thời
gian tính tốt nhất của thuật toán với đầu vào
kích thước n.
• Thời gian nhiều nhất cần thiết để thực hiệnthuật toán với mọi bộ dữ liệu đầu vào kích
thước n Thời gian như vậy sẽ được gọi là thời
gian tính kém nhất của thuật toán với đầu vào
kích thước n.
• Thời gian trung bình cần thiết để thực hiệnthuật toán trên tập hữu hạn các đầu vào kích
thước n Thời gian như vậy sẽ được gọi là thời
Trang 14• Ta nói g(n) là cận trên tiệm cận của
f(n) và viết f(n) O(g(n)) hoặc f(n)
=O(g(n)).
Trang 17Cách nói về thời gian tính
• Câu nói “thời gian tính là O(f(n))” hiểu là:
đánh giá trong tình huống kém nhất là
O(f(n)) Thường nói: “Đánh giá thời gian
tính trong tình huống kém nhất là
O(f(n))”; nghĩa là thời gian tính trong tình
huống tồi nhất được xác định bởi một
hàm nào đó g(n) O(f(n)).
• Câu nói “thời gian tính là(f(n))” hiểu là:
đánh giá trong tình huống tốt nhất là
(f(n)) Thường nói: “Đánh giá thời gian
tính trong tình huống tốt nhất là
(f(n))”; nghĩa là thời gian tính trong tình
huống tốt nhất được xác định bởi một
hàm nào đó g(n) (f(n)).
Trang 18Thuật toán có đánh giá thời gian tính là O(nk) được gọi làthuật toán thời gian tính đa thức (hay vắn tắt: thuật toán đathức) Các thuật toán đa thức được coi là thuật toán hiệuquả Các thuật toán với thời gian tính hàm mũ là không hiệu
Trang 19Cận trên và cận dưới
• Cận trên (Upper bound): Cho bài toán P,ta nói cận trên cho thời gian tính của P làO(g(n)) nếu để giải P tồn tại thuật toángiải với thời gian tính là O(g(n)).
• Cận dưới (Lower bound): Cho bài toán P,ta nói cận dưới cho thời gian tính của P
là(g(n)) nếu mọi thuật toán giải P đều
có thời gian tính là(g(n)).
• Ta nói thời gian tính của P là (g(n)) nếuP có cận trên là O(g(n)) và cận dưới là
(g(n)).
Trang 20Bài toán dễ
giải – khó giải-không giải
• Bài toán dễ giải • Bài toán khó giải
• Bài toán không giải được
Trang 21Bài toán dễ giải
• Một bài toán được gọi là dễ giải nếu như nó có thể giải được bởi thuật toán đa thức Ví dụ:
✓ bài toán tìm dãy con liên tiếp có tổng lớn nhất,
✓ sắp xếp dãy n số,…
Trang 22Bài toán khó giải
• Một bài toán được gọi là khó giải nếu như nó không thể giải được bởi thuật toán đa thức
Ví dụ:
✓ bài toán liệt kê các hoán vị của n số,
✓ bài toán liệt kê các dãy nhị phân chiều dài n
• Một dạng bài toán nữa cũng được xem là khó giải: Đó là những bài toán cho đến hiện tại vẫn chưa tìm được thuật toán đa thức để giải.
Ví dụ:
✓ bài toán cái túi,
✓ bài toán người đi du lịch,…
❖ Tham khảo “Bài toán tổ hợp” ở các trang tiếp theo.
Trang 23Bài toán không giải được
• Một bài toán được gọi là không giải được nếu như không tồn tại thuật toán để giải Ví dụ:
✓ bài toán về tính dừng,
✓ bài toán về nghiệm nguyên của đa thức,…
Trang 24Đánh giá độ phức tạp của thuật toán bằng một số quy tắc
• Để xác định độ phức tạp tính toán của một thuật toán bất kỳ có thể dẫn tới những bài toán phức tạp
• Tuy nhiên trong thực tế, đối với một số thuật toán ta cũng có thể phân tích được bằng một số quy tắc sau:
✓ Quy tắc cộng✓ Quy tắc nhân
Trang 25•Quy tắc cộng
Giả sử T1(n) và T2(n) là thời gian thực hiện của hai đoạn chương trình P1 và P2 mà
T1(n)=O(f(n)); T2(n)=O(g(n)) thì thời gian thực hiện P1 rồi P2 tiếp theo sẽ là T1(n)+
T2(n)=O(max(f(n),g(n))
Trang 26for (i=1;i<=n;i++) <công việc>
Ví dụ: Hãy đánh giá độ phức tạp của đoạn lệnh sau
Trang 27•Quy tắc nhân
Giả sử T1(n) và T2(n) là thời gian thực hiện của hai đoạn chương trình P1 và P2 mà
T1(n)=O(f(n)); T2(n)=O(g(n)) thì thời gian thực hiện P1 và P2 lồng nhau sẽ là
T1(n)×T2(n)=O(max(f(n) ×g(n)).
Trang 29THUẬT TOÁN ĐỆ QUI
• Thuật toán đệ quy là thuật toán tự gọi đến chính nó với kích thước dữ liệu đầu vào nhỏ hơn để dần đi đến kết thúc thuật toán.
• Việc phát triển thuật toán đệ quy là thuận tiện khi cần xử lý với các đối tượng được định nghĩa đệ quy (biểu thức quy nạp, cây có gốc,…).
Trang 30Sơ đồ thuật toán đệ qui
void Reccursive(Input){
if (kích thước của Input là nhỏ nhất)Thực hiện Bước cơ sở;
else {
RecAlg (Input với kích thước nhỏ hơn); /* Bước đệ quy */
/*Có thể có thêm những lệnh gọi đệ quy */
Tổ hợp lời giải của các bài toán con để thu được Lờigiải;
return Lờigiải;
}
Trang 31Ví dụ
Tìm số hạng thứ n của dãy Fibonacci
Trang 32Đệ quy có nhớ
• Ta sẽ dùng biến ghi nhớ lại thông tin về lời giải của các bài toán con ngay sau lần đầu tiên nó được giải
• Điều đó cho phép rút ngắn thời gian tính của thuật toán, bởi vì, mỗi khi cần đến có thể tra cứu mà không phải giải lại những bài toán con đã được giải trước đó.
Trang 34Ví dụ 1
liên tiếp là dãy mà thành phần của nó là các
thành phần liên tiếp nhau trong {a}, ta gọi
tổng của dãy con là tổng tất cả các thành
Trang 35Thuật toán 1
• Xét tất cả các cặp số
nguyên L và U thỏa mãn1 L U n;
• Đối với mỗi cặp như vậy ta tính tổng của dãy con
Trang 37Thuật toán 3
• Tổng lớn nhất trong dãy con
a[1 i] là tổng lớn nhất trong dãy
con a[1 i-1] (gọi là maxsofar)
hoặc tổng lớn nhất trong tất cảcác tổng của các dãy con kết
thúc tại i (gọi là maxendinghere).
• Chúng ta có nhận xét rằng: Dãy
con lớn nhất kết thúc tại i là dãycon lớn nhất kết thúc tại vị trí i-1được bổ sung thêm phần tử a[i]
ở cuối hoặc là dãy con rỗngtrong trường hợp tổng của dãycon nhận được là số âm Ta cóthuật toán như sau:
void algorithm3(int a[], int n)
Trang 38Ví dụ 2
chuyển k phần tử đầu dãy về cuối dãy Yêu cầu không dùng mảng trung gian.
Trang 39Thuật toán 1
Để dịch chuyển một phần tử đầu dãy về cuối dãy, ta thực hiện 3 bước sau: Chuyển một phần tử đầu dãy vào biến tạm; dịch chuyển tất cả các phần tử của dãy về bên trái một vị trí; gán phần tử cuối dãy bằng giá trị của biến tạm Dễ thấy độ phức tạp của công đoạn
gồm 3 bước trên là O(n); do vậy đểdịch chuyển k phần tử đầu dãy về cuối
Trang 40Thuật toán 2
Sử dụng thuật toán chia để trị để giải bài toán trên với độ phức
tạp O(n).
✓ Đảođoạn(1,k);✓ Đảođoạn (k+1,n);✓ Đảođoạn (1,n);
Việc Đảođoạn (u,v) là đơn giản; được thực hiện bằng thời gian O(n) như sau:
void sequence_reverse(int a[], int u, int v){
while (u<v)
swap(a[u++], a[v ]);// hàm hoán đổi giá trị 2 biến
Thuật toán giải bài toán này có độ phức tạp O(n).
void solve(int a[], int n, int k){
sequence_reverse(a,1,k);sequence_reverse(a,k+1,n);sequence_reverse(a,1,n);
Trang 41Ví dụ 3
Cho dãy n số nguyên a1,a2,….an (n ≤ 106).
Hãy tìm 3 số sao cho tích của chúng là lớn nhất (xuất tích lớn nhất tìm
Trang 42for (int i=1;i<=n-2;i++)for (int j=i+1;j<=n-1;j++)
Trang 44Thuật toán 3
• Tìm 3 số lớn nhất max1, max2, max3• Tìm 2 số nhỏ nhất min1,min2
• Đặt p= max1 * max2 * max3; q= max1 * min1 * min2• So sánh p,q để tìm ra kết quả
Trang 45BÀI TẬP
Trang 46Trình bày thuật toán và đánh giá độ phức tạp của các thuật toán giải các bài toán sau
Bài tập 1.
Cho dãy gồm n số nguyên a1,a2,…,an (n 106)
Tìm một dãy con liên tiếp tăng dài nhất Xuất chiều dài của dãy tìm
Trang 47Bài tập 2.
trên có bao nhiêu số có giá trị đôi một khác nhau ?
Trang 48Bài tập 3.
Cho số nguyên dương p, ước số nguyên dương không kể chính nó gọi là ướcsố thực sự của p Ví dụ 10 có 3 ước số thực sự là 1,2 và 5.
Hãy đếm xem có bao nhiêu cặp số nguyên dương p,q với 1<p,q < M (với
M<=106) sao cho tổng các ước số thực sự của p bằng q và tổng các ước sốthực sự của q bằng p.
Trang 49Bài tập 4
Trang 50Special sorting algorithms
Trang 51• Running time analysis for
uncomparison sorting algorithms • Conclusion
• Exercise
Trang 52GIỚI THIỆU BÀI TOÁN SẮP XẾP
Trang 53nguyên, số thực, xâu ký tự hoặc là các đối tượng dữ liệu khác;
• Khóa sắp xếp là bộ phận của bảnghi; khóa xác định thứ tự sắp xếpcủa bản ghi trong họ các bản ghi;
Trang 55Ứng dụng của bài toán sắp
• Quản trị cơ sở dữ liệu, • Trong các máy tìm kiếm,
• Sắp xếp là một công đoạn quan trọng hỗ trợ giải quyết một vấn đề tin học hiệu quả,…
Trang 56Sắp xếp nội
(internal sort)
• Các thuật toán sắp xếp đòi hỏi toànbộ dữ liệu cần sắp xếp được đưa vàobộ nhớ trong của máy tính.
Trang 57Thuật toán sắp xếp dựa vào phép so sánh
Các thuật toán sắp xếp mà việc xác định thứ tự của các phần tử dựa vào phép so sánh được gọi là các thuật toán sắp xếp dựa vào
Trang 58nhất tìm được là O(n log n);
• Đây là thời gian tính tốt nhất củadạng thuật toán này và về mặt lýthuyết là không thể cải thiện hơnđược nữa.
Trang 59• Các thuật toán sắp xếp mà việc xác
định thứ tự của các phần tử không dựavào phép so sánh được gọi là các thuậttoán sắp xếp không dựa vào phép so
Trang 61có cùng giá trị vẫn giữ nguyên thứ tự tương đối của chúng như trước khi sắp xếp.
• Tính tại chỗ (in place): Nếu không gian bộnhớ phụ mà thuật toán đòi hỏi là O(1),nghĩa là bị chặn bởi hằng số không phụthuộc vào độ dài của dãy cần sắp xếp.
Trang 62Đặc trưng
của các thuật toán sắp xếp (…)
• Thời gian tính của các thuật toán sắp xếp có phụ thuộc vào kiểu dữ liệu/miền giá trị của các phần tử cần sắp xếp;
• Những thuật toán dù có cùng cỡ O lớn
nhưng thời gian tính trung bình trên các bộ dữ liệu thì có thể khác nhau;
• Khi các thuật toán sắp xếp có cùng cỡ thời gian tính thì chúng ta cần cân nhắc các đặc trưng còn lại;
Trang 63PHÂN TÍCH THỜI GIAN TÍNH
MỘT SỐ THUẬT TOÁN SẮP XẾP CÓ DỰA VÀO PHÉP SO SÁNH
Trang 64• Trình bày ý tưởng/minh họa bằng ví dụ ?
• Trong trường hợp trung bình, thuật toán
Trang 65void Interchangesort(int a[], int n){
for (int i=0; i<n-1;i++)for (int j=i+1;j<n ;j++)
if (a[i]>a[j])
exch(a[i],a[j]);}
Ý tưởng chính của thuật toán:
Xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa phần tử này, triệt tiêu chúng bằng cách đổi chỗ phần tử này với phần tử tương ứng trong cặp nghịch thế Lặp lại quá trình trên với các phần tử tiếp theo trong dãy.
Trang 66void exch(int &x, int &y)
Trang 67Thuật toán sắp xếp nổi bọt (bubble sort)
• Trình bày ý tưởng/minh họa bằng ví dụ ? • Trong trường hợp trung bình, thuật toán
Trang 68void Bubblesort(int a[],int n){
for (int i=1;i<n;i++)for (int j=n-1;j>=i;j )
if (a[j]<a[j-1])exch(a[j],a[j-1]);
Ý tưởng chính của thuật toán:
Xuất phát từ cuối dãy (hoặc đầu dãy), đổi chỗ bất kỳ hai phần tử kế cận nào ngược thứ tự để đưa phần tử nhỏ nhất (hoặc lớn nhất) trong các cặp phần tử đó về vị trí đúng là đầu (cuối) dãy hiện hành, kế tiếp không xét đến nó nữa ở bước tiếp theo, do vậy ở lần xử lý thứ i sẽ có vị trí đầu dãy là i Lặp lại quá trình trên cho đến khi không còn cặp phần tử nào để xét
Trang 69Thuật toán
sắp xếp chọn (selection
• Trình bày ý tưởng/minh họa bằng ví dụ ? • Trong trường hợp trung bình, thuật toán
• Thuật toán Selection sort có độ phức tạp thời gian tuyến tính đối với các mẫu tin có kích thước lớn và khóa của các mẫu tin có kích thước nhỏ;
Trang 70void Selectionsort(int a[],int n)
exch(a[min], a[i]);// nghia la ai la phan tu nho nhat o buoc chon thu i}
Ý tưởng chính của thuật toán:
Chọn phần tử nhỏ nhất trong n phần tử
khởi tạo, đưa phần tử này về vị trí đúng là đầu dãy hiện hành; sau đó không quan tâm đến nó nữa, xem dãy hiện hành mới chỉ còn n-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ hai; lặp lại quá trình trên cho dãy hiện hành cho đến khi dãy hiện hành chỉ còn một phần tử.
Trang 71Thuật toán
sắp xếp chèn (insertion
• Trình bày ý tưởng/minh họa bằng ví dụ ? • Trong trường hợp trung bình, thuật toán
• Thuật toán Insertion sort có độ phức tạp thời gian tuyến tính đối với các tập tin hầu như đã được sắp xếp.
Trang 72void Insertionsort(int a[], int n)
Ý tưởng chính của thuật toán:
Dãy đầu tiên chỉ có một thứ tự a0 là dãy đã được sắp Ta từng bước mở rộng dãy được sắp bằng cách lần lượt thêm phần tử ai (i=1 n-1) vào Khi chèn ai vào dãy đã được sắp thì ta tiến hành các công đoạn
chèn Thứ hai tìm vị trí pos thích hợp
trong đoạn a0 đến ai-1 để chèn ai vào Thứ
ba là chèn x vào vị trí pos.
Trang 73Thuật toán
sắp xếp shell (shell sort)
• Thuật toán Shell sort do Donald L.Shell đề xuất vào năm 1959;
• Thuật toán Shell sort là sự mở rộngcủa thuật toán Insertion sort: Trongkhi thuật toán Insertion sort chỉ đổichỗ các phần tử kề nhau thì thuậttoán Shell sort nhắm tới việc đổichỗ các phần tử ở xa nhau.
Trang 74Thuật toán
sắp xếp shell (shell sort)
• Shell sort là thuật toán sắp xếp được lựa chọn cho nhiều ứng dụng thực tế vì thời gian tính của nó gần tương đương với các thuật toán sắp xếp tốt nhất hiện biết với các tập tin có kích thước vừa phải (chẳng hạn
Trang 75void Shellsort (int a[], int n) {
int h = 1;
while (h < n/3) h = 3*h + 1; // 1, 4, 13, 40, 121, 364, 1093, while (h >= 1)
{ // h-sort the array.
for (int i = h; i < n; i++)
{ // Insert a[i] among a[i-h], a[i-2*h], a[i-3*h] for (int j = i; j >= h && a[j]<a[j-h]; j -= h)