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

Bài giảng cấu trúc dữ liệu thuật toán chương 5 nguyễn đức nghĩa

94 189 1

Đ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

Định dạng
Số trang 94
Dung lượng 3,17 MB

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

Nội dung

ACM Computing Surveys, Vol.. " ...The bibliography appearing at the end of this article lists 37 sorting algorithms and 100 books and papers on sorting published in the last 20 years...

Trang 1

NGUY N C NGH A

B môn KHMT - HBKHN

Ch ng 5

S p x p (Sorting)

William A Martin, Sorting ACM Computing Surveys, Vol 3, Nr 4, Dec 1971, pp 147-174.

" The bibliography appearing at the end of this article lists 37 sorting algorithms

and 100 books and papers on sorting published in the last 20 years

Suggestions are made for choosing the algorithm best suited to a given situation."

D Knuth: 40% th i gian ho t đ ng c a các máy tính là dành cho s p x p!

N I DUNG

5.1 Bài toán s p x p

5.2 Ba thu t toán s p x p c b n

5.3 S p x p tr n (Merge Sort)

5.4 S p x p nhanh (Quick Sort)

5.5 S p x p vun đ ng (Heap Sort)

5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t

2

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 2

– Ta c n s p x p các b n ghi theo th t c a các khoá

4

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 3

5.1.1 Bài toán s p x p

• Chú ý:

• Vi c s p x p ti n hành tr c ti p trên b n ghi đòi h i di chuy n

v trí b n ghi, có th là thao tác r t t n kém

• Vì v y, ng i ta th ng xây d ng b ng khoá g m các b n ghi

ch có hai tr ng là (khoá, con tr )

– tr ng "khoá" ch a giá tr khoá,

– tr ng "con tr " đ ghi đ a ch c a b n ghi t ng ng

• Vi c s p x p theo khoá trên b ng khoá không làm thay đ i

b ng chính, nh ng trình t các b n ghi trong b ng khoá cho phép xác đ nh trình t các b n ghi trong b ng chính

– Khoa h c và k thu t (Science and engineering);

– Các thu t toán l p l ch (Scheduling algorithms),

• ví d thi t k ch ng trình d ch, truy n thông, (compiler design, telecommunication);

– Máy tìm ki m web (Web search engine);

– và nhi u ng d ng khác…

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 4

5.1.1 Bài toán s p x p

• Các lo i thu t toán s p x p

– S p x p trong (internal sort)

• òi h i h d li u đ c đ a toàn b vào b nh trong c a máy tính – S p x p ngoài (external sort)

• H d li u không th cùng lúc đ a toàn b vào b nh trong,

nh ng có th đ c vào t ng b ph n t b nh ngoài

• Các đ c tr ng c a m t thu t toán s p x p:

– T i ch (in place): n u không gian 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ó hai phép toán c b n mà thu t toán s p x p th ng ph i s d ng:

i ch (Swap): Th i gian th c hi n là O(1)

void swap( datatype &a, datatype &b){

datatype temp = a; //datatype-ki u d li u c a ph n t

Trang 5

O(n log n)

Comparison lower bound:

(n log n)

Specialized algorithms:

O(n)

Handling huge data sets

Bucket sort Radix sort

External sorting

NGUY N C NGH A

B môn KHMT - HBKHN

Các thu t toán s p x p d a trên phép so sánh

Name Average Worst Memory Stable Method

Cocktail sort — O(n²) O(1) Yes Exchanging Comb sort O(n log n) O(n log n) O(1) No Exchanging

Selection sort O(n²) O(n²) O(1) No Selection

Insertion sort O(n + d) O(n²) O(1) Yes Insertion

Shell sort — O(n log² n) O(1) No Insertion

Binary tree sort O(n log n) O(n log n) O(n) Yes Insertion

Library sort O(n log n) O(n²) O(n) Yes Insertion

Merge sort O(n log n) O(n log n) O(n) Yes Merging

In-place merge sort O(n log n) O(n log n) O(1) Yes Merging

Heapsort O(n log n) O(n log n) O(1) No Selection

Smoothsort — O(n log n) O(1) No Selection

Quicksort O(n log n) O(n²) O(log n) No Partitioning Introsort O(n log n) O(n log n) O(log n) No Hybrid

Patience sorting — O(n²) O(n) No Insertion

10

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 6

Các thu t toán s p x p không d a trên phép so sánh

5.4 S p x p nhanh (Quick Sort)

5.5 S p x p vun đ ng (Heap Sort)

5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t

12

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 9

Don’t start coding

You must design a working algorithm first.

Trang 10

5.2.1 S p x p chèn (Insertion Sort)

Thu t toán:

– T i b c k = 1, 2, , n, đ a ph n t th ktrong m ng đã cho vào đúng

v trí trong dãy g m kph n t đ u tiên.

=a[i]) trong dãy g m i ph n

Trang 12

NGUY N C NGH A

B môn KHMT - HBKHN

23

Các đ c tính c a Insertion Sort

• S p x p chèn là t i ch và n đ nh (In place and Stable)

• Phân tích th i gian tính c a thu t toán

– Best Case: 0 hoán đ i, n-1 so sánh (khi dãy đ u vào là đã đ c s p)

– Worst Case: n2 /2 hoán đ i và so sánh (khi dãy đ u vào có th t

ng c l i v i th t c n s p x p)

– Average Case: n2 /4 hoán đ i và so sánh

• Thu t toán này có th i gian tính trong tình hu ng t t nh t là

printf("\nGive n = "); scanf("%i", &N);

//seed random number generator

Trang 13

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

int i, j, min, temp;

template <class Elem, class Comp>

void selection_sort(Elem A[], int n) {

for (int i=0; i<n-1; i++) {

int lowindex = i; // Remember its index

for (int j=n-1; j>i; j ) // Find least

26

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 14

nh ví d minh ho cho các giáo trình nh p môn l p trình.

• B t đ u t đ u dãy, thu t toán ti n hành so sánh m i ph n t v i

ph n t đi sau nó và th c hi n đ i ch , n u chúng không theo đúng

th t Quá trình này s đ c l p l i cho đ n khi g p l n duy t t

đ u dãy đ n cu i dãy mà không ph i th c hi n đ i ch (t c là t t c các ph n t đã đ ng đúng v trí) Cách làm này đã đ y ph n t l n

nh t xu ng cu i dãy, trong khi đó nh ng ph n t có giá tr nh h n

đ c d ch chuy n v đ u dãy.

• M c dù thu t toán này là đ n gi n, nh ng nó là thu t toán kém hi u

qu nh t trong ba thu t toán c b n trình bày trong m c này Vì th ngoài m c đích gi ng d y, S p x p n i b t r t ít khi đ c s d ng.

28

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 17

N I DUNG

5.1 Bài toán s p x p

5.2 Ba thu t toán s p x p c b n

5.3 S p x p tr n (Merge Sort)

5.4 S p x p nhanh (Quick Sort)

5.5 S p x p vun đ ng (Heap Sort)

5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t

Trang 18

S p x p m i dãy con m t cách đ qui s d ng s p x p tr n

– Khi dãy ch còn m t ph n t thì tr l i ph n t này

T h p (Combine)

– Tr n (Merge) hai dãy con đ c s p x p đ thu đ c dãy đ c s p x p

g m t t c các ph n t c a c hai dãy con

if p < r Ki m tra đi u ki n neo

then q (p + r)/2 Chia (Divide)

36

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 19

6321

Trang 20

6 1 3 5

4 9 2 8

Divide

4 9

3 4

2 8

1 2

6 1

7 8

3 5

3 4

8 2

1 2

6 1

7 8

5 3

5 6

Merge

6 5 3 1

9 8 4 2

Merge

9 8 6 5 4 3 2 1

K t qu :

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 21

Cài đ t merge: Tr n A[first mid] và A[mid+1 last]

void merge(DataType A[], int first, int mid, int last) {

DataType tempA[MAX_SIZE]; // m ng ph

int first1 = first; int last1 = mid;

int first2 = mid + 1; int last2 = last; int index = first1; for (; (first1 <= last1) && (first2 <= last2); ++index){

if (A[first1] < A[first2]) {

tempA[index] = A[first1]; ++first1;}

else

{ tempA[index] = A[first2]; ++first2;} }

for (; first1 <= last1; ++first1, ++index)

tempA[index] = A[first1]; // sao n t dãy con 1

for (; first2 <= last2; ++first2, ++index)

tempA[index] = A[first2]; // sao n t dãy con 2

for (index = first; index <= last; ++index)

A[index] = tempA[index]; // sao tr m ng k t qu

{ // chia thành hai dãy con

int mid = (first + last)/2; // ch s đi m gi a

// s p x p dãy con trái A[first mid]

mergesort(A, first, mid);

// s p x p dãy con ph i A[mid+1 last]

mergesort(A, mid+1, last);

// Tr n hai dãy con

merge(A, first, mid, last);

Trang 22

N I DUNG

5.1 Bài toán s p x p

5.2 Ba thu t toán s p x p c b n

5.3 S p x p tr n (Merge Sort)

5.4 S p x p nhanh (Quick Sort)

5.5 S p x p vun đ ng (Heap Sort)

5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t

Trang 23

5.4.1 S đ Quick Sort

• Thu t toán s p x p nhanh đ c phát tri n b i

Hoare n m 1960 khi ông đang làm vi c cho

hãng máy tính nh Elliott Brothers Anh.

• Theo th ng kê tính toán, Quick sort (s vi t t t là

QS) là thu t toán s p x p nhanh nh t hi n nay.

• QS có th i gian tính trung bình là O(n log n), tuy

nhiênth i gian tính t i nh t c a nó l i là O(n2 ).

10 Algorithms in 20th Century

Science, Vol 287, No 5454, p 799, February 2000

Computing in Science & Engineering, January/February 2000

1946: The Metropolis Algorithm for Monte Carlo

1947: Simplex Method for Linear Programming // Tính toán khoa h c

1950: Krylov Subspace Iteration Method

1951: The Decompositional Approach to Matrix Computations

1957: The Fortran Optimizing Compiler

1959: QR Algorithm for Computing Eigenvalues

1962: Quicksort Algorithms for Sorting

1965: Fast Fourier Transform // X lý nh

1977: Integer Relation Detection

1987: Fast Multipole Method

có nh h ng sâu r ng đ n vi c phát tri n và ng d ng c a khoa

h c k thu t …

Trang 24

5.4.1 S đ Quick Sort

• Quick sort là thu t toán s p x p đ c phát tri n d a trên k thu t chia đ tr

• Thu t toán có th mô t đ qui nh sau (có d ng t ng t nh merge sort):

1 Neo đ qui (Base case) N u dãy ch còn không quá m t ph n t thì nó là dãy

đ c s p và tr l i ngay dãy này mà không ph i làm gì c

2 Chia(Divide):

• Ch n m t ph n t trong dãy và g i nó làph n t ch t p (pivot).

• Chia dãy đã cho ra thành hai dãy con: Dãy con trái (L) g m nh ng ph n t

không l n h n ph n t ch t, còn dãy con ph i (R) g m các ph n t không

nh h n ph n t ch t Thao tác này đ c g i là "Phân đo n" (Partition).

3 Tr (Conquer):L p l i m t cách đ qui thu t toán đ i v i hai dãy con L và R.

65

26

75 0

13

81 92

57 26

75 0

Trang 25

S đ t ng quát c a QS

• S đ t ng quát c a QS có th mô t nh sau:

Quick-Sort(A, Left, Right)

1. if (Left < Right ) {

2 Pivot = Partition(A, Left, Right);

3. Quick-Sort(A, Left, Pivot –1);

4. Quick-Sort(A, Pivot +1, Right); }

• Hàm Partition(A, Left, Right ) th c hi n chia A[Left Right] thành hai

đo n A[Left Pivot –1 ] và A[Pivot+1 Right] sao cho:

Các ph n t trong A[Left Pivot –1] là nh h n ho c b ng A[Pivot]

Các ph n t trong A[Pivot+1 Right] là l n h n ho c b ng A[Pivot].

• L nh g i th c hi n thu t toán Quick-Sort(A, 1, n)

4 Pivot = Partition(A, Left, Right);

5. Quick-Sort(A, Left, Pivot –1);

6. Quick-Sort(A, Pivot +1, Right); }

50

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 26

5.4.2 Thao tác chia

• Trong QS thao tác chia bao g m 2 công vi c:

– Ch n ph n t ch t p.

– Phânđo n: Chia dãy đã cho ra thành hai dãy con: Dãy con trái (L) g m

nh ng ph n t không l n h n ph n t ch t, còn dãy con ph i (R) g m

các ph n t không nh h n ph n t ch t.

• Thao tác phânđo n có th cài đ t (t i ch ) v i th i gian (n).

• Hi u qu c a thu t toán ph thu c r t nhi u vào vi c ph n t nào

đ ng gi a trong danh sách đ c s p x p (ta g i ph n t nh

v y là trung v /median) Khi đó, sau log2n l n phân đo n ta s

đ t t i danh sách v i kích th c b ng 1 Tuy nhiên, đi u đó r tkhó th c hi n Ng i ta th ng s d ng các cách ch n ph n t

Trang 27

Thu t toán phân đo n

Ta xây d ng hàm Partition(a, left, right) làm vi c sau:

• Input:M ng a[left right]

• Output: Phân b l i các ph n t c a m ng đ u vào và tr l i

ch s jpivot tho mãn:

– a[jpivot ] ch a giá tr ban đ u c a a[left],

– a[i] ≤ a[jpivot], v i m i left ≤ i < pivot,

– a[j] ≥ a[jpivot]), v i m i pivot < j ≤ right

53

NGUY N C NGH A

B môn KHMT - HBKHN

Ph n t ch t là ph n t đ ng đ u

Partition(a, left, right)

i = left; j = right + 1; pivot = a[left];

i Sau khi ch n pivot, d ch các con tr i và j t đ u và cu i m ng j

và đ i ch c p ph n t tho mãn a[i] > pivot và a[j] < pivot

pivot đ c ch n là

ph n t đ ng đ u

j là ch s (jpivot) c n tr l i,

do đó c n đ i ch a[left] và a[j]

Trang 28

a pivot vào v trí

Trang 29

Ph n t ch t là ph n t đ ng gi a

PartitionMid(a, left, right);

i = left; j = right; pivot = a[(left + right)/2];

repeat

while a[i] < pivot do i = i + 1;

while pivot < a[j] do j = j - 1;

• Cài đ t thu t toán phân đo n trong đó pivot đ c ch n là ph n t đ ng

gi a ( ây c ng là cách cài đ t mà TURBO C l a ch n).

58

NGUY N C NGH A

B môn KHMT - HBKHN

Trang 30

Cài đ t QUICK SORT

int Partition(int a[], int left, int right) {

int i, j, pivot;

i = left; j = right + 1; pivot = a[left];

while (i < j) {

i = i + 1; while ((i <= right)&&(a[i] < pivot)) i++;

j ; while ((j >= left)&& (a[j] > pivot)) j ;

pivot = Partition(a, left, right);

if (left < pivot) quick_sort(a, left, pivot-1);

if (right > pivot) quick_sort(a, pivot+1, right);}

Cài đ t Quick Sort (d đ c h n?)

int Partition(int a[], int L, int R)

Trang 31

Ch ng trình DEMO/* CHUONG TRINH DEMO QUICK SORT */

/* include: stdlib.h; stdio.h; conio.h; process.h; include time.h */

void quick_sort(int a[], int left, int right);

void swap(int &a, int &b);

int Partition(int a[], int left, int right);

int a[1000]; int n; // n - so luong phan tu cua day can sap xep

void main() {

int i; clrscr();

printf("\n Give n = "); scanf("%i",&n); randomize();

for (i = 0; i < n; i++) a[i] = rand(); // Tao day ngau nhien

printf("\nDay ban dau la: \n");

for (i = 0; i < n; i++) printf("%8i ", a[i]);

quick_sort(a, 0, n-1); // Thuc hien quick sort

printf("\n Day da duoc sap xep.\n");

for (i = 0; i < n; i++) printf("%8i ", a[i]);

T T

T n T q T n q O n O

Trang 32

Th i gian tính c a Quick-Sort

• Th i gian tính c a Quick-Sort ph thu c vào vi c phép phân chia là

cân b ng (balanced) hay không cân b ng (unbalanced) , và đi u

đó l i ph thu c vào vi c ph n t nào đ c ch n làm ch t.

1 Phân đo n không cân b ng: th c s không có ph n nào c , do

đó m t bài toán con có kích th c n – 1 còn bài toán kia có kích

th c 0.

2 Phân đo n hoàn h o (Perfect partition): vi c phân đo n luôn

đ c th c hi n d i d ng phân đôi, nh v y m i bài toán con

có kích th c c n/2.

3 Phân đo n cân b ng: vi c phân đo n đ c th c hi n đâu đó

quanh đi m gi a, ngh a là m t bài toán con có kích th c n – k

còn bài toán kia có kích th c k.

T n

T

T T

(

1 ) 1 ( )

0

(

) 1 ( ) 2 ( )

1

T

) 2 ( ) 3 ( )

2

T

) 2 ( ) 1 ( )

n

T

2

) 1 ( )

(

) (n2O

Trang 33

T n

T

T T

)

(

1 ) 1 ( )

Trang 34

Phân tích tình hu ng t i nh t

Ta có công th c đ qui:

Ch ng minh: Qui n p theo n.

• Base case: Rõ ràng b đ đúng cho n=1

• Induction step: Gi s b đ đúng v i m i n < n’, ta ch ng minh

Trang 35

Th i gian tính trung bình c a QS

QuickSort Average Case

• Gi s r ng pivot đ c ch n ng u nhiên trong s các

ph n t c a dãy đ u vào

• T t c các tình hu ng sau đây là đ ng kh n ng:

– Pivot là ph n t nh nh t trong dãy

– Pivot là ph n t nh nhì trong dãy

– Pivot là ph n t nh th ba trong dãy

– Pivot là ph n t l n nh t trong dãy

• i u đó c ng là đúng khi pivot luôn đ c ch n là ph n

t đ u tiên, v i gi thi t là dãy đ u vào là hoàn toàn

• Gi i công th c đ qui này ta thu đ c

E(T(N)) = O(N log N).

Trang 36

N I DUNG

5.1 Bài toán s p x p

5.2 Ba thu t toán s p x p c b n

5.3 S p x p tr n (Merge Sort)

5.4 S p x p nhanh (Quick Sort)

5.5 S p x p vun đ ng (Heap Sort)

5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t

Trang 37

5.5.1 The Heap Data Structure

• nhngh a: ng (heap) là cây nh phân g n hoàn ch nh có hai

tínhch t sau:

– Tính c u trúc (Structural property): t t c các m c đ u là đ y, ngo i

tr m c cu i cùng, m c cu i đ c đi n t trái sang ph i.

– Tính cóth t hay tính ch t đ ng (heap property): v i m i nút x

7

8

4 2

– Con trái c a A[i] là A[2*i]

– Con ph i c a A[i] là A[2*i + 1]

– Cha c a A[i] là A[ i/2 ]

Trang 38

Ví d đ ng16

14

1 4

Trang 39

B sung và lo i b nút

Adding/Deleting Nodes

• Nút m i đ c b sung vào m c đáy (t trái sang ph i)

• Các nút đ c lo i b kh i m c đáy (t ph i sang trái)

Trang 40

– Di chuy n xu ng theo cây

– Ti p t c quá trình cho đ n khi nút không còn bé h n con

Ngày đăng: 04/12/2015, 17:49

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm