Slide bài giảng Cấu trúc dữ liệu: Chương 1: Giới thiệu tổng quan về Cấu trúc dữ liệu Chương 2: Các giải thuật tìm kiếm và sắp thứ tự
Trang 1CẤU TRÚC DỮ LIỆU 1
Trang 2ĐỀ CƯƠNG CHI TIẾT
Chương 1 : Giới thiệu tổng quan
về Cấu trúc dữ liệu
1.1.Giới thiệu 1.2.Cấu trúc dữ liệu cơ bản
Trang 3ĐỀ CƯƠNG CHI TIẾT
Chương 2 : Các giải thuật tìm
kiếm và sắp thứ tự
2.1.Giới thiệu chung
2.2.Các giải thuật tìm kiếm 2.3.Các giải thuật sắp thứ tự
Trang 4ĐỀ CƯƠNG CHI TIẾT
Chương 3 : Danh sách đặc(mảng)
3.1.Định nghĩa 3.2.Các phép toán trên mảng 3.3.Ưu điểm và khuyết điểm của mảng
3.4.Stack và Queue
Trang 5ĐỀ CƯƠNG CHI TIẾT
Chương 4 : Danh sách liên kết
4.1.Định nghĩa
4.2.Các phép toán trên danh sách liên kết
4.3.Danh sách liên kết kiểu FIFO và
LIFO
4.4.Một số ứng dụng của danh sách liên kết
4.5.Stack và Queue
4.6.Sắp thứ tự trên danh sách liên kết
4.7.Danh sách đa liên kết
Trang 6ĐỀ CƯƠNG CHI TIẾT
Chương 5 : Cấu trúc cây
5.1.Cây nhị phân tìm kiếm5.2.Cây cân bằng
Trang 7CÁC TÍNH ĐIỂM
- Bài tập lớn miễn thi
- Điểm thi cuối môn
Trang 8TÀI LIỆU THAM KHẢO
1 N.Wirth , Algorithms + Data Structure = Programs
Trang 9CHƯƠNG 1
□ Vai trò của cấu trúc dữ liệu
CTDL + Thuật toán = Chương trình
(Data Structures + Algorithms = Program)
Trang 10Các cấu trúc dữ liệu đơn giản
Trang 12Ví dụ
Xây dựng một cấu trúc dữ liệu lưu trữ cho chương trình: Nhập vào toạ độ của 3 điểm của một tam giác và một điểm P, xác định điểm
P nằm trong hay ngoài tam giác
Trang 13typedef struct TAMGIÁC
Trang 14Chương 2
Sắp xếp và tìm kiếm
Trang 15Tìm kiếm
- Tìm kiếm tuần tự
- Tìm kiếm nhị phân
Trang 16Sắp xếp
1 Thuật toán sắp xếp nội
+ Sắp xếp chọn trực tiếp (Selection sort)
+ Sắp xếp chèn trực tiếp (Insertion Sort) + Sắp xếp nổi bọt (Bubble Sort)
+ Shake sort (cải tiến của Bubble Sort) + Sắp xếp trộn (Merge Sort)
Trang 17Tìm kiếm
- Tìm kiếm tuần tự
- Tìm kiếm nhị phân
Trang 18Tìm kiếm tuần tự
Ý tưởng:
- Nếu tìm thấy thì dừng
Ngược lại, nếu duyệt đến cuối
mảng thì cho kết quả không tìm thấy
Trang 24Thuật toán
Bước 2: Nếu a[i] == x thì dừng chương
trình, xuất kết quả tìm thấy
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
Trang 25Cài đặt
Input:
a: mảngn: số phần tử mảngx: phần tử cần tìmOutput:
i : vị trí x trong mảng-1: nếu không tìm thấy x
Trang 26int Sequence_Search(int a[],int n, int x) {
Trang 27Độ phức tạp
Độ phức tạp là của phép tìm kiếm tuần tự là : O(n)
Trang 32Bài tập
Tìm vị trí của giá trị x = 1
Trang 33Thuật toán
Bước 2: m = (L + R) /2
Bước 4: Nếu a[m] < x thì tăng L lên m+ 1Bướ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
Trang 34int Binary_Search (int a[], int n, int x)
}
Trang 35Độ phức tạp
Độ phức tạp là của phép tìm kiếm nhị phân là : O(log2n)
Trang 36Sắp xếp
Sắp xếp chọn trực tiếp
Trang 37Ví dụ
Sắp xếp một hàng ngang 7
em sinh viên theo thứ tự
tăng dần theo chiều cao
Trang 38Nêu ý tưởng (sx tăng)
Từ một mảng n phần tử
- Chọn phần tử nhỏ nhất , đổi chổ với phần tử thứ nhất
- Từ n – 1 phần tử còn lại, ta cũng chọn phần tử nhỏ nhất và đổi chổ với phần tử thứ 2
- Cứ tiếp tục như vậy cho đến hết mảng
Trang 39if x[min]>x[j] then min = j
t = x[i]
x[i] = x[min]
x[min] = t }
}
Trang 40Cài đặt
□ Mời một bạn lên bảng viết lại chương trình sắp xếp theo giải thuật chọn trực tiếp
(selection sort) bằng ngôn ngữ C++
□ Các bạn lớp tự viết vào giấy nháp rồi so
sánh với bạn
Trang 41Bài tập Selection sort
□ Sắp xếp theo thứ tự giảm dần mảng sau:
Trang 42Sắp xếp
Sắp xếp chèn trực tiếp
(Insertion Sort)
Trang 43Nêu ý tưởng (sx tăng)
Từ một mảng n phần tử
- Chọn phần tử đầu tiên coi như là một mảng mới có 1 ptử đã có thứ tự
- Chèn phần tử thứ 2 vào vị trí thích hợp của mảng mới để có 1 mảng 2 ptử
đã có thứ tự.
- Chèn phần tử thứ 3 vào vị trí thích hợp của mảng mới.
- Cứ tiếp tục như vậy cho đến hết Khi
đó ta có được một mảng đã có thứ tự
Trang 44Mã giảHàm InsertionSort()
Trang 45Cài đặt
□ Mời một bạn lên bảng viết lại chương trình sắp xếp theo giải thuật chọn chèn trực tiếp
(Insertion Sort) bằng ngôn ngữ C++
□ Các bạn lớp tự viết vào giấy nháp rồi so
sánh với bạn
Trang 46Bài tập Insertion Sort
□ Sắp xếp theo thứ tự giảm dần mảng sau:
Trang 47Sắp xếp
Sắp xếp nổi bọt (Bubble Sort)
Trang 48Nêu ý tưởng (sx tăng)
Từ một mảng n phần tử
- Xét từ cặp phần tử từ cuối danh sách lên đầu mảng, và đổi chổ chúng với nhau để phần tử luôn nhỏ đứng trước (vật nhẹ luôn được nổi lên trên)
- Lặp lại cho đến khi không còn việc đổi chổ 2 phần tử nữa, khi đó ta sẽ được mảng có thứ tự
Trang 49t = a[j]
a[j] = a[j-1]
a[j-1] = t }
}
Kiểm tra phần tử
nhỏ có được nổi
lên chưa
Trang 50Cài đặt
□ Mời một bạn lên bảng viết lại chương trình sắp xếp theo giải thuật chọn chèn trực tiếp
(Bubble Sort) bằng ngôn ngữ C++
□ Các bạn lớp tự viết vào giấy nháp rồi so
sánh với bạn
Trang 51Nhận xét Bubble Sort
□ Những phần tử nhỏ sau mỗi lần duyệt đều
sẽ di chuyển đến đúng vị trí của nó, trong khi các phần tử lớn nhất chỉ được hạ 1
Trang 52Bài tập Bubble Sort
□ Sắp xếp theo thứ tự giảm dần mảng sau:
Trang 53Sắp xếp
Sắp xếp Shake Sort
( Cải tiến của Bubble Sort )
Trang 54Nêu ý tưởng (sx tăng)
Trong mỗi lần duyệt, ta chia 2 hướng ngược nhau:
- Chiều đi: Duyệt danh sách từ dưới lên, đẩy phần tử có giá trị nhỏ về đầu danh sách
- Chiều về: Duyệt danh sách từ trên xuống, đẩy phần tử có giá trị lớn về cuối danh sách
*Lưu ý: sau mỗi lần duyệt thì ta lưu lại những vị trí đã đúng thứ tự, để các lần duyệt sau được thu hẹp lại, tránh những phép so sánh không cần thiết
Trang 55Mã giả
ShakeSort()
{
top = 1 ; //Đầu danh sách
bottom = n - 1; //Cuối danh sách
top = k+1
//Lượt về
for i = top to bottom
if a[ i – 1 ]> a [ i ] {
bottom = k - 1 }
while (top <= bottom) }
Trang 56Cài đặt
□ Mời một bạn lên bảng viết lại chương trình sắp xếp theo giải thuật chọn chèn trực tiếp
□ Các bạn lớp tự viết vào giấy nháp rồi so
sánh với bạn
Trang 57Bài tập Shake Sort
□ Sắp xếp theo thứ tự giảm dần mảng sau:
□ 4 2 1 10 6 8 4
Trang 59Sắp xếp
Sắp xếp Trộn
( MergeSort )
Trang 60Nêu ý tưởng (sx tăng)
Trong mỗi lần duyệt, ta chia 2 hướng ngược nhau:
- Chiều đi: Duyệt danh sách từ dưới lên, đẩy phần tử có giá trị nhỏ về đầu danh sách
- Chiều về: Duyệt danh sách từ trên xuống, đẩy phần tử có giá trị lớn về cuối danh sách
*Lưu ý: sau mỗi lần duyệt thì ta lưu lại những vị trí đã đúng thứ tự, để các lần duyệt sau được thu hẹp lại, tránh những phép so sánh không cần thiết
Trang 61Mã giả
ShakeSort()
{
top = 1 ; //Đầu danh sách
bottom = n - 1; //Cuối danh sách
top = k+1
//Lượt về
for i = top to bottom
if a[ i – 1 ]> a [ i ] {
bottom = k - 1 }
while (top <= bottom) }
Trang 62Cài đặt
□ Mời một bạn lên bảng viết lại chương trình sắp xếp theo giải thuật chọn chèn trực tiếp
□ Các bạn lớp tự viết vào giấy nháp rồi so
sánh với bạn
Trang 63Bài tập Shake Sort
□ Sắp xếp theo thứ tự giảm dần mảng sau:
□ 4 2 1 10 6 8 4
Trang 64Chương 3
Danh sách đặc
(mảng)
Trang 65Định nghĩa mảng
Là một danh sách mà
cách phần tử được sắp xếp kế nhau trong bộ
nhớ
Trang 66Cách khai báo mảng
mảng 1 chiều: int a[10]
mảng 2 chiều: int a[10][10]
C++:
Kiểu_dữ_liệu tên_mảng[spt][spt]…;
Trang 69Chèn một pt vào mảng
Giải thuật:
+ Khi thêm một phần tử x vào vị trí
i (0<=i<n) thì các phần tử từ a[i] đến a[n-1] được di chuyển ra
phía sau một vị trí
+ Gán a[i] = x
+ Tăng spt lên một đơn vị
Trang 72Cài đặtvoid Chèn()
for (int i=n-1 ; i>=k ; i ) a[i+1] = a[ i]
a[k] = x;
n++;
}
Trang 73Xoá một phần tử của
mảng
Giải thuật:
+ Khi xoá phần tử i, các phần
tử từ a[i+1] đến a[n-1] được
di chuyển ra phía trước một vị trí
+ giảm spt đi một đơn vị
Trang 74Cài đặtvoid Xoá_1_pt()