ĐỀ CƯƠNG ÔN TẬP MÔN CTDL & TT CÓ LỜI GIẢIPHẦN I... Phân tích giải thuật sẽ đánh giá các giải thuật và tìm ra giải thuật tốt nhất... Có thể thừa hoặc thiếu bộ nhớ khi xó
Trang 1ĐỀ CƯƠNG ÔN TẬP MÔN CTDL & TT CÓ LỜI GIẢI
PHẦN I LÝ THUYẾT CHƯƠNG I
1.1 Các khái niệm cơ bản
- Mô hình dữ liệu : là mô hình toán học cùng với các phép toán có thể thực hiện trên
các đối tượng của mô hình
- Kiểu dữ liệu trừu tượng : là một mô hình dữ liệu được xét cùng với một số xác định
các phép toán
- Giải thuật : là một dãy các câu lệnh chặt chẽ và rõ ràng, xác định một dãy các thao tác
trên một số đối tượng nào đó sao cho sau một số hữu hạn bước thực hiện ta đạt được kết quả mong muốn
- Cấu trúc dữ liệu : Cách thức tổ chức biểu diễn dữ liệu mà theo đó dữ liệu được lưu trữ và được xử lý trong MTĐT, được gọi là cấu trúc dữ liệu.
- Kiểu dữ liệu :
+ Mỗi kiểu DL trong ngôn ngữ lập trình thường đại diện cho một loại dữ liệu trong thực tế
+ Trong ngôn ngữ lập trình, một kiểu dữ liệu T được xác định bởi một bộ <V, O> trong đó :
V : tập các giá trị hợp lệ mà một đối tượng kiểu T có thể lưu trữ
O : tập các thao tác xử lý có thể thi hành trên đối tượng kiểu T
- Mối quan hệ giữa CTDL và GT : Giải thuật tác động trên dữ liệu lưu trữ trong các cấu
trúc để cho ra kết quả mong muốn Trong lập trình, chúng quan hệ với nhau theo ràng buộc sau:
Giải thuật + cấu trúc dữ liệu = chương trình
1.2 Phân biệt CTLT trong và CTLT ngoài
- CTLT trong : được lưu trữ trong bộ nhớ trong Ví dụ: mảng, bản ghi…
- CTLT ngoài : được lưu trữ trong bộ nhớ ngoài Ví dụ: tệp tin, bảng…
1.3 Đệ quy
- Khái niệm : Một đối tượng được gọi là đệ quy nếu nó bao gồm chính nó như là một bộ
phận hoặc nó được định nghĩa dưới dạng của chính nó
- Giải thuật đệ quy : là giải thuật có chứa lời giải đệ quy Lời giải đệ quy là lời giải của
bài toán T được thực hiện bởi lời giải của bài toán T’ có dạng như T (cỡ của T’< T)
- Đặc điểm của giải thuật đệ quy : Có 3 đặc điểm
- Trong giải thuật đệ quy bao giờ cũng có lời gọi đến chính nó
- Sau mỗi lời gọi đệ quy, kích thước của bài toán được thu nhỏ hơn trước
- Có một trường hợp suy biến: bài toán được giải quyết theo một cách khác hẳn và giải thuật cũng kết thúc
- Ưu – nhược điểm của GT đệ quy :
+ ưu điểm : thuận lợi cho việc biểu diễn bài toán, đồng thời làm gọn chương trình+ nhược điểm : không tối ưu về mặt thời gian (so với sử dụng vòng lặp), gây tốn bộ nhớ
Trang 2- Viết thuật toán tính n!, tính dãy fibonaci
int TinhFB (int n){
if(n==1 || n==2) return 1;
else return (TinhFB(n-1)+TinhFB(n-2));
}
1.4 Sự cần thiết phân tích giải thuật
- Một bài toán có thể có nhiều giải thuật khác nhau Phân tích giải thuật sẽ đánh giá các giải thuật và tìm ra giải thuật tốt nhất Các tiêu chuẩn đánh giá:
+ Giải thuật đúng đắn: để kiểm tra tính đúng đắn của giải thuật ta có thể cài đặt giải thuật đó và cho thực hiện trên máy với một số bộ dữ liệu mẫu rồi lấy kết quả thu đc
so sánh với kết quả đã biết
+ Giải thuật đơn giản: cần 1 giải thuật dễ viết chương trình để nhanh chóng có được kết quả
+ Độ phức tạp của giải thuật : là hiệu quả của giải thuật Tính hiệu quả thể hiện qua 2 mặt là thời gian và không gian
1.5 Các bước cơ bản từ bài toán đến chương trình <2 bước>
- Bước 1: Thiết kế: nhằm xác định bài toán cần giải quyết và xây dựng mô hình toán họccho bài toán
- Bước 2: Mã hoá: Sử dụng ngôn ngữ lập trình cụ thể để viết chương trình ứng với cách làm của giai đoạn trc nó
CHƯƠNG II 2.1 Các khái niệm cơ bản
- Danh sách
+ Khái niệm : Danh sách là một cấu trúc dùng để lưu trữ một tập hợp hữu hạn
biến động các phần tử thuộc cùng một lớp đối tượng nào đó Có thể cài đặt danh sách bởi mảng và bởi con trỏ, tương ứng ta có danh sách kế tiếp và danh sách móc nối (danh sách liên kết)
+ Hình ảnh :
+ Nguyên tắc hoạt động :
+ Ví dụ :
- Ngăn xếp
+ Khái niệm : ngăn xếp là một danh sách tuyến tính trong đó phép bổ sung một
phần tử vào ngăn xếp và phép loại bỏ một phần tử ra khỏi ngăn xếp đều được thực hiện ở một đầu, đầu đó gọi là đỉnh của ngăn xếp
+ Hình ảnh :
Trang 3+ Nguyên tắc hoạt động :
+ Ví dụ :
- Hàng đợi
+ Khái niệm : hàng đợi là một danh sách tuyến tính trong đó phép bổ sung một
phần tử vào hàng đợi được thực hiện ở một đầu còn phép loại bỏ một phần tử ra khỏi hàng đợi được thực hiện ở đầu kia
+ Hình ảnh :
+ Nguyên tắc hoạt động :
+ Ví dụ :
2.3 Phân biệt ngăn xếp và hàng đợi
- Việc thêm vào, lấy ra một phần tử từ ngăn xếp đều được thực hiện ở một đầu, dođó ngăn xếp hoạt động theo nguyên tắc LIFO, thích hợp với các ứng dụng có trình tự truy xuất ngược với trình tự lưu trữ
- Việc thêm vào, lấy ra một phần tử từ hàng đợi được thực hiện ở hai đầu khác nhau, do đó hàng đợi hoạt động theo nguyên tắc FIFO, thích hợp với các ứng dụng có trình tự truy xuất và trình tự lưu trữ như nhau
2.2 Phân biệt mảng và danh sách liên kết
Vùng nhớ của các phần tử trong mảng
được sắp xếp liên tục nhau
Vùng nhớ của các phần tử trong danh sách liên kết được sắp xếp tùy ý (do hệ điều hành) Các phần tử lưu 1 con trỏ trỏ tới phần tử tiếp theo
Truy cập tới phần tử trong mảng là truy
cập trực tiếp dựa vào chỉ số (ví dụ: a[0],
a[1], a[2],…, a[n])
Cần phải duyệt tuần tự khi muốn truy cập tới phần tử trong danh sách liên kết
Kích thước của mảng là hằng số,
không thay đổi khi chạy chương
trình
Sử dụng mảng không tối ưu được bộ
nhớ Có thể thừa hoặc thiếu bộ nhớ
khi xóa hoặc chèn phần tử vào mảng
Kích thước của danh sách liên kết cóthể thay đổi khi chạy chương trình
Sử dụng danh sách liên kết tối ưu được bộ nhớ Vùng nhớ được cấp phát thêm khi cần chèn thêm phần tửmới, vùng nhớ được free khi xóa phần tử
Trang 4CHƯƠNG III 3.1 Các khái niệm cơ bản
- Cây tổng quát : cây là một tập hợp T các phần tử (gọi là nút của cây) trong đó có 1 nút
đặc biệt được gọi là gốc, các nút còn lại được chia thành những tập rời nhau T1, T2 , ,
Tn theo quan hệ phân cấp trong đó Ti cũng là một cây Mỗi nút ở cấp i sẽ quản lý một sốnút ở cấp i+1 Quan hệ này người ta còn gọi là quan hệ cha-con
- Cây nhị phân : là một cây, trong đó số con tại mỗi đỉnh trên cây tối đa là 2 con và
được sắp thành cây con trái và cây con phải
- Cây tìm kiếm nhị phân : là 1 cây nhị phân t/m các đk:
+ All khoá tại các đỉnh của cây con bên trái đều có giá trị đi trước nhỏ hơn các khoá tại đỉnh gốc
+ Khoá tại gốc đi trc nhỏ hơn all các khoá ở các đỉnh của cây con bên phải
+ Cây con bên trái và cây con bên phải cũng là cây TKNP
- Các dạng cây nhị phân đặc biệt :
+ Cây lệch trái + Cây lệch trái + Cây zic-zắc
+ Cây nhị phân hoàn chỉnh
+ Cây nhị phân đầy đủ
3.2 Các nguyên tắc duyệt cây đa phân và cây nhị phân
- Nguyên tắc duyệt cây đa phân (cây tổng quát, cây)
+ Duyệt theo thứ tự trước
Nếu cây T rỗng: Không làm gì
Nếu T khác rỗng: Trình tự thăm các cây như sau:
Nếu cây T rỗng: Không làm gì
Nếu T khác rỗng: Trình tự thăm:
1 Thăm các cây con T1, T2,…,T(k) của T theo thứ tự sau
2 Thăm gốc T
- Nguyên tắc duyệt cây nhị phân
+ Duyệt tiền tự – thứ tự trước: duyệt nút gốc, duyệt tiền tự con trái rồi duyệt tiền tự con phải
+ Duyệt trung tự – duyệt theo thứ tự giữa: duyệt trung tự con trái rồi đến nút gốc sau đó là duyệt trung tự con phải
+ Duyệt hậu tự – duyệt theo thứ tự sau: Duyệt hậu tự con trái rồi duyệt hậu tự con phải sau đó là nút gốc
Trang 5CHƯƠNG IV 4.1 Định nghĩa đồ thị
- Đồ thị là một cấu trúc rời rạc dùng để mô tả một tập hợp các đối tượng rời rạc có mối
quan hệ n-m với nhau (n,m>0) Ký hiệu đồ thị G là G=<V,E>, trong đó:
+ V là tập các đỉnh
+ E là tập các cạnh/cung
4.2 Các khái niệm
- Đồ thị có hướng : nếu E là tập các cặp (u,v) khác (v,u), gọi là các cung
- Đồ thị vô hướng : nếu E gồm các cặp (u,v) = (v, u), gọi là các cạnh
- Đồ thị liên thông : nếu có đường đi giữa mọi cặp đỉnh phân biệt của đồ thị
- Đồ thị đơn : nếu giữa hai đỉnh u, v bất kỳ có nhiều nhất 1 cạnh/cung
- Đồ thị đa : nếu giữa hai đỉnh u, v bất kỳ có thể có nhiều hơn 1 cạnh/cung
- Đỉnh kề : nếu e = (u, v) là một cạnh thuộc E thì ta nói u, v kề nhau, và e là liên thuộc
với u và v
- Đường đi : một đường đi P = (V1, V2, …., Vp) mà cạnh (V(i-1), V(i)) thuộc E,
với i = 2… p;
- Chu trình : P được gọi là chu trình nếu V1 = Vp
- Bậc của một đỉnh trên đồ thị : bậc của v (ký hiệu: deg(v)) là số cạnh liên thuộc với v
CHƯƠNG V 5.1 Tập hợp
- Định nghĩa tập hợp : Tập hợp là một cấu trúc rời rạc được nói là chứa các phần tử của
nó Tập hợp thường dùng để gom nhóm các phần tử có các tính chất chung lại với nhau, nhưng nó cũng có thể chứa các phần tử chẳng có mối quan hệ gì với nhau
- Các phương pháp mô tả tập hợp : có 3 cách mô tả tập hợp
+ Cách 1: Dùng biểu đồ Ven là một đường cong khép kín, các điểm trong đường cong đó chỉ các phần tử của tập hợp
+ Cách 2: Liệt kê tất cả các phần tử của tập hợp A
Trang 65.2 Hàm băm
- Tư tưởng hàm băm :
+ Phân chia tập hợp đã cho thành một số cố định các lớp(giả sử N lớp được đánh số từ 0 -> N-1)
+ Sử dụng một mảng T có chỉ số chạy từ 0 đến N-1 để chứa các phần tử trong tập hợp, mỗi thành phần T[i] là một “rổ” đựng các phần tử thuộc lớp thứ i, các phần
tư trong mỗi lớp được tổ chức thành một danh sách liên kết, T[i] là con trỏ trỏ tới phần tử đầu tiên trong lớp thứ i T chính là bảng băm mở
- Tác dụng hàm băm : Phân chia các phần tử của tập hợp vào trong các lớp Nếu x là
giá trị khóa của môt phần tử nào đó của tập hợp thì h(x) là chỉ số nào đó của mảng T, h(x) được gọi là giá trị băm của x, ta nói x thuộc lớp h(x);
- Tiêu chí lựa chọn :
+ Hàm băm phải cho phép tính được dễ dàng và nhanh chóng giá trị băm của mỗi khóa
+ Phân bố đều các khóa vào các lớp
Trang 7PHẦN II BÀI TẬP
I Bài tập về danh sách, ngăn xếp, hàng đợi
1 Danh sách
Dạng cài đặt
Theo mảng
#define N 100 Typedef int item;
typedef struct{
}List;
Theo con trỏ
Typedef int item;
typedef struct Node{
};
typedef Node *List;
Danh sách kế tiếp
#include <stdio.h>
#include <stdlib.h>
#define N 100;
typedef int item;
//Cai dat cau truc mang
//Ham kiem tra danh sach day
int Isfull (List L)
Trang 8int x;
scanf("%d", &x);
return x;
}
//Ham nhap du lieu
void Input (List *L)
//Ham hien thi du lieu
void Output (List L)
//Ham them phan tu x vao vi tri thu k
int Insert_k (List *L, item x, int k)
//Ham xoa phan tu o vi tri thu k
int Del_k (List *L, item *x, int k)
Trang 9//Ham tim kiem phan tu co gia tri x
int Search (List L, item x)
typedef int item;
//Cai dat danh sach
typedef struct Node
{
item Data;
Node *next;
};
typedef Node *List;
//Khoi tao danh sach rong
void Init (List &L)
{
L=NULL;
}
//Kiem tra danh sach rong
int Isempty (List L)
{
return (L==NULL);
}
//Tao mot node chua du lieu x
Node *Make_Node (Node *P, item x)
{
P = (Node *) malloc (sizeof (Node)); P->next = NULL;
P->Data = x;
Trang 10return P;
}
//Tinh do dai danh sach
int len (List L)
//Them phan tu co gia tri x vao vi tri dau
void Insert_first (List &L, item x)
//Them phan tu co gia tri x vao vi tri k
void Insert_k (List &L, item x, int k)
//Them phan tu o vi tri cuoi
//Xoa phan tu o vi tri dau
void Del_frist (List &L, item &x)
{
x = L->Data;
L = L->next;
}
Trang 11//Xoa phan tu o vi tri thu k
void Del_k (List &L, item &x, int k)
//Xoa phan tu o vi tri cuoi
//Nhap du lieu cho danh sach
void Input (List &L)
//Hien thi du lieu
void Output (List L)
Trang 12 Các thao tác dùng con trỏ
//tao cau truc stack
typedef int item;
//khoi tao ngan xep rong 1
void Init(stack &s)
{
s.Top=NULL;
}
//kiem tra danh sach rong
int empty (stack s)
//them 1 phan tu vao dinh
void Push(stack &s, item x)
Trang 13//Xoa 1 phan tu o dinh
int Pop(stack &s)
Trang 14int front, rear;
item Data;
Node * Next;
};
Các thao tác dùng con trỏ
//Cai dat 1 node
//Khoi tao queue rong
void Init(Queue &Q)
{
Q.Front = Q.Rear = NULL;
Q.count = 0;
}
//Kiem tra queue rong
int Isempty (Queue Q)
Node *P = (Node*) malloc(sizeof(Node));
P->Next = NULL; P->Data = x;
return P;
}
//Them phan tu vao cuoi queue
void Push(Queue &Q, item x)
Node * Front, *Rear; int count;
};
Trang 15//Xoa phan tu o dau queue
int Pop(Queue &Q)
//Them phan tu x o vi tri thu k
//Xoa phan tu x o vi tri thu k
Trang 16 Vẽ cây nhị phân biểu diễn biểu thức toán học, đưa biểu thức toán học về
dạng tiền tố, hậu tố
Dạng cài đặt cây đa phân bằng con trưởng và em liền kề
struct Node *EldestChild;
struct Node *Nextsibling;
Dạng cài đặt cây TKNP bằng con trỏ
typedef struct Node
typedef Node *SearchTree;
Trình bày ý tưởng và viết các hàm cho cây đa phân
Tìm con trưởng, em kề
Ý tưởng
Cài đặt
Theo con trỏ
typedef int item;
typedef struct Node{
item data;
Node *left, *right;} Node;
Node *BTree;
Trang 17Tìm cha của đỉnh k
Ý tưởng: Duyệt lần lượt các đỉnh trên cây, xuất phát từ gốc (i=1), kiểm tra
xem con trưởng j của i có = k hay không?
- Nếu bằng thì i chính là cha cần tìm
- Ngược lại, kiểm tra em liền kề của con trưởng j xem có bằng k hay ko?
+ Nếu bằng nhau thì i chính là cha cần tìm+ Nếu không ktra j là em liền kề của j cũ
Cứ tiếp tục như vậy cho đến khi kiểm tra hết các con của i mà không có con nào = k thì duyệt đỉnh i tiếp theo trên cây Ngược lại chỉ cần 1 con j của i = k thì dừng tìm kiếm và kl i chính là đỉnh cha cần tìm
Cài đặt:
int Parent (Tree T, int k){
int i=0; int j; int found=0;
while(i<N && (found!=1)){
j=T.Elems[i].EldestChild;
if(j==k){
return i;
found = 1;
}else{
j=T.Elems[j].NextSibling;
while(j!==-1 && (found!=1)){
if(j==k){
return i;
found = 1;
}else j=T.Elems[j].NextSibling;} i++ }}
Duyệt cây theo thứ tự trước
Ý tưởng:
Nếu cây T rỗng: Không làm gì
Nếu T khác rỗng: Trình tự thăm các cây như sau:
Preorder (C);
c = NextSibling;
}}
Trang 18Duyệt theo thứ tự giữa
Ý tưởng:
Nếu cây T rỗng: Không làm gì cả
Nếu T khác rỗng: Trình tự thăm:
1 Thăm cây con T1 của T theo thứ tự giữa
Inorder(c);
c = NextSibling(c);
}visit(T);
while(c!=$){
Inorder(c);
c = NextSibling(c);
}}
Duyệt theo thứ tự sau
Ý tưởng:
Nếu cây T rỗng: Không làm gì
Nếu T khác rỗng: Trình tự thăm:
1 Thăm các cây con T1, T2,…,T(k) của T theo thứ tự sau
Postorder(c);
c = NextSibling(c);
}visit(T);
}
Trình bày ý tưởng và viết các hàm cho cây nhị phân
Ý tưởng
Cài đặt
Trình bày ý tưởng và viết các hàm cho cây TKNP
Nhập dữ liệu