56
1 Chương 2 Phân tích độ phức tạp của một số giải thuật sắp thứ tự và tìm kiếm

Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

Embed Size (px)

Citation preview

Page 1: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

1

Chương 2

Phân tích độ phức tạp của một số giải thuật sắp thứ tự và tìm kiếm

Page 2: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

2

Nội dung

1. Vài phương pháp sắp thứ tự căn bản

2. Quicksort

3. Xếp thứ tự dựa vào cơ số

4. Xếp thứ tự bằng phương pháp trộn

5. Xếp thứ tự ngoại

6. Vài phương pháp tìm kiếm căn bản

Page 3: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

3

Nguyên tắc về sắp thứ tự

Xét những phương pháp sắp thứ tự một tập tin gồm các mẩu tin (record) có chứa khóa (key). Khóa mà là một phần của mẩu tin, được dùng để điều khiển việc sắp thứ tự.

Mục tiêu: sắp xếp các mẩu tin sao cho các trị khóa của chúng có thứ tự theo một qui luật thứ tự nào đó.

Nếu các tập tin được sắp thứ tự có thể chứa trong bộ nhớ chính thì giải thuật sắp thứ tự được gọi là sắp thứ tự nội (internal sorting).

Việc sắp thứ tự tập tin lưu ở bộ nhớ phụ được gọi là sắp thứ tự ngoại (external sorting).

Page 4: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

4

Hai nhóm phương pháp sắp thứ tự

Chúng ta quan tâm đến thời gian tính toán của các giải thuật sắp thứ tự.

1. Một nhóm gồm 4 phương pháp căn bản đòi hỏi thời gian tính toán tỉ lệ với N2 để sắp thứ tự N phần tử.

2. Các phương pháp tiên tiến hơn có thể sắp thứ tự N phần tử trong thời gian chạy tỉ lệ với NlgN.

Một đặc tính của phương pháp sắp thứ tự là tính ổn định (stability). Một phương pháp sắp thứ tự được gọi là ổn định khi nó bảo toàn được thứ tự tương đối của các phần tử cùng trị khóa trong tập tin.

Page 5: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

5

1. Nhóm phương pháp căn bản

Với nhóm này, có hai phương pháp sắp thứ tự được chọn để khảo sát:

- sắp thứ tự bằng phương pháp chọn (selection sort)

- sắp thứ tự bằng phương pháp chèn (insertion sort)

Với mục đích tập trung vào khía cạnh giải thuật, ta sẽ làm việc với các phương pháp mà nó chỉ sắp thứ tự các mảng số nguyên theo thứ tự lớn dần của số.

Page 6: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

6

Sắp thứ tự bằng phương pháp chọn

Ý tưởng:“Trước tiên tìm phần tử nhỏ nhất trong mảng và hoán đổi

nó với phần tử đang ở vị trí thứ nhất trong mảng, và rồi tìm phần tử nhỏ thứ nhì trong mảng và hoán đổi nó với phần tử đang ở vị trí thứ nhì trong mảng, và cứ thế cho đến khi toàn mảng đã được sắp thứ tự.”

390 45 45 45 45205 205 182 182 182182 182 205 205 20545 390 390 390 235235 235 235 235 390

Page 7: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

7

Giải thuật sắp thứ tự bằng phương pháp chọn

procedure selection;var i, j, min, t: integer;begin

for i :=1 to N-1 do begin

min :=i;for j :=i+1 to N do if a[j]<a[min] then min :=j;t :=a[min]; a[min] :=a[i];

a[i] :=t;end;

end;

Page 8: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

8

Phân tích độ phức tạp của selection sort

Vòng lặp trong (tác vụ so sánh) được thực hiện với tổng số lần như sau:(N-1)+(N-2)+...+1 =N(N-1)/2

=O(N2)Vòng lặp ngoài được thực thi N-1 lần. Tính chất 1.1: Selection sort thực thi khoảng N hoán vị và N2/2 so sánh.

Ghi chú: Thời gian tính toán của selection sort thì độc lập đối với dữ liệu nhập.

Page 9: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

9

Sắp thứ tự bằng phương pháp chèn

Ý tưởng :Giải thuật xem xét từng phần tử một, chèn nó vào vị trí đúng của nó trong nhóm các phần tử đã được sắp thứ tự rồi.

390 205 182 45 45205 390 205 182 182182 182 390 205 20545 45 45 390 235235 235 235 235 390

Page 10: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

10

Giải thuật sắp thứ tự bằng phương pháp chèn

procedure insertion;var i; j; v:integer;begin

for i:=2 to N do begin

v:=a[i]; j:= i;while a[j-1]> v do begin

a[j] := a[j-1]; // pull down j:= j-1 end;

a[j]:=v;end;

end;

Page 11: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

11

Những lưư ý về giải thuật insertion sort

1. Chúng ta dùng một trị khóa “cầm canh” (sentinel) tại a[0], làm cho nó nhỏ hơn phần tử nhỏ nhất trong mảng.

2. Vòng lặp ngoài của giải thuật được thực thi N-1 lần. Trường hợp xấu nhất xảy ra khi mảng đã có thứ tự đảo ngược. Khi đó, vòng lặp trong được thực thi với tổng số lần sau đây:

(N-1) + (N-2) + ... + 1 =N(N-1)/2 =O(N2)

Số bước chuyển = N(N-1)/2 Số so sánh = N(N-1)/2

3. Trung bình có khoảng chừng (i-1)/2 so sánh được thực thi trong vòng lặp trong. Do đó, trong trường hợp trung bình, tổng số lần so sánh là:

(N-1)/2 + (N-2)/2 + ... + 1/2 =N(N-1)/4 =O(N2)

Page 12: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

12

Độ phức tạp của sắp thứ tự bằng phương pháp chọn và phương pháp chèn

Tính chất 1.2: Sắp thứ tự bằng phương pháp chọn thực thi khoảng N2/2 so sánh và N2/4 hoán vị trong trường hợp xấu nhất.

Tính chất 1.3: Sắp thứ tự bằng phương pháp chèn thực thi khoảng N2/4 so sánh và N2/8 hoán vị trong trường hợp trung bình.

Tính chất 1.4: Sắp thứ tự bằng phương pháp chèn có độ phức tạp tuyến tính đối với một mảng đã gần có thứ tự.

Page 13: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

13

2. 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 đượ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 N2 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).

Page 14: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

14

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:

procedure quicksort1(left,right:integer);var i: integer;begin

if right > left then begin

i:= partition(left,right);quicksort(left,i-1);quicksort(i+1,right);

end;end;

Page 15: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

15

Phân hoạch

Phần then chốt của Quicksort là thủ tục phân hoạch (partition), mà sắp xếp lại mảng sao cho thỏa mãn 3 điều kiện sau:

i) phần tử a[i] được đưa về vị trí đúng đắn của nó, với một giá trị i nào đó,

ii) tất cả những phần tử trong nhóm a[left], ..., a[i-1] thì nhỏ hơn hay bằng a[i]

iii) tất cả những phần tử trong nhóm a[i+1], ..., a[right] thì lớn hơn hay bằng a[i]

Example:

53 59 56 52 55 58 51 57 5452 51 53 56 55 58 59 57 54

Page 16: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

16

Thí dụ về phân hoạch

Giả sử chúng ta chọn phần tử thứ nhất hay phần tử tận cùng trái (leftmost ) như là phần tử sẽ được đưa về vị trí đúng của nó ( Phần tử này được gọi là phần tử chốt - pivot).

40 15 30 25 60 10 75 45 65 35 50 20 70 55

40 15 30 25 20 10 75 45 65 35 50 60 70 55

40 15 30 25 20 10 35 45 65 75 50 60 70 55

35 15 30 25 20 10 40 45 65 75 50 60 70 55

nhỏ hơn 40 sorted lớn hơn 40

Page 17: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

17

Giải thuật Quicksort procedure quicksort2(left, right: integer);var j, k: integer;begin

if right > left thenbegin j:=left; k:=right+1;

//start partitioning repeat

repeat j:=j+1 until a[j] >= a[left];repeat k:=k-1 until a[k]<= a[left];if j< k then swap(a[j],a[k])

until j>k; swap(a[left],a[k]); //finish partitioning quicksort2(left,k-1); quicksort2(k+1,right)end;

end;

Page 18: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

18

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:

CN = 2CN/2 + N.

Số hạnh 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:

CN N lgN.

Page 19: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

19

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ế.

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).

Page 20: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

20

Độ 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: NCN = (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.

Page 21: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

21

Chú ý rằng, C0 + C1 + … + CN-1 thì giống hệt

CN-1 + CN-2 +… + C0, nên ta có

NCN = (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:

NCN – (N-1) CN-1 = N(N+1) – (N-1)N + 2CN-1

Từ đó ta được

NCN = (N+1)CN-1 + 2N

 

Page 22: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

22

Chia cả hai vế với N(N+1) ta được hệ thức truy hồi:

CN/(N+1) = CN-1/N + 2/(N+1)

= CN-2 /(N-1) + 2/N + 2/(N+1)

.

. N

= C2 /3 + 2/(k+1) 3 N N

CN/(N+1) 2 1/k 2 1/x dx = 2lnN 1 1

Suy ra:

CN 2NlnN

Page 23: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

23

Độ phức tạp trường hợp trung bình của Quicksort (tt.)

Vì ta có:

lnN = (log2N).(loge2) =0.69 lgN

2NlnN 1.38 NlgN.

Tổng số so sánh trung bình của Quicksort chỉ khoảng chừng 38% cao hơn trong trường hợp tốt nhất.

Mệnh đề. Quicksort cần khoảng 2NlnN so sánh trong trường hợp trung bình.

Page 24: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

24

Khử đệ quy giải thuật Quicksort

procedure quicksort3;var t, i, left, right : integer;begin left :=1; right:= N; stackinit; push(left); push(right); repeat if right > left then begin

i=: partition(left,right);if (i –left) > (right –i) then

begin push(left); push(i-1); left := i+1 endelsebegin

push (i+1);push(right); right:=i-1

end; end else begin right := pop; left := pop end; until stackempty;end;

Dùng ngăn xếp (stack) ta có thể chuyển Quicksort thành một giải thuật không đệ quy

Page 25: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

25

3. Sắp thứ tự dựa vào cơ số

Trong nhiều ứng dụng, các trị khóa có thể là những khóa thuộc một tầm hạn định nào đó.

 Các phương pháp sắp thứ tự mà lợi dụng tính chất số của các khóa được gọi là sắp thứ tự dựa vào cơ số (radix sort).

 Những phương pháp này không chỉ so sánh các trị khóa chúng xử lý và so sánh các phần của khóa.

Sắp thứ tự dựa vào cơ số coi các trị khóa như là những số được biểu diễn ở dạng hệ cơ số M và làm việc với từng ký số (digit) đơn lẻ.

 Với hầu hết mọi máy tính, thật tiện lợi để làm việc với cơ số 2 (M =2), hơn là cơ số thập phân (M =10).

Page 26: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

26

Bit

Cho một khóa được diễn tả dưới dạng một số nhị phân, một tác vụ cần thiết là trích các tập bit kề nhau từ một số.

VớI ngôn ngữ máy, các bit được trích từ số nhị phân nhờ các tác vụ như “and” và “shift” trên các bit.  

Thí dụ: Ta có thể trích hai bit đầu của một số 10 bit bằng cách dùng tác vụ “shift right”(dịch sang phải) 8 bit rồi thực hiện tác vụ “and” từng bit với mặt nạ 0000000011.

Trong ngôn ngữ Pascal, những tác vụ trên có thể được giả lập bằng hai tác vụ div và mod.

Page 27: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

27

Làm việc trên bit

Hai bit đầu của một số mười bit được trích bởi: (x div 256) mod 4.

“dịch số x sang phải k vị trí bit” được thực hiện bởi:

x div 2k

“gán zero tất cả trừ j bit tận cùng phải “được thực hiện bởi:

(x div 2 k) mod 2j

Trong giải thuật sắp thứ tự dựa vào cơ số, giả sử đã tồn tại hàm bits(x,k,j :integer):integer mà trả về j bit xuất hiện cách k bit kể từ mốc bên phải trong số x.

Page 28: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

28

Giải thuật sắp thứ tự hoán vị cơ số

Phương pháp căn bản của giải thuật sắp thứ tự hoán vị cơ số (exchange radix sort) là xem xét từng bit của trị khóa từ trái sang phải.

Ý tưởng: Kết quả của sự so sánh giữa hai trị khóa chỉ tùy thuộc vào giá trị của từng bit tại vị trí đầu tiên mà chúng khác nhau (đọc từ trái sang phải).

Page 29: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

29

Sắp thứ tự hoán vị cơ số

Sắp thứ tự hoán vị cơ số (Radix Exchange Sort)

Việc sắp thứ tự tập tin được thực hiện theo một cách giống như thao tác phân hoạch trong Quicksort.

duyệt từ trái sang phải để tìm trị khóa mà bắt đầu bằng bit 1,

duyệt từ phải sang trái để tìm trị khóa mà bắt đầu bằng bit 0,

hoán vị hai trị khóa này,

và tiếp tục quá trình này cho đến khi hai con trỏ giao nhau.

Page 30: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

30

procedure radix_exchange(1, r, b : integer);var t, i, j: integer;begin if (r >1) and (b>=0) then begin i:= 1; j:= r; repeat

while (bits(a[i], b, 1)=0) and (i <j) do i:=i+1;while (bits(a[j], b, 1)=1) and (i<j) do j:= j-1;swap(a[i],a[j]);

until j=i; if bits(a[r], b, 1)= 0 then j:=j +1 ; radix_exchange(1, j-1, b-1); radix_exchange(j, r, b-1); endend;

Page 31: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

31

Sắp thứ tự hoán vị cơ số (tt.)

Giả sử mảng a[1..N] chứa các số nguyên dương nhỏ hơn 232 (sao cho chúng có thể được diễn tả thành các số nhị phân 31-bit).

Thì lịnh gọi radix_echange (1,N,30) sẽ sắp thứ tự được cho dãy. 

Biến b theo dõi các bit từ bit thứ 30 (tận cùng trái) cho đến bit thứ 0 (tận cùng phải).

 Hình vẽ sau đây minh họa sự phân hoạch theo biểu diễn nhị phân của các trị khóa. Một phép mã hóa 5 bit được dùng cho khóa.

Page 32: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

32

A 0 0 0 0 1 A 0 0 0 0 1 A 0 0 0 0 1 A 0 0 0 0 1 A 0 0 0 0 1 A 0 0 0 0 1

S 1 0 0 1 1 E 0 0 1 0 1 E 0 0 1 0 1 A 0 0 0 0 1 A 0 0 0 0 1 A 0 0 0 0 1

O 0 1 1 1 1 O 0 1 1 1 1 A 0 0 0 0 1 E 0 0 1 0 1 E 0 0 1 0 1 E 0 0 1 0 1

R 1 0 0 1 0 L 0 1 1 0 0 E 0 0 1 0 1 E 0 0 1 0 1 E 0 0 1 0 1 E 0 0 1 0 1

T 1 0 1 0 0 M 0 1 1 0 1 G 0 0 1 1 1 G 0 0 1 1 1 G 0 0 1 1 1 G

I 0 1 0 0 1 I 0 1 0 0 1 I 0 1 0 0 1 I 0 1 0 0 1 I I

N 0 1 1 1 0 N 0 1 1 1 0 N 0 1 1 1 0 N 0 1 1 1 0 L 0 1 1 0 0 L 0 1 1 0 0

G 0 0 1 1 1 G 0 0 1 1 1 M 0 1 1 0 1 M 0 1 1 0 1 M 0 1 1 0 1 M 0 1 1 0 1

E 0 0 1 0 1 E 0 0 1 0 1 L 0 1 1 0 0 L 0 1 1 0 0 N 0 1 1 1 0 N 0 1 1 1 0

X 1 1 0 0 0 A 0 0 0 0 1 O 0 1 1 1 1 O 0 1 1 1 1 O 0 1 1 1 1 O 0 1 1 1 1

A 0 0 0 0 1 X 1 1 0 0 0 S 1 0 0 1 1 S 1 0 0 1 1 P 1 0 0 0 0 P

M 0 1 1 0 1 T 1 0 1 0 0 T 1 0 1 0 0 R 1 0 0 1 0 R 1 0 0 1 0 R 1 0 0 1 0

P 1 0 0 0 0 P 1 0 0 0 0 P 1 0 0 0 0 P 1 0 0 0 0 S 1 0 0 1 1 S 1 0 0 1 1

L 0 1 1 0 0 R 1 0 0 1 0 R 1 0 0 1 0 T 1 0 1 0 0 T T

E 0 0 1 0 1 S 1 0 0 1 1 X 1 1 0 0 0 X X X

Hình 3.3.1 Sắp thứ tự hoán vị cơ số

Page 33: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

33

Độ phức tạp của sắp thứ tự dựa vào cơ số

Thời gian tính toán của sắp thứ tự hoán vị cơ số sắp thứ tự N mẩu tin là Nb.

 Mặt khác, ta có thể coi thời gian tính toán bằng với NlgN vì nếu các trị khóa khác biệt nhau thì b ít nhất phải là lgN.

 Tính chất 3.1: Sắp thứ tự dựa vào cơ số cần trung bình khoảng NlgN sự so sánh bit. 

Nếu kích thước của mảng là lũy thừa của 2 và các bit là ngẫu nhiên, thì chúng ta kỳ vọng rằng một nửa những bit đầu có trị là 0 và một nửa có trị là 1. Do đó hệ thức truy hồi là: CN = 2CN/2 + N.

 Trong giải thuật sắp thứ tự hoán vị cơ số, sự phân hoạch thường dễ ở phạm vi trung tâm hơn là trong in Quicksort.

Page 34: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

34

4. 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

Trongnhiề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.

Page 35: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

35

Trộn

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].

 

i:= 1; j :=1;for k:= 1 to M+N do if a[i] < b[j] then begin c [k] := a[i]; i:= i+1 end else begin c[k] := b[j]; j := j+1 end;

Ghi chú: Giải thuật dùng a[M+1] và b[N+1] để làm phần tử cầm canh chứa hai giá trị lớn hơn mọi trị khóa khác. 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.

Page 36: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

36

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.  

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,

Page 37: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

37

procedure mergesort(1,r: integer);var i, j, k, m : integer;begin if r-1>0 then begin

m:=(r+1)/2; mergesort(1,m); mergesort(m+1,r);  for i := m downto 1 do b[i] := a[j];

for j :=m+1 to r do b[r+m+1-j] := a[j];for k :=1 to r do if b[i] < b[j] then

begin a[k] := b[i] ; i := i+1 end else begin a[k] := b[j]; j:= j-1 end;

end;end;

Page 38: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

38

A S O R T I N G E X A M P L E

A S

O R

A O R S

I T

G N

G I N T

A G I N O R S T

E X

A M

A E M X

L P

E L P

A E E L M P X

A A E E G I L M N O P R S T X

Thí dụ: Sắp thứ tự một mảng gồm những ký tự chữ

Page 39: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

39

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:

 CN N lg N

Tính chất 4.2: Sắp thứ tự bằng phương pháp trộn cần dùng chỗ bộ nhớ thêm tỉ lệ vớI N. 

Ghi chú: Mergesort thì ổn định (stable) trong khi

Quicksort thì không ổn định.

Độ phức tạp của giải thuật Mergesort

Page 40: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

40

5. 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).

Page 41: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

41

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)

Page 42: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

42

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:

- tạo các run

- trộn run

M: số trang (page) của bộ đệm trong bộ nhớ chính (memory-buffer) .

Page 43: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

43

Xếp thứ tự ngoại bằng p.p. trộn (tt.)

1. Trong bước 1, một số run có thứ tự được tạo ra bằng cách sau: i = 0; repeat read M blocks of the file, or the rest of the file, whichever is smaller; sort the in-memory part of the file; write the sorted data to the run file Ri;

i = i+1; until the end of the file.

 2. Trong bước 2, các run được trộn lại.

Page 44: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

44

Trộn run

Trường hợp đặc biệt:

Giả sử số run, N, N < M. Ta có thể dành 1 trang của bộ đệm cho mỗi run và dành chỗ bộ nhớ còn lại chứa một trang của kết quả xuất ra. Giải thuật phần trộn run như sau:

 read one block of each of the N files Ri into a buffer page in

memory;repeat choose the first record (in sort order) among all buffer pages; write the tuple to the output, and delete it from the buffer page; if the buffer page of any run Ri is empty and

not end-of-file(Ri) then

read the next block of Ri into the buffer page;

until all buffer pages are empty.

Page 45: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

45

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).

  Trường hợp tổng quát:

Về tổng quát, nếu tập tin lớn hơn sức chứa của bộ đệm

N > M

 thì không thể dành một trang trong bộ đệm cho mỗi run trong bước trộn. Trong trường hợp này, sự trộn phải trải qua nhiều chuyến (passes).

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.

Page 46: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

46

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ự.

Page 47: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

47

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.

Page 48: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

48

a 19d 31 a 19

g 24 g 24 b 14 a 14a 19 c 33 a 19d 31 b 14 d 31 b 14c 33 c 33 e 16 c 33b 14 e 16 g 24 d 7e 16 d 21r 16 d 31 a 14 d 31d 21 m 3 d 7 e 16m 3 r 16 d 21 g 24p 2 m 3 m 3d 7 a 14 p 2 p 2a 14 d 17 r 16 r 16

p 2

Tạo run trộn pass-1 trộn pass-1

Page 49: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

49

Độ 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.

br : 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à br/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.

Page 50: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

50

Độ phức tạp của xếp thứ tự ngoại(tt)

Tổng số truy đạt đĩa cho giải thuật sắp thứ tự ngoại bằng phương pháp trộn là:

 2br + 2br logM-1(br/M) = 2br( logM-1 (br/M) +1)

tạo run các chuyến trộn

Page 51: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

51

6. Tìm kiếm tuần tự

type node = record key, info: integer end;var a: array [0..maxN] of node; N: integer;procedure initialize;begin N: = 0 end;function seq_search (v: integer, x: integer): integer;begin a[N+1].key: = v; /*sentinel */ if x<= N then repeat x: = x + 1 until v = a[x].key; seq_search: = xend;

Phương pháp đơn giản nhất để tìm kiếm là lưu trữ các mẩu tin trong một mảng, và để tìm kiếm một mẩu tin, duyệt qua toàn bộ mảng một cách tuần tự.

Page 52: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

52

function seq_insert (v: integer): integer;begin N: = N+1; a[n].key : = v; seq_insert: = Nend;

Note: Tham số x được đưa vào để đối phó với trường hợp nhiều

mẩu tin có cùng trị khóa. Bằng cách thực hiện t: = seq_search (v, t) bắt đầu với t = 0, ta có thể liên tiếp cho t

bằng vị trí của mỗi mẩu tin có trị khóa là v. Nếu sự tìm kiếm thất bại, sep_search trả về trị N+1.

Page 53: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

53

Đặc tính của tìm kiếm tuần tự (Chứng minh)

Tính chất: Tìm kiếm tuần tự cần N+1 so sánh đối với một sự tìm kiếm không thành công và khoảng trung bình N/2 so sánh đối với một tìm kiếm không thành công.

Chứng minh: Trường hợp xấu nhất

Trường hợp xấu nhất xảy ra khi v là phần tử cuối cùng của mảng hoặc v không có trong mảng.

Trong cả hai trường hợp, chúng ta có lần lượt C(N) = N và C(N) = N+1.

Page 54: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

54

Trường hợp trung bình Giả sử v có xuất hiện trong mảng và có một xác xuất đều để xuất hiện tại một vị trí bất kỳ nào trong mảng. Và mỗi trường hợp xảy ra với cùng xác xuất p = 1/N. Thì C(N) = 1.(1/N) + 2.(1/N) + …+ N.(1/N) = (1 + 2 + …+ N).(1/N) = (1+2+…+N)/N = N(N+1)/2.(1/N) = (N+1)/2.

Page 55: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

55

Tìm kiếm chia đôi (binary search)

function binarysearch(v:integer): integer;var x, 1, r: integer;begin 1: = 1; r: = N; repeat x: = (1+r) div 2 if v < a[x].key then r: = x – 1 else l: = x+1 until (v = a[x].key) or (1>r); if v = a[x].key then binarysearch: = x else binarysearch: = N+1end;

Phương pháp này được áp dụng khi mảng đã có thứ tự.

Page 56: Chapter2 Phan tich do phuc tap cua mot so giai thuat sap thu tu va tim kiem

56

Độ phức tạp của giải thuật tìm kiếm chia đôi

Hệ thức truy hồi của giải thuật này là:

CN CN/2 + 1

Tính chất: Tìm kiếm chia đôi không bao giờ đòi hỏi nhiều hơn lgN + 1 so sánh cho một sự tìm kiếm thành công hay không thành công.