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

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

41 1,3K 7

Đ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 41
Dung lượng 1,16 MB

Nội dung

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ảngTì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

Trang 1

Bài 5:

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

Trang 2

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ũ

Trang 3

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

Trang 4

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

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

Trang 5

Bài toán : Cho trước một dãy số a 1 , a 2 ,… , a N được

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

Sắp xếp dãy số a 1 , a 2 ,… , a N 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 a k1 , a k2 ,… ,a kN có thứ tự (ví dụ thứ tự tăng) nghĩa là a ki > a ki-1.

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

Trang 6

Để 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ố

Trang 7

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

Trang 8

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

Trang 9

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

Trang 10

LƯU ĐỒ GIẢI

THUẬT SẮP XẾP

LỰA CHỌN

Trang 11

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

Ví dụ: Cho dãy số a:

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

Trang 13

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

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

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ảng

temp = arr(outer) arr(outer) = arr(min) arr(min) = temp

Next

End Sub

Trang 14

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

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

Trang 15

Ý 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ên

Bướ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 theo

Nếu i>N-1 thì dừng Ngược lại, lặp lại Bước 2

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

Trang 16

LƯU ĐỒ GIẢI

THUẬT SẮP XẾP

NỔI BỌT

Trang 17

Ví dụ : Cho dãy số a:

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

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

Trang 20

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

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

Trang 21

Đá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 định

phầ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

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

Xấu nhất

Trang 22

Sắp xếp chèn

Ý 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

Trang 23

LƯU ĐỒ GIẢI

THUẬT SẮP

XẾP CHÈN

Trang 25

Sắp xếp chèn

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

Cuối cùng chèn a 7 = 5

Trang 26

Sắp xếp chèn

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

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

Trang 27

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à:

Trang 28

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

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

Trang 29

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

Tập dãy số a 1 , a 2 ,…, a N đượ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

Trang 30

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ự

Trang 31

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.

Trang 32

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

i = i+1; // xét tiếp phần tử kế trong mảng

Nếu i >N: Hết mảng, không tìm thấy Dừng

Ngược lại: Lặp lại Bước 2.

Trang 33

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

Trang 34

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

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

Trang 35

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

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

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

Trang 36

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.

Trang 37

Giải thuật

Bước 1: left = 1; right = N; // tìm kiếm trên tất cả các phần tử

Bước 2:

mid = (left+right)/2; // lấy mốc so sánh

So sánh a[mid] với x, có 3 khả năng:

Trang 38

LƯU ĐỒ GIẢI

THUẬT

Trang 40

Đá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)

Trang 41

Tổng kết

Sắ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(n 2 )

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ự

Ngày đăng: 23/05/2014, 16:49

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w