Nó thực hiện bằng cách phân hoạch một tập tin thành hai phần và sắp thứ tự mỗi phần một cách độc lập với nhau.. Sắp thứ tự bằng cách trộn mergesort • Trước tiên, chúng ta xét một quá trì
Trang 1PHÂN TÍCH
CÁC GIẢI THUẬT SẮP XẾP
1
Trang 2Nội dung
2
Trang 3Insertion Sort
3
DEMO_HUNG
Trang 4Insertion Sort – Ý tưởng
Nhận xét:
Mọi dãy a[0] , a[1] , , a[n-1] luôn có i-1 phần tử đầu tiên a[0] , a[1] , , a[i-2] đã có thứ tự (i ≥ 2)
Ý tưởng chính:
Tìm cách chèn phần tử a[i] vào vị trí thích hợp của đoạn đã được
sắp để có dãy mới a[0] , a[1] , , a[i-1] trở nên có thứ tự
Vị trí này chính là pos thỏa :
a[pos-1] ≤ a[i ]< a[pos] (1≤ pos ≤ i)
4
Chương 4: Sắp xếp
Trang 6Chèn a[1] vào (a[0], a[1]) 6
Chương 4: Sắp xếp
Trang 14Insertion Sort – Đánh giá thuật toán
void InsertionSort ( int a[], int n){
1 for ( int i=1; i<n; i++)
Trang 15Giải thuâât gia tăng
(incremental algorithm)
15
Trang 16Giải thuật Insertion Sort
Trang 17Insertion Sort – Đánh giá thuật toán
Đối với mỗi i = 1, 3, , n -1, trong đó n
=length[A], gọi tJ là số lần kiểm tra vòng lặp while trong dòng 5 được thực thi
Gọi T(n) là thời gian thực hiện thuật giải
T(n) = c1n + c2(n-1)+ c4(n-1)+ c5Σj=2,ntj+ c6Σj=2,n
(tj-1) + c7Σj=2,n (tj-1)+ c8(n-1)
17
Chương 4: Sắp xếp
Trang 18Insertion Sort – Đánh giá thuật toán
Trường hợp tốt nhất: Khi dãy đã được sắp xếp,j = 1
18
Chương 4: Sắp xếp
Daạng an + b đôạ phưức taạp là O(n)
Trang 19Trường hợp xấu nhất: khi dãy được sắp theo chiều ngược lại,
Mỗi phần tử A[i] được so sánh với mỗi phần tử của mảng con đã sắp A[1 i − 1], vì vâây ti = j với j = 2, 3, , n
1 2
) 1 (
n
n j
) 1
( )
1 (
Trang 20Insertion Sort – Đánh giá thuật toán
20
Chương 4: Sắp xếp
Daạng an2 + bn + c đôạ phưức taạp là O(n2)
Trang 21Insertion Sort – Đánh giá thuật toán
Trường hợp trung bình: Có một vị trí i =1,…, j-1 để chèn A[j] với xác suất 1/j
Khi i khởi đầu là j -1 thì số lần so sánh trung bình xảy ra quan hệ A[j]>key là j/2, nên tj=j/2 với mọi j
=1, 3, , n-1
T(n) = c1n + c2(n-1)+ c3(n-1)+c4((n(n+1)/2-1)/2 +
c5((n(n-1)/2)/2 + c6((n(n-1)/2)/2 + c7(n-1)
=(c4+c5+c6)n2/4 + (c1+c2+c3 +c4/4 –c5/4 –c6/4+c7)n (c2+ c3+ c4/2 +c7)
-=O(n2)
21
Chương 4: Sắp xếp
Trang 22 Loop invariant là điều kiện cần đúng ngay trước khi bắt đầu
vòng lặp và ngay sau mỗi lần lặp của vòng lặp
22
Trang 23Proving Loop Invariants – Vòng lặp bất biến
Các tính chất của loop invariant:
Initialization (base case): Khởi tạo
Điều kiện cần đúng ngay trước khi bắt đầu vòng lặp
Maintenance (inductive step): Các bước lặp
Điều kiện cần đúng ngay sau mỗi lần lặp của
vòng lặp
Termination: Kết thúc
Khi vòng lặp kết thúc Giải thuật là đúng
Trang 24Loop Invariant for Insertion Sort
do A[i + 1] A[i] ←
i i – 1 ← A[i + 1] key ←
Invariant: a the start of the for loop the elements in A[1 j-1]
are in sorted order
Trang 25Loop Invariant for Insertion Sort
Initialization:
Just before the first iteration,
j = 2:
the subarray A[1 j-1] =
A[1], (the element originally
in A[1]) – is sorted
Trang 26Loop Invariant for Insertion Sort
the while inner loop moves A[j -1], A[j -2], A[j -3], and so on, by one position to the
right until the proper position for key (which
has the value that started out in A[j]) is
found
At that point, the value of key is placed into
this position.
Trang 27Loop Invariant for Insertion Sort
The outer for loop ends when j = n + 1 ⇒ j-1 = n
Replace n with j-1 in the loop invariant:
the subarray A[1 n] consists of the elements
originally in A[1 n], but in sorted order
Trang 28Giải thuật Quick sort
• Giải thuật căn bản của Quick sort được phát minh năm 1960 bởi C A R Hoare.
• Quicksort thể hiện tinh thần thiết kế giải thuật theo lối “ Chia để trị ” (divide-and-conquer).
• Quicksort được ưa chuộng vì nó không quá khó để hiện thực hóa
• Quicksort chỉ đòi hỏi khoảng chừng NlgN thao tác căn bản để sắp thứ tự N phần tử.
• Nhược điểm của Quick sort gồm:
- Nó là một giải thuật đệ quy
- Nó cần khoảng N 2 thao tác căn bản trong trường hợp xấu nhất
- Nó dễ bị lỗi khi lập trình (fragile).
Trang 29Giải thuật căn bản của Quicksort
Quicksort là một phương pháp xếp thứ tự theo kiểu “chia để trị” Nó thực hiện bằng cách phân hoạch một tập tin thành hai phần và sắp thứ tự mỗi phần một cách độc lập với nhau
Giải thuật có cấu trúc như sau:
void quicksort1(int left,int right)
{ int i;
if right > left {
TỔNG HỢP
Trang 30Giải thuật căn bản của Quicksort
//x=A[r] luôn được chọn làm phần tử chốt (pivot)
Trang 31Phân tích độ phức tạp: trường hợp xấu nhất
Trang 32Phân tích độ phức tạp: trường hợp tốt nhất
• Trường hợp tốt nhất xảy ra với Quicksort là khi mỗi lần phân hoạch chia tập tin ra làm hai phần bằng nhau Điều này làm cho số lần so sánh của Quicksort thỏa mãn hệ thức truy hồi:
C N = 2C N/2 + N.
• Số hạng 2CN/2 là chi phí của việc sắp thứ tự hai nửa tập tin và N là chi phí của việc xét từng phần tử khi phân hoạch lần đầu
• Từ chương 1, việc giải hệ thức truy hồi này đã đưa đến lời giải:
C N ≈ N lgN.
Trang 33Phân tích độ phức tạp: trường hợp xấu nhất
• Một trường hợp xấu nhất của Quicksort là khi tập tin đã
có thứ tự rồi
• Khi đó, phần tử thứ nhất sẽ đòi hỏi n so sánh để nhận
ra rằng nó nên ở đúng vị trí thứ nhất Hơn nữa, sau đó phân đoạn bên trái là rỗng và và phân đoạn bên phải gồm n – 1 phần tử
• Do đó với lần phân hoạch kế, phần tử thứ hai sẽ đòi hỏi
n-1 so sánh để nhận ra rằng nó nên ở đúng vị trí thứ
hai Và cứ tiếp tục như thế
Trang 34Phân tích độ phức tạp: trường hợp xấu nhất
• Như vậy tổng số lần so sánh sẽ là:
n + (n-1) + … + 2 + 1 = n(n+1)/2
= (n2 + n)/2 = O(n2)
• Độ phức tạp trường hợp xấu nhất của Quicksort là O(n2)
Trang 35Độ phức tạp trường hợp trung bình của Quicksort
• Công thức truy hồi chính xác cho tổng số so sánh mà Quick sort cần để sắp thứ tự N phần tử được hình thành một cách ngẫu nhiên:
N
CN = (N+1) + (1/N) ∑ (Ck-1 + CN-k) 1
với N ≥ 2 và C1 = C0 = 0
• Số hạng (N+1) bao gồm số lần so sánh phần tử chốt với từng phần tử khác, thêm hai lần so sánh để hai pointer giao nhau
Phần còn lại là do sự kiện mỗi phần tử ở vị trí k có cùng xác
xuất 1/N để được làm phần tử chốt mà sau đó chúng ta có hai
phân đoạn với số phần tử lần lượt là k-1 và N-k.
Trang 36• Chú ý rằng, C0 + C1 + … + CN-1 thì giống hệt
CN-1 + CN-2 +… + C0, nên ta có N
CN = (N+1) + (1/N) ∑ 2Ck-1 1
• Ta có thể loại trừ đại lượng tính tổng bằng cách nhân cả hai vế với N và rồi trừ cho cùng công thức nhân với N-1:
Trang 37Chia cả hai vế với N(N+1) ta được hệ thức truy hồi:
Trang 38Độ phức tạp trường hợp trung bình của Quicksort (tt.)
Trang 39Sắp thứ tự bằng cách trộn (mergesort)
• Trước tiên, chúng ta xét một quá trình được gọi là trộn
(merging), thao tác phối hợp hai tập tin đã có thứ tự thành một tập tin có thứ tự lớn hơn
Trộn
• Trong nhiều ứng dụng xử lý dữ liệu, ta phải duy trì một tập dữ liệu có thứ tự khá lớn Các phần tử mới thường xuyên được thêm vào tập tin lớn
• Nhóm các phần tử được đính vào đuôi của tập tin lớn và toàn bộ tập tin được sắp thứ tự trở lại
• Tình huống đó rất thích hợp cho thao tác trộn.
Trang 40Giả sử ta có hai mảng số nguyên có thứ tự a[1 M] và b[1 N] Ta muốn trộn chúng thành một mảng thứ ba c[1 M+N].
Ghi chú: Giải thuật dùng a[M+1] và b[N+1] để làm phần
Nhờ chúng, khi một trong hai mảng đã cạn thì vòng lặp sẽ
đưa phần còn lại của mảng còn lại vào mảng c
Trang 41Sắp thứ tự bằng phương pháp trộn
• Một khi ta đã có thủ tục trộn, ta dùng nó làm cơ sở để
xây dựng một thủ tục sắp thứ tự đệ quy
• Để sắp thứ tự một tập tin nào đó, ta chia thành hai đoạn bằng nhau , sắp thứ tự hai đoạn này một cách đệ quy và rồi trộn hai đoạn lại với nhau
• Mergesort thể hiện chiến lược thiết kế giải thuật theo lối
“ Chia để trị ” (divide-and-conquer).
• Giải thuật sau sắp thứ tự mảng a[1 r], dùng mảng b[1 r]
làm trung gian,
Trang 42void mergesort(int 1,int r)
else { a[k] = b[j]; j= j-1;}
}
}
Sắp thứ tự bằng phương pháp trộn
Trang 44Tính chất 4.1: Sắp thứ tự bằng phương pháp trộn cần
khoảng NlgN so sánh để sắp bất kỳ tập tin N phần tử nào
Đối với giải thuật mergesort đệ quy, số lần so sánh được
mô tả bằng hệ thức truy hồi: CN = 2CN/2 + N, với C1 = 0 Suy ra:
Trang 45Sắp thứ tự ngoại
• Sắp thứ tự các tập tin lớn lưu trữ trên bộ nhớ phụ được gọi
là sắp thứ tự ngoại (external sorting).
• Sắp thứ tự ngoại rất quan trọng trong các hệ quản trị cơ sở
dữ liệu (DBMSs).
• Khối (block) và truy đạt khối (Block Access)
• Hệ điều hành phân chia bộ nhớ phụ thành những khối có kích thước bằng nhau Kích thước của khối thay đổi tùy theo hệ điều hành, nhưng thường ở khoảng 512 đến 4096 byte
• Các tác vụ căn bản trên các tập tin là
- mang một khối ra bộ đệm ở bộ nhớ chính ( read )
- mang một khối từ bộ nhớ chính về bộ nhớ phụ ( write ).
Trang 46Sắp thứ tự ngoại
Khi ước lượng thời gian tính toán của các giải thuật mà làm việc trên các tập tin, chúng ta phải xét số lần mà chúng ta đọc một khối ra bộ nhớ chính hay viết một khối về bộ nhớ phụ
Một tác vụ như vậy được gọi là một truy đạt khối (block access) hay một truy đạt đĩa (disk access).
khối = trang (page)
Trang 47Xếp thứ tự ngoại bằng p.p trộn
(External Sort-merge)
Kỹ thuật thông dụng nhất để sắp thứ tự ngoại là giải thuật sắp thứ
tự ngoại bằng phương pháp trộn (external sort-merge algorithm)
Phương pháp sắp thứ tự ngoại này gồm 2 bước:
Trang 48sort the in-memory part of the file;
write the sorted data to the run file Ri;
i = i+1;
while not end of the file.
2 Trong bước 2, các run được trộn lại
Trang 49Trộn run (trường hợp tổng quát)
Tác vụ trộn là sự khái quát hóa của phép trộn hai đường
(two-way merge) được dùng bởi giải thuật sắp thứ tự nội bằng phương
pháp trộn Nó trộn N run, do đó nó được gọi là trộn nhiều đường (n-way merge).
Vì chỉ có M-1 trang của bộ đệm dành cho các đầu vào, sự trộn có
thể tiếp nhận M-1 runs như là các đầu vào.
Trang 50Trộn run [trường hợp tổng quát (tt.)
Chuyến trộn đầu tiên làm việc như sau:
M-1 run đầu tiên được trộn lại thành một run cho chuyến kế tiếp Rồi thì M-1 runs sẽ được trộn theo cách tương tự và cứ thế cho đến khi tất cả các run đầu tiên đều được giải quyết Tại điểm này, tổng số run được giảm đi một thừa số M-1
Nếu số run đã được giảm đi này vẫn còn ≥ M, một chuyến nữa
sẽ được thực thi với các run được tạo ra bởi chuyến đầu tiên làm đầu vào
Mỗi chuyến làm giảm tổng số run một thừa số M – 1 Các
chuyến cứ lặp lại nhiều như cần thiết cho đến khi tổng số run nhỏ hơn M; chuyến cuối cùng sẽ tạo ra kết quả là một tập tin có thứ
tự
Trang 51Một thí dụ của thứ tự ngoại bằng p.p trộn
Giả sử: i) một mẩu tin chiếm vừa một khối
ii) bộ đệm chiếm 3 trang
Trong giai đoạn trộn, hai trang được dùng làm đầu vào
và một trang được dùng để chứa kết quả
Giai đoạn trộn đòi hỏi hai chuyến.
Trang 53Độ phức tạp của xếp thứ tự ngoại
Hãy tính số truy đạt khối (block accesses) của giải thuật sắp thứ
tự ngoại bằng phương pháp trộn
b r : tổng số khối của tập tin
Trong giai đoạn tạo run, một khối được đọc và ghi, đem lại một tổng số 2br, truy đạt khối
Tổng số run ban đầu là b r /M.
Tổng số chuyến trộn: log M-1(br/M)
Trong mỗi chuyến trộn, từng khối của tập tin được đọc một lần
và ghi một lần
Trang 55Cây nhị phân
Cây nhị phân là cây mà mỗi nút có tối đa 2 cây con (cây
có bậc là 2)
Cây con trái
Cây con phải
Hình ảnh môôt cây nhị phân
Trang 56Binary Tree - Biểu diễn
56
Sử dụng cấu trúc để lưu trữ các thông tin của một nút gồm:
Dữ liệu của nút
Địa chỉ nút gốc của cây con trái
Địa chỉ nút gốc của cây con phải
Khai báo cấu trúc cây nhị phân:
Để quản lý cây nhị phân chỉ cần quản lý địa chỉ nút gốc: Tree root;
Trang 57Khởi tạo cây nhị phân
Một cây rỗng được biểu diễn bằng cây có con trỏ bên
phải chỉ đến nút giả t.
Khởi tạo cây rỗng:
void InitTree (Tree &t)
{
t = NULL ; }
Trang 58Tác vụ thêm vào
Thêm một nút vào trong cây, ta thực hiện một sự tìm kiếm
ứng với nút giả z tại điểm mà quá trình tìm kiếm kết thúc.
Hình vẽ minh họa việc thêm nút P vào cây nhị phân.
Trang 59Binary Search Tree – Tìm kiếm
}
}
Trang 60Binary Search Tree – Tìm kiếm
Tìm một phần tử x trong CNPTK (dùng vòng lặp):
Trang 61Binary Search Tree – Thêm
Trang 62Tính chất của sự tìm kiếm trên cây nhị phân
phân đòi hỏi chừng 2lnN so sánh trên một cây được tạo ra từ N trị
Tính chất 2: Trong trường hợp xấu nhất, một tác vụ tìm
kiếm trên cây tìm kiếm nhị phân gồm N khóa có thể cần N
so sánh
Trường hợp xấu nhất xảy ra khi cây nhị phân bị suy biến
thành một danh sách liên kết.
Trang 63AVL Tree - Định nghĩa
63
Cây nhị phân tìm kiếm cân bằng (AVL) là cây mà tại mỗi nút độ cao của cây con trái và của cây con phải chênh lệch không quá một 44
Trang 64AVL Tree – Ví dụ
64
Định lý Độ cao h của cây nhị phân tìm kiếm cân bằng
n nút là h≈1.44 lgn
Trang 65HEAPSORT
Trang 66CẤU TRÚC DỮLIỆU HEAP
Heap là một mảng các đối tượng được biểu diễn bởi một cây nhị phân đầy đủ có thứ tự và cân bằng
Mỗi nút tương ứng với một phần tử của mảng, gốc ứng với phần tử đầu tiên của mảng
Trang 67CẤU TRÚC DỮLIỆU HEAP
Trang 68CẤU TRÚC DỮ LIỆU HEAP
k 1 2 3 4 5 6 7 8 9 10 11 12 a[k] X T O G S M N A E R A I
Ta có thể diễn tả dạng cây của heap thành một mảng bằng cách đặt nút rễ tại vị trí 1 của mảng, các con của nó tại vị trí
2 và 3, các nút ở các mức kế tiếp ở các vị trí 4, 5, 6 và 7, v.v
Trang 69CẤU TRÚC DỮLIỆU HEAP
Cây được lấp đầy trên tất cả các mức từ trái sang phải, ngoại trừ mức thấp nhất có thể chưa được lấp đầy
Một heap biểu diễn một mảng A có hai đặc tính:
length[A], là số phần tử của mảng
heap-size[A], là số phần tử của heap được lưu trữ trong mảng A
Trang 70CẤU TRÚC DỮ LIỆU HEAP
Gốc của cây là A[1]
Chỉ số của cha, con trái và con phải của nút i có thể tính:
Trang 71Các lối đi trên heap
một mảng trong đó mỗi nút thỏa mãn điều kiện
heap Đặc biệt, phần tử có khóa lớn nhất luôn ở vị
trí thứ nhất của mảng.
một lối đi nào đó từ nút rễ xuống mức đáy (bottom) của heap
⇒ Trong một heap có N nút, tất cả các lối đi (path) thường có lgN nút trên đó.
Trang 72Các giải thuật trên Heap
phần tử mới và xóa bỏ phần tử lớn nhất ra khỏi heap
• Tác vụ này sẽ làm tăng kích thước của heap lên thêm một phần tử N được tăng thêm 1
• Và phần tử mới được đặt vào tại vị trí a[N], nhưng lúc đó điều kiện heap có thể sẽ bị vi phạm.
• Nếu điều kiện heap bị vi phạm, nó sẽ được khắc phục bằng cách hoán đổi phần tử mới với cha của nó Điều này lại có thể gây ra vi phạm điều kiện heap và nó sẽ được khắc phục tiếp với cùng một cách tương tự.
1 Tác vụ thêm vào (insert)
Trang 74Thêm (P) vào heap
M
Trang 75hơn trong hai nút con của nó, nếu cần và dừng lại khi nút ở
k lớn hơn hai nút con của nó.
Trang 76}
Trang 77Thí dụ về tác vụ xóa
Trước khi xóa
Sau khi xóa
M
Trang 78Độ phức tạp của các tác vụ trên heap
Tính chất 3.1: Mọi tác vụ thêm vào, xóa bỏ, downheap, upheap đòi hỏi ít hơn 2lgN so sánh khi thực hiện trên một heap gồm N phần tử
Tất cả những tác vụ này phải đi dọc theo một lối đi giữa nút
rễ cho đến cuối heap mà bao gồm ít hơn lgN phần tử với một heap gồm N phần tử
Thừa số 2 là do tác vụ downheap khi xóa bỏ mà cần hai thao tác so sánh trong vòng lặp trong và các thao tác khác chỉ đòi hỏi lgN lần so sánh