41
Bài 5: CÁC THUẬT TOÁN SẮP XẾP VÀ TÌM KIẾM CƠ BẢN

Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Embed Size (px)

DESCRIPTION

Tìm hiểu các giải thuật sắp xếp cơ bản trên cấu trúc dữ liệu mảng Tìm hiểu các giải thuật tìm kiếm cơ bản trên cấu trúc dữ liệu mảng Đánh giá và so sánh hiệu quả các giải thuật

Citation preview

Page 1: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Bài 5:CÁC THUẬT TOÁN

SẮP XẾP VÀ TÌM KIẾM CƠ BẢN

Page 2: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Tìm hiểu về cách sử dụng mảng thông thường trong

VB.Net

Tìm hiểu về lớp ArrayList và cách sử dụng trong VB.Net

So sánh mảng thông thường và ArrayList

Áp dụng việc đo thời gian thực hiện lệnh

Nhắc lại bài cũ

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 2

Page 3: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Tìm hiểu các giải thuật sắp xếp cơ bản trên cấu trúc dữ

liệu mảng

Tìm hiểu các giải thuật tìm kiếm cơ bản trên cấu trúc dữ

liệu mảng

Đánh giá và so sánh hiệu quả các giải thuật

Mục tiêu bài học hôm nay

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 3

Page 4: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp là quá trình xử lý một danh sách các phần tử để

đặt chúng theo một thứ tự nào đó (tăng dần, giảm dần)

dựa trên nội dung thông tin lưu giữ tại mỗi phần tử.

Định nghĩa bài toán sắp xếp

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 4

3 1 6 8 5

1 3 5 6 8

Sắp xếp tăng dần

Page 5: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Bài toán: Cho trước một dãy số a1 , a2 ,… , aN được

lưu trữ trong cấu trúc dữ liệu mảng

Sắp xếp dãy số a1 , a2 ,… , aN là thực hiện việc bố trí lại

các phần tử sao cho hình thành được dãy mới ak1 , ak2

,… ,akN có thứ tự (ví dụ thứ tự tăng) nghĩa là aki > aki-1.

Bài toán sắp xếp dãy số

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 5

Page 6: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Để quyết định được những tình huống cần thay đổi vị trí các

phần tử trong dãy, cần dựa vào kết quả của một loạt phép so

sánh

-> Hai thao tác so sánh và gán là các thao tác cơ bản của hầu

hết các thuật toán sắp xếp.

Chú ý: Khi xây dựng một thuật toán sắp xếp cần tìm cách

giảm thiểu những phép so sánh và đổi chỗ không cần thiết để

tăng hiệu quả của thuật toán

Bài toán sắp xếp dãy số

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 6

Page 7: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp lựa chọn (Selection Sort)

Sắp xếp nổi bọt (Bubble Sort)

Sắp xếp chèn (Insertion Sort)

3 giải thuật sắp xếp cơ bản

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 7

Page 8: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp lựa chọn

Ý tưởng:

Chọn phần tử nhỏ nhất trong N phần tử ban đầu, đưa phần tử

này về vị trí đầu dãy hiện hành; sau đó loại nó khỏi danh sách

sắp xếp tiếp theo.

Xem dãy hiện hành chỉ còn N-1 phần tử của dãy ban đầu, bắt

đầu từ vị trí thứ 2; lặp lại quá trình trên cho dãy hiện hành… đến

khi dãy hiện hành chỉ còn 1 phần tử.

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 8

Page 9: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp lựa chọn

Các bước sắp xếp tăng dần:

Bước 1: i = 1 // lần xử lý đầu tiên

Bước 2: Tìm phần tử nhỏ nhất a[min] trong dãy hiện hành từ a[i]

đến a[N]

Bước 3: Hoán vị a[min] và a[i]

Bước 4: Nếu i < N-1 thì i = i+1; Lặp lại Bước 2

Ngược lại: Dừng

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 9

Page 10: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

LƯU ĐỒ GIẢI

THUẬT SẮP XẾP

LỰA CHỌN

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 10

Page 11: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp lựa chọnVí dụ: Cho dãy số a:

{12, 2, 8, 5, 1, 6, 4, 15 }

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 11

Page 12: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 12

Page 13: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp lựa chọnCài đặt giải thuật bằng ngôn ngữ VB.Net

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 13

Public Sub SelectionSort()

Dim outer, inner, min, temp As Integer

For outer = 0 To numElements - 2

min = outer

For inner = outer + 1 To numElements - 1

If (arr(inner) < arr(min)) Then

min = inner

End If

Next

‘ Hoán đổi phần tử nhỏ nhất với phần tử đầu mảngtemp = arr(outer)

arr(outer) = arr(min)

arr(min) = temp

Next

End Sub

Page 14: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp lựa chọn

Đánh giá giải thuật trên: Ở lượt thứ i, bao giờ cũng cần (n-i) lần so

sánh để xác định phần tử nhỏ nhất hiện hành. Do vậy số lần so

sánh:

Số lần hoán vị (một hoán vị bằng 3 phép gán) lại phụ thuộc vào tình

trạng ban đầu của dãy số, ta chỉ có thể ước lược trong từng trường

hợp như sau:

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 14

Trường hợp Số lân so sánh Số phép gán

Tốt nhất n(n-1)/2 3(n-1)

Xấu nhất n(n-1)/2 n(n-1)/2 + 3(n-1)

Page 15: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Ý tưởng: xuất phát từ đầu dãy, so sánh 2 phần tử cạnh nhau để đưa

phần tử nhỏ hơn lên trước, sau đó lại xét cặp tiếp theo cho đến khi

tiến về đầu dãy. Nhờ vậy, ở lần xử lý thứ i sẽ tìm được phần tử ở vị

trí đầu dãy là i

Các bước:Bước 1: i=1 // lần xử lý đầu tiênBước 2: j=N // duyệt từ cuối dãy trở về vị tríTrong khi j>i thực hiện:

Nếu a[j]<a[j-1]: hoán vị a[j] và a[j-1]j= j-1

Bước 3: i=i+1 // lần xử lý tiếp theoNếu i>N-1 thì dừngNgược lại, lặp lại Bước 2

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 15

Sắp xếp nổi bọt

Page 16: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

LƯU ĐỒ GIẢI

THUẬT SẮP XẾP

NỔI BỌT

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 16

Page 17: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Ví dụ: Cho dãy số a:{12, 2, 8, 5, 1, 6, 4, 15 }

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 17

Sắp xếp nổi bọt

Page 18: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 18

Page 19: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 19

Page 20: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Cài đặt giải thuật bằng ngôn ngữ VB.Net

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 20

Public Sub BubbleSort()

Dim outer, inner, temp As Integer

For outer = numElements - 1 To 2 Step -1

For inner = 0 To outer - 1

If (arr(inner) > arr(inner + 1)) Then

temp = arr(inner)

arr(inner) = arr(inner + 1)

arr(inner + 1) = temp

End If

Next

Next

End Sub

Sắp xếp nổi bọt

Page 21: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp nổi bọtĐánh giá giải thuật:

Ở lượt thứ i, bao giờ cũng cần (n-i+1) lần so sánh để xác địnhphần tử nhỏ nhất hiện hành. Do vậy số lần so sánh:

Số lượng phép hoán vị thực hiện tùy thuộc vào kết quả so sánh,có thể ước lược trong từng trường hợp như sau

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 21

Trường hợp Số lân so sánh Số lần hoán vị

Tốt nhất 0

Xấu nhất

Page 22: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp chèn

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 22

Ý tưởng:

Trước hết ta xem phần tử a[0] là một dãy đã có thứ tự.

Bước 1: Chèn phần tử a[1] vào đúng vị trí trong dãy a[0] trên

sao cho dãy gồm a[0] và a[1] được sắp thứ tự

Bước 2: Chèn phần tử a[2] vào đúng vị trí trong dãy gồm a[0],

a[1] sao cho dãy gồm a[0], a[1], a[2] được sắp thứ tự

Tổng quát bước i, chèn phần tử a[i] vào đúng vị trí trong dãy đã

sắp xếp a[0],… a[i-1] sao cho dãy a[0], a[1],… a[i] được sắp thứ

tự.

Sau N-1 bước thì kết thúc

Page 23: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

LƯU ĐỒ GIẢITHUẬT SẮPXẾP CHÈN

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 23

Page 24: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp chèn

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 24

Ví dụ: cho danh sách gồm 7 phần tử, trong đó 3 phần tử đầu đã đcsắp xếp

Để tiếp tục sắp xếp phần tử thứ tư a4 = 6 vào danh sách con đó, tatìm vị trí thích hợp của nó là sau 3 và trước 7.

Làm tiếp theo với a5 = 4 ta được

Page 25: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp chèn

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 25

Làm tiếp theo với a6 = 2 ta được

Cuối cùng chèn a7 = 5

Page 26: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp chènCài đặt giải thuật bằng ngôn ngữ VB.Net

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 26

Public Sub InsertionSort()

Dim inner, outer, temp As Integer

For outer = 1 To numElements - 1

temp = arr(outer)

inner = outer

While (inner > 0 AndAlso (arr(inner - 1) >= temp))

arr(inner) = arr(inner - 1)

inner -= 1

End While

arr(inner) = temp

Next

End Sub

Page 27: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Sắp xếp chèn

Đánh giá giải thuật: Độ phức tạp giải thuật phụ thuộc

vào số lần so sánh. Ở lượt thứ i, tối đa cần i lần so sánh

để tìm được vị trí chèn thích hợp. Do vậy số lần so sánh

tối đa là:

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 27

Page 28: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Đánh giá các giải thuật sắp xếp

Cả 3 GT đều có độ phức tạp là 0(n2)

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 28

Page 29: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Bài toán tìm kiếm

Tập dãy số a1 , a2 ,…, aN được lưu trữ ở dạng mảng

Cần tìm phần tử có giá trị x xem có trong mảng không

29

a1 a2 a3 … aN - 1 aN

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 30: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Các giải thuật tìm kiếm

Có 2 giải thuật tìm kiếm thường áp dụng:

Tìm kiếm tuyến tính: thường thực hiện với các mảng chưa được

sắp xếp thứ tự

Tìm kiếm nhị phân: thường thực hiện với các mảng đã sắp xếp

thứ tự

30Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 31: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Tìm kiếm tuyến tính

Ý tưởng: Tiến hành so sánh x lần lượt với các phần tử thứ nhất, thứ

hai… của mảng a cho đến khi gặp được phần tử có giá trị x cần tìm,

hoặc đã tìm đến hết mảng mà không thấy x.

Ví dụ: Tìm phần tử có giá trị x = 10

31

Đã tìm thấy tại vịtrí số 5

7 5 12 41 10 32 13 9 15 31 2 3 4 5 6 7 8 9 10

10

7

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 32: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Giải thuật tìm kiếm tuyến tínhĐầu vào: mảng a[i] và xĐầu ra: Trả về True nếu tìm thấy, ngược lại trả về False

Bước 1:i = 1; // bắt đầu từ phần tử đầu tiên của dãy

Bước 2:So sánh a[i] với x, có 2 khả năng:a[i] = x: Tìm thấy. Dừnga[i] != x: Sang Bước 3.

Bước 3:i = i+1; // xét tiếp phần tử kế trong mảngNếu i >N: Hết mảng, không tìm thấy. DừngNgược lại: Lặp lại Bước 2.

32Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 33: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Lưu đồ giải thuậttìm kiếm tuyến tính

33Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 34: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Cài đặt giải thuật

34Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Function SeqSearch(ByVal arr() As Integer,

ByVal sValue As Integer) As Integer

Dim index As Integer

For index = 0 To arr.GetUpperBound(0)

If (arr(index) = sValue) Then

Return True

End If

Next

Return False

End Function

Page 35: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Cài đặt giải thuậtGiải thuật trả về vị trí của phần tử tìm thấy trong mảng, hoặc trả về -1

nếu không tìm thấy:

35Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Function SeqSearch(ByVal arr() As Integer,

ByVal sValue As Integer) As Integer

Dim index As Integer

For index = 0 To arr.GetUpperBound(0)

If (arr(index) = sValue) Then

Return index

End If

Next

Return -1

End Function

Page 36: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Tìm kiếm nhị phânÝ tưởng:

Tìm kiếm kiểu “tra từ điển”

Giải thuật tìm cách giới hạn phạm vi tìm kiếm sau mỗi

lần so sánh x với một phần tử trong dãy đã được sắp

xếp.

Tại mỗi bước, so sánh x với phần tử nằm ở vị trí giữa

của dãy tìm kiếm hiện hành:

Nếu x nhỏ hơn thì sẽ tìm kiếm ở nửa trước của dãy.

Ngược lại, tìm ở nửa sau của dãy.

36Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 37: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Giải thuậtBước 1: left = 1; right = N; // tìm kiếm trên tất cả các phầntửBước 2:

mid = (left+right)/2; // lấy mốc so sánhSo sánh a[mid] với x, có 3 khả năng:a[mid] = x: Tìm thấy. Dừnga[mid] > x: //tìm tiếp x trong dãy con aleft .. amid -1

right =mid - 1;a[mid] < x: //tìm tiếp x trong dãy con amid +1 .. aright

left = mid + 1;

Bước 3:Nếu left <= right //còn phần tử chưa xét tìm tiếp.

Lặp lại Bước 2.Ngược lại: Dừng //Ðã xét hết tất cả các phần tử.

37Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 38: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

LƯU ĐỒ GIẢITHUẬT

38Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 39: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Tìm kiếm nhị phân

39

Ví dụ minh họa tìm x = 41

x

ml m

x

m

x

3 14 16 19 22 41 46 51 63 711 2 3 4 5 6 7 8 9 10

Tìm thấy x tạivị trí 6

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 40: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Đánh giá các giải thuật tìm kiếm

Nếu tìm kiếm trên mảng dữ liệu chưa được sắp xếp thứ

tự thì sử dụng phương pháp tìm kiếm tuyến tính

Nếu tìm kiếm trên mảng đã sắp xếp thứ tự thì sử dụng

phương pháp tìm kiếm nhị phân.

Độ phức tạp thuật toán của hai phương pháp: 0(n)

40Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản

Page 41: Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT

Tổng kếtSắp xếp và tìm kiếm là những bài toán quan trọng trong lập trình

máy tính.

Việc sắp xếp và tìm kiếm thường được tiến hành trên mảng

3 giải thuật cơ bản để sắp xếp với độ phức tạp 0(n2)

2 giải thuật tìm kiếm với độ phức tạp 0(n):

Tìm kiếm tuyến tính: thực hiện trên mảng chưa được sắp thứ tự

Tìm kiếm nhị phân: thực hiện trên mảng đã được sắp thứ tự

Slide 5 - Các thuật toán sắp xếp và tìm kiếm cơ bản 41