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

Chương 2 TÌM KI M & S P X P2.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 pptx

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 (3.34 MB, 79 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
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
Chương 2
TÌM KIẾM & SẮP XẾP
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
2
2.1 Các Giải Thuật Tìm Kiếm
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
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
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
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
4
 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?
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
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.
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
6
VD:Tìm x = 14
12 3 5 1 14 9 0 10 2 7

14
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ứ 5
1 2 3 4 5 6 7 8 9 10
12 3 5 1 14 9 0 10 2 7
VD:Tìm x = 30
30
Chưa
hết
mảng
Hết mảng
không tìm
thấy
1 2 3 4 5 6 7 8 9 10
 Minh Họa
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
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
Ngược lại: Lặp lại bước 2.
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
8
 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.
}
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
 ðánh giá giải thuật
ðộ phức tập tính toán cấp n: T(n)=O(n)
9
2.1.3 Giải Thuật Tìm Kiếm Nhị Phân
 Ý Tưởng:
- 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 CNTT Trường TC TÂY NAM Á
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ự.
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
1 12 34 4623 59 69 77
11
Minh Họa
59
9085
69 777 12 34 4623
L
Tìm giá trị X = 85 (Tìm thấy)
M
X
Mid = 5
M[mid]= 46
X > M[mid]
© Dương Thành Phết-www.thayphet.net

Khoa CNTT Trường TC TÂY NAM Á
F
7 12 34 4623 59 69 77
12
Minh Họa
59
9085
69 77
Tìm giá trị X = 85 (Tìm thấy)
M
X
Mid = 8
M[mid] = 77
X > M[mid]
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
F
L
7 12 34 4623 59 69 77
13
Minh Họa
9085
Tìm giá trị X = 85 (Tìm thấy)
ðã tìm
thấy tại
vị trí 9
M
X
Mid = 9
M[mid] = 85

X = M[mid]
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
LF
Minh Họa
Tìm kiếm phần tử có giá trị X = 5 (tìm thấy):
True54False443
TrueFalseFalse43False432
TrueFalseFalse32False411
FalseTrueFalse85False101B.ñầu
X>
M[Mid]
X<
M[Mid]
X=
M[Mid]
M[Mid]Mid
First>L
ast
LastFirst
Lần
lặp
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
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
14
 Minh Họa
Tìm kiếm phần tử có giá trị X = 7 (không tìm thấy)
True454

TrueFalseFalse 54False443
TrueFalseFalse43False432
TrueFalseFalse32False411
FalseTrueFalse85False101B.ñầu
X>
M[Mid]
X<
M[Mid]
X=
M[Mid]
M[Mid]Mid
First>
Last
LastFirst
Lần
lặp
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
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
15
16
 Giải thuật:
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 CNTT Trường TC TÂY NAM Á
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;
if (X == M[Mid])
return Mid;
if (X < M[Mid])
Last = Mid – 1;
else
First = Mid + 1;
}
return -1;
}
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
 ðánh giá giải thuật
ðộ phức tập tính toán cấp n: T(n)=O(Log

2
n)
18
2.2 Các giải thuật sắp xếp
© Dương Thành Phết-www.thayphet.net
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
Khoa CNTT Trường TC TÂY NAM Á
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.
 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.
© Dương Thành Phết-www.thayphet.net
Khoa CNTT Trường TC TÂY NAM Á
20
© Dương Thành Phết-www.thayphet.net
Khái niệm về nghịch thế:
a
n

a
n-1
. . . . . . . . . . a
3
a
2
a
1
Giả sử mảng có thứ tự tăng dần, nếu i<j và a
i
>a
j
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ử)
Khoa CNTT Trường TC TÂY NAM Á
2.2.2. Giải Thuật ðổi Chổ Trực Tiếp-Interchange Sort
21
© Dương Thành Phết-www.thayphet.net
 Ý 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.
Khoa CNTT Trường TC TÂY NAM Á
22
© Dương Thành Phết-www.thayphet.net

 Minh Họa
2
12
8 5 1 6 4
2
12
8 5 1 6 4
i=1 j=2 j=5i=2 j=3 j=4i=3 j=7i=4 j=6i=5 i=6 i=7
Khoa CNTT Trường TC TÂY NAM Á
23
© Dương Thành Phết-www.thayphet.net
212 8 5 1 6 4
121 8 5 2 6 4
21 12 8 5 6 4
2
1
4 12 8 6 5
2
1
4 5 12 8 6
2
1
4 5 6 12 8
2
1
4 5 6 8 12
Ban ñầu
Lần 1
Lần 2
Lần 3

Lần 4
Lần 5
Lần 6
Khoa CNTT Trường TC TÂY NAM Á
24
© Dương Thành Phết-www.thayphet.net
 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]<a[i]: ðổi chổ a[i] và 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.
Khoa CNTT Trường TC TÂY NAM Á
25
© Dương Thành Phết-www.thayphet.net
 Cài ðặt
void InterchangeSort(int a[], int N )
{ int i, j,tam;
for (i = 0 ; i<N-1 ; i++)
for (j =i+1; j < N ; j++)
if(a[j ]< a[i])
{

tam=a[i];
a[i]=a[j];
a[j]=tam;
}
}
Khoa CNTT Trường TC TÂY NAM Á

×