Professional Documents
Culture Documents
ấ ữệ
C u trúc d li u là gì? (Data Structures)
ả ữệ ểử ụ ệ ả ấ
Là cách chúng ta qu n lý d li u sao cho có th s d ng hi u qu nh t.
Điều quan trọng là chọn cấu trúc dữ liệu phù hợp cho yêu cầu của cá nhân. Ví
dụ: nếu muốn lưu trữ dữ liệu tuần tự trong bộ nhớ, thì có thể sử dụng cấu trúc
dữ liệu array.
Các phần tử được sắp xếp theo thứ tự lần lượt nên dễ thực hiện đối với
chương trình không quá phức tạp.
Array Data Structure: Trong một array, các phần tử trong bộ nhớ được sắp
xếp trong bộ nhớ liên tục. Tất cả các phần tử trong một mảng có cùng kiểu.
Stack Data Structure: Trong stack, các phần tử được lưu trữ theo nguyên tắc
LIFO (Last In First Out). Có hai phương thức là Push và Pop.
Queue Data Structure: Trong Queue, các phần tử hoạt động theo nguyên
tắc FIFO (First In First Out)
Linked List Data Structure: Trong Linked List, các phần tử được kết nối
thông qua một loại các nodes. Và mỗi node chưa các data items và địa chỉ
cho node tiếp theo.
Các phần tử không theo bất kỳ trình tự nào. Thay vào đó, chúng được sắp
xếp theo cách phân cấp trong đó một phần tử sẽ được kết nối với một hoặc
nhiều phần tử.
Graph Data Structure (Biểu đồ): Trong cấu trúc dữ liệu dạng biểu đồ, mỗi
node được gọi là đỉnh và mỗi đỉnh được kết nối với các đỉnh khác thông qua
các cạnh.
ự ữ ể ấ
S khác nhau gi a 2 ki u c u trúc d li u: ữệ
Linear Data Structures Non Linear Data Structures
ượ ắ ế ứự
Các items đ c s p x p theo th t liên ượ ắ ế ứự
Các items đ c s p x p theo th t không
ụ ố
t c và ghép n i nhau. ầ ự ấ
tu n t (phân c p).
Các items được đặt trên một dòng. Các items có thể rẽ nhánh.
ấ ử ụ ộ ớ
Các c u trúc khác nhau s d ng b nh theo
ệ ử ụ ộ ớ ệ ả
Vi c s d ng b nh không hi u qu . ữ ệ ả ộ
nh ng cách hi u qu khác nhau tùy thu c vào
ầ
nhu c u.
ạ ạ ầ ấ ữệ
T i sao l i c n c u trúc d li u?
CTDL là một thứ không thể thiếu để tạo ra các thuật toán mạnh và nhanh.
Là m t ộ
ậ
Thu t toán là gì?
ộ ậ ợ ướ ẫ ượ ị ể ả ế ộ ấ ề
Là m t t p h p các h ng d n đ c xác đ nh rõ ràng đ gi i quy t m t v n đ
ụ ể ậ ạ
c th . Nh n các inputs và t o ra các output mong mu n. ố
Cần phải phân tích thuật toán vì có rất nhiều thuật toán để giải quyết vấn đề để
chọn ra cái tối ưu nhất.
Step 1: Start.
ế
Step 2: Khai báo bi n: num1, num2 và sum.
ọ ị
Step 3: Đ c giá tr num1, num2 do ng ười dùng nhập vào.
ử ớ ố
Step 4: Dùng toán t + v i 2 s num1, num2 và gán vào sum: sum ← num1
+ num2.
ể ị
Step 5: Hi n th sum.
Step 6: Stop.
ốớ ấ
Algorithm 2: Tìm s l n nh t trong 3 s : ố
Step 1: Start.
ế
Step 2: Khai báo ba bi n a, b và c.
ọ ị ế
Step 3: Đ c giá tr ba bi n a, b và c do ng ười dùng nhập.
ừ ủ ộ ố
Algorithm 3: Tìm giai th a c a m t s :
Step 1: Start.
ế
Step 2: Khai báo bi n n, factorial và i.
5.2: i ← i + 1.
ể ị
Step 6: Hi n th factorial.
Step 7: Stop.
ể ộ ố ả ố
Algorithm 4: Ki m tra xem m t s có ph i là s nguyên t hay không? ố
Step 1: Start.
ế
Step 2: Khai báo các bi n n, i, flag.
Step 5: Lặp lại các bước sau cho đến khi i = (n/2):
5.2: i ← i + 1.
ế ể ị ả ố
Step 6: N u flag = 0 thì hi n th n không ph i là s nguyên t còn ng ố ược lại
ể ị ố
hi n th n là s nguyên t . ố
Step 7: Stop.
BigO Notation
ữ ứệ ấ ự ệ ấ
Là nh ng th t nh t và khó khăn th c hi n nh t thì đ ược biểu thị bằng
BigO
ược hiệu năng của thuật toán khi Input đầu vào vô cùng lớn.
Tính toán đ
Khi tính toán BigO thường sẽ thấy các list như sau:
ộ ủ
Các thu c tính c a BigO:
C: Constant - Thời gian thực thi một câu lệnh nào đó.
F(N): Function -
ụ ề ớ
Ví d : O (N+C) = O(C.N) đ u có BigO là O(N) vì N đang xét t i vô cùng.
ụ
Ví d 1: O(C), Constant Time.
Ví dụ 3: O(N^2).
Ví dụ 4: O(NLog(N)).
Omega Notation
ạ ệ ớ ạ ưới của thời gian chạy của một thuật toán. Do đó, nó
Đ i di n cho gi i h n d
cung cấp trường hợp phức tạp tốt nhất của một thuật toán.
Stack
ắ
Nguyên t c: LIFO (Last In First Out).
ộ ố ơ ả ự ệ
M t s thao tác c b n cho phép th c hi n trên stack là:
Peek: Lấy giá trị của phần tử trên cùng mà không xóa nó.
Một con trỏ có tên là TOP được sử dụng để theo dõi phần tử trên cùng trong
stack.
ởạ
Khi kh i t o stack, TOP đ ược đặt giá trị thành -1 → để kiểm tra xem stack có
ố
tr ng không thì so sánh TOP == -1.
ộ ầ ử ịủ
Khi Push m t ph n t vào stack, giá tr c a TOP đ ược tăng lên và đặt phần
ử ớ ị ượ ỉ ị ở
t m i vào v trí đ c ch đ nh b i TOP.
Khi Pop một phần tử, trả lại phần tử được trỏ bởi TOP và giảm giá trị của nó.
ắ
Nguyên t c: FIFO (First In First Out).
ộ ộ ự ệ
M t queue là m t object (an abstact data structure - ADT) cho phép th c hi n
các thao tác sau:
ầ ử ố ợ
Enqueue: Thêm ph n t vào cu i hàng đ i. → O(1).
Peek: Lấy giá trị phía trước hàng đợi mà không xóa nó.
Có 2 con trỏ là FRONT và REAR. Trong đó FRONT trỏ đến phần tử đầu tiên
của Queue và REAR trỏ đến phần tử cuối cùng của Queue.
Ban đầu khởi tạo FRONT và REAR đều có giá trị là -1.
ể ượ ự ệ ừ
Double Ended Queue: Chèn và xóa có th đ c th c hi n t phía tr ước
ặ ắ
ho c phía sau. Do đó, nó không tuân theo quy t c FIFO.
Linked List
ộ ấ ữệ ế ồ ế ớ
Là m t c u trúc d li u tuy n tính bao g m các nodes liên k t n i nhau sao cho
ỗ ề ứ ị ỉủ ế
m i node đ u ch a data và đ a ch c a node ti p theo.
ạ
Phân lo i Linked List:
Singly:
ỗ ẽ ỏớ ả
Doubly: M i node s có data và tr t i c node tr ước và sau của node đó.
ư ư ố ẽ ỏ ế ầ ứ
Circular Linked List: nh singly nh ng node cu i s tr đ n node đ u ch
ả ế ư ầ ẽ ỏớ
không ph i NULL. Còn n u nó nh doubly thì node đ u tiên s tr t i node
ố
cu i cùng.
ế ố ầ ử ữ ầ ử ỗ
N u mu n chèn 1 ph n t 4 vào gi a ph n t 1 và 2 trong chu i HEAD → 1 → 2
→ 3 → NULL thì ta làm các b c sau:ướ
ạ ộ ớ ấ ộ ớ
T o m t node m i và c p phát b nh cho nó.
Trỏ con trỏ tiếp theo của nó tới node chứa 2 làm data.
Thay đổi con trỏ tiếp theo của 1 thành trỏ tới node vừa mới tạo.
ửử ụ
Toán t s d ng trong Linked List:
ậ ừ ầ ử ể
Traverse: Truy c p t ng ph n t trong Linked List. (Ki m tra xem temp ==
ứ ế ố ể ị ữ
NULL thì t c là đã đ n cu i Linked List và không hi n th n a).
Insert: Thêm phần tử mới vào Linked List (Thêm vào đầu, giữa hoặc cuối
của Linked List)
Delete: Xóa phần tử chỉ định. (Xóa đầu, giữa hoặc cuối của Linked List).
ắ ế
Sort: S p x p node trong Linked List.
Hash Table
ấ ữệ ư ữ ầ ử
Là c u trúc d li u l u tr các ph n t theo key - value.