1. DATA STRUCTURES
& ALGORITHM
“ALGORITHMS + DATA STRUCTURES
= PROGRAMS”
NIKLAUS WIRTH, 1976
Thiện Nguyễn
August 26th, 2012
2. CẤU TRÚC DỮ LIỆU
& THUẬT TOÁN ĐỂ LÀM GÌ?
• Ứng dụng để giải quyết các bài toán
thực tế
• Cài đặt các chương trình
• Tiền đề cho các môn học, lĩnh vực
khác của Máy tính
• …
3. Thuật toán là gì?
Là một tập hữu hạn các chỉ dẫn để
máy tính giải quyết một bài toán.
4. Các tính chất
của Thuật toán
• Tính đơn nghĩa
• Tính dừng
• Tính đúng
• Tính phổ dụng
• Tính khả thi.
5. Độ phức tạp
của Thuật toán
Là khái niệm dùng để đánh giá
thời gian thực thi của một thuật
toán độc lập với máy tính
6. Các xác định
Độ phức tạp của Thuật toán
• Quy tắc Loại bỏ hằng số
• Quy tắc Cực đại
• Quy tắc cộng
• Quy tắc nhân.
7. Các độ phức tạp
thường gặp
• O(n)
• O(n^k)
• O(log(n))
• O(n.log(n))
• O(a^n)
• O(n!).
8. Cấu trúc dữ liệu
• Danh sách tuyến tính
• Hàng đợi
• Ngăn xếp
• Cây.
9. Danh sách tuyến tính
Là một cấu trúc dữ liệu
mà mỗi phần tử chỉ tồn tại tối
đa một phần tử liền sau.
10. Phân loại
Danh sách tuyến tính
Danh
sách
Ràng
Thường
buộc
Không FIFO LIFO
Có thứ tự
thứ tự (queue) (stack)
11. Danh sách tổng quát
• Không có ràng buộc đối với các
thao tác trên danh sách.
• Không có ràng buộc khi
chèn/xóa phần tử
• Có 2 loại:
o Có thứ tự
o Không thứ tự.
12. Danh sách ràng buộc
• Ràng buộc đối với các thao tác
trên danh sách
• Ràng buộc khi chèn/xóa phần tử.
• Có 2 loại:
o Queue (FIFO: First-In-First-Out)
o Stack (LIFO: Last-In-First-Out).
13. Cài đặt danh sách
• Dùng mảng: • Dùng DS Liên kết:
int a[20]; struct Node{
int data;
int* next;
}
struct List{
Node* pHead;
int count;
}
14. Cài queue dùng mảng
Cách cài đặt Queue
• Dùng mảng:
class Queue{ public:
private: Queue();
int data[100]; int size();
int count; int front();
int front; int rear();
int rear; bool isEmpty();
bool isFull();
bool enQueue(int k);
bool deQueue(int k);
}
15. Cách cài đặt Queue
Cài queue bằng danh sách liên kết
• Dùng danh sách liên kết:
class Queue{ public:
private: Queue();
int* front; int size();
int* rear; int front();
int count; int rear();
bool isEmpty();
bool isFull();
bool enQueue(int k);
bool deQueue(int k);
}
16. Cài stack bằng mảng
Cách cài đặt Stack
• Dùng mảng:
class Stack{ public:
private: Stack()
int data[100]; int size();
int count; bool isEmpty();
bool isFull();
int top();
void push(int k);
int pop();
}
Ghi chú: Tùy vào mục đích sử và phương pháp sử dụng
mà các method push, pop có thể trả về void, bool hay int
17. Cài stack bằng danh sách liên kết
Cách cài đặt Stack
• Dùng danh sách liên kết:
class Stack{ public:
private: Stack();
Node* head int size();
Node* tail bool isEmpty();
int count bool isFull();
int count; int top();
void push(int k);
int pop();
}
Ghi chú: Tùy vào mục đích sử và phương pháp sử dụng
mà các method push, pop có thể trả về void, bool hay int
18. Tree (Cây)
Cây là một cấu trúc
dữ liệu gồm một tập
hữu hạn các node
(nút), giữa các node
có một quan hệ
phân cấp gọi là quan
hệ “cha – con”.