lOMoARcPSD| 58702377
ÔN TẬP
1. Những khái niệm, quy trình phân ch thiết kế giải thuật, nh độ
phức tạp thuật toán (lưu ý lệnh ch cực, lưu ý bước nhảy của
vòng lặp )
2. Các phương pháp để lưu trữ dữ liu:
- Lưu trữ tuần tự (mảng 1 chiều)
+Cố định,truy nhập qua chỉ số,tốc độ truy cập đồng đều
- Lưu kế móc nối (đơn, đôi, vòng, 1 con trỏ đầu, 2 con trỏ đầu)
+Truy nhập từng phần tử một theo thứ tự, tốc độ truy cập
không đồng đều
3. Mảng 1 chiều, 2 chiều, nhiều chiều (lưu trữ tuần tự)
4. Danh sách tuyến nh: Stack, Queue
a. Các biến thể của các cấu trúc trên (hàng đợi ưu ên, hàng
đợi vòng)
b. ng dụng của chúng: nh giá trbiểu thức hậu tố, chuyển
đổi cơ số, kiểm tra cặp dấu ngoặc
c. Lưu trữ bằng CTLT tuần tự, CTLT móc nối
5. Đệ quy và khử đệ quy (độ phức tạp nh toán)
6. y Nhị phân (đặc biệt lưu ý cây NPTK: có nh chất trái < gốc <
phi)
- Các thao tác trên cây NPTK: tạo cây rỗng, bổ sung, loại b,
duyt cây (hiểu code, mô tả được), m kiếm, nh toán
- Heap: nh chất cha >con (Max-Heap)
Tính chất cha<con (Min-Heap) (về nhà thực hiện)
Cài đặt cây NP:
lOMoARcPSD| 58702377
- Lưu trữ tuần tự (dùng mảng 1 chiều, lưu ý các phần tử bị
khuyết thì để là rỗng (trong trường hợp cây NP không hoàn
chỉnh, không đy đủ)
- Lưu trữ móc nối Cây tổng quát:
- Cài đặt bằng danh sách móc nối (số thành phần phần của một
nút bằng = 1+ cấp của cây hoặc cài đặt gián ếp thông qua cây
NP (code)
- Mô tả cách chuyển một cây tổng quát về cây NP
7. Các giải thuật sắp xếp
- Chèn, chọn, nổi bọt, nổi bọt cải ến - Nhanh, phân đoạn,
vun đống, hòa trộn
8. Các giải thuật m kiếm:
- Tuần tự
- Nhị phân
- Trc ếp
9. Đồ th
- Các khái niệm cơ bản
- Các phép duyệt đồ thị: theo chiều rộng, sâu
- Cài đặt đồ thị (biểu diễn đồ thị) bằng ma trận k (ma trận đỉnh
kề, ma trận cạnh kthị có trọng số)), bằng danh sách k
y dựng ma trận đỉnh k
y dựng ma trận cạnh k
lOMoARcPSD| 58702377
0
0
1
0
0
0
3
0
5
0
0
0
0
0
0
2
4
0
6
0
0
0
0
5
0
0
0
0
0
1
0
0
0
0
0
0
- Các bài toán ứng dụng đồ th: o Dựng cây khung. o Cây khung
cực ểu o Sắp xếp topo
o Tìm đường đi ngắn nhất từ 1 điểm đến các điểm còn lại
(Dijkstra)
o Tìm đường đi:
có đường đi từ đỉnh I đến đỉnh j hay không (xác định
dựa vào ma trận đường đi P)
Có đường đi từ I đến j mà có độ dài bằng t hay
không (xác định dựa vào ma trận A
(t)
)
Lưu ý: Bổ sung code cho những thuật toán chưa có code.
Danh sách liên kết đơn
#include<iostream>
using namespace std;
template<class T>
class LinkedListNode{
public:
T value;
LinkedListNode* Next;
public:
lOMoARcPSD| 58702377
LinkedListNode(T v):value(v){
Next=0;
}
};
template<class T>
class LinkedList{
LinkedListNode<T> *head,*tail;
int count;
public:
LinkedList():count(0){
head=tail=0;
}
void AddFirst(const T&v){
LinkedListNode<T> *p=new LinkedListNode<T>(v);
if(count++==0){ tail=p;
}
else{ p->Next=head;
}
head=p;
}
void AddLast(const T&v){
LinkedListNode<T> *p=new LinkedListNode<T>(v);
if(count++==0){ head=p;
} else{ tail-
>Next=p;
}
tail=p;
}
void RemoveFirst(){
LinkedListNode<T> *p=head;
head=p->Next; delete p; if(--
count==0){ tail=0;
lOMoARcPSD| 58702377
}
}
void RemoveLast(){
if(count==1){
RemoveFirst();
return;
}
LinkedListNode<T> *p=head; while(p-
>Next->Next!=NULL){ p=p->Next;
} tail=p;
delete(p->Next);
p->Next=NULL;
--count;
}
void RemoveAt(int k){
LinkedListNode<T> *p=head;
for(int i=0;i<k-1;i++){ p=p-
>Next;
}
LinkedListNode<T> *temp=p->Next;
p->Next=temp->Next;
delete temp;
}
void RemoveAll(){
while(count){
--count;
LinkedListNode<T> *p=head; head=p-
>Next;
delete p;
}
}
void PrintList(){
lOMoARcPSD| 58702377
LinkedListNode<T> *p=head;
while(p!=NULL){ cout<<p-
>value<<' ';
p=p->Next;
}
} int Count(){
return count;
}
};
int main(){
LinkedList<int> s;
unsigned int x=25;
do{
s.AddFirst(x%2);
x/=2;
}
while(x);
s.PrintList();
}
Ngăn xếp
#include<iostream> using
namespace std;
template<class T> class
Stack{ int value; T*data;
int top; public: Stack(T
v):value(v),top(-1){
data=new T[value];
}
lOMoARcPSD| 58702377
~Stack(){
delete [] data;
}
void Push(const T&v){
data[++top]=v;
}
T &Pop(){
return data[top--]; }
int IsEmpty(){
return top==-1;
}
int IsFull(){ return
top==(value-1);
}
int Count(){
return top+1;
}
};
int main(){
Stack<int> s(32);
unsigned int x=25;
do{
s.Push(x%2);
x/=2; }while(x);
lOMoARcPSD| 58702377
while(!s.IsEmpty()){
cout<<s.Pop();
}
}

Preview text:

lOMoAR cPSD| 58702377 ÔN TẬP
1. Những khái niệm, quy trình phân tích thiết kế giải thuật, tính độ
phức tạp thuật toán (lưu ý lệnh tích cực, lưu ý bước nhảy của vòng lặp )
2. Các phương pháp để lưu trữ dữ liệu:
- Lưu trữ tuần tự (mảng 1 chiều)
+Cố định,truy nhập qua chỉ số,tốc độ truy cập đồng đều
- Lưu kế móc nối (đơn, đôi, vòng, 1 con trỏ đầu, 2 con trỏ đầu)
+Truy nhập từng phần tử một theo thứ tự, tốc độ truy cập không đồng đều
3. Mảng 1 chiều, 2 chiều, nhiều chiều (lưu trữ tuần tự)
4. Danh sách tuyến tính: Stack, Queue
a. Các biến thể của các cấu trúc trên (hàng đợi ưu tiên, hàng đợi vòng)
b. Ứng dụng của chúng: tính giá trị biểu thức hậu tố, chuyển
đổi cơ số, kiểm tra cặp dấu ngoặc
c. Lưu trữ bằng CTLT tuần tự, CTLT móc nối
5. Đệ quy và khử đệ quy (độ phức tạp tính toán)
6. Cây Nhị phân (đặc biệt lưu ý cây NPTK: có tính chất trái < gốc < phải)
- Các thao tác trên cây NPTK: tạo cây rỗng, bổ sung, loại bỏ,
duyệt cây (hiểu code, mô tả được), tìm kiếm, tính toán
- Heap: tính chất cha >con (Max-Heap)
Tính chất chaCài đặt cây NP: lOMoAR cPSD| 58702377
- Lưu trữ tuần tự (dùng mảng 1 chiều, lưu ý các phần tử bị
khuyết thì để là rỗng (trong trường hợp cây NP không hoàn chỉnh, không đầy đủ)
- Lưu trữ móc nối Cây tổng quát:
- Cài đặt bằng danh sách móc nối (số thành phần phần của một
nút bằng = 1+ cấp của cây hoặc cài đặt gián tiếp thông qua cây NP (code)
- Mô tả cách chuyển một cây tổng quát về cây NP
7. Các giải thuật sắp xếp
- Chèn, chọn, nổi bọt, nổi bọt cải tiến - Nhanh, phân đoạn, vun đống, hòa trộn
8. Các giải thuật tìm kiếm: - Tuần tự - Nhị phân - Trực tiếp 9. Đồ thị - Các khái niệm cơ bản
- Các phép duyệt đồ thị: theo chiều rộng, sâu
- Cài đặt đồ thị (biểu diễn đồ thị) bằng ma trận kề (ma trận đỉnh
kề, ma trận cạnh kề (đồ thị có trọng số)), bằng danh sách kề
Xây dựng ma trận đỉnh kề
Xây dựng ma trận cạnh kề lOMoAR cPSD| 58702377 0 0 1 0 0 0 3 0 5 0 0 0 0 0 0 2 4 0 6 0 0 0 0 5 0 0 0 0 0 1 0 0 0 0 0 0
- Các bài toán ứng dụng đồ thị: o Dựng cây khung. o Cây khung
cực tiểu o Sắp xếp topo
o Tìm đường đi ngắn nhất từ 1 điểm đến các điểm còn lại (Dijkstra) o Tìm đường đi:
có đường đi từ đỉnh I đến đỉnh j hay không (xác định
dựa vào ma trận đường đi P)
Có đường đi từ I đến j mà có độ dài bằng t hay
không (xác định dựa vào ma trận A(t))
Lưu ý: Bổ sung code cho những thuật toán chưa có code. Danh sách liên kết đơn #include using namespace std; template class LinkedListNode{ public: T value; LinkedListNode* Next; public: lOMoAR cPSD| 58702377
LinkedListNode(T v):value(v){ Next=0; } }; template class LinkedList{ LinkedListNode *head,*tail; int count; public: LinkedList():count(0){ head=tail=0; } void AddFirst(const T&v){
LinkedListNode *p=new LinkedListNode(v); if(count++==0){ tail=p; } else{ p->Next=head; } head=p; } void AddLast(const T&v){
LinkedListNode *p=new LinkedListNode(v); if(count++==0){ head=p; } else{ tail- >Next=p; } tail=p; } void RemoveFirst(){ LinkedListNode *p=head;
head=p->Next; delete p; if(-- count==0){ tail=0; lOMoAR cPSD| 58702377 } } void RemoveLast(){ if(count==1){ RemoveFirst(); return; }
LinkedListNode *p=head; while(p-
>Next->Next!=NULL){ p=p->Next; } tail=p; delete(p->Next); p->Next=NULL; --count; } void RemoveAt(int k){ LinkedListNode *p=head; for(int i=0;i>Next; }
LinkedListNode *temp=p->Next; p->Next=temp->Next; delete temp; } void RemoveAll(){ while(count){ --count;
LinkedListNode *p=head; head=p- >Next; delete p; } } void PrintList(){ lOMoAR cPSD| 58702377 LinkedListNode *p=head;
while(p!=NULL){ cout<>value<<' '; p=p->Next; } } int Count(){ return count; } }; int main(){ LinkedList s; unsigned int x=25; do{ s.AddFirst(x%2); x/=2; } while(x); s.PrintList(); } Ngăn xếp #include using namespace std; template class Stack{ int value; T*data; int top; public: Stack(T v):value(v),top(-1){ data=new T[value]; } lOMoAR cPSD| 58702377 ~Stack(){ delete [] data; } void Push(const T&v){ data[++top]=v; } T &Pop(){ return data[top--]; } int IsEmpty(){ return top==-1; } int IsFull(){ return top==(value-1); } int Count(){ return top+1; } }; int main(){ Stack s(32); unsigned int x=25; do{ s.Push(x%2); x/=2; }while(x); lOMoAR cPSD| 58702377 while(!s.IsEmpty()){ cout< } }