You are on page 1of 34

TÌM KIẾM VÀ SẮP XẾP

NHÓM 1
THÀNH VIÊN NHÓM
NỘI DUNG CHÍNH
01
Giới thiệu về tìm kiếm
Võ Tấn Thời
MSSV:22521427 02
Giải thuật tìm
Hà Khả Nguyên
kiếm
MSSV:22520964 03
Giới thiệu về
Trương Quốc Huy
STL
MSSV:22520583 04
Giới thiệu lớp vector và
Trương Quang Huy
một số hàm có sẵn cho
MSSV:22520582
bài toán tìm kiếm
1. Giới thiệu về tìm
kiếm
2. Giải thuật tìm kiếm
Bài toán: Cho mảng A gồm n phần tử và biến K. Tìm vị trí
phần tử có giá trị bằng K trong mảng A
VD: Mảng A( n=8): K=4

A[i] 3 5 1 2 16 90 4 0

i 0 1 2 3 4 5 6 7
2.1. Tìm kiếm tuyến
tính
Ý tưởng: So sánh K lần lượt với
phần tử thứ 1, thứ 2,...của mảng a
cho đến khi gặp được khóa cần tìm
hoặc tìm hết mảng mà không thấy.
2.1. Tìm kiếm tuyến tính
Các bước tiến hành:
Bước 1: Khởi gán i=0;
Bước 2: So sánh a[i] với giá trị k cần tìm. Nếu:
• a[i] == k: Tìm thấy x. Dừng;
• a[i] != k: Sang bước 3;
Bước 3: i = i+1. Nếu:
• i == N: Hết mảng. Dừng;
• i != N: Lặp lại bước 2;
2.1. Tìm kiếm tuyến tính

Hàm trả về 1
nếu tìm thấy,
ngược lại trả
về 0
2.1. Tìm kiếm tuyến tính

Hàm trả về
vị trí nếu
tìm thấy,
ngược lại
trả về -1
2.1. Tìm kiếm tuyến tính
VD: Mảng A( n=8): K=4
3 ≠ 4 5 ≠ 4 1≠ 4 2 ≠ 4 1𝟔 ≠ 49 𝟎 ≠ 4 4 =4
A[i]
3 5 1 2 16 90 4 0
i 0 1 2 3 4 5 6 7
2.1. Tìm kiếm tuyến
tính
Độ phức tạp thuật toán( O(N)):
• Tốt nhất: 1
• Xấu nhất: N
• Trung bình: (N+1)/2
2.2. Tìm kiếm nhị phân
Ý tưởng:
Giả xử ta xét mảng có thứ tự tăng, khi ấy ta có a[i-1]<a[i]<a[i+1]
Nếu K>a[i] thì K chỉ có thể xuất hiện trong đoạn [a[i+1],a[n-1]]
Nếu K<a[i] thì K chỉ có thể xuất hiện trong đoạn [a[0],a[i-1]]
Tại mỗi bước ta so sánh K với phần tử đứng giữa trong dãy tìm kiếm hiện hành, dựa
vào kết quả so sánh này mà ta quyết định giới hạn dãy tìm kiếm ở nữa dưới hay nữa
trên của dãy tìm kiếm hiện hành.
2.2. Tìm kiếm nhị phân
Các bước tiến hành:
Bước 1: Left=0; Right=N-1;
Bước 2: mid=(Left+Right)/2; //chỉ số phần tử giữa trong dãy
So sánh a[mid] với k. Có 3 khả năng:
• a[mid]= k: tìm thấy. Dừng
• a[mid]> k: Right= mid-1;
• a[mid]< k: Left= mid+1;
Bước 3: Nếu Left <=Right ; // còn phần tử trong dãy
Lặp lại bước 2. Ngược lại : Dừng
2.2. Tìm kiếm nhị phân

Hàm trả về
vị trí nếu
tìm thấy,
ngược lại
hàm trả về
giá trị -1
2.2. Tìm kiếm nhị phân

Độ phức tạp thuật toán( O(N)):


• Tốt nhất: 1
• Xấu nhất:
• Trung bình: /2
2.2. Tìm kiếm nhị phân
VD: Mảng A( n=9)
K=76

A[i]
1 2 4 5 16 76 80 110 150
i 0 1 2 3 4 5 6 7 8
2.2. Tìm kiếm nhị phân
VD: Mảng A( n=9)
K=76
16<76
A[i]
1 2 4 5 16 76 80 110 150
i 0 1 2 3 4 5 6 7 8

left mid right


2.2. Tìm kiếm nhị phân
VD: Mảng A( n=9)
K=76
16<76
A[i]
1 2 4 5 16 76 80 110 150
i 0 1 2 3 4 5 6 7 8

mid left right


2.2. Tìm kiếm nhị phân
VD: Mảng A( n=9)
K=76
80>76
A[i]
1 2 4 5 16 76 80 110 150
i 0 1 2 3 4 5 6 7 8

left mid right


2.2. Tìm kiếm nhị phân
VD: Mảng A( n=9)
K=76
80>76
A[i]
1 2 4 5 16 76 80 110 150
i 0 1 2 3 4 5 6 7 8

left
right mid
2.2. Tìm kiếm nhị phân
VD: Mảng A( n=9)
K=76
76=76
A[i]
1 2 4 5 16 76 80 110 150
i 0 1 2 3 4 5 6 7 8

left ht
mid rig
2.2. Tìm kiếm nhị phân
VD: Mảng A( n=9)
K=76
76=76
A[i]
1 2 4 5 16 76 80 110 150
i 0 1 2 3 4 5 6 7 8

left ht
mid rig
3.Giới thiệu STL
• Standard Template Library - thư viện
Template chuẩn của C++
• STL chính là một thư viện chứa những template
của cấu trúc dữ liệu cũng như thuật toán được
xây dựng một cách tổng quát nhất, nhằm hỗ trợ
cho người dùng trong quá trình lập trình.
• Thư viện STL vô cùng rộng lớn, gồm rất nhiều các template
khác nhau.
3.Giới thiệu STL
Nhưng ta có thể chia STL làm 4 phần chính:
• Containers Library: Thư viện chứa các cấu trúc dữ liệu mẫu như
vector, stack, queue, deque, set, map,...
• Algorithm Library: Chứa các thuật toán viết sẵn để thao tác với
dữ liệu.
• Iterator Library: Là các biến lặp, sử dụng để truy cập, duyệt các
phần tử dữ liệu của các containers. Về cơ bản, nó giống như các
biến chạy trên dữ liệu nhưng truy cập vào địa chỉ của dữ liệu.
• Numeric Library: Chứa các hàm toán học.
4.1.Giới thiệu Vector
Vector là kiểu dữ liệu mảng động - hỗ trợ người dùng lưu trữ các
phần tử có cùng kiểu. Nhưng khác với mảng thông thường, vector
rất linh hoạt và có nhiều phương thức để hỗ trợ người dùng

Một số ưu điểm của kiểu vector trong C++


• Không cần phải khai báo kích thước của mảng vì vector có khả
năng tự resize.
• Tự động điều chỉnh kích thước để chèn phần tử nếu vector đã đầy.
• Cho biết số lượng các phần tử đang được lưu trữ.
• Cho phép sử dụng chỉ số âm (chẳng hạn như A[-6], A[-5],…).
4.2.Thao tác thường dùng với vector
Khai báo: vector < {kiểu dữ liệu} > {tên_vector};

Khai báo thư viện chứa vector

Tạo một vector gồm 10


phần tử

Để truy cập một phần tử trong vector, ta sử dụng toán tử [] giống


như mảng (trước hết vị trí đó phải tồn tại trong vector)
4.2.Thao tác thường dùng với vector
Lấy số lượng phần tử và kiểm tra rỗng:

Lấy số lượng phần tử của vector

Kiểm tra vector rỗng


4.2.Thao tác thường dùng với vector
Thêm và xóa phần tử:

Thêm phần tử 5 vào cuối của vector

Xóa phần tử cuối của vector


4.2.Thao tác thường dùng với vector
Duyệt vector:

Sử dụng vòng lặp (tương tự mảng)


4.2.Thao tác thường dùng với vector
Duyệt vector:
Khai báo:
vector < {Kiểu phần tử} > :: iterator {Tên biến lặp};

Sử dụng biến lặp (iterator)


4.2.Thao tác thường dùng với vector
Duyệt vector:
Khai báo:
for (auto {Tên biến lặp} : {Tên_vector})
{
{Các_câu_lệnh};
}

Sử dụng biến auto


4.2.Thao tác thường dùng với vector
Hàm tìm kiếm trong vector

Tìm kiếm phần tử x trong vector v, trả về true nếu tìm thấy và false
nếu không tìm thấy.

Trả về địa chỉ của phần tử x trong vector v


4.2.Thao tác thường dùng với vector
Hàm sắp xếp trong vector

Sắp xếp vector v theo thứ tự tăng dần


(từ vị trí đầu tiên đến vị trí cuối cùng)
4.3.Bài toán
Nhập một dãy số nguyên dương A với số phần tử không biết trước và giá trị k.
Thao tác nhập kết thúc khi phần tử vào có giá trị A[i] <= 0. In ra màn hình:
• Vị trí i của phần tử có giá trị k ở trong A hoặc in ra -1 nếu không tìm thấy
• 5 giá trị lớn nhất của A

Ví dụ:

INPUT OUTPUT
1 2 8 3 7 4 6 10 9 21 0 5
4 21 10 9 8 7
X

MỜI MỌI
NGƯỜI ĐẶT
CÂU HỎI

You might also like