Big Theta
V i hàm c, kí hi u là t p h p các hàm th a mãn:
Mô t hình h c c a Big- c th hi n trong Hình 2.1
Có th nói r ng hàm m c c ký hi u là
Chú ý r ng vi t thay vì
Big-O
V i hàm c, kí hi u là t p h p các hàm th a mãn:
Mô t hình h c c a Big- c th hi n trong Hình 2.2
Có th nói r ng hàm n trên ti m c n cho c ký hi u là ho c
Big-Omega
V i hàm c, kí hi u là t p h p các hàm th a mãn:
Mô t hình h c c a Big-Omega c th hi n trong Hình 2.3
Có th nói r ng hàm i ti m c n cho c ký hi u là ho c
2.2.4 S d ng các kí hi u Big-Theta, Big-O, Big-Omega
Liên h gi a , , : V i hai hàm b t k và ,
- c hi ng h p x u nh t (worst case), t c là th i gian tính trong tr ng h p x u nh c xác nh b i m
- hi ng h p t t nh t (best case), t c là th i gian tính toán trong tr ng h p t t nh nh b i m t hàm nào
- Thu t toán tìm ki m ph i duy t qua t t c các ph n t (n u là ph n t cu i ho c không tìm th y trong m ng) Vì v y, bài toán tìm ki ph c t p là thay th cho m
- nh, thì không th c k t lu n
Ví d 2.6 nh các h ng s ch các ti m c
- Gi s t n t i sao cho: Ta có suy ra hay Do và là các s d ng nên u không th x y ra, do không th nh h n h ng s
Chú ý r ng giá tr c a và không ph i là duy nh t trong công th c ti m c n
Thuật toán có thời gian tính là cách thức thực hiện (còn gọi là thuật toán thực) Các thuật toán được coi là hiệu quả khi chúng đạt được kết quả mong muốn trong thời gian hợp lý Các thuật toán với hiệu quả cao thường được áp dụng trong các bài toán có tính phức tạp tính toán lớn.
V i bài toán , c n trên cho th i gian tính c a là n u gi i t n t i gi i thu t toán gi i v i th i gian tính là
V i bài toán , c i cho th i gian tính c a là n u m i thu t toán gi i u có th i gian tính là
V i bài toán , th i gian tính c a là n u có c n trên cho th i gian tính là và có c i cho th i gian tính là
B ng so sánh gi Big-O, Big-Theta và Big-Omega
Big-O Big-Omega Big-Theta
T ng c a m t thu t toán nh h n ho c b ng m t giá tr c th
T ng c a m t thu t toán l n h n ho c b ng m t giá tr c th
T ng c a m t thu t toán b ng m t giá tr c th
Là th i gian c n thi t nhi u nh t (hi u su t trong tr ng h p x u nh t)
Là th i gian c n thi t ít nh t (hi u su t trong tr ng h p t t nh t)
Là hi u su t t t nh t trong t t c các tr ng h p x u nh t mà thu t toán có th th c hi n
M c g i là d gi i n u có th gi c nh thu c, bao gồm các bài toán như tìm vị trí phần tử có giá trị lớn nhất trong dãy số và sắp xếp dãy số.
M c g i là một bài toán khó giải, đặc biệt là trong lĩnh vực thu thập thông tin Các bài toán có liên quan đến việc liệt kê các hoán vị của một tập hợp hoặc liệt kê các xâu nhị phân dài thường được coi là những bài toán khó giải.
M t d c xem là khó gi n th i m hi n t i v c thu gi i Có th th y các bài toán sau là khó gi i du l
M c g i là không gi c n n t i thu gi i nó Có th th y các bài toán sau là không gi c: Bài toán v tính d ng, bài toán v nghi m nguyên c
Mã giảng ngôn ng là một phương pháp toán học sử dụng ngôn ngữ lập trình Tuy nhiên, việc mô tả thuật toán trở nên phức tạp và khó khăn Do đó, mã giảng ngôn ng cho phép việc mô tả thuật toán bằng ngôn ngữ lập trình và sử dụng những cấu trúc lập trình Các mục kê một số câu lệnh sử dụng trong tài liệu mô tả thuật toán.
2.4.3 C u khi n if condition then else endif case cond1: stat1 cond2: stat2 condn: statn endcase
- while conditon do endwhile for [step d] dãy câu l nh endfor
Hàm
Function max(A(1:n)) begin datatype interger i x = A[1] for i = 2 to n do if x < A[i] then x = A[i] endif endfor return (x) end max
2.5 M T S K THU T PHÂN TÍCH THU T TOÁN
Giải và nghiệm của thuần có thể hiểu là một câu lệnh học một thuật toán con Giải và phức tạp của và quy tắc tuần tự của một phức tạp, thực hiện, tiễn là, s là: học, theo ký ngôn ng ký hiệu Theta( ).
Xét vòng l p sau: for i in range(1, ):
Gi s th i gian th c hi n c a là i gian th c hi n vòng l p for s là
Function Fibiter(n) begin i = 0 j = 1 for k = 2 to n do j = j + i i = j - i endfor return j end
Hàm Fibiter có th t b ng ngôn ng def FibIter(n): if n T[k]: i = k + 1 endcase endwhile end
G i là s ph n t c a m ng c n ti p t c kh o sát Ký hi u theo th t là giá tr c a c và sau khi th c hi n vòng l p Kh
Vòng l p k t thúc khi nên thu t thúc G i là giá tr c a l n l p th và
Thu t toán k t thúc c n u y ra khi
Hàm tìm ki m nh phân có th t b ng ngôn ng def binary_search(array, x): i = 0 j = len(array)-1 while i < j: k = (i + j) // 2 if x < array[k]: j = k - 1 elif x == array[k]: return k else: i = k + 1 return -1
Câu l là một trong những câu lệnh có số lượng thực thi nhiều nhất trong thuật toán Thời gian thực hiện mỗi câu lệnh bị ảnh hưởng bởi độ phức tạp của thuật toán, và số lần thực hiện câu lệnh cũng có thể làm tăng độ phức tạp này.
Ví d 2.10: Xét thu t toán tìm s Fibonaci th n v i hàm Fibiter trên
The Python function `Maxsum(array)` calculates the maximum sum of contiguous subarrays It initializes `maxsum` to zero and determines the length of the input array The function employs three nested loops to iterate through all possible subarrays, calculating their sums If a subarray's sum exceeds the current `maxsum`, it updates `maxsum` Finally, the function returns the maximum sum found.
Câu l a hàm là i gian tính c a thu t toán là
Khi xét ràng buộc trong thuật toán yêu cầu thực hiện nhiều vòng lặp lồng nhau, có thể xảy ra tình huống câu lệnh nằm trong vòng lặp trong cùng Điều này có thể làm cho câu lệnh trở nên khó khăn trong việc xác định số lần thực thi chính xác của nó trong vòng lặp lồng nhau.
Câu 1: So sánh hai hàm sau: a và : hay b và : hay
Câu 2: ph c t p cho các hàm sau: a + b c Câu 3: ph c t p c a các hàm sau: a b c d e f g
The article discusses four different implementations of a function named `SUM` in Python, each with varying levels of complexity The first implementation iterates through two nested loops, counting up to \( n \) and \( n^2 \), while the second uses a nested loop that counts up to \( i \), where \( i \) ranges from 0 to \( n \) The third implementation features three nested loops, with the outer loop running from 0 to \( n-1 \) and the inner loops iterating based on the square of the current index Lastly, the fourth implementation includes a single loop that counts up to \( n \) and another nested loop that computes a value based on the sum and the second loop's index.
Bi t r ph c t p c a hàm compute_val(x, y) là
Câu 5: Xét thu quy sau:
Để xây dựng một thuật toán hiệu quả, cần thực hiện các bước sau: đầu tiên, xây dựng công thức cho đầu vào \(s\) Nếu điều kiện không thỏa mãn, trả về giá trị 1 Tiếp theo, phát triển công thức cho phép nhân của thuật toán cần thực hiện Sau đó, xây dựng công thức cho phép toán cộng/trừ của thuật toán Cuối cùng, thiết lập công thức tính thời gian thực thi của thuật toán.
Trong th c t ng g p nh ng bao g m chính nó ho c i d ng c a chính nó, ch ng h
Gi i thu quy: N u l i gi i c a bài toán c th c hi n b i l i gi i c a m t bài toán , có d là m t l i gi quy Gi i thu t ch a l i gi c g i là gi i thu quy ( )
3 h thu c vào bi n nguyên không âm theo các
- B c quy: cho giá tr c a nh quy t c tính giá tr c a
Ch ng h n, m t s ph n t u tiên c a là: và
Function RecAlg(input) begin if (kích t then else return endif end
Function D-and-C(n) begin if then else
Chia bài toán thành c for(m i bài toán trong bài toán con) do D-and-C( )
Chia dãy g m n ph n t c n s p x p ra thành hai dãy con, m i dãy có
Function MERGE_SORT( ) begin if
G i th c hi n th t c: MERGE_SORT( )
Input: M ng A và các ch s sao cho
Tính và sao cho ph n t u tiên vào và ph n t ti p theo vào for to do if then else endfor end MERGE
- n t vào m ng k t qu (vòng for cu i): n l n l p, m i l n t n th i gian là h ng s
- T ng c ng th i gian tr n là def mergeSort(arr): if len(arr) > 1: mid = len(arr)//2
R = arr[mid:] mergeSort(L) mergeSort(R) i = j = k = 0 while i < len(L) and j < len(R): if L[i] < R[j]: arr[k] = L[i] i += 1 else: arr[k] = R[j] j += 1 k += 1 while i < len(L): arr[k] = L[i] i += 1 k += 1 while j < len(R): arr[k] = R[j] j += 1 k += 1
Hàm def Fact(n): if n==0: return 1 else: return n*Fact(n-1)
Dãy s def FibRec(n): if n finish then return -1 endif
The binary search algorithm efficiently locates a target value within a sorted array It begins by calculating the middle index using the formula \( \text{middle} = \frac{\text{start} + \text{finish}}{2} \) If the middle element equals the target value, the index is returned If the target is less than the middle element, the search continues in the left half of the array; otherwise, it proceeds to the right half The process repeats until the target is found or the search space is exhausted, returning -1 if the value is not present This method significantly reduces the number of comparisons needed compared to linear search, making it a preferred choice for large datasets.
Ví d 3.12: Bài toán tháp Hà N i c mô t c a, b, c C c a có m t ch ng g ng kính gi m d n t i lên trên C n ph i chuy n ch c c a sang c c c tuân th quy t c M i l n ch chuy n m c x ng kính nh ng kính l c dùng c
N u thì ch vi c chuy c c a sang c c c
1 Chuy n c c a n c c b s d ng c c c c này ph i c th c hi n v i s l n di chuy i th c hi n v i
2 Chuy ng kính l n nh t) t c c a sang c c c
Chuyển n- c c b n c c c yêu cầu phải thực hiện với số lần di chuyển tối thiểu Để tính toán số lần di chuyển ít nhất, chúng ta có công thức quy định như sau: 1) và 3) yêu cầu phải thực hiện với l n di chuyển.
Thu t toán có th mô t
Function HaNoiTower (n, a, b, c) begin if n = 1 then chuyen dia tu coc a sang coc c else
HaNoiTower (1, a, b, c) HaNoiTower (n-1, b, a, c) endif end def TowerOfHanoi(n , a, b, c): if n==1: print("chuyen mot dia tu coc",a,"sang coc",c) return
- G i là th i gian tính toán c a thu t toán
- Xây d ng công th quy cho
- Gi i công th nh giá cho , còn g i là gi i công th i v i
G i là s phép toán c ng ph i th c hi n trong l nh g i FibRec(n) Ta có:
Phân tích cho thấy việc sử dụng hàm FibRec để tính toán số Fibonacci là không hiệu quả Thay vào đó, nên sử dụng hàm lặp def FibIter(n): với các biến f1, f2, f3 được khởi tạo là 0 Nếu n nhỏ hơn hoặc bằng 1, hàm sẽ trả về n Ngược lại, hàm sẽ tính toán số Fibonacci bằng cách lặp qua các giá trị từ 2 đến n, cập nhật f1 và f2, và cuối cùng trả về giá trị f3.
Function D-and-C(n) begin if then else begin
Chia bài toán thành c for(m i bài toán trong bài toán con) do D-and-C( )
G i là th i gian gi c Th tr d a trên th i gian th c hi n ba thao tác c a thu t toán
- Chia bài toán ra thành bài toán con, m c yêu c u th i gian
- Tr các bài toán con:
Giới thiệu về định lý Master, một công cụ hữu ích trong việc phân tích độ phức tạp của các thuật toán chia để trị Định lý này cung cấp các quy tắc tổng quát cho dãy số thỏa mãn công thức quy nạp Đối với các hằng số \(a\) và \(b\) cùng với \(n\) là số nguyên không âm, định lý Master giúp xác định độ phức tạp của các thuật toán thông qua các điều kiện cụ thể.
Chia: Tính trung bình c a và :
Tr : Gi quy hai bài toán con, m c :
T h p: Tr n hai m ng con v i ph n t v i th i gian nh lý th
Phân tích thu t toán tính
G i là th i gian th c hi n l nh g i hàm dàng th y th a mãn công th quy sau: v i m i
Có th ch ng minh quy trên không hi u qu
Function begin if then return else return end c khi g i hàm c n kh i t o m ng 2 chi
Thu t toán quay lui là m t k thu c áp d gi i quy t nhi u v khác nhau Thu c mô t
Bài toán li t kê (Q): cho là các t p h u h n, ký hi u:
Gi s là tính ch t trên , yêu c u li t kê t t c các ph n t c a X th a mãn tính ch t : th a mãn tính ch t Các ph n t c a t p c g i là các l i gi i ch p nh c
Bài toán li t kê chu i nh dài c quy v bài toán li t kê các ph n t c a t p:
Bài toán li t kê các t p con ph n t c a t p c quy v bài toán li t kê các ph n t c a t p:
G i l i gi i b ph n c p là b có th t g m thành ph n
- N u l i gi i b ph n c c kí hi c g i là l i gi i r ng
- N u , bài toán có l i gi n là m t l i gi i c a bài toán ng
Thu t gi c xây d ng d a trên vi c xây d ng t ng thành ph n c a l i gi i
Thuật toán bù trừ giải tính chất các phần tử của tập có thể chọn vào vị trí thành tố của lưới Những phần tử này gọi là những ngữ viên (UCV) vào vị trí thành tố của lưới, ký hiệu UCV Lý do, bổ sung vào lưới giải thuật lưới phần cấp 1.
Tóm lại, giá trị có lợi giải quyết các vấn đề cấp bách tính chất của các phần tử có thể chẩn đoán vào vị trí thực của lợi giải Những phần tử gợi ý là những ứng viên (UCV) vào vị trí thực của lợi giải gợi là khi thành phần chẩn là ng hợp sau:
- y , b sung vào l i gi i b ph n c p c l i gi i b ph n c p
- N u , ti p t c xây d ng thành ph n th c a l i gi i ng h p ngõ c i gi i b ph n không th ti p t c phát tri n thành l i gi ng h p này ph i tìm UCV m i vào v trí th c a l i gi i
N u tìm th y UCV m i thì b sung vào v trí th r i ti p t c xây d ng thành ph n th
N c UCV m i thì quay lui th c tìm UCV m i vào v trí th n l i gi i r ng mà v c UCV m i vào v trí th 1 thì thu t toán k t thúc
Thu t toán quay lui có th mô t
Xây d ng for do /* v i m i UCV y t */ begin if then Ghi nh n l i gi i ( ) else Backtrack(k+1) end end
G i th c hi n th t c quay lui: Backtrack (1)
Chú ý t thu t toán quay lui cho các bài toán c th , c n gi i quy t hai v b n sau:
- Tìm thu t toán xây d ng các t p UCV
- Tìm mô t các t có th t thao tác li t kê các ph n t c a chúng t vòng l c for )
Hi u qu c a thu t toán li t kê ph thu c vào vi c chính xác các t p UCV hay không
N u ch c n tìm m t l i gi i thì c n tìm cách k t thúc các th t c g quy l ng nhau sinh b i l nh g i Backtrack (1) sau khi ghi nh c l i gi u tiên
N u k t thúc thu c m t l i gi i nào thì bài toán không có l i gi i
Thuật toán đơn giản mở rộng cho bài toán liệt kê có thể mô tả là b (dài hầu hết) Tuy nhiên, giá trị dài không bị giới hạn và các liệt kê thực tế phải dài Chỉ cần dòng lệnh: if then Ghi nhận là liệt kê ( ) else Backtrack(k+1) có thể được chuyển thành: if là liệt kê thì Ghi nhận là liệt kê ( ) else Backtrack(k+1).
C n xây d ng hàm nh n bi t b ( i gi
Li t kê t t c các cách x p n quân H u trên bàn c n m trên cùng m t dòng hay cùng m t c t ho c m ng chéo c a bàn c ng d n:
- các c t và dòng c a bàn c t n Cách x p H u có th bi u di n b i b có thành ph n là t c t c a quân H u dòng th
- v i m i : hai quân H u hai dòng và c n m trên cùng m t c t;
- v i m i : hai quân H u hai ô ( ) và ( c n m trên cùng m ng chéo y bài toán x p H bài toán li t kê các ph n t c a t p:
- p H bài toán li t kê các hoán v th a mãn tính ch t b sung: ,
Hàm nh n bi t ng c viên function UCVh (j, k) begin int i for i =1 to k-1 do if j=a[i] or fabs(j-a[i]) = k i then return 0 return 1 end
Funtion Hau(i) begin for j = 1 to n do if UCVh (j, i) then A[i] = j if i = n then
In ra ket qua else Hau(i+1) endif endif endfor end
Bài toán x p H u không ph i luôn luôn có l i gi i, c th bài toán không có l i gi i khi n n ph i thông báo khi k t thúc thu t toán
Câu 1: ph c t p c a các hàm sau: a def f4(n): if n > 1: return 1 + 2 * f4(n - 1) return 0 b def f5(n): if n > 1: return 3 * f5(int(n/2))+1 return 0
Câu 2: Xét thu t toán tính giá tr trong hàm def F(x, n): if n == 0: return 1 elif n%2==0: return F(x,int(n/2))*F(x,int(n/2)) else: return F(x,int(n/2))*F(x,int(n/2))*x
G i là th i gian tính c a thu nh công th quy cho và ph c t p cho T(n)
Câu 3: Hai thu t toán sau có th c s d tính v i là s
Thu t toán pow2A def pow2A(n): if n == 0: return 1 else: return 2 * pow2A(n-1)
Hàm đệ quy pow2B(n) tính giá trị 2^n bằng cách gọi lại chính nó Nếu n bằng 0, hàm trả về 1; ngược lại, nó sẽ tính tổng của hai lần gọi hàm với n giảm đi 1 Phương pháp này thể hiện tính chất đệ quy trong lập trình, cho phép thực hiện các phép toán trong thời gian nhất định Để đánh giá hiệu quả của thuật toán, cần xem xét độ phức tạp và thời gian thực thi.
Câu 4: quy sau: def myst(x, n): if n == 0 : return 1 if n % 2 == 1: y = myst(x, int((n-1)/2)) return x * y * y else: y = myst(x, int(n / 2)) return y * y ph c t p c a thu t toán, gi s t t c phép toán th c hi n trong th i gian và
Câu 5: Cho thu quy sau: def F(x, n): if n == 0 : return 1 elif n % 2 == 0: tmp = F(x, int(n/2)) return tmp * tmp else: tmp = F(x, int(n / 2)) return tmp * tmp * x
Kh quy cho hàm trên
- Cách bi u di n d li c s d ng chung cho t t c các giá tr
- T p các phép toán có th th c hi n trên t t c các giá tr
CÂY
Cây
Cây là t p h p các nút xu t phát t c bi c g i là g c (root), và các c nh (edge) n i các nút v i nhau
Cây là một cấu trúc dữ liệu bao gồm các nút Mỗi nút có thể có một hoặc nhiều nút con, trong đó nút cha (parent) là nút gốc của các nút con Cây có thể được xây dựng từ các nút, và các nút con là những nút trực tiếp liên kết với nút cha Một cây rỗng (null tree) là cây không chứa bất kỳ nút nào.
- Phân c p qu n lý hành chính
5.1.2 Các thu t ng liên quan
B c degree.N u là nút trên cây sao cho là cha c a v i c g i là (path) t nút n nút dài (length) c b t m
N nút t i nút , thì c g i là t tiên (ancestor) c a , còn c g i là h u du (descendant) c a a
T tiên (h u du ) c a m t nút khác v c g i là t tiên (h u du ) ng (proper) Trong cây, g c là nút không có t ng và m i u là h u du ng c a nó
M t nút không có h u du c g i là nút lá (leaf) c g i là anh em (sibling)
Cây con (subtree) c a m t cây là m t nút cùng v i t t c các nút h u du c a nó
Chi u cao (height) c a nút trên cây b dài c dài nh t t n lá c ng v i 1 Chi u cao c a cây (height of a tree) là chi u cao c a g c Chi u sâu/m c (depth/level) c a nút là 1 c ng v t t g n nó
Hình 5.2: Các thành ph n c a cây
Hình 5.4 Chi u cao (height) và chi u sâu/m c (depth/level)
Hình 5.5 Chi u cao, chi u sâu, m c c a cây
S ng con c a nút c g i là b c (degree) c a
5.1.3 Cây có th t (Ordered Tree)
Các con c a m c x p theo th t t trái sang ph i Hai cây trong hình sau là khác nhau vì hai con c a nút xu t hi n trong hai cây theo th t khác nhau:
Cây v c x p th t c g i là cây có th t Khi mu n kh nh n th t , c n ph nh rõ là cây không có th t
Các nút con (anh em) có thể so sánh với nhau mà không cần có cùng quan hệ tiên hủy Quy tắc so sánh là: nếu hai nút là anh em và một nút nằm bên trái, thì tất cả các nút con của bên trái đều phải nhỏ hơn.
Ví d 5.1: Nút bên ph i nút , bên trái các nút và không i c a các nút t tiên c a chúng
Có th x p th t các nút c a cây theo nhi u cách g m th t c, th t sau và th t gi a (Preorder, Postorder, Inorder) Các th t
N u cây là r ng thì danh sách r ng là danh sách theo th t c, th t sau và th t gi a c a cây
N u cây có m t c, sau, gi a c a cây c l i, gi s là cây có g c v i các cây con
Duy t theo th t c Preorder Traversal
- Các nút c a theo th t tr c
- Các nút c a theo th t tr c
- Sau cùng là các nút c a theo th t tr c
Duy t theo th t sau Postorder Traversal
Th t sau c a các nút c a cây :
- Các nút c a theo th t sau
- Các nút c a theo th t sau
- Các nút c a theo th t sau
Duy t theo th t gi a Inorder Traversal
Th t gi a c a các nút c a cây :
- Các nút c a theo th t gi a
- Các nút c a m c x p theo th t gi a
T Hình 5.10, chúng ta có các k t qu duy t cây theo th t :
Cách d nh th t duy ngoài cây b u t g c chi ng h Xét ví d v i cây
Hình 5.11: Th t duy t các nút i v i th t c, in nút m i v i th t l n cu c khi quay v nút cha c a nó i v i th t gi c in ra khi n hai c x p theo th t t trái qua ph ba cách.
CÁC PHÉP TOÁN TRÊN CÂY BST
- tìm ki m m t nút có giá tr khóa b ng key
- tìm giá tr nh nh t
- chèn thêm m t nút v i khóa cho s n vào cây BST
- xóa thêm m t nút v i khóa cho s n vào cây BST t s n
Tìm ki m ph n t có khóa b ng key trên BST: tìm ki m m t khóa trên cây, ti
- N u khóa c n tìm nh a nút hi n t i thì ti p t c tìm cây con trái
- c l i, n u khóa c n tìm l a nút hi n t i thì ti p t c tìm ki m cây con ph i
Vi c tìm ki m ph i duy dài c cao c i gian tìm ki m s là là chi u cao c a cây
In Python, the `Search` function is designed to locate a node with a specified key in a binary search tree The function checks if the current node is `None` or if its key matches the desired key, returning the node if found If the current node's key is less than the target key, the function recursively searches the right subtree; otherwise, it searches the left subtree.
Tìm ph n t nh nh t và l n nh t: Find_Min, Find_Max
Vi c tìm ph n t nh nh t (l n nh t) trên cây nh phân tìm ki m có th th c hi n nh vi c di chuy n trên cây mà không c n so sánh khóa C th :
- Tìm ph n t nh nh n khi g p None
- Tìm ph n t l n nh n khi g p None
3 return T quy thu t toán Find- def Find_Min(root): current = root while (current is not None): current =current.left return current
K c c và k c n sau (Predecessor và Successor)
- K c n sau (Successor) c a nút là nút sao cho là khóa nh nh t còn l n
, k c n sau c a nút v i khóa l n nh t None
- K c c (Predecessor) c a nút là nút sao cho là khóa l n nh t còn nh , k c c c a nút v i khóa nh nh t None
Vi c tìm ki m k c n sau hay k c c th c hi n mà không c n so sánh khóa
N u có con ph i thì k c n sau c a là nút v i khóa nh nh t trong cây con ph i c a (nói cách khác là nút trái nh t trong cây con ph i c a )
- tìm có th dùng Find-Min( right): Find_Min( right)
- Ho c b u t g c c a cây con ph n khi g p nút c n tìm
N u không có con ph i thì k c n c a là t tiên g n nh t có con trái ho c là ho c là t tiên c a tìm c n sau:
- B u t di chuy n lên trên (theo giá tr n khi g p nút có con trái u tiên thì d ng, là k c n sau c a
- N u không th di chuy n ti n g c) thì là nút l n nh t (vì th không có c n sau)
- N u có con trái thì k c c c a s là nút v i khóa l n nh t trong cây con trái c a (nói cách khác là nút ph i nh t trong cây con trái c a ): Find_Max( left)
- N u không có con trái thì k c c c a là t tiên g n nh t có con ph i ho c là ho c là t tiên c a h a tìm k c n sau và k c c
Hình 6.3: Tìm ki m k c n sau và k c c
Thêm và xóa nút trên cây BST
Vi c b sung thêm m t nút (ho c lo i b m t nút) c c th c hi n sao cho sau khi b sung (lo i b c v n là cây BST
Predeces sor c a là t tiên g n nh t có con ph i ho c là ho c là t tiên c a
Successor c a là t tiên g n nh t có con trái ho c là ho c là t tiên c
Successor c a Predeces sor c a là là
Thao tác thêm nút (Insertion)
Di chuy tìm cha c a nút m i So sánh khóa c a ph n t c n chèn v i u là g c c a cây), n u khóa c a ph n t c n chèn l
(nh a nút theo con ph i (con trái) c u g p None thì d n tìm
Thêm nút m c (chú ý nút m i luôn là nút lá) t c a thao tác thêm
T o m i nút và thêm vào cây c l i, n u khóa c a ph n t b sung nh a nút hi n t i thì ti p t c quá trình v i nút hi n t i là nút con trái (con ph i)
The Insert function in Python is designed to add a new key to a binary search tree It begins by checking if the root is None, in which case it creates a new Node with the given key If the root is not None, it compares the key with the root's key If they are equal, it returns the root; if the key is greater, it recursively calls Insert on the right subtree; otherwise, it calls Insert on the left subtree Finally, it returns the updated root of the tree.
Khi xóa m t nút c n ph m b c v n là cây nh phân Vì th , khi xóa c n ph i xét c n th n các con c a nó Có b ng h p c n xem xét:
- ng h p 1: Nút c n xóa là nút lá
- ng h p 2: Nút c n xóa ch có con trái
- ng h p 3: Nút c n xóa ch có con ph i
- ng h p 4: Nút c n xóa có hai con
So sánh 32 và con trái ng h p 1: Nút c n xóa là nút lá
Thao tác: C p nh t l i nút cha c a ng h p 2: Nút c n xóa là có con trái mà không c
Thao tác: G n cây con trái c a ng h p 3: Nút c n xóa là
Thao tác: G n cây con ph i c a ng h p 4: Nút có hai con
1 Ch n nút th ch nút , nút s là successor c a ( là giá tr nh nh t còn l ), nói cách khác là giá tr nh nh t cây con ph i c a
The Python function `Delete(root, key)` is designed to remove a node from a binary search tree It first checks if the tree is empty; if so, it returns `None` If the key to be deleted is less than the root's key, the function recursively calls itself on the left subtree Conversely, if the key is greater, it operates on the right subtree When the key matches the root's key, the function handles three cases: if the node has no left child, it replaces the node with its right child; if it has no right child, it replaces it with its left child If the node has both children, it finds the minimum value in the right subtree, replaces the root's key with this minimum value, and then deletes the minimum node from the right subtree Finally, the function returns the updated root of the tree.
Ngoài ra có th ch n nút là giá tr l n nh t còn nh , nói cách khác là giá a
Duy t cây BST theo th t gi a cho k t qu c s p x p nên chúng ta có th ng d gi i quy t bài toán s p x s p x p dãy ph n t có th th c hi
- Xây d ng v i dãy s ng cách thêm (insert) các ph n t c a dãy s vào cây nh phân tìm ki m b u t cây r ng
- Duy t cây BST theo th t gi xu c s p x p
S p x p dãy sau s d ng cây BST: 10, 25, 5, 7, 36, 21
Hình 6.4: Cây minh h a cho dãy 10, 25, 5, 7, 36, 21
Phân tích hi u qu c a s p x p s d ng cây BST
- ph c t p trung bình là do chèn ph n t th t n phép so sánh
Hình 6.5: ph c t p c a vi c b sung ph n t vào dãy ph c t p x u nh t là do b sung ph n t th t n phép so sánh
Ví d b sung dãy: 1, 3, 7, 9, 11, 15 ph c t p trung bình c a các thao tác v i cây BST cao trung bình c ph c t p trung bình c a các thao tác trên cây BST là:
Insertion Deletion Find Min Find Max BST Sort
T t c n (Search, Successor, Predecessor, Minimum, Maximum, Insert, Delete) trên cây BST v i chi u cao h u có th i gian tính là , ng h p x u nh t
Yêu c m b o t, cây nh phân có cao t i thi u là ng h p t t nh t khi BST là cây nh y cao th p nh t có th c) Có hai cách ti p c n nh m b cao c a cây là ):
- Luôn gi cho cây cân b ng t i m i th m (AVL Trees)
- Ki m tra cây có "quá m t cân b ng" hay không, n u cây m t cân b ng thì c n tìm cách cân b ng l i (Splay Trees [Tarjan])
Ph n ti p theo s trình bày cách ti p c n th nh t - cây AVL
6.4 C ÂY NH PHÂN TÌM KI M CÂN B NG CÂY AVL 6.4.1 nh
Cây AVL là một loại cây nhị phân tìm kiếm, trong đó chiều cao của cây con trái và cây con phải của mỗi nút chênh lệch nhau không quá 1 Đồng thời, cả cây con trái và cây con phải đều phải là cây AVL.
- c gi tr ng thái cân b i) N u vi c thêm hay xóa nút d n m t tính cân b ng thì c n ti n hành cân b ng l i cây
- Các thao tác: tìm ki u có th th c hi n v i cây AVL có nút trong th i gian O(logn) (trong c ng h p trung bình và x u nh t)
Có th s d ng các ký hi u / \ - // \\ th hi u t cân b a nút:
\: ph i n (right subtree) = 1+ (left subtree)
/: trái n (right subtree) = 1+ (left subtree)
-: b ng nhau (right subtree) = (left subtree)
\\: mât cân b ng ph i (right subtree) > 1+ (left subtree)
//: m t cân b ng trái (right subtree) > 1+ (left subtree)
Cây AVL là một loại cây nhị phân tự cân bằng, trong đó mỗi nút phải tuân thủ quy tắc về độ cao Để duy trì tính chất AVL, sau mỗi thao tác chèn hoặc xóa, cần phải thực hiện các bước điều chỉnh để đảm bảo cây vẫn giữ được sự cân bằng.
: Chi u cao (height) c a nút , ký hi u là
- , n u là chi u cao c a cây con trái (ph i) c a
Hệ số cân bằng (balance factor) của một nút, ký hiệu là bal(), là hiệu giữa chiều cao của cây con phải và cây con trái của nó Cây nhị phân tìm kiếm được gọi là cây AVL nếu hệ số cân bằng của mọi nút trong cây là hợp lệ.
Bi u di n cây AVL class AVLTree: class TreeNode: def init (self, item, height=1, left=None, right=None): self.item = item self.left = left self.right = right self.height = 1
Khôi ph c tính cân b ng c a cây
- c khi th c hi n thao tác cây là cân b ng
- Sau khi th c hi n thao tác thêm ho c xóa (insertion or deletion operation), cây có th m t cân b y, c nh cây con m t cân b ng
(single rotation: right rotation or left rotation)
(double rotation: right-left rotation or left-right rotation)
Hình 6.8: Thao tác quay trái
Hình 6.9: Minh h a vi c quay kép quay trái r i quay ph i
Hình 6.10: Thao tác quay kép quay ph i r i quay trái
6.4.2 Các thao tác v i cây AVL
Do vi c khôi ph c cân b ng c a m t nút t n th i gian
- V i m i nút x m tra tính cân b ng c a n t N u cân b ng thì ti p t c v i g c a nút các phép quay
- Khác v i thao tác thêm, sau khi khôi ph c tính cân b ng c a nút chúng ta ph i ti p t n khi g p g c c a cây, b i vì vi c khôi ph c cân b ng c a nút
D th y th i gian khôi ph c tính cân b ng c a m t nút là dài không quá , nên thao tác xóa t n th i gian là
"lazy deletion" u cao c a cây AVL v i còn cây con
Ta có b ng th i v cao c a cây AVL có nút:
T b ng th c cu i cùng này kh t c các phép toán v c th c hi n v i th i gian
Cho b và b n ghi , tác sau:
- M ng h p x u nh t, vi c tìm ki m t n th i gian c r t hi u qu V i m t s gi thuy t khá h p lý, vi c tìm ki m ph n t trong b n th i gian
- B c xem là s m r ng c a m ng, vi a ch hóa tr c ti p trong m ng cho phép truy c n ph n t b t k v i th i gian
6.5.2 a ch tr c ti p Direct Addressing
- Các khóa là các s trong kho ng t n
- c g i là b a ch tr c ti p (direct-address table), các ph n t trong b ng
Ví d 6.8: T o b a chi tr c ti p M i khóa trong t p ng v i m t ch s trong b ng T p nh các ô trong b ng ch a giá tr tham chi n các ph n t , các ô khác ch a giá tr
Th i gian th c hi n m i phép toán là a ch tr c ti p làm vi c t t n bit thì
Gi i quy t: Ánh x khóa vào kho ng bi i nh
6.5.3 collision) khi nhi ng cùng m t ô trong b a ch
- c ô r n p khóa vào Thay vì tìm tu n t theo th t s t n th i gian
Thu t toàn tìm ki m khóa tr
Các k thu m b o là hoán v c a i v i m i khóa (Linear probing)
Gi s th c hi u ki n simple uniform hashing M i khóa trong b ng có cùng kh c gán v i m t ô b t k Cho khóa và t n p (load factor)
- phát hi n m t khóa không có trong b ng là
Chi phí tìm kiếm một khóa trong bảng là một yếu tố quan trọng Nếu sử dụng khóa tỷ lệ với số ô trong bảng, thì chi phí tìm kiếm sẽ tăng theo hàm số lượng ô.
Hash Functions - (The Division Method) n vào b ng có ô nh s d nh b i ph a phép chia cho
D th y n u ), thì chính là bit cu i c a
N u ) thì ch ph thu c vào ch s cu i c a
Hash Functions- (The Multiplication Method) xây d c th c hi u tiên, nhân v i m t h ng s , phân c a giá tr này v i
- Ch n không quá g n v i 0 ho c 1 (Knuth khuyên ch n )
Câu 5: Cho b ng c 11 ô và t p khóa thêm vào V b ng sau khi t t c các giá tr khóa trong t p ng
V b ng sau khi t t c các giá tr khóa trong t p ng
The provided code defines a class `Node` with an initializer that sets the left and right child nodes to `None` and assigns a key value It includes a method `Search` that traverses the tree to find a node with a specified key, returning the node if found or `None` if not Additionally, the `Insert` method creates a new node and inserts it into the tree at the correct position based on the key value, ensuring the binary search tree properties are maintained.
Hàm tr v ng info nh th trong cây nh phân tìm ki m, tr v None n nút V i , hàm c n tr v ng info là nh nh t, n u info
- T i ch (in place): n u không gian nh ph thu t toán yêu c u là
- i ch (Swap) có th i gian th c hi n là
Binary tree sort Có Chèn
In-place merge sort Có
Quick sort Không Phân chia lotto sort Không Lai
LSD Radix sort Có Không
MSD Radix sort Không Không
Chia dãy g m ph n t c n s p x p ra thành hai dãy con, m i dãy có
2 Sao ph n t u tiên vào và ph n t ti p theo vào
- n t vào m ng k t qu (vòng l p for cu i cùng): có
- T ng c ng th i gian c n tr n:
- Chia: tính là giá tr trung bình c a và ,
- Tr : gi quy hai bài toán con, m c
- T h p: tr n (MERGE) trên các m c n th i gian
Hình 7.2: def mergeSort(arr, l, r): if l < r: m = (l + (r - 1)) // 2 mergeSort(arr, l, m) mergeSort(arr, m + 1, r) merge(arr, l, m, r) def merge(arr, l, m, r): n1 = m - l + 1 n2 = r - m
R[j] = arr[m + 1 + j] i = 0 j = 0 k = l while i < n1 and j < n2: if L[i]