Tải bản đầy đủ (.ppt) (79 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (923.99 KB, 79 trang )

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

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
3.2.2 Giải thuật chọn trực tiếp-Selection Sort
3.2.3 Giải thuật chèn trực tiếp-Insert Sort
3.2.4 Giải thuật nổi bọt – Bubble Sort
3.2.5 Giải thuật nhanh – Quick Sort
2.3. Bài tập
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


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
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương




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

3
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


 Giả sử chúng ta có một mảng M gồm N phần tử.
 Vấn đề đặt ra là có hay không phần tử có giá trị bằng X
trong mảng M?
 Nếu có thì phần tử có giá trị bằng X là phần tử thứ mấy
trong mảng M?

4
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương



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.

5
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


 Minh Họa
Chưa
hết
mảng

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

55

VD:Tìm x = 14

14
12

3

5

1

14

9

0

10

2

7

1

2

3


4

5

6

7

8

9

10

VD:Tìm x = 30

30
12

3

5

1

14

9


0

10

2

7

1

2

3

4

5

6

7

8

9

10

HếtChưa
mảng

hếttìm
không
mảng
thấy

6
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


 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
Ngược lại: Lặp lại bước 2.
7
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương



 Cài Đặt
Int Timtuyentinh (int a[] , int N , int x)
{
int i = 0;
while((i < N) && (a[i] != x))
i++;
if( i == N)
return -1 ; // tìm hết mảng nhưng không có x
else
return i ; //a[i] là phần tử có khóa x.
}
 Đánh giá giải thuật
Độ phức tập tính toán cấp n: T(n)=O(n)
8
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


2.1.3 Giải Thuật Tìm Kiếm Nhị Phân
 Ý Tưởng:

9

- Lần tìm kiếm ban đầu là phần tử đầu tiên của dãy
(First = 1) đến phần tử cuối cùng của dãy (Last = N).
- So sánh giá trị X với giá trị phần tử đứng ở giữa
của dãy M là M[Mid].
- 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)
- Lặp lại quá trình này cho đến khi tìm thấy phần tử
có giá trị X hoặc phạm vi tìm kiếm không còn nữa
(First > Last).
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


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

10
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


Minh Họa
Tìm giá trị X = 85 (Tìm thấy)

Mid = 5
M[mid]= 46
M

F

17

12

23

34

46

L
59

69

77

85

90

X
X > M[mid]
11
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


Minh Họa

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

Mid = 8
M[mid] = 77
F
7

12

23

34

46

59

M
69

L

77

85

90

X
X > M[mid]

12
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


Minh Họa
Tìm giá trị X = 85 (Tìm thấy)
Mid = 9
M[mid] = 85
M

7

12

23

34

46

59

69

77

F


L

85

90

X

Đã tìm
thấy tại
vị trí 9

X = M[mid]
13
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


Minh Họa
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
Tìm kiếm phần tử có giá trị X = 5 (tìm thấy):
Lần
lặp

First Last

First>L
X=

X<
Mid M[Mid]
ast
M[Mid] M[Mid]

X>
M[Mid]

B.đầu

1

10

False

5

8

False

True

False

1

1


4

False

2

3

False

False

True

2

3

4

False

3

4

False

False


True

3

4

4

False

4

5

True

14
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


 Minh Họa
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
Tìm kiếm phần tử có giá trị X = 7 (không tìm thấy)
Lần
lặp


First Last

First>
Last

Mid M[Mid]

X=
X<
M[Mid] M[Mid]

X>
M[Mid]

B.đầu

1

10

False

5

8

False

True


False

1

1

4

False

2

3

False

False

True

2

3

4

False

3


4

False

False

True

3

4

4

False

4

5

False

False

True

4

5


4

True

15
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


 Giải thuật:

16

B1: First = 1
B2: Last = N
B3: IF (First > Last)
B3.1: Không tìm thấy
B3.2: Thực hiện Bkt
B4: Mid = (First + Last)/ 2
B5: IF (X = M[Mid])
B5.1: Tìm thấy tại vị trí Mid
B5.2: Thực hiện Bkt
B6: IF (X < M[Mid])
B6.1: Last = Mid – 1
B6.2: Lặp lại B3
B7: IF (X > M[Mid])
B7.1: First = Mid + 1
B7.2: Lặp lại B3
Bkt: Kết thúc

© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


 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;
if (X == M[Mid])
return Mid;
if (X < M[Mid])
Last = Mid – 1;
else
First = Mid + 1;
}
return -1;
}

 Đánh giá giải thuật
Độ phức tập tính toán cấp n: T(n)=O(Log2n)
17
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


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

18
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


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.
 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ự tăng hoặc giảm dựa trên
nội dung lưu trữ trên mỗi phần tử.
 Có rất nhiều thuật toán sắp xếp song chúng ta chỉ
quan tâm đến 5 giải thuật sắp xếp thường sử dụng.

19
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương



Khái niệm về nghịch thế:
a1

a2

a3

..........

an-1

an

Giả sử mảng có thứ tự tăng dần, nếu i<j và ai>aj thì
gọi là nghịch thế
Mục tiêu của sắp xếp là khử các nghịch thế(bằng cách
hoán vị các phần tử)

20
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


2.2.2. Giải Thuật Đổi Chổ Trực Tiếp-Interchange Sort
 Ý tưởng:
 Xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa
phần tử này.
 Triệt tiêu chúng bằng cách đổi chỗ phần tử này với
phần tử tương ứng trong cặp nghịch thế.

 Lặp lại xử lý trên với các phần tử tiếp theo trong
dãy.

21
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


 Minh Họa
12

2

8

5

1

6

4

12

2

8


5

1

6

4

i=1

j=2
i=2

j=3
i=3

j=4
i=4

j=5
i=5

j=6
i=6

j=7
i=7

22
© Dương Thành Phết-www.thayphet.net


Khoa KTCN Trường ĐH KTKT B.Dương


12

2

8

5

1

6

4

Lần 1

1

12

8

5

2


6

4

Lần 2

1

2

12

8

5

6

4

Lần 3

1

2

4

12


8

6

5

Lần 4

1

2

4

5

12

8

6

Lần 5

1

2

4


5

6

12

8

Lần 6

1

2

4

5

6

8

12

Ban đầu

23
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương



 Giải thuật:
Bước 1 :
i = 1; // bắt đầu từ đầu dãy
Bước 2 :
j = i+1;//tìm các phần tử a[j] < a[i], j>i
Bước 3 :
Trong khi j < N thực hiện
Nếu a[j]j = j+1;
Bước 4 :
i = i+1;
Nếu i < n: Lặp lại Bước 2.
Ngược lại: Dừng.
24
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


 Cài Đặt
void InterchangeSort(int a[], int N )
{
int
i, j,tam;
for (i = 0 ; ifor (j =i+1; j < N ; j++)
if(a[j ]< a[i])
{

tam=a[i];
a[i]=a[j];
a[j]=tam;
}
}
25
© Dương Thành Phết-www.thayphet.net

Khoa KTCN Trường ĐH KTKT B.Dương


×