You are on page 1of 10

Data Structures and Algorithms

ấ ữệ
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.

Phân loại cấu trúc dữ liệu:

Cấu trúc dữ liệu tuyến tính (Linear data structure).

Cấu trúc dữ liệu phi tuyến tính (Non-linear data structure).

Cấu trúc dữ liệu tuyến tính (Linear data structure).

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ấu trúc dữ liệu phi tuyến tính (Non-linear data structure).

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.

Data Structures and Algorithms 1


ố ớ
Trees Data Structure: Gi ng v i Graph nh ng ư ở đây giữa 2 đỉnh chỉ có một

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ó thể được duyệt trên một lần chạy,


(Duyệt qua tất cả các phần tử trong một ầ ề ầ ạ ớ ể ệ
Yêu c u nhi u l n ch y m i có th duy t qua
lần chạy nếu xuất phát từ phần tử đầu ế ượ ầ ử
h t đ c các ph n t .
tiên).

ấ ử ụ ộ ớ
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.

Data Structures and Algorithms 2


ộ ứ ạ ờ
Đ ph c t p th i gian tăng theo kích
ộ ứ ạ ờ ữ
ướ ữ ệ
th c d li u.
Đ ph c t p th i gian gi nguyên.

Example: Arrays, Stack, Queue. Example: Tree, Graph, Map.

ạ ạ ầ ấ ữệ
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.

CTDL giúp cho code có thể sạch và dễ hiểu hơn.

Abstact Data Type?

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.

3 yếu tố quan trọng khi phân tích thuật toán:

Thời gian thực thi:

Dung lượng thực thi (Memory):

Công sức bỏ ra của Developer:

Algorithm 1: Cộng hai số do người dùng nhập vào:

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.

Data Structures and Algorithms 3


ế ế
Step 4: N u a > b: N u a > c → max = a, ng ược lại thì max = c.
ế ế
N u a < b: N u b > c → max = b, ng ược lại thì max = c.
Step 5: Stop.

ừ ủ ộ ố
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.

Step 3: Khởi tạo biến: factorial ← 1, i ← 1.

Step 4: Đọc giá trị của n.

Step 5: Lặp lại các bước sau cho đến khi i = n.

5.1: factorial ← factorial * 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 3: Khởi tạo các biến: flag ← 1, i ← 2.

Step 4: Đọc n từ người dùng.

Step 5: Lặp lại các bước sau cho đến khi i = (n/2):

5.1: Nếu n / i dư là 0 thì: flag ← 0 và đến step 6.

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

BigO Notation là gì?

ữ ứệ ấ ự ệ ấ
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

Data Structures and Algorithms 4


ạ ệ ớ ạ ủ ờ ạ ủ ộ ậ
Đ i di n cho gi i h n trên c a th i gian ch y c a m t thu t toán. Do đó nó
đưa ra độ phức tạp trong trường hợp xấu nhất của một thuật toán.

BigO Notation làm gì?

ượ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 đ

Chỉ ra được trường hợp tệ nhất của thuật toán.

Các thuộc tính của BigO:

Khi tính toán BigO thường sẽ thấy các list như sau:

O(1) → O(Log(N)) → O(N) → O(NLog(N)) → O(N^2) → O(N^3) →


O(B^N), B > 1 → O(N!)

ộ ủ
Các thu c tính c a BigO:

ố ượng phần tử của input.


N: Input Size - S l

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ụ dưới đây xác định BigO là trường hợp tệ nhất là N^3


Ví d 1: O(C), Constant Time.

Ví dụ 2: O(N), Linear 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.

Data Structures and Algorithms 5


Theta Notation.

ạ ệ ớ ạ ớ ạ ưới của thời gian chạy thuật toán, nên nó


Đ i di n cho gi i h n trên và gi i h n d
được sử dụng để phân tích độ phức tạp trường hợp trung bình của 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à:

Push: Thêm một phần tử vào trên cùng stack. → O(1).

Pop: Xóa phần tử trên cùng stack. → O(1).

IsEmpty: Kiểm tra Stack có trống không?

IsFull: Kiểm tra Stack đã Full chưa?

Peek: Lấy giá trị của phần tử trên cùng mà không xóa nó.

Cách hoạt động của Stack:

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ó.

Trước khi Push, kiểm tra xem stack đã đầy chưa?

Trước khi Pop, kiểm tra xem stack đã trống chưa?

Data Structures and Algorithms 6


Queue.


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).

Dequeue: Xóa phần tử trên đầu hàng đợi. → O(1).

IsEmpty: Kiểm tra hàng đợi trống?

IsFull: Kiểm tra hàng đợi Full?

Peek: Lấy giá trị phía trước hàng đợi mà không xóa nó.

Cách hoạt động của Queue:

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.

Phân loại hàng đợi:

Simple Queue: Tuân thủ nghiêm ngặt quy tắc FIFO.

Data Structures and Algorithms 7


ầ ử ố ỏ ế ầ ử ầ ạ ế
Circular Queue: Ph n t cu i cùng tr đ n ph n t đ u tiên t o liên k t
Ư ể ớ ử ụ ộ ớố ơ ế ị
vòng. u đi m so v i Simple Queue là s d ng b nh t t h n. N u v trí
ố ầ ị ầ ố ể ộ ầ ử ị
cu i cùng đ y và v trí đ u tiên tr ng, thì có th chèn m t ph n t vào v trí
đầu tiên.

ỗ ầ ử ược liên kết với một mức độ ưu tiên và được


Priority Queue: M i ph n t đ
phục vụ theo mức độ ưu tiên của nó. Nếu các phần tử có cùng mức độ ưu
tiên thì chúng sẽ được phục vụ theo thứ tự ưu tiên của chúng trong hàng
đợi. Phần tử có mức ưu tiên cao nhất sẽ bị xóa trước.

ể ượ ự ệ ừ
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.

Data Structures and Algorithms 8


ầ ố ẽ ỏ ế
Node đ u tiên có tên là HEAD và nút cu i cùng s tr đ n NULL ở phần 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ó.

Thêm giá trị data = 4 vào node mới.

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).

Data Structures and Algorithms 9


ộ ể
Search: Tìm m t node trong Linked List. (Ki m tra xem currentNode có data
ủ ỏ
== data c a node đang tr không).

ắ ế
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.

Data Structures and Algorithms 10

You might also like