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

TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ THUẬT GIẢI 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 (710.91 KB, 35 trang )

CHƯƠNG I : TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ THUẬT GIẢI
CHƯƠNG II : MỘT SỐ THUẬT TOÁN TÌM KIẾM VÀ SẮP XẾP
CHƯƠNG III : DANH SÁCH LIÊN KẾT - NGĂN XẾP VÀ HÀNG ĐỢI
CHƯƠNG IV : CÂY
0 1 2 3 4 5 6 7 8
I. KHÁI NIỆM & KHAI BÁO BIẾN
a
4
4
14
14
22
22
38
38
27
27
15
15
n
6
6
Cú pháp khai báo các phần tử của mảng
#define size 200
int n; // số phần tử thực tế
<Kiểu dữ liệu> <Tên mảng> [size];
1. Nhập & Xuất mảng
II. MỘT SỐ TÁC VỤ CƠ BẢN
#include <iostream.h>
#define size 200
int a[size];


void main()
{
int n, i;
//Nhap so phan tu
cin >> n

//Nhap day
for (i=0;i<n;i++)
cin >> a[i];

//Xuat day
for (i=0;i<n;i++)
cout << a[i] << “ ”;
}
1. Nhập & Xuất mảng
II. MỘT SỐ TÁC VỤ CƠ BẢN
void Input (int mang[ ], int n)
{
int i;
for (i = 0 ; i < n ; i++)
{
cout << " Nhap phan tu thu "
<< i + 1 <<" : ";
cin >> mang[i];
}
}
void Output (int mang[ ], int n)
{
int i;
for (i = 0 ; i < n ; i++)

cout << mang[i] << “ ”;
cout <<"\n";
}
0 1 2 3 4 5 6 7 8
2. Chèn 1 phần tử x vào mảng tại vị trí thứ k
a
4
4
14
14
22
22
38
38
27
27 15
15
n=6
n=6
n=7
n=7
II. MỘT SỐ TÁC VỤ CƠ BẢN
k
19
19
void Insert (int x, int a[ ], int& n, int k)
{
int i;
if ( k > n + 1 )
cout <<"Khong the chen \n";

else
{
n++;
for (i = n; i >= k; i )
a[i] = a[i-1];
a[i] = x;
}
}
0 1 2 3 4 5 6 7 8
2. Xóa 1 phần tử x trong mảng tại vị trí thứ k
A
4
4
14
14
22
22
38
38
27
27
15
15
n=6
n=6
n=5
n=5
II. MỘT SỐ TÁC VỤ CƠ BẢN
k
void Delete (int a[ ], int& n , int k)

{
int i;
if ( k > n )
cout <<" Khong the xoa \n";
else
{
for (i = k-1; i < n; i++)
a[i]=a[i+1];
n ;
}
}
II. TÌM KIẾM
1. Tuần tự
Ý Tưởng :
13
1 2 n
3 5 10 13 6 9
a[0] a[n-1]
i=0 i=1
i
i=2 i=3
3
Tìm thấy tại
vị trí 419
i=4 i=5
-1
Tìm không thấy
II. TÌM KIẾM
1. Tuần tự
Ý Tưởng :


Duyệt từ đầu đến phần tử cần tìm

Nếu tìm thấy thì dừng, ngược lại thì duyệt tới cuối
mảng thì cho kết quả tìm không thấy
II. TÌM KIẾM
1. Tuần tự
Giải thuật :
Bước 1 : Cho i = 0
Bước 2 : Nếu a[i] == x thì dừng chương trình, xuất kết quả tìm thấy
Bước 3 : Ngược lại tăng i lên một đơn vị
Bước 4 : Lặp lại bước 2 và 3 đến khi i >= n thì qua bước 5
Bước 5 : Kết luận không tìm thấy
II. TÌM KIẾM
1. Tuần tự
Giải thuật :
Hàm Sequence_Search
Cho i = 0
Thực hiện
Nếu a[i] == x thì
dừng ct, trả về kết quả tìm thấy
ngược lại tăng i thêm 1
Lặp lại thực hiện đến khi i >= n
Trả về kết quả tìm không thấy
Hàm Sequence_Search
Cho i = 0
Thực hiện
Nếu a[i] == x thì
dừng ct, trả về kết quả tìm thấy
ngược lại tăng i thêm 1

Lặp lại thực hiện đến khi i >= n
Trả về kết quả tìm không thấy
int Sequence_Search (int a[ ], int n, int x)
{
int i = 0;
do
{
if (a[i] == x)
return i;
else
i++;
} while (i < n);
return -1;
}
int Sequence_Search (int a[ ], int n, int x)
{
int i = 0;
do
{
if (a[i] == x)
return i;
else
i++;
} while (i < n);
return -1;
}
Cài đặt chương trình
Input :
a : mảng
x : giá trị phần tử cần tìm

Output :
i : vị trí của x trong mảng
-1 : tìm không thấy
Input :
a : mảng
x : giá trị phần tử cần tìm
Output :
i : vị trí của x trong mảng
-1 : tìm không thấy
II. TÌM KIẾM
2. Nhị phân
3 5 10 13 16 19 23 25 30 33 36 49
Left Right
36
m=(Left + Right)/2
= (0+11)/2
= 5
a[m]
m=(Left + Right)/2
= (6+11)/2
= 8
a[m]
m=(Left + Right)/2
= (9+11)/2
= 10
a[m]
Tìm thấy tại
vị trí 11
m
II. TÌM KIẾM

2. Nhị phân
3 5 10 13 16 19 23 25 30 33 36 49
Left Right
23
m=(Left + Right)/2
= (0+11)/2
= 5
a[m]
m=(Left + Right)/2
= (6+11)/2
= 8
a[m]
m=(Left + Right)/2
= (6+7)/2
= 6
a[m]
Tìm thấy tại
vị trí 7
m
II. TÌM KIẾM
2. Nhị phân
3 5 10 13 16 19 23 25 30 33 36 49
Left Right
24
m=(Left + Right)/2
= (0+11)/2
= 5
a[m]
m=(Left + Right)/2
= (6+11)/2

= 8
a[m]
m=(Left + Right)/2
= (6+7)/2
= 6
a[m]
Tìm ko thấy
-1
m=(Left + Right)/2
= (7+7)/2
= 7
a[m]
II. TÌM KIẾM
2. Nhị Phân
Ý Tưởng :

Phạm vi tìm kiếm ban đầu của chúng ta là từ phần tử đầu tiên của dãy (Left = 1)
cho đến phần tử cuối cùng của dãy (Right = 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 (Right = 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 (Left = 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 của chúng ta không còn nữa (Left > Right).
II. TÌM KIẾM

2. Nhị Phân
Giải thuật :
Bước 1 : Cho L = 0; R = n-1
Bước 2 : m = (L + R) /2
Bước 3 : Nếu a[m] = x thì dừng ct, báo kết quả
Bước 4 : Nếu x > a[m] thì tăng L lên m + 1
Bước 5 : Ngược lại giảm R xuống m - 1
Bước 6 : Lặp lại bước 2,3,4,5,
cho đến khi L > R thì qua bước 7
Bước 7 : Kết luận không tìm thấy
II. TÌM KIẾM
2. Nhị Phân
Giải thuật:
Hàm Binary_Search
Cho Left = 0, Right = n-1
Thực hiện trong khi Left <= Right
m=(Left + Right)/2
Nếu a[m] == x thì
dừng ct, trả về kết quả tìm thấy (m)
ngược lại
nếu x > a[m] thì Left = m+1
ngược lại Right = m-1
Kết thúc tìm kiếm trong mảng tìm không
thấy Trả về kết quả tìm không thấy (-1)
Hàm Binary_Search
Cho Left = 0, Right = n-1
Thực hiện trong khi Left <= Right
m=(Left + Right)/2
Nếu a[m] == x thì
dừng ct, trả về kết quả tìm thấy (m)

ngược lại
nếu x > a[m] thì Left = m+1
ngược lại Right = m-1
Kết thúc tìm kiếm trong mảng tìm không
thấy Trả về kết quả tìm không thấy (-1)
int Binary_Search(int x, int a[ ], int n)
{
int L = 0, R = n-1; int m;
while (L <= R)
{
m = (L + R) /2;
if (a[m] == x) return m; //Tim thay x
else
if (x > a[m])
L = m +1;
else R = m -1;
}
return -1; //Ket luan khong tim thay x
}
int Binary_Search(int x, int a[ ], int n)
{
int L = 0, R = n-1; int m;
while (L <= R)
{
m = (L + R) /2;
if (a[m] == x) return m; //Tim thay x
else
if (x > a[m])
L = m +1;
else R = m -1;

}
return -1; //Ket luan khong tim thay x
}
Cài đặt chương trình
3 15 30 23 6 11 53 25 13 8 36 49
3 6 8 11 13 15 23 25 30 36 53 49
III. SẮP XẾP
1. Selection Sort (Sắp xếp chọn trực tiếp)
Ý Tưởng :
III. SẮP XẾP
1. Selection Sort ( Sắp xếp chọn trực tiếp)
Ý Tưởng :

Ta chọn phần tử có giá trị nhỏ nhất trong N
phần tử chưa có thứ tự này để đưa lên đầu
nhóm.

Sau lần thứ nhất chọn lựa phần tử nhỏ nhất
và đưa lên đầu nhóm chúng ta còn lại N-1 phần
tử đứng ở phía sau dãy M chưa có thứ tự.

Chúng ta tiếp tục chọn phần tử có giá trị nhỏ
nhất trong N-1 phần tử chưa có thứ tự này để
đưa lên đầu nhóm chưa thứ tự này (N-1)

Làm tiếp tục cho đến cuối dãy
Là phương pháp sắp xếp bằng cách chọn phần tử bé
nhất xếp vào vị trí thứ nhất, tương tự với các phần tử

nhỏ thứ hai, thứ ba,
Giải thuật:
Hàm Selection Sort
{
for i=0 to n – 2
{
min = i
for j = i + 1 to n – 1
if a[j] < a[min] thì min = j
đổi chỗ a[i] với a[min]
}
}
Hàm Selection Sort
{
for i=0 to n – 2
{
min = i
for j = i + 1 to n – 1
if a[j] < a[min] thì min = j
đổi chỗ a[i] với a[min]
}
}
void SelectionSort (int a[ ], int n)
{
int i, j, min;
for(i = 0; i <= n-2; i++)
{
min = i;
for (j = i+1; j <= n-1; j++)
if (a[j] <a[min]) min = j;


swap(a[i] , a[min]);
}
}
void SelectionSort (int a[ ], int n)
{
int i, j, min;
for(i = 0; i <= n-2; i++)
{
min = i;
for (j = i+1; j <= n-1; j++)
if (a[j] <a[min]) min = j;

swap(a[i] , a[min]);
}
}
Cài đặt chương trình
III. SẮP XẾP
1. Sắp xếp chọn trực tiếp (Straight Selection Sort )
III. SẮP XẾP
2. Sắp xếp chèn trực tiếp (Straight Insertion Sort )
Ý Tưởng :
III. SẮP XẾP
2. Sắp xếp chèn trực tiếp (Straight Insertion Sort)
Ý Tưởng :

Nó lần lượt lấy các phần tử của danh sách chèn vào vị trí thích hợp
trong một danh sách mới đã được sắp.


Bắt chước cách sắp xếp quân bài của những người chơi bài. Muốn
sắp một bộ bài theo trật tự người chơi bài rút lần lượt từ quân thứ 2, so
với các quân đứng trước nó để chèn vào vị trí thích hợp.
III. SẮP XẾP
2. Sắp xếp chèn trực tiếp (Straight Insertion Sort)
Ý Tưởng :

×