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

Bài giảng Cấu trúc dữ liệu và giải thuật: Tìm kiếm và sắp xếp - Đậu Ngọc Hà Dương

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 (600.51 KB, 56 trang )

1

TÌM KIẾM & SẮP XẾP
Bài giảng Cấu trúc dữ liệu và Giải thuật


Nội d
dung
‰

Tì kiếm
Tìm
kiế
ƒ
ƒ

‰

Tuần tự
Nhị phân

Sắp xếp
ƒ
ƒ
ƒ
ƒ

Bubble sort
Selection sort
Insert sort
Quick sort




Tìm kiếm
3

…

…

Tìm kiếm: duyệt một danh sách và lấy ra phần tử
thoả tiêu chuẩn cho trước.
Là thao tác phổ biến trên máy tính:
† Tìm

mẫu tin trong cơ sở dữ liệu
† Tìm kiếm thơng tin trên Internet…
…

Khảo sát việc tìm kiếm trên mảng/danh sách.


4

Tìm kiếm
Giải thuật
…

Input:
put:
† Mảng A gồm


n phần tử
† Giá trị x cần tìm
…

Trả về:
† Vị

…

trí phần tử x trong A hoặc –1 nếu x không xuất hiện

Thao tác cơ bản:
† So

sánh


5

Tìm kiếm tuần tự
Giải thuật
…

Giải thuật:
†

…

Lần lượt so sánh x với các phần tử của mảng A cho đến khi

gặp được phần tử cần tìm, hoặc hết mảng.

Ví dụ: A = {1, 25, 6, 5, 2, 37, 40}, x = 6
x = 6
1

25

6

5

2

37

40

6

5

2

37

40

2


37

40

x = 6
1

25

x = 6
1

25

6

5

Dừng


6

Tìm kiếm tuần tự
Đánh giá
…

Đánh giá (thao tác so sánh):
† Tốt


nhất: O(1)
† Xấu nhất: O(n)
† Trung bình:
„ Giả

Hiếm khi xảy ra. Tại sao?

sử dữ liệu phân bố đều, xác suất bắt gặp x tại mỗi vị trí
đều như nhau.
„ Mỗi vòng lặp thực hiện 2 thao tác so sánh. Tại sao?
„ Số thao tác = 2*(1 + 2 + … + n) = n + 1
„ Độ phức tạp: O(n)


7

Tìm kiếm tuần tự
Phần tử lính canh
…

Mỗi vịng lặp cần 2 thao tác so sánh:
† Kiểm

tra hết mảng
† Kiểm tra phần tử hiện tại có bằng x
…

…

Phần tử lính canh: đặt giá trị x vào cuối mảng ⇒

không cần kiểm tra điều kiện hết mảng.
Ví dụ: A = {1, 25, 5, 2, 37}, x = 6
1

…

25 5

2

37 6

Trả về:
ề: n nếu
nế khơng tìm thấ
thấy


Tìm kiếm nhịị phân
p
8

…

…

Khi mảng gồm các phần tử được sắp,
sắp tận dụng điều
kiện này để giảm số thao tác.
Ý tưởng:

† Xét

phần tử giữa A[m]
† Nếu A[m] = x, trả về m
† Nếu A[m] > x,
x tìm trong các phần tử bên trái của m
† Nếu A[m] < x, tìm trong các phần tử bên trái của m


9

Tìm kiếm nhị phân
Ví dụ minh hoạ
…

A = {2,
{2 3,
3 6,
6 7,
7 10
10, 16,
16 18},
18} x = 16
2
[0]

3

6


7

10 16

18

[1] [2] [3] [4] [5]

[6]

[4]
2

3

6

7

[5] [6]

10 16

18


Tìm kiếm nhị phân
Chương trình
10


int BinarySearch(int a[], int n, int x)
{
int l = 0, r = n-1;
while (
(l <= r)
) {
int m = (l + r)/2;
if (a[m]==x) return m;
// tìm thấy
else if (x < a[m]) r = m – 1;
else l = m + 1;
}
return –1;
1
// khơ
khơng tìm
ì thấy
hấ
}


11

Tìm kiếm nhị phân
Bài tập
…

Thực hiện việc tìm kiếm đối với các bài tập sau:
†A=


{1, 2, 6, 26, 28, 37, 40}, x = 40

†A=

{1, 2, 6, 26, 28, 37, 40}, x = -7


12

Tìm kiếm nhị phân
Đánh giá

…

Mỗi lần lặp
lặp, chiều dài mảng con phải xét được
giảm ½ so với mảng trước đó.
Mảng ban đầu được chia tối đa k lần với k =
⎣log2n⎦.
Tối đa k vịng lặp được thực hiện trong đó mỗi
vòng lặp thực hiện 1-2 phép so sánh.
Độ phức tạp: O(log2n)

…

Mảng cần được sắp xếp trước!!!

…

…


…


Sắp
p xếp
p
13

…

…
…

…

Sắp xếp: tổ chức các phần tử trong một danh sách
theo thứ tự.
Là bài toán phổ biến trên máy tính.
Nhiều giải thuật sắp xếp đã ra đời.
đời
Khảo sát
Khả
át vàà đánh
đá h giá
iá hiệu
hiệ quảả một
ột số
ố giải
iải thuật

th ật sắp

xếp thông dụng dựa trên mảng.


14

Sắp xếp
Giải thuật
…

Input:
† Mảng A gồm

…

n phần tử.

Output:
hoán vị của A sao cho: A0 ≤ A1 ≤ … ≤ An-1 (sắp
xếp
p tăngg dần).
)

† Một

…

Thao tác cơ bản:
† So


sánh
† Hoán vị (đổi vị trí hai phần tử)


15

Sắp xếp
Các giải thuật
…

Các phương pháp sắp xếp thông dụng:
† Bubble

Sort
† Selection Sort
† Insertion Sort
†Q
Quick Sort
† Merge Sort
† Shell Sort
† Heap Sort
† Radix Sort


Bubble sort
16

…


Giải thuật:
† Xuất

phát từ cuối (đầu) dãy, đổi chỗ các cặp phần tử kế
cận để đưa p
phần tử nhỏ hơn về vị trí đúng
g đầu dãyy
hiện hành.
† Sau đó khơng xét đến nó ở bước kế tiếp.
† Lần xử lý thứ i sẽ có vị trí đầu dãy là i.
† Lặp lại cho đến khi khơng cịn cặp phần tử nào để xét.
…

Ví dụ: sắp xếp dãy A: 15 2 8 7 3 6 9 17


17

Bubble sort
Ví dụ
i=0

j=4

15

2

8


7

3

6

9

17

i=0

j=3

15

2

8

3

7

6

9

17


i=0

j=1

15

2

3

8

7

6

9

17

i=1

j=5

2

15

3


8

7

6

9

17

i=1

j=4

2

15

3

8

6

7

9

17


i=1

j=2

2

15

3

6

8

7

9

17

i=2

j=5

2

3

15


6

8

7

9

17

i=2

j=3

2

3

15

6

7

8

9

17



18

Bubble sort
Ví dụ (tt)
i=3 j=4

2

3

6

15

7

8

9

17

i=4 j=5

2

3

6


7

15

8

9

17

i=5 j=6

2

3

6

7

8

15

9

17

i=6 j=7


2

3

6

7

8

9

15

17

2

3

6

7

8

9

15


17


19

Bubble sort
Chương trình
void BubbleSort(int a[], int n){
for(int i=0; ifor(int j = n-1; j>i; j--){
if( [j]< [j 1])// ế sai
if(a[j]i vị
ị trí
t í thì đổi chỗ
hỗ
HoanVi(a[j],a[j-1]);
}
}
}


20

Bubble sort
Bài tập
…

Mơ tả tình trạng dãy A sau mỗi bước chạy với thuật

toán Bubble sort.
A = {2,
{2 9,
9 5,
5 12,
12 20,
20 15
15, -8
8, 10}


21

Bubble sort
Đánh giá
…

…

Các giải thuật sắp xếp thường có độ phức tạp tương
tự nhau.
Cần một đánh giá chi tiết:
† Các

trường hợp: xấu nhất, tốt nhất, trung bình
† Các thao tác:
„ So

sánh
„ Gán (quan trọng hơn vì tốn nhiều chi phí hơn). Lưu ý: mỗi

thao tác gán vị tốn
ố 3 phép gán


22

Bubble sort
Chương trình
void BubbleSort(int a[], int n){
for(int i=0; ifor(int j = n-1; j>i; j--){
if( [j]< [j 1])
if(a[j]HoanVi(a[j],a[j-1]);
}
}
}

Số lần vòng i
thực hiện?

Số lần vòng j
thực
ự hiện?



23

Bubble sort

Đánh giá
…

Số phép so sánh: không phụ thuộc vào tình trạng
dãy số ban đầu.
n(n − 1)
(n − i − 1) =

2
i =0
n−2

…

Số lượng phép gán: tùy vào kết quả so sánh
† Tốt

nhất: 0 n − 2
3n(n − 1)
† Xấu nhất: ∑ 3( n − i − 1) =
2
i= 0


24

Shaker sort
Cải tiến Bubble sort
…


Nhận xét: Bubble sort có các khuyết điểm:
† Khơng

nhận diện được tình trạng dãy đã có thứ tự hay
khơng
g có thứ tự từng
g phần.
p
† Trong khi phần tử nhỏ được đưa về vị trí đúng rất
nhanh, thì các phần tử lớn lại được đưa về vị trí đúng
rất
ấ chậm.
h
Giải thuật Shaker sort cải tiến các khuyết điểm này.


25

Shaker sort
Cải tiến Bubble sort
…

Cải tiến:
† Duyệt

mảng theo 2 lượt từ 2 phía khác nhau:

„ Lượt



đi: đẩy
y phần
p
tử nhỏ về đầu mảng
g
„ Lượt về: đẩy phần tử lớn về cuối mảng.
† Ghi

nhận lại những đoạn đã sắp.


×