1. Trang chủ
  2. » Công Nghệ Thông Tin

PHÂN TÍCH CÁC GIẢI THUẬT SẮP XẾP pps

103 787 2
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Phân Tích Các Giải Thuật Sắp Xếp
Tác giả DEMO_HUNG
Trường học Đại học Bách Khoa Hà Nội
Chuyên ngành Khoa học máy tính
Thể loại Báo cáo nghiên cứu
Thành phố Hà Nội
Định dạng
Số trang 103
Dung lượng 3,14 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

PHÂN TÍCH

CÁC GIẢI THUẬT SẮP XẾP

1

Trang 2

Nội dung

2

Trang 3

Insertion Sort

3

DEMO_HUNG

Trang 4

Insertion 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 6

Chèn a[1] vào (a[0], a[1]) 6

Chương 4: Sắp xếp

Trang 14

Insertion Sort – Đánh giá thuật toán

void InsertionSort ( int a[], int n){

1 for ( int i=1; i<n; i++)

Trang 15

Giải thuâât gia tăng

(incremental algorithm)

15

Trang 16

Giải thuật Insertion Sort

Trang 17

Insertion 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 18

Insertion 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 19

Trườ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 20

Insertion 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 21

Insertion 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 23

Proving 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 24

Loop 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 25

Loop 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 26

Loop 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 27

Loop 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 28

Giả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 29

Giả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 30

Giả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 31

Phân tích độ phức tạp: trường hợp xấu nhất

Trang 32

Phâ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 33

Phâ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 34

Phâ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 37

Chia 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 39

Sắ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 40

Giả 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 41

Sắ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 42

void 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 44

Tí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 45

Sắ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 46

Sắ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 47

Xế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 48

sort 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 49

Trộ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 50

Trộ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 51

Mộ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 55

Câ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 56

Binary 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 57

Khở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 58

Tá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 59

Binary Search Tree – Tìm kiếm

}

}

Trang 60

Binary Search Tree – Tìm kiếm

Tìm một phần tử x trong CNPTK (dùng vòng lặp):

Trang 61

Binary Search Tree – Thêm

Trang 62

Tí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 63

AVL 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 64

AVL 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 65

HEAPSORT

Trang 66

CẤ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 67

CẤU TRÚC DỮLIỆU HEAP

Trang 68

CẤ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 69

CẤ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 70

CẤ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 71

Cá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 72

Cá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 74

Thêm (P) vào heap

M

Trang 75

hơ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 77

Thí 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

Ngày đăng: 25/07/2014, 16:20

TỪ KHÓA LIÊN QUAN

w