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

Chương 2 tìm KIẾM sắp xếp

79 432 0

Đ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 79
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

Giải Thuật Tìm Kiếm Tuyến Tính Ý Tưởng: Tiến hành so sánh x với phần tử thứ nhất, thứ hai…của mảng A cho đến khi gặp được phần tử có khóa cần tìm, hoặc đã tìm hết mảng mà không thấy x..

Trang 1

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

2.1.1 Bài toán tìm kiếm 2.1.2 Giải thuật tìm kiếm tuyến tính 2.1.3 Giải thuật Tìm kiếm nhị phân

2.2 Các giải thuật sắp xếp

2.2.1 Bài toán sắp xếp 3.2.1 Giải thuật đổi chổ trực tiếp –Interchange Sort

Chương 2 TÌM KIẾM & SẮP XẾP

Trang 2

2.1 Các Giải Thuật Tìm Kiếm

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

2.1.2 Giải thuật tìm kiếm tuyến tính

2.1.3 Giải thuật Tìm kiếm nhị phân

Trang 3

2.1.1 Bài Toán Tìm Kiếm

Trong thực tế, khi thao tác, khai thác dữ liệu hầu như lúc nào cũng phải thực hiện thao tác tìm kiếm

Kết quả của việc tìm kiếm có thể là không tìm thấy hoặc tìm thấy

Nếu kết quả là tìm thấy thì nhiều khi còn phải xác định xem vị trí của phần tử tìm thấy là ở đâu?

Việc tìm kiếm nhanh hay chậm tùy thuộc vào trạng thái và trật tự của dữ liệu trên đó

Có 2 thuật toán chính: Tìm kiếm tuyến tính & Tìm kiếm nhị phân

Trang 5

2.1.2 Giải Thuật Tìm Kiếm Tuyến Tính

Ý Tưởng:

Tiến hành so sánh x với phần tử thứ nhất, thứ hai…của mảng A cho đến khi gặp được phần tử có khóa cần tìm, hoặc đã tìm hết mảng mà không thấy x

Ưu điểm: Thuật toán này có thể cho ta thực hiện tìm kiếm khi các phần tử trong mảng chưa được sắp xếp

Nhược điểm: Sẽ mất rất nhiều thời gian nếu như không có phần tử chúng ta cần tìm

Trang 6

VD:Tìm x = 14

12 3 5 1 14 9 14 0 10 2 7

14

Chưa hết mảng

Tìm thấy tại vị trí thứ

5

Tìm thấy tại vị trí thứ

Hết mảng không tìm thấy

Minh Họa

Trang 7

Giải thuật:

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

• a[i] != x ; // Thực hiện bước 3.

Bước 3 :

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

• Nếu i > N // Hết mảng.Không tìm thấy.Dừng

Trang 9

2.1.3 Giải Thuật Tìm Kiếm Nhị Phân

- Nếu X = M[Mid]: Tìm thấy

- Nếu X < M[Mid]: Rút ngắn phạm vi tìm kiếm

về nửa đầu của dãy M (Last = Mid–1)

- Nếu X > M[Mid]: Rút ngắn phạm vi tìm kiếm

về nửa sau của dãy M (First = Mid+1)

Trang 10

Ưu điểm: Thuật toán tìm nhị phân sẽ rút ngắn đáng

kể thời gian tìm kiếm

Nhược điểm: Chỉ thực hiện được trên dãy đã có thứ tự

Trang 12

X > M[mid]

Trang 13

7 12 23 34 46 59 69 77

Minh Họa

90 85

Tìm giá trị X = 85 (Tìm thấy)

Đã tìm

M

Mid = 9 M[mid] = 85

L F

Trang 14

Giả sử dãy M gồm 10 phần tử có khóa như sau (N = 10)

2 3 4 5 8 15 17 22 25 30

Trang 15

Giả sử dãy M gồm 10 phần tử có khóa như sau (N=10)

1 3 4 5 8 15 17 22 25 30

Trang 16

B7: IF (X > M[Mid])

B7.1: First = Mid + 1

Trang 17

Cài Đặt

int Timnhiphan(int M[ ], int N, int X){

int First = 1; int Last = N;

while (First <= Last){

int Mid = (First + Last)/2;

}

Trang 18

2.2 Các giải thuật sắp xếp

2.2.1 Bài toán sắp xếp

2.2.2 Giải thuật đổi chổ trực tiếp –Interchange Sort

2.2.3 Giải thuật chọn trực tiếp-Selection Sort

2.2.4 Giải thuật chèn trực tiếp-Insert Sort

2.2.5 Giải thuật nổi bọt – Bubble Sort

2.2.6 Giải thuật nhanh – Quick Sort

Trang 19

2.2.1 Bài Toán Sắp Xếp

 Để thuận tiện và giảm thiểu thời gian thao tác mà đặc biệt là để tìm kiếm Do vậy sắp xếp dữ liệu là một trong những thao tác cần thiết và thường gặp trong quá trình lưu trữ, quản lý dữ liệu

Trang 21

2.2.2 Giải Thuật Đổi Chổ Trực

Trang 25

a[j]=tam;

Trang 26

Đánh giá giải thuật:

 Ðối với giải thuật đổi chỗ trực tiếp, số lượng các phép so sánh xảy ra không phụ thuộc vào tình trạng của dãy số ban đầu

 Nhưng số lượng phép hoán vị thực hiện tùy thuộc vào kết qủa so sánh

Trang 27

2.2.3 Giải Thuật Chọn Trực Tiếp –

Trang 29

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

11 45 28 73 61 16 23 7

Min

16

Minh Họa

Trang 30

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

Trang 31

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

Trang 32

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

Trang 33

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

11

Min

45 61

16

Minh Họa

Trang 34

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

Trang 35

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

11

Kết thúc vì mảng chỉ còn 1 phần tử

16

Minh Họa

Trang 36

Ban đầu Lần 1 Lần 2 Lần 3 Lần 4 Lần 5 Lần 6

11 45 28 73 61 7 23 16

11 45 28 73 61 16 23 7

11 45 28 73 61 16 23 7

11 16 28 73 61 45 23 7

11 16 23 73 61 45 28 7

11 16 23 28 61 45 73 7

11 16 23 28 45 61 73 7

11 16 23 28 45 61 73 7

Lần 7

Trang 39

Đánh giá giải thuật:

Ðối với giải thuật chọn trực tiếp, có thể thấy rằng ở 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 Số lượng phép so sánh này không phụ thuộc vào tình trạng của dãy

số ban đầu, do vây kết luận:

Trang 40

2.2.4 Giải Thuật Chèn Trực Tiếp –Insert Sort

 Tiếp tục cho đến thêm khi xong a n vào đoạn a 1 a 2 …

a n-1 sẽ có dãy a 1 a 2 a n được sắp xếp

Trang 41

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

13 7 9 4 11 3 17 15

13 7 9 4 11 3 17 15

Minh Họa

Trang 43

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

11 3 17 15

7 9 13 4

13 7 9 4 11 3 17 15

Minh Họa

Trang 44

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

Trang 45

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

17 15

4 7 9 11 13 3

13 7 9 4 11 3 17 15

Minh Họa

Trang 46

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

Trang 47

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

3 4 7 9 11 13 17 15

Kết thúc

13 7 9 4 11 3 17 15

Minh Họa

Trang 48

13 7 9 4 11 3 17 15

Ban đầu Lần 1 Lần 2 Lần 3 Lần 4 Lần 5 Lần 6

Trang 50

Cài Đặt void InsertSort(int a[],int n)

a[pos+1]=a[pos];

pos ;

}a[pos+1]=x; //chèn x vào dãy}

Trang 51

Đánh giá giải thuật:

 Các phép so sánh xảy ra trong vòng lặp while tìm

vị trí thích hợp pos, và mỗi lần xác định vị trí đang xét không thích hợp, sẽ dời chỗ phần tử a[pos] tương ứng

 Giải thuật thực hiện tất cả n – 1 vòng lặp while, do

số lượng phép so sánh và dời chỗ này phụ thuộc vào tình trạng của dãy số ban đầu, nên chỉ có ước lượng trong từng trường hợp sau:

Trang 52

2.2.5 Giải Thuật Nổi Bọt –Bubble Sort

 Ý Tưởng:

 Xuất phát từ cuối dãy ,đổi chổ các cặp phần tử kế cận để đưa phần tử đó về vị trí đứng đầu dãy hiện hành

 Sau đó sẽ không xét đến nó ở bước tiếp theo

 Do vậy ở lần xử lý thứ i sẽ có vị trí dầu dãy là i phần

tử được sắp xếp

 Lặp lại xử lý trên cho đến khi không còn phần tử nào

để xét

Trang 53

Minh Họa

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

11 5 7 3 9 2

2 1

3 4 5 6

i

11 5 7 3 9 2

2 1

3 4 5 6

Ban đầu

Trang 54

Minh Họa

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

1 11 5 7 3 9 2

2 1

3 4 5 6 7 8

i

j

Trang 55

Minh Họa

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

1 2 11 5 7 3

2 1

3 4 5 6

i

Trang 56

Minh Họa

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

1 2 3 11 5 7 9

2 1

3 4 5 6 7 8

i

j

Trang 57

Minh Họa

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

1 2 3 5 11 7

2 1

3 4 5 6

i

Trang 58

Minh Họa

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

1 2 3 5 7 11 9

2 1

3 4 5 6 7 8

i

j

Trang 59

Minh Họa

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

1 2 3 5 7 9

2 1

3 4 5 6

i

Kết

Trang 60

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

Minh Họa

1

11 5 7 3 9 2 15

2 1

3 4 5 6 7

1 11 5 7 3 9 2

2 1

3 4 5 6 7

1 2 11 5 7 3 9

2 1

3 4 5 6 7

1 2 3 11 5 7 9

2 1

3 4 5 6 7

1 2 3 5 11 7 9

2 1

3 4 5 6 7

1 2 3 5 7 11 9

2 1

3 4 5 6 7

1 2 3 5 7 9 11

2 1

3 4 5 6 7

1 2 3 5 7 9 11

2 1

3 4 5 6 7 8

Trang 61

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—;

Bước 3:

i=i+1;

Nếu i>N-1: Hết dãy, dừng

Trang 62

int tam=M[j];

M[j]=M[j-1];

M[j-1]=tam;

}}

Trang 63

Đánh giá giải thuật:

 Ðối với giải thuật nổi bọt, số lượng các phép so sánh xảy ra không phụ thuộc vào tình trạng của dãy

số ban đầu

 Nhưng số lượng phép hoán vị thực hiện tùy thuộc vào kết qủa so sánh

Trang 64

Ý Tưởng:

 Phân hoạch dãy M thành 2 dãy con thỏa mãn điều kiện: “1/2 Dãy bên trái chứa các phần tử nhỏ hơn các phần tử của 1/2 Dãy bên phải”

 Nếu dãy con có nhiều hơn 1 phần tử thì thực hiện sắp xếp dãy con (Đệ qui)

2.2.6.Giải Thuật Sắp Xếp Nhanh – Quick Sort

Trang 72

Minh Họa

Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần

1 2 3 5 7 9 10 15

Không còn đoạn nào cần sắp xếp

Trang 74

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—;

Bước 3:

i=i+1;

Nếu i>N-1: Hết dãy, dừngNgược lại: Lặp lại Bước 2

Trang 75

Cài Đặt void QuickSort(int M[], int First, int Last){

int i, j, tam, x;

x = M[(First+Last)/2]; i = First; j = Last;

do { while (M[i] <x) i++;

while (M[j] > X) j ;

if (i <= j) {

Trang 76

Đánh giá giải thuật:

+ Trường hợp tốt nhất, khi mảng M có thứ tự tăng:

Số phép gán: Gmin = N-1

Số phép so sánh: Smin = N×Log2(N)/2

Số phép hoán vị: Hmin = 0+ Trường hợp xấu nhất, khi phần tử X được chọn

ở giữa dãy con là giá trị lớn nhất:

Số phép gán: Gmax = N×(N-1)/2

Số phép so sánh: Smax = (N-1)×(N-1)

Số phép hoán vị: Hmax = N×(N-1)/2+ Trung bình:

Số phép gán: Gavg = (N-1)×(N+2)/4

Số phép so sánh: Savg = N×[Log2(N)+2N–2]/4

Trang 77

Chi phí trung bình O(n*log2n)

Chi phí cho trường hợp xấu nhất O(n2)

Chi phí này phụ thuộc vào cách chọn phần tử trục:

- Nếu chọn được phần tử có giá trị trung bình ta

sẽ chia thành 2 dãy bằng nhau

- Nếu chọn nhằm phần tử nhỏ nhất (hay lớn nhất)  O(n2)

Trang 78

1 Trình bày tư tưởng và minh họa giải thuật tìm kiếm tuyến tính, tìm kiếm nhị phân

2 Cài đặt thuật toán tìm tuyến tính bằng cách:

Trang 79

1 Trình bày tư tưởng và minh họa 5 giải thuật sắp xếp

2 Cài đặt 5 giải thuật sắp xếp theo các trường hợp và điền kết quả số lần thực hiện các phép toán vào bảng sau:

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

TỪ KHÓA LIÊN QUAN

w