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

Cấu trúc dữ liệu và giải thuật - Chương 2 - Tìm kiếm và sắp xếp ppsx

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 (495.57 KB, 204 trang )

1
Cấu trúc dữ liệu và giải thuật
(Data structure and Algorithms)
2
Tìm kiếm và sắp xếp
Ch
ươ
ng II.
3
I. CÁC GIẢI THUẬT TÌM KIẾM NỘI
1. Tìm kiếm tuyến tính
2. Tìm kiếm nhị phân
II. CÁC GIẢI THUẬT SẮP XẾP NỘI
1. Chọn trực tiếp (Selection sort)
2. Chèn trực tiếp (Insertion sort)
3. Đổi chỗ trực tiếp (Interchange sort)
4. Nổi bọt (Buble sort)
5. Sắp xếp cây (Heap sort)
6. Sắp xếp dựa trên phân hoạch (Quick sort)
7. Sắp xếp trộn trực tiếp (Merge sort )
4
I. CÁC GIẢI THUẬT TÌM KIẾM NỘI
1. Tìm kiếm tuyến tính
2. Tìm kiếm nhị phân
5
* Bài toán tìm ki
ế
m
• Cho dãy n phần tử, giả sử chúng được lưu trữ dưới dạng mảng a[1],
a[2], …., a[n], và các phần tử là số tự nhiên.
• Hãy tìm vị trí của phần tử có giá trị là x trong mảng


•Có 2 phương pháp tìm kiếm:
Tìm kiến tuyến tính
Tìm kiếm nhị phân
6
1. Tìm ki
ế
m tuy
ế
n tính
Các bước tiến hành như sau:
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[1] với x, có 2 khả năng
 a[i]=x: Tìm thấy. Dừng
 a[i] <>x: Sang Bước 3
Bước 3: 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.
a. Tư tưởng giải thuật
Tiến hành so sánh x lần lượt với phần tử thứ nhất, thứ 2, …., của mảng cho đến
khi gặp được phần tử có khoá cần tìm, hoặc tìm hết mảng mà không thấy x.
7
1. Tìm ki
ế
m tuy
ế
n tính
Các bước tiến hành như sau:
b. Ví dụ:

Cho dãy số a:
1546158212
Hãy tìm phần tử
x=8
8
1. Tìm ki
ế
m tuy
ế
n tính
b. Ví dụ:
1546158212
X=8
i=1 : a[1
]<>
8
9
1. Tìm ki
ế
m tuy
ế
n tính
b. Ví dụ:
1546158212
X=8
i=2 : a[2]<>8
10
1. Tìm ki
ế
m tuy

ế
n tính
b. Ví dụ:
1546158212
X=8
i=3 : a[3]=8=x
• K
ế
t qu

: Tìm th

y x=8

v

trí th

3 !
11
c. Thuật toán
1. Tìm ki
ế
m tuy
ế
n tính
Function TuyenTinh (A, n, X)
{Nếu tìm thấy X, hàm trả về giá trị là vị trí của x trong dãy, ngược lại trả về giá trị 0}
Begin
1) { Khởi đầu}

i:=1;
2) {Tìm khoá x trong dãy}
While (a[i] <>x)and (i<n) do i:=i+1;
3) {Tìm thấy hay không}
If i=n+1 then return(0)
Else return(i)
End;
12
d. Nhận xét
1. Tìm ki
ế
m tuy
ế
n tính
 Mỗi lần thực hiện lặp while phải tiến hành kiểm tra 2 điểm kiện i<n và a[i]<>x.
Nhưng thực ra chỉ cần kiểm tra điều kiện a[i]<>x bằng cách sử dụng kỹ thuật lính
canh.
Thuật toán cải tiến
 Kỹ thuật lính canh: Đặt thêm phần tử x vào cuối mảng, như vậy bảo đảm luôn
tìm được x trong mảng, sau đó dựa vào vị trí tìm để kết luận
15 846158212
P
h

n

t


n

h

c
a
n
h
13
e. Đánh giá giải thuật
1. Tìm ki
ế
m tuy
ế
n tính
Giả sử xác suất các phần tử trong mảng nhận giá trị
x là như nhau
(N+1)/2Trung bình
Phần tử cuối cùng có giá trị x hoặc không tìm thấy x
N+1Xấu nhất
Phần tử đầu tiên có giá trị x1Tốt nhất
Giải thíchSố lần so sánhTrường hợp
Độ phức tạp thuật toán T(n)=O(n)
14
a. Tư tưởng giải thuật
2. Tìm ki
ế
m nh

phân
• Áp dụng với những dãy đã có thứ tự (giả sử thứ tự tăng), các
phần tử trong dãy có quan hệ a

i-1
<=a
i
<=a
i+1
- Dãy a
1
, a
2
, …, a
n
đã được sắp xếp tăng dần, để tìm phần tử x, có thể
tiến hành như sau:
•Nếu x>a
i
: Thì x có thể xuất hiện trong đoạn [a
i+1
, a
n
]
•Nếu x<a
i
: Thì x có thể xuất hiện trong đoạn [a
1
, a
i-1
]
- Giải thuật tìm kiếm nhị phân sẽ tìm cách giới hạn phạm vi tìm kiếm x sau
mỗi lần so sánh với 1 phần tử trong dãy. Ý tưởng của giải thuật là tại mỗi
bước tiến hành so sánh x với phần tử nằm ở vị trí giữa của dãy hiện

hành, dựa vào kết qủa so ánh này để quyết định giới hạn dãy tìm kiếm ở
bước kế tiếp là nửa trên hay nửa dưới của dãy hiện hành.
15
a. Tư tưởng thuật toán
2. Tìm ki
ế
m nh

phân
- Giả sử dãy tìm kiếm gồm các phần tử a[Left], …, a[Right] các
bước tiến hành như sau:
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) div 2 //
lấy mốc so sánh
So sánh a[mid] với x có 3 khả năng
 a[mid]=x: Tìm thấy. Dừng
 a[i] >x: Tìm tiếp x trong dãy con trái
a[Left], …, a[mid-1]
Right:=mid-1;
 a[i] <x: Tìm tiếp x trong dãy con phải
a[mid+1], …, a[right]
Left:=mid+1;
Bước 3: Nếu left<=right //
còn phần tử chưa xét

tìm tiếp
Lặp lại bước 2
Ngược lại: Dừng //
Đã xét hết tất cả các phần tử

16
2. Tìm ki
ế
m Nh

phân
Các bước tiến hành như sau:
b. Ví dụ:
Cho dãy số a:
1512865421
Hãy tìm phần tử
x=8
17
2. Tìm ki
ế
m Nh

phân
b. Ví dụ:
1512865421
X=8
left=1; right=8; mid=4
•So sánh (x=8) > (a[mid]=5) 

 Tìm kiếm nửa bên phải
left:=4+1=5
right:=8
mid:=(left+right) div 2=6
18
2. Tìm ki

ế
m Nh

phân
b. Ví dụ:
1512865421
X=8
left=5; right=8; mid=6

So sánh x= a[mid]=8 

 Tìm thấy x=8 ở vị trí 6 !
• Dừng
19
c. Thu

t toán tìm ki
ế
m nh

phân
Function NhiPhan (A, n, X)
{Cho dãy A gồm n phần tử tăng dấn. Giải thuật này tìm xem trong dãy có phần tử nào có giá trị bằng X
hay không. Ở đây dùng các biến l, r, m để ghi nhận chỉ số phần tử đầu, phần tử cuối, phần tử giữa của
dãy. Nếu tìm kiếm được thoả, giá trị cho ra là vị trí của phần tử, nếu không thì cho ra giá trị 0}
Begin
1) { Khởi đầu}
l:=1; r:=n;
2) {Tìm}
While l<=r do Begin

3) {Tính chỉ sổ giữa}
m:=(l+r) div 2;
4) {So sánh}
If x<k[m] then r:=m-1 else if x>k[m] then l:=m+1
Else return(m)
End;
5) {Tìm kiếm không thoả mãn}
Return(0)
End;
Dạng đệ quy của giải thuật
20
d. Đánh giá giải thuật
2. Tìm ki
ế
m Nh

phân
Giả sử xác suất các phần tử trong mảng nhận giá
trị x là như nhau
Log
2
n/2
Trung bình
Không có x trong mảng
log
2
nXấu nhất
Phần tử đầu tiên có giá trị x1Tốt nhất
Giải thíchSố lần so sánhTrường hợp
Độ phức tạp thuật toán T(n)=O(log

2
n)
21
1. Ch

n tr

c ti
ế
p (Selection sort)
2. Chèn tr

c ti
ế
p (Insertion sort)
3.
Đổ
i ch

tr

c ti
ế
p (Interchange sort)
4. N

i b

t (Buble sort)
5. S


p x
ế
p cây (Heap sort)
6. S

p x
ế
p d

a trên phân ho

ch (Quick sort)
7. S

p x
ế
p tr

n tr

c ti
ế
p (Merge sort )
II. CÁC GI

I THU

T S


P X

P N

I
22
II. Sắp xếp
 Sắp xếp là quá trình xử lý một danh sách các phần tử (hoặc các
bản ghi) để đặt chúng theo thứ tự thoả mãn một tiêu chuẩn nào
đó dựa trên nội dung thông tin lưu giữ tại mỗi phần tử.
 Không mất tính tổng quát, giả sử mỗi phần tử trong danh sách
có một khoá để phân biệt, chúng ta sẽ tiến hành sắp xếp dãy
khoá này.
 Quy ước: Sắp xếp dãy số nguyên được lưu trữ bởi mảng
a[1], a[2], …, a[n]
Theo thứ tự tăng dần
23
1.Chọn trực tiếp
(Selection Sort)
24
Nguyên tắc cơ bn của phơng pháp này là ở lợt thứ i,
ta sẽ chọn trong dãy a
i
, a
i+1
, , a
n
phn t nhỏ nhất và đổi
chỗ nó với a
i


Nh vậy sau j lợt, j khoá nhỏ hơn đã lần lợt ở các vị trí
thứ nhất, thứ hai,

., thứ j theo đúng thứ tự sắp xếp.
1. Chn trc tip
a. T

t

ng gi

i thu

t
25
a. T
ư
t
ưở
ng gi

i thu

t
Các bước tiến hành như sau:
B
ướ
c 1: i:=1; //
bắt đầu từ phần tử đầu tiên của dãy

B
ướ
c 2: Tìm ph

n t

a[min] nh

nh

t 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 //
n-1 phần tử đã nằm đúng vị trí
1. Chọn trực tiếp

×