DANH MỤC TÀI LIỆU
Cấu trúc dữ liệu B+Tree và ứng dụng trong bài toán xử lý tập có thứ tự
C u trúc d li u B+Tree và ng d ng trong bài toán x lý t p có th ữ ệ
t
Gi i thi uớ ệ
Hi, xin chào m i ng i.ọ ườ
Lâu r i m i d o quanh 1 vòng các blog c a Vi t Nam th y blog này phát ớ ạ
tri n quá t nhiên c m th y mu n tham gia giao l u chia s ki n th c cùng ư ẻ ế
m i ng i đ cùng nhau góp 1 ph n nh cho s phát tri n ngành IT Vi t ườ ể
Nam. Gi i thi u s qua mình t ng là sinh viên Bách Khoa Hà N i khóa ệ ơ
Hedspi K52 và c u du h c sinh tr ng Keio Nh t B n. Hi n t i thì mình ườ ệ ạ
đang làm cho cty sàn giao d ch ti n mã hóa c a Nh t B n là Bitbank. ậ ả
Bài toán
Vào v n đ chính hôm nay mình s gi i thi u 1 c u trúc d li u gi i thu t ữ ệ
là BTree mà c th h n là B+Tree và ng d ng c a nó trong vi c gi i ể ơ
quy t 1 bài toán nhìn qua thì th y r t đ n gi n nh ng đế ấ ơ ư scale up v i kích
th c d li u l n và các thao tác di n ra v i t n su t cao thì th c s l i là ướ ự ạ
1 v n đ khác.ấ ề
Bài toán đ t ra nh sau chúng ta có 1 t p các s đ c s p x p theo th t ư ượ ế ứ ự
tăng d n ví d nh ụ ư [1,2,3,5,7,8,9,12]. Và yêu c u đ t ra là chúng ta ph i ầ ặ
thêm ho c xóa b t 1 s ph n t sao cho v n đ m b o th t tăng d n. R t ứ ự
đ n gi n đúng không và nh bình th ng chúng ta cũng có cách gi i quy t ơ ả ư ườ ế
đ n gi n dùng c u trúc d li u m ng và gi i thu t tìm ki m tu n t (ơ ế linear
search) (nh ng ph n code minh h a trong bài vi t mình s s ế ẽ ử
d ng typescript).
Cách gi i đ n thu nả ơ
const arr = [1,2,3,5,7,8,9,12];
// insert
function insert(value: number) {
// tìm v trí ph n t đ u tiên l n h n ho c b ng ${value} ử ầ ơ
const pos = arr.find((a) => a >= value);
// chèn value vào v trí này
arr.splice(pos, 0, value);
}
// delete
function delete(value: number) {
// tìm v trí ph n t đ u tiên l n h n ho c b ng ${value} ử ầ ơ
const pos = arr.find((a) => a >= value);
// xóa v trí này n u tìm th y ế ấ
if (arr[pos] === value) {
arr.splice(pos, 1);
}
}
D th y đ ph c t p cho m i thao tác ứ ạ insert ho c delete c a cách làm này
là O(n) v i n = arr.length. Gi s v trí c n tìm là k (0 <= k <= n) chúng ta ả ử
c n k + 1 phép so sánh đ tìm đ c v trí này sau đó đ ượ ị insert hay delete ta
cũng c n reindex toàn b các ph n t phía sau t ng c ng là c n n thao tác ầ ử
t c là O(n) đ hoàn thành.
C i ti n v i binary search trên arrayả ế
V i c u trúc d li u m ng array chúng ta có th truy c p đ n ph n t v ế ử ở
trí b t kỳ v i th i gian O(1). T n d ng đi u này ta có th áp d ng binary
search trên m ng đã s p x p đ tăng t c thao tác tìm ki m. ắ ế ể ế
function binarySearchPosition(value: number, firstIndex: number, lastIndex:
number): number {
if (firstIndex === lastIndex) {
return firstIndex;
}
const middleIndex = Math.floor((firstIndex + lastIndex) / 2);
if (arr[middleIndex] === value) {
return middleIndex;
}
return arr[middleIndex] < value
? binarySearchPosition(value, middleIndex + 1, lastIndex)
: binarySearchPosition(value, firstIndex, middleIndex);
}
Áp d ng hàm tìm ki m này chúng ta c i ti n cài đ t ban đ u b ng vi c thay ế ả ế
th dòng l nh tìm ki m tu n t nh sau:ế ế ầ ự ư
// 'const pos = arr.find((a) => a >= value)' thay b ng
const pos = binarySearchPosition(value, 0, arr.length);
Ta th y cài đ t ph n search đã đ c c i ti n ch v i m i phép so sánh ượ ế ở ỗ ớ
v i ph n t gi a s l ng m ng tìm ki m c a chúng ta đã gi m đi 1 n a ố ượ ế
ch không ph i ch gi m 1 nh cài đ t ban đ u. Ta làm đ c đi u này là do ỉ ả ư ượ
tính ch t có th truy c p đ n ph n t gi a 1 cách t c thì c a m ng. ế ử ữ
đi u này cũng có s đánh đ i khi thao tác modify m ng (insert, delete) v n ự ổ
c n đ m b o tính ch t này b ng cách ph i reindex toàn b các ph n t phía ầ ử
sau v trí b thay đ i. Th i gian tính toán c a thao tác này tùy thu c v trí ộ ị
thay đ i nh ng v trung bình mà nói c b n v n là O(n) m c dù c i ti n là ư ơ ả ế
r t đáng k so v i cài đ t ban đ u. ể ớ
chi u h ng khác c u trúc d li u ướ LinkedList cho phép insert, delete vở ị
trí xác đ nh v i th i gian t c thì O(1) nh ng v i ư LinkedList không có cách
nào đ truy c p nhanh ph n t gi a mà không ph i duy t nh trên m ng do ầ ử ữ ư
đó v n ph i s d ng tìm ki m tu n t v i đ ph c t p O(n). ử ụ ế ự ớ
R t may chúng ta có gi i pháp k t h p đi m m nh c a c 2 c u trúc d ế ợ
li u k trên làệ ể Array và LinkedList.
C i ti n v i c u trúc d li u B+tree ế ữ ệ
B+Tree có th đ c nhìn d i góc đ nh là s k t h p ể ượ ướ ư ự ế
gi a Array và LinkedList:
Tìm ki m (search)ế: m i phép so sánh cho phép ta lo i 1 c s ph n ơ ố
t đ đ n v i v trí c n tìm nhanh h n.ử ể ế ơ
Ch nh s a (modify)ỉ ử : thao tác insert, delete 1 v trí xác đ nh không ở ị
làm nh h ng đ n toàn b các ph n t còn l i. ưở ế ầ ử
B+Tree là c u trúc d ng cây tìm ki m và là t ng quát c a cây tìm ki m nh ế ế ị
phân (Binary Search Tree - BST) v i 1 node g c ( root), các node trong
(internal node) có ch a các node con và các node d i cùng không ch a ướ ứ
node con g i là node lá (leaf node).
Các node trong ch a n ph n t g i là khóa tìm ki m ( ử ọ ế key) và t ng ươ
ng là n+1 node con có tính ch t:
key[i-1] <= {child[i].data} < key[i]
S l ng khóa và node con trong 1 node dao đ ng trong 1 kho ng ố ượ
h ng s nh đ c xác đ nh b i giá tr ỏ ượ order (d ch là b c) c a B+tree. ậ ủ
T t c các ph n t c a t p c n qu n lý đ u n m node lá. ử ủ
T t c node lá đ u có cùng đ cao và đ c liên k t nhau theo th t ượ ế ứ ự
b ng pointer nhằ ư linkedlist.
Chúng ta có th tìm ki m nhanh trên cây này b ng cách b t đ u t node g c ế ắ ầ
so sánh các khóa trên t ng node đ đi vào nhánh phù h p. Các node trong ừ ể
ch a các ph n t ch đóng vai trò là các khóa trung gian đ tìm ki m. ầ ử ế
Chúng ta có th hình dung vể ề B+tree theo cách khác nh sau:ư
Có 1 t p các ph n t đã đ c s p x p th ầ ử ượ ế
t [1,2,3,4,5,6,7,8,9,10,11,12]
Tách t p này thành các kh i 2 ph n t , liên k t nhau theo ki u ầ ử ế
linkedlist (1,2)->(3,4)->(5,6)->(7,8)->(9,10)->(11,12)
T kh i th 2 tr đi ch n ra ph n t đ u tiên làm đ i di n ta có t p ử ầ
các ph n t t ng th 2 ử ở [3,5,7,9,11]
đây ta có c u trúc d ng cây v i 1 nút g c ch a 5 khóa (g i là key) và 6 ố ứ
nút con m i nút ch a 2 ph n t có tính ch t k p gi a. ầ ử ấ ẹ
(3,5,7,9,11)
(1,2)->(3,4)->(5,6)->(7,8)->(9,10)->(11,12)
Khi tìm ki m trên c u trúc này ta s b t đ u t node trên tìm ki m tu n t ế ắ ầ ừ ế ầ ự
đ tìm ra nhánh ch a ph n t c n tìm. D th y v i m i phép so sánh mà ử ầ
ch a tìm ra, ta s lo i đ c 1 nhánh v i nhi u ph n t mà trong tr ng ư ẽ ạ ượ ầ ử ườ
h p này là 2. Ti p t c l p l i thao tác v i t ng th 2 ta có t ng th 3: ế ầ ứ ầ ứ
(7,11)
(3,5) (7,9) (11)
(1,2)->(3,4)->(5,6)->(7,8)->(9,10)->(11,12)
T ng t m i phép so sánh t ng 3 cho phép lo i 2 ph n t t ng 2 ươ ở ầ ở ầ
t ng ng 4 ph n t t ng d i cùng (t ng c n tìm ki m). T p t t c các ươ ử ầ ướ ế
node d i cùng g i là lá (leaf) chính là t p các ph n t mà ta có ban đ u. ướ ầ ử
V i s l ng ph n t nhi u h n b t kỳ ta có th làm các thao tác trên l p ố ượ ơ
l i cho đ n khi còn 1 node trên cùng v i 2 ph n t . Đây chính là c u trúc d ế ầ ử
li u B+tree v i b c là 3. ớ ậ
Đ ph c t p tính toán c a B+tree ứ ạ
Kích th c node là các giá tr dao đ ng trong 1 kho ng nh (vd: 1->2, 2->3) ướ ả ỏ
xác đ nh đ i di n b i giá tr ệ ở order (d ch là b c) c a B+tree. Đ ph c t p ứ ạ
trong tìm ki m đ c tính b i s phép so sánh mà ta ph i làm (trong tr ng ế ượ ở ố ườ
h p x u nh t) đ đi đ n v trí c n tìm đó là:ợ ấ ế ị
Kích th c node (đ i di n b i order) * Đ cao cây (h)ướ ệ ở
V i order là 1 constant đ c xác đ nh t tr c và đ cao h là bi n s t l ượ ướ ế ố ỉ ệ
thu n v i kích th c t p ví d v i kích th c m i node là 2 có th coi ư ụ ớ ướ
như h = log n thì nh v y ta có đ ph c t p tính toán đ t đ c trong tìm ư ậ ượ
ki m làế O(log n), đây là hi u suât t t h n r t nhi u so v i ơ O(n).
Khi đã tìm đ c v trí thì chi phí cho thao tác insert hay delete trong ph m vi ượ ị
1 node (các ph n t l u trong 1 node b i c u trúc m ng) là không đáng k ử ư
vì kích th c node là 1 h ng s nh i di n b i order).ướ ỏ ạ
Ti p theo sau khi đã modify (insert ho c delete) B+tree này chúng ta ph i ế ặ ả
duy trì tính ch t c a tree vàấ ủ s cân b ng đ đ m b o tính đúng đ n và hi uể ả
qu , đ ph c t p cho các thao tác này v n là ứ ạ O(log n). Chúng ta hãy cùng đi
vào cài đ t c th .ặ ụ
thông tin tài liệu
Giới thiệu 1 cấu trúc dữ liệu giải thuật là BTree mà cụ thể hơn là B+Tree và ứng dụng của nó trong việc giải quyết 1 bài toán
Mở rộng để xem thêm
từ khóa liên quan
xem nhiều trong tuần
yêu cầu tài liệu
Giúp bạn tìm tài liệu chưa có

LÝ THUYẾT TOÁN


×