Please enable JavaScript.
Coggle requires JavaScript to display documents.
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT, Bùi Thanh Hậu - 20020524 - Coggle Diagram
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Ngăn xếp
Hoạt động theo nguyên lý “last in first out”. Tức là, phần tử cuối cùng được chèn vào ngăn xếp sẽ là phần tử đầu tiên được lấy ra khỏi ngăn xếp. Chúng ta chỉ có thể truy cập tới đối tượng dữ liệu ở đỉnh của ngăn xếp, thêm một đối tượng dữ liệu mới vào đỉnh của ngăn xếp và loại đối tượng dữ liệu ở đỉnh ra khỏi ngăn xếp. Ví dụ về chồng sách
Ngăn xếp là 1 kiểu dữ liệu trừu tượng đóng vai trò như 1 tập hợp các phần tử, với 2 phép toán chính
các phép toán ngăn xếp
Empty (S): hàm trả về true nếu ngăn xếp S rỗng và false nếu ngược lại
Push (S,x): đẩy x vào đỉnh của ngăn xếp S
Pop (S): loại đối tượng ở đỉnh của ngăn xếp S
GetTop (S): hàm trả về đối tượng ở đỉnh của S, ngăn xếp S không thay đổi
cài đặt ngăn xếp bởi mảng
sử dụng mảng element (mảng tĩnh hoặc mảng động) để lưu giữ các đối tượng dữ liệu của ngăn xếp
cài đặt ngăn xếp bởi danh sách liên kết
B1: khởi tạo stack: Init(S)
B2: tạo mới 1 nút: CreateNode(x)
B3: kiểm tra stack rỗng: isEmpty
B4: đưa phần tử vào stack: Push(S,x)
B5: lấy phần tử ra khỏi stack: Pop(S,x)
biểu thức dấu ngoặc cân xứng: 1 biểu thức dấu ngoặc được xem như 1 xâu ký tự được tạo thành từ 2 kí tự mở ngoặc hoặc đóng ngoặc. Ngăn xếp được sử dụng để lưu các dấu mở ngoặc. Thuật toán gồm các bước sau
B1: Khởi tạo 1 ngăn xếp rỗng
B2: đọc lần lượt các kí tự trong biểu thức dấu ngoặc
nếu kí tự là dấu đóng ngoặc thì
nếu ngăn xếp rỗng thì thông báo biểu thức dấu ngoặc không cân xứng và dừng
nếu ngăn xếp không rỗng thì loại dấu mở ngoặc ở đỉnh ngăn xếp
B3: sau khi kí tự cuối cùng trong biểu thức dấu ngoặc đã được đọc, nếu ngăn xếp rỗng thì thông báo biểu thức dấu ngoặc cân xứng
đánh giá biểu thức số học
đánh giá biểu thức postfix
nếu thành phần được đọc là toán hạng od thì đẩy nó vào ngăn xếp, biểu thức là S Push (od)
nếu thành phần được đọc là phép toán op thì lấy ra các toán hạng ở đỉnh ngăn xếp: od2 = S Pop(), od1 = S Pop(). Thực hiện phép toán op với các toán hạng od1 và od2, kết quả được đẩy vào ngăn xếp
lặp lại 2 bước trên ho đến khi thành phần cuối cùng của biểu thứ được đọc qua. Khi đó ngăn xếp chứa kết quả của biểu thức
chuyển biểu thức infix thành postfix
ứng dụng
sử dụng vào bài toán kiểm tra dấu ngoặc có hợp lệ hay không
https://123docz.net//document/1599188-chuong-6-ngan-xep-ppt.htm
Hàng đợi (queue)
cài đặt hàng đợi bởi DSLK
nếu muốn thêm 1 phần tử vào queue thì ta thêm vào cuối danh sách
nếu muốn lấy 1 phần tử ra khỏi queue thì ta hủy phần tử đầu danh sách
cài đặt hàng đợi bởi mảng
cần có 2 chỉ số
front và rear
để lưu chỉ số phần tử đầu và chỉ số phần tử cuối trong queue. Khởi tạo queue rỗng thì front = 0 và rear = -1
để thêm 1 phần tử vào queue, ta tăng rear lên 1 và đưa giá trị đó vào phần tử thứ rear trong mảng
để loại bỏ 1 phần tử khỏi queue, ta tăng front lên 1
chỉ những phần tử của mảng từ vị trí front tới rear mới được xem là các phần tử trong queue
khi front -> rear thì queue đang rỗng
khi rear tăng lên hết khoảng chỉ số của mảng thì mảng đã đầy, không thể thêm phần tử vào nữa
Có thể hình dung hàng đợi như một đoàn người xếp hàng mua vé. Người nào xếp hàng trước sẽ được mua vé trước và ra khỏi hàng để nhường vị trí cho người xếp hàng ngay phía sau.
2 phép toán đặc trưng
bổ sung 1 phần tử vào
cuối danh sách
(rear)
loại bỏ 1 phần tử ở
đầu danh sách
(front)
khởi tạo hàng đợi
Thao tác thêm phần tử vào hàng đợi
1.Kiểm tra xem hàng đợi đã đầy hay chưa, nếu đầy thì đưa ra thông báo.
2.Đối với phần tử đầu tiên, ta sẽ đặt giá trị của FRONT thành 0.
3.Tăng chỉ số REAR lên 1 đơn vị.
4.Thêm phần tử mới vào vị trí được trỏ tới bởi REAR.
Thao tác lấy ra phần tử khỏi hàng đợi
1.Kiểm tra xem hàng đợi có trống rỗng hay không, nếu rỗng thì đưa ra thông báo là không thể lấy ra phần tử.
2.Trả về giá trị được trỏ bởi FRONT.
3.Tăng chỉ số FRONT lên 1 đơn vị.
4.Đối với phần tử cuối cùng, đặt lại các giá trị của FRONT và REAR thành -1.
các thao tác cơ bản của hàng đợi
Enqueue: Thêm một phần tử vào cuối hàng đợi.
Dequeue: Xóa một phần tử khỏi đầu hàng đợi.
IsEmpty: Kiểm tra xem hàng đợi có trống rỗng hay không.
IsFull: Kiểm tra xem hàng đợi đã đầy hay chưa.
Peek: Nhận giá trị phía trước của hàng đợi mà không cần xóa nó.
https://tek4.vn/khoa-hoc/cau-truc-du-lieu-va-giai-thuat/khai-niem-ve-hang-doi
cây
khái niệm cây
Cấu trúc dữ liệu cây biểu diễn các nút (node) được kết nối bởi các cạnh.
khái niệm cơ bản về cây nhị phân
Cây nhị phân là một cấu trúc dữ liệu đặc biệt được sử dụng cho mục đích lưu trữ dữ liệu.
Một cây nhị phân có một điều kiện đặc biệt là mỗi nút có thể có tối đa hai nút con
Đường: là một dãy các nút cùng với các cạnh của một cây.
Nút gốc (Root): nút trên cùng của cây được gọi là nút gốc. Một cây sẽ chỉ có một nút gốc và một đường xuất phát từ nút gốc tới bất kỳ nút nào khác. Nút gốc là nút duy nhất không có bất kỳ nút cha nào.
Nút cha: bất kỳ nút nào ngoại trừ nút gốc mà có một cạnh hướng lên một nút khác thì được gọi là nút cha
Nút con: nút ở dưới một nút đã cho được kết nối bởi cạnh dưới của nó được gọi là nút con của nút đó.
Nút lá: nút mà không có bất kỳ nút con nào thì được gọi là nút lá.
Cây con: cây con biểu diễn các con của một nút.
Truy cập: kiểm tra giá trị của một nút khi điều khiển là đang trên một nút đó.
Duyệt: duyệt qua các nút theo một thứ tự nào đó.
Bậc: bậc của một nút biểu diễn số con của một nút. Nếu nút gốc có bậc là 0, thì nút con tiếp theo sẽ có bậc là 1, và nút cháu của nó sẽ có bậc là 2, …
Khóa (Key): biểu diễn một giá trị của một nút dựa trên những gì mà một thao tác tìm kiếm thực hiện trên nút.
Biểu diễn cây tìm kiếm nhị phân
Con bên trái của một nút phải có giá trị nhỏ hơn giá trị của nút cha (của nút con này) và con bên phải của nút phải có giá trị lớn hơn giá trị của nút cha (của nút con này)
Nút (Node) trong cây tìm kiếm nhị phân
Một nút sẽ có cấu trúc như dưới đây. Nút có phần dữ liệu và phần tham chiếu tới các nút con bên trái và nút con bên phải.
struct node {
int data;
struct node *leftChild;
struct node *rightChild; };
Hoạt động cơ bản trên cây tìm kiếm nhị phân
Chèn: chèn một phần tử vào trong một cây/ tạo một cây.
Tìm kiếm: tìm kiếm một phần tử trong một cây.
Duyệt tiền thứ tự: duyệt một cây theo cách thức duyệt tiền thứ tự
Duyệt trung thứ tự: duyệt một cây theo cách thức duyệt trung thứ tự
Duyệt hậu thứ tự: duyệt một cây theo cách thức duyệt hậu thứ tự
//hoclaptrinh.vn/tutorial/cau-truc-du-lieu-amp-giai-thuat-55-bai/cau-truc-du-lieu-cay
bảng băm (hash table)
phương pháp băm
phương pháp kết nối trực tiếp
: mỗi địa chỉ của bảng băm tương ứng một danh sách liên kết. Các phần tử bị xung đột được kết nối với nhau trên một danh sách liên kết
phương pháp kết nối hợp nhấ
t: bảng băm này được cài đặt bằng danh sách kề, mỗi phần tử có hai trường: trường key chứa khóa của phần tử và trường next chỉ phần tử kế bị xung đột. Các phần tử bị xung đột được kết nối nhau qua trường kết nối next
phương pháp dò tuần tự
: Khi thêm phần tử vào bảng băm nếu bị đụng độ thì sẽ dò địa chỉ kế tiếp… cho đến khi gặp địa chỉ trống đầu tiên thì thêm phần tử vào địa chỉ này
phương pháp dò bậc hai
: ví dụ khi thêm phần tử vào bảng băm này, nếu băm lần đầu bị xung đột thì sẽ dò đến địa chi mới, ở lần dò thứ i sẽ xét phần tử cách i 2 cho đến khi gặp địa chỉ trống đầu tiên thì thêm phần tử vào địa chỉ này
phương pháp băm kép
: bảng băm này dùng hai hàm băm khác nhau, băm lần đầu với hàm băm thứ nhất nếu bị xung đột thì xét địa chỉ khác bằng hàm băm thứ hai
các hàm băm
Hàm băm MD5
SHA-1
RIPEMD-160
Bcrypt
Whirlpool
SHA-2
SHA-3
BLAKE2
hàm băm sử dụng phương pháp chia
hàm băm sử dụng phương pháp nhân
https://123docz.net//document/2333856-cau-truc-du-lieu-va-giai-thuat-nang-cao-bai-3-bang-bam-hash-table.htm
https://sentayho.com.vn/ham-bam-la-gi.html
Hàng ưu tiên
mỗi phần tử được liên kết với một mức độ ưu tiên và được thực thi theo mức độ ưu tiên của nó. Nếu các phần tử có cùng mức độ ưu tiên, chúng sẽ được thực thi theo thứ tự trong hàng đợi. Nói chung, giá trị của phần tử được xem xét để gán mức độ ưu tiên.
cài đặt hàng ưu tiên
cài đặt hàng ưu tiên bằng cây có thứ tự từng phần
cây có thứ tự từng phần là cây nhị phân mà giá trị tại mỗi nút đều nhỏ hơn hoặc bằng giá trị của 2 con
ta có thể sủ dụng cây có thứ tự từng phần để cài đặt hàng ưu tiên và trong đó mỗi phần tử được biểu diễn bởi 1 nút trên cây mà độ ưu tiên ủa phần tử là giá trị ủa nút
cài đặt cây có thứ tự từng phần bằng mảng
https://voer.edu.vn/c/hang-uu-tien-priority-queue/c5e6dc01/2b75617e
quy hoạch động
là một kỹ thuật trong lập trình giúp giải quyết một cách hiệu quả một lớp vấn đề có các bài toán con chồng chéo và thuộc tính cấu trúc con tối ưu. Những bài toán như vậy liên quan đến việc tính toán nhiều lần giá trị của các bài toán con giống nhau để tìm ra giải pháp tối ưu.
Các bài toán con chồng chéo: Bài toán con là các bài toán nhỏ hơn của bài toán ban đầu. Bất kỳ bài toán nào cũng có các bài toán con trùng nhau nếu việc tìm lời giải của nó liên quan đến việc giải cùng một bài toán con nhiều lần.
Thuộc tính cấu trúc con tối ưu: Bất kỳ bài toán nào cũng có thuộc tính cấu trúc con tối ưu nếu giải pháp tối ưu tổng thể của nó có thể được xây dựng từ các giải pháp tối ưu của các bài toán con của nó.
phương pháp chung
Phương pháp tiếp cận từ trên xuống hay phương pháp ghi nhớ
giải bài toán lớn hơn bằng cách lặp đệ quy để tìm lời giải cho các bài toán con nhỏ hơn
Bất cứ khi nào chúng ta giải quyết một vấn đề con, chúng ta sẽ lưu kết quả của nó vào bộ nhớ để không phải giải quyết nó lặp đi lặp lại nếu nó được gọi nhiều lần
Thay vào đó, chúng ta chỉ cần trả về kết quả đã được lưu. Kỹ thuật lưu trữ kết quả của các bài toán con đã được giải quyết này được gọi là kỹ thuật ghi nhớ.
Phương pháp từ dưới lên hay phương pháp lập bảng
giải quyết vấn đề “từ dưới lên” (tức là bằng cách giải quyết tất cả các vấn đề con liên quan trước)
quay lui
tìm kiếm vét cạn
kỹ thuật quay lui để giải bài toán tối ưu
dựa trên đệ quy
chia - để - trị
là 1 phương pháp áp dụng cho các bài toán có thể giải quyết bằng cách chia nhỏ ra thành các bài toán con từ việc giải quyết các bài toán con này. Sau đó lời giải của các bài toán nhỏ được tổng hợp lại thành lời giải cho bài toán ban đầu.
các bước giải quyết bài toán
B1: chia/ tách nhỏ
B2: trị/ giải quyết bài toán con
B3: kết hợp lời giải lại để suy ra lời giải
ví dụ:
https://viblo.asia/p/tim-hieu-thuat-toan-chia-de-tri-va-cac-vi-du-ap-dung-3Q75wkP95Wb
đệ quy
https://viblo.asia/p/de-quy-va-giai-thuat-de-quy-gGJ5969JKX2
là 1 hàm tự gọi lại chính nó
gồm 2 phần
phần cơ sở: Điều kiện để thoát khỏi đệ quy. Nếu như không có phần này, hàm đệ quy sẽ thực hiện mãi mãi gây ra tràn bộ nhớ Stack.
Phần đệ quy: Thân hàm có chứa phần gọi đệ quy, thực hiện cho đến khi thỏa mãn điều kiện ở phần cơ sở.
đường đi ngắn nhất
https://v1study.com/giai-thuat-va-lap-trinh-cac-thuat-toan-tren-do-thi-bai-toan-duong-di-ngan-nhat.html#gsc.tab=0
đồ thị
https://123docz.net//document/3471837-do-thi-cau-truc-du-lieu-va-giai-thuat.htm
Bùi Thanh Hậu - 20020524