Đặc biệtlà các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy tính, Lý thuyết mã, Tối ưu hoá, Kinh tế học, tìm đường đi ngắn nhất, bài toán luồn
Trang 1Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG
NINH QUANG TRUNG
THUẬT TOÁN XÁC ĐỊNH CHA CHUNG GẦN NHẤT CỦA HAI NÚT TRONG CÂY ỨNG DỤNG PHÂN TÍCH ĐA DẠNG
LOÀI VI SINH VẬT
Chuyên ngành: Khoa học máy tính
Mã số: 60.48.01
LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH
Thái Nguyên, năm 2014
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO
ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG
NINH QUANG TRUNG
CÁC PHƯƠNG PHÁP XÁC ĐỊNH CHA CHUNG GẦN NHẤT CỦA HAI NÚT TRONG CÂY, ỨNG DỤNG PHÂN
TÍCH ĐA DẠNG LOÀI VI SINH VẬT
Chuyên ngành: Khoa học máy tính
Mã số: 60.48.01
LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH
Người hướng dẫn khoa học: TS Nguyễn Cường
Trang 3LỜI CAM ĐOAN
Tôi xin cam đoan: Luận văn này là công trình nghiên cứu thực sự
của cá nhân, được thực hiện dưới sự hướng dẫn khoa học của Tiến sĩ
Nguyễn Cường Các số liệu, những kết luận nghiên cứu được trình bày
trong luận văn này trung thực và chưa từng được công bố dưới bất cứ hình thức nào
Tôi xin chịu trách nhiệm về nghiên cứu của mình
Học viên
Ninh Quang Trung
Trang 4LỜI CẢM ƠN
Lời đầu tiên, tôi xin chân thành cảm ơn Tiến sĩ Nguyễn Cường
người đã trực tiếp huớng dẫn tôi hoàn thành luận văn Với những lời chỉ dẫn, những tài liệu, sự tận tình hướng dẫn và những lời động viên của Thầy
đã giúp tôi vượt qua nhiều khó khăn trong quá trình thực hiện luận văn này
Tôi cũng xin cảm ơn quý Thầy (Cô) giảng dạy chương trình cao học
“Khoa học máy tính” đã truyền dạy những kiến thức quý báu, những kiến thức này rất hữu ích và giúp tôi nhiều khi thực hiện nghiên cứu
Xin cảm ơn các quý Thầy (Cô) công tác tại Trường Đại học Công nghệ thông tin và truyền thông – Đại học Thái Nguyên đã tạo điều kiện cho tôi được tham gia và hoàn thành khóa học
Tôi xin chân thành cảm ơn
Học viên
Ninh Quang Trung
Trang 5MỤC LỤC
LỜI CAM ĐOAN 1
LỜI CẢM ƠN iv
MỤC LỤC v
DANH MỤC CÁC HÌNH ẢNH vii
DANH MỤC CÁC BẢNG BIỂU viii
DANH MỤC CÁC TỪ VIẾT TẮT-THUẬT NGỮ ix
MỞ ĐẦU 1
CHƯƠNG I: LÝ THUYẾT ĐỒ THỊ VÀ CÂY 6
1.1 Các khái niệm cơ bản về đồ thị 6
1.1.1 Định nghĩa đồ thị (Graph) 6
1.1.2 Các khái niệm 6
1.1.3 Các thuật toán tìm kiếm trên đồ thị 8
1.1.4 Độ phức tạp tính toán của BFS và DFS 15
1.2 Các khái niệm cơ bản về cây đồ thị 15
1.2.1 Định nghĩa và các tính chất cơ bản: 15
1.2.2 Một số khái niệm 16
CHƯƠNG II: CÁC PHƯƠNG PHÁP XÁC ĐỊNH CHA CHUNG GẦN NHẤT CỦA HAI NÚT TRONG CÂY 17
2.1 Giới thiệu bài toán LCA 17
2.2 Mối quan hệ giữa LCA và RMQ 19
2.3 Các phương pháp tiếp cận 42
2.3.1 Bài toán hà tiện 43
2.3.2 Một số phương pháp giải bài toán LCA 45
2.4 Lựa chọn phương án cài đặt thuật toán cho bài toán LCA 515
CHƯƠNG III: KẾT QUẢ CÀI ĐẶT VÀ ĐÁNH GIÁ 54
3.1 Cây phân loài và ứng dụng bài toán phân tích đa dạng loài vi sinh vật 548
Trang 63.2 Cài đặt phần mềm 59
3.3 Đánh giá chất lƣợng dữ liệu trình tự 63
3.4 Lắp ráp trình tự 65
3.5 Dự đoán gen 66
3.6 Phân tích đa dạng loài vi sinh 67
KẾT LUẬN 70
TÀI LIỆU THAM KHẢO 67
Trang 7DANH MỤC CÁC HÌNH ẢNH
Hình 1.1: Ví dụ về mô hình đồ thị 6
Hình 1.2: Ví dụ về phân loại đồ thị 7
Hình 1.3 Ví dụ về thuật toán tìm kiếm DFS 9
Hình 1.4 Xác định đỉnh kề trong thuật toán DFS 11
Hình 1.5 Đường đi bắt đầu từ A và kết thúc tại G 12
Hình 1.6 Bắt đầu từ A nhưng đi theo trình tự tập các cạnh đã thăm 12
Hình 1.7 Duyệt các đỉnh trong cây 13
Hình 1.8 Ví dụ thuật toán tìm kiếm theo chiều sâu 14
Hình 1.9 Cây đồ thị 16
Hình 2.1 Vị trí của các phần tử trong bài toán RQM 19
Hình 2.2 Ví dụ về bài toán RQM 21
Hình 2.3: Cấu trúc cây phân đoạn 23
Hình 2.4 Hình cây của thuật toán LCA 29
Hình 2.5 Phân chia đoạn trong bài toán LCA 30
Hình 2.6 Chuyển từ bài toán LCA về bài toán RQM 35
Hình 2.8 Ví dụ đưa vài toán từ RQM về bài toán LCA 37
Hình 2.9 Cây tiến hóa 43
Hình 3.1 Quy trình phân tích và xử lý dữ liệu 55
Hình 3.2 Chất lượng tính theo vị trí trình tự 59
Hình 3.3 Chất lượng theo từng đoạn trình tự 60
Hình 3.4 Cây phân loài 63
Hình 3.5 Biểu đồ thể hiện sự đa dạng sinh vật trong mẫu dữ liệu 63
Hình 3.6 Số lượng các đoạn ORF có liên quan đến các quy trình chyển hóa 65
Trang 8DANH MỤC CÁC BẢNG BIỂU
Bảng 1.1 Bảng lập lịch duyệt các đỉnh trong cây 14
Bảng 3.1 Kết quả lắp ráp trình tự 61
Bảng 3.2 Tổng quan kết quả dự đoán gen 61
Bảng 3.4 Đa dạng loài đã đƣợc đinh tên theo từng cấp độ khác nhau 64
Bảng 3.5 Kết quả phân loại theo cơ sở dữ liệu KEGG 64
Trang 9DANH MỤC CÁC TỪ VIẾT TẮT-THUẬT NGỮ Cụm từ viết tắt Cụm từ chi tiết
ASCII American Standard Code for Information Interchange BFS Breadth First Search
DFS Depth – First – Search
DNA Deoxyribo Nucleic Acid
HGP Human Genome Project
LCA Lowest Common Ancestor
MEGAN MetaGenomeANalyzer
NCBI National Center for Biotechnology Information
NGS Next Genration Sequencing
PCR Polymerase chain reaction
Trang 10để giải quyết bài toán thực tế nhờ vào việc tìm ra ngày càng nhiều của các định lý, công thức và thuật toán
Đặc biệt trong những năm trở lại đây, cùng với sự ra đời của máy tính điện tử và sựphát triển nhanh chóng của Tin học, Lý thuyết đồ thị càng được quan tâm đến nhiều hơn Đặc biệtlà các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy tính, Lý thuyết mã, Tối ưu hoá, Kinh tế học, tìm đường đi ngắn nhất, bài toán luồng cực đại, bài toán vận chuyển, bài toán luồng tổng quát và bài toán xác định cha chung gần nhất của hai nút trong câycũng là một ứng dụng trong lý thuyết đồ thị Hiện nay, lý thuyết đồ thị là một trong những kiến thức cơ sở của bộ môn khoa học máy tính
Trong phạm vi một đề tài không thể nói kỹ và nói hết những vấn đề của lý thuyết đồ thị Luận văn này trình bày lý thuyết đồ thị dưới góc độ khảo sát những thuật toán cơ bản nhất có thể cài đặt được trên máy tính một số ứng dụng của nó
Trong khuôn khổ luận văn học viên ứng dụng lý thuyết đồ thị để giải bài toán xác định cha chung gần nhất của hai nút trong cây nhằm mục đích phân tích đa dạng loài vi sinh sử dụng công nghệ đọc trình tự thế hệ mới
Ngày nay thông tin về trình tự gen rất hữu ích trong những nghiên cứu về sinh học phân tử và trong nhiều lĩnh vực ứng dụng như chuẩn đoán, sinh học pháp y, hệ thống sinh học…Quá trình đọc trình tự hay giải trình tự
Trang 11gen (DNA sequencing) là việc xác định thứ tự các nucleotide gắn kết với nhau dọc theo chiều dài của gen (DNA) và trình tự gắn kết nhau của các nucleotide được gọi là trình tự gen
Từ những năm đầu của thập niên 70 của thế kỷ trước, các nhà khoa học đã thu được thành công đầu tiên về trình tự gen bằng phương pháp thủ công Cho đến năm 1990, dự án giải mã toàn bộ hệ genome người (HGP)
đã được khởi động nhằm tìm hiểu cơ sở di truyền bệnh, kết quả của dự án
là một hệ genngười với độ chính xác cao Ngày nay, các công ty thương mại đã cho ra đời các thế hệ máy đọc trình tự dựa trên nhiều công nghệ mới Các kỹ thuật đọc trình tự gen đã trở nên đơn giản và nhanh chóng hơn nhiều nhờ sự ứng dụng huỳnh quang phân tích tự động [36] Tuy nhiên tại thời điểm đó, đọc trình tự DNA gặp phải vấn đề là các thiết bị chi phí quá đắt đỏ và mất thời gian để đọc nguyên vẹn hệ gen Chúng chỉ phù hợp cho kiểm tra các gen riêng lẻ, một số xét nghiệm phân tử, di truyền dược học, bệnh về máu và vi sinh
Với mong muốn hiểu chi tiết về gen, các nhà nghiên cứu luôn mong muốn giải trình tự hoàn chỉnh các DNA hoặc gen của nhiều loài trong cuộc sống Thiết bị đọc trình tự thế hệ mới (Next Genration Sequencing - NGS) là một bước tiến vượt bậc về công nghệ đọc trình tự
Từ khả năng đọc trình tự đoạn ngắn 1500bp (Sanger) hay 100 bp (pyrosequencing), thiết bị đọc trình tự thế hệ mới cho phép đọc được từ 8Gb đến 600Gb, có nghĩa là cho phép đọc trình tự nguyên bộ gen với số lần rất lớn từ 10 cho đến 500 lần Vì thế, đọc trình tự thế hệ mới còn được gọi là đọc trình tự bộ gen (whole genome sequencing) Đọc trình tự thế hệ mới là công cụ mạnh nhất để phát hiện tác nhân gây bệnh, vì với khả năng đọc hàng trăm ngàn đoạn DNA có trong mẫu thử công nghệ này dễ dàng phát hiện bất cứ một trình tự nucleic acid của bất cứ tác nhân gì có mặt trong mẫu thử lấy từ vật chủ hay bệnh nhân
Trang 12Với các thiết bị đọc trình tự thế hệ mới, các phân tử DNA sẽ được cắt nhỏ bằng các enzyme đặc thù tạo lên các phân đoạn có độ dài từ 50 cho đến 200 cặp trình tự (basepair - bp) Các phân đoạn ngắn này sẽ được đưa vào thiết bị khuếch đại lên hàng trăm lần rồi tiến hành đọc trình tự bởi thiết
bị đọc trình tự thế hệ mới Do đó, dữ liệu thu được là một tập với số lượng lớn, có thể lên tới hàng trăm triệu các đoạn trình tự ngắn có độ dài từ 50bp cho đến 200bp Để có thể tiến hành các phân tích dữ liệu như dự đoán gen, chú giải gen, tìm đột biến SNP…
Sự ra đời của thiết bị đọc trình tự gen thế hệ mới đã đánh dấu một bước tiến vượt bậc trong nghiên cứu phân tử, y sinh, pháp y, nhân chủng học với hàng loạt các dự án giải mã toàn bộ hệ gen động thực vật như người, chó, khỉ, gà, khoai tây, lúa… Cùng với các quy trình chuẩn đoán bệnh hướng tới cá nhân cụ thể (personalized treament) Bên cạnh đó, các thiết bị đọc trình tự gen thế hệ mới cũng bắt đầu được áp dụng vào nghiên cứu tính đa dạng loài và phân tích chức năng của các hệ vi sinh vật có trong môi trường như trong ruột người bị bệnh [5], hệ vi sinh trong dạ dày bò [8], ruột gà [7], trong môi trường đất [7]… Phân tích tính đa dạng loài và chức năng của hệ vi sinh vật từ dữ liệu trình tự là một trong những đề tài nóng hiện nay trên thế giới
Nhận thấy tính thiết thực của vấn đề và với sự định hướng của giáo
viên hướng dẫn, tôi chọn đề tài “Các phương pháp xác định cha chung
gần nhất của hai nút trong cây, ứng dụng trong phân tích đa dạng loài
vi sinh vật” Đề tài này sẽ xây dựng quy tình phân tích dữ liệu trình tự hệ
gen vi sinh vật và chương trình đánh giá mức độ đa dạng loài
Trang 13Nội dung chính của luận văn được chia làm 3 chương
- Chương I: Lý thuyết đồ thị và cây: Trình bày các khái niệm cơ bản
nhất về lý thuyết đồ thị và cây ứng dụng trong việc giải quyết một số bài toán trong lý thuyết đồ thị
- Chương II: Các phương pháp xác định cha chung gần nhất của hai
nút trong cây: Trình bày mối liên hệ giữa các bài toán xác định hai nút trong cây và các phương pháp giải bài toán
- Chương III: Kết quả cài đặt và đánh giá: Trình bày quy trình và
các yêu cầu cần thiết của các chương trình được sử dụng thí nghiệm
1 Đối tượng và phạm vi nghiên cứu:
- Nghiên cứu lý thuyết đồ thị và cây
- Nghiên cứu các thuật toán xác định cha chung gần nhất của hai nút trong cây ứng dụng trong phân tích đa dạng loài vi sinh sử dụng công nghệ đọc trình tự thế hệ mới
- Nghiên cứu quy trình phân tích dữ liệu trình tự hệ gen vi sinh vật
và đánh giá đa dạng loài
2 Hướng nghiên cứu của đề tài
1 Nghiên cứu về lý thuyết đồ thị
2 Nghiên cứu thuật toán xác định cha chung gần nhất của hai nút trong cây Lowest Common Ancestor (LCA) ứng dụng trong phân tích đa dạng loài vi sinh sử dụng công nghệ đọc trình tự thế hệ mới
3 Nghiên cứu phương pháp phân tích dữ liệu trình tự hệ gen vi sinh vật
và đánh giá đa dạng loài
Trang 143 Phương pháp nghiên cứu
- Nghiên cứu các nội dung về lý thuyết đồ thị
- Nghiên cứu lý thuyết thuật toán xác định cha chung gần nhất của hai nút trong cây Lowest Common Ancestor (LCA) ứng dụng trong phân tích
đa dạng loài vi sinh sử dụng công nghệ đọc trình tự thế hệ mới
- Thiết kế, đặc tả, xây dựng chương trình xử lý, phân tích dữ liệu trình
tự và đánh giá đa dạng loài
4 Ý nghĩa khoa học của đề tài
Đề tài nghiên cứu thuật toán xác định cha chung gần nhất của hai nút trong cây Lowest Common Ancestor (LCA) ứng dụng trong phân tích đa dạng loài vi sinh sử dụng công nghệ đọc trình tự thế hệ mới Cung cấp công
cụ đánh giá đa dạng loài vi sinh vật giúp cho các nhà sinh học tiến hành các nghiên cứu đánh giá sự đa dạng loại vi sinh vật có trong môi trường sống như đất, nước, cũng như trong các mẫu bệnh phẩm của bệnh nhân như ruột người, màng nhầy, …
Trang 15CHƯƠNG I: LÝ THUYẾT ĐỒ THỊ VÀ CÂY
1.1 Các khái niệm cơ bản về đồ thị
Sơ đồ giao thông Mạng máy tính
Hình 1.1: Ví dụ về mô hình đồ thị
1.1.2 Các khái niệm
Như trên định nghĩa đồ thị G = (V, E) là một cấu trúc rời rạc, tức là các tập V và E hoặc là tập hữu hạn, hoặc là tập đếm được, có nghĩa là ta có thể đánh số thứ tự 1, 2, 3 cho các phần tử của tậpV và E Hơn nữa, đứng trên phương diện người lập trình cho máy tính thì ta chỉ quan tâm đến cácđồ thị hữu hạn (V và E là tập hữu hạn) mà thôi, chính vì vậy từ đây về sau, nếu không chú thích gì thêm thì khi nói tới đồ thị, ta hiểu rằng đó là
Trang 16nhiều nhấtlà 1 cạnh trong E nối từ u tới v
- Đa đồ thị: G được gọi là đa đồ thị nếu giữa hai đỉnh u, v của V có thể
có nhiều hơn 1 cạnh trong E nối từ u tới v
- Đồ thị vô hướng: G được gọi là đồ thị vô hướng nếu các cạnh trong
E là không định hướng, tức là cạnh nối hai đỉnh u, v bất kỳ cũng là cạnh nối hai đỉnh v, u Hay nói cách khác, tập E gồm các cặp (u, v) không tính thứ tự (u, v) (v, u)
- Đồ thị có hướng: G được gọi là đồ thị có hướng nếu các cạnh trong
E là có định hướng, có thể có cạnh nối từ đỉnh u tới đỉnh v nhưng chưa chắc đã có cạnh nốitừ đỉnh v tới đỉnh u Hay nói cách khác, tập E gồm các cặp (u, v) có tính thứ tự:(u, v) ≠ (v, u) Trong đồ thị có hướng, các cạnh được gọi là các cung Đồ thị vôhướng cũng có thể coi là đồ thị có hướng nếu như ta coi cạnh nối hai đỉnh u, vbất kỳ tương đương với hai cung (u, v) và (v, u)
Ví dụ:
Hình 1.2: Ví dụ về phân loại đồ thị
Đối với đồ thị vô hướng G = (V, E) Xét một cạnh e E, nếu e=(u,v) thìta nói hai đỉnh u và v là kề nhau (adjacent) và cạnh e này liên thuộc (incident)với đỉnh u và đỉnh v
Với một đỉnh v trong đồ thị, ta định nghĩa bậc (degree) của v,
ký hiệu deg(v) là số cạnh liên thuộc với v Dễ thấy rằng trên đơn đồ thị thì
Trang 17số cạnh liên thuộc với v cũng là số đỉnh kề với v
Đối với đồ thị có hướng G = (V, E) Xét một cung e E, nếu e=(u,v) thìta nói u nối tới v và v nối từ u, cung e là đi ra khỏi đỉnh u và đi vào đỉnh v.Đỉnh u khi đó được gọi là đỉnh đầu, đỉnh v được gọi là đỉnh cuối của cung e
Với mỗi đỉnh v trong đồ thị có hướng, ta định nghĩa: Bán bậc ra của
v kýhiệu deg+(v) là số cung đi ra khỏi nó; bán bậc vào ký hiệu deg-(v) là số cung đi vàođỉnh đó
- Đường đi: Một đường đi độ dài k từ đỉnh u đến đỉnh v là dãy
(u=x0, x1, , xk = v) thoả mãn (xi, xi+1) E (là 1 cạnh của đồ thị) với
i:(0 ≤ i ≤ k).Đỉnhu gọi là đỉnh xuất phát, v gọi là đỉnh kết thúc của đường
đi Đường đi không cócạnh nào đi qua hơn 1 lần gọi là đường đi đơn
- Chu trình: Đường đi có đỉnh xuất phát trùng với đỉnh kết thúc gọi
là chu trình Tương tự ta có khái niệm chu trình đơn
1.1.3 Các thuật toán tìm kiếm trên đồ thị
a Thuật toán tìm kiếm theo chiều sâu DFS (Depth – First – Search)
Là một thuật toán duyệt hoặc tìm kiếm trên một cây hoặc một đồ thị Thuật toán khởi đầu tại gốc (hoặc chọn một đỉnh nào đó coi như gốc) và phát triển xa nhất có thể theo mỗi nhánh
Thông thường, DFS là một dạng tìm kiếm thông tin không đầy
đủ mà quá trình tìm kiếm được phát triển tới đỉnh con đầu tiên của nút đang tìm kiếm cho tới khi gặp được đỉnh cần tìm hoặc tới một nút không có con Khi đó giải thuật quay lui về đỉnh vừa mới tìm kiếm ở bước trước Trong dạng không đệ quy, tất cả các đỉnh chờ được phát triển được bổ sung vào một ngăn xếp Last In First Ount (LIFO)
Trang 18Ví dụ:
Hình 1.3 Ví dụ về thuật toán tìm kiếm DFS
Tìm kiếm ưu tiên chiều sâu bắt đầu thăm đỉnh A, đi theo cạnh trái, tiếp tục tìm kiếm xong ở cây con trái mới chuyển sang tìm kiếm ở cây con phải Thứ tự thăm viếng các đỉnh là: A, B, D, F, E, C, G
Quá trình viếng thăm các đỉnh diễn ra như sau: Sau khi thăm đỉnh A, vì
B chưa được thăm nên theo cạnh AB ta thăm B, tiếp tục theo cạnh BD tới viếng thăm D Từ D không thể tiếp tục đi xa hơn, ta quay lại B Từ B, theo
BF đến thăm F, từ F đến thăm E Từ E vì A đã viếng thăm nên ta quay lại
F, rồi quay lại B Tại B vì tất cả các khả năng từ B đã xem xét nên ta quay lại A Từ A, quá trình tiếp tục với các đỉnh C và G
Kết quả của thuật toán:
- Duyệt các đỉnh:Có thể dùng giải thuật này để tạo một danh sách tuyến
tính các đỉnh của một đồ thị (hoặc cây) Có ba cách hiện thực phương pháp này:
Duyệt tiền thứ tự (preordering): Tạo ra một danh sách mà trong
đó các đỉnh xuất hiện theo đúng trật tự nó được thăm đến khi chạy thuật toán Đây chính là biểu diễn tự nhiên của quá trình thực hiện giải thuật tìm kiếm theo chiều sâu Một biểu thức ở dạng tiền thứ tự được gọi là ký pháp tiền tố
Duyệt hậu thứ tự (postordering): Tạo ra một danh sách mà trong đó
các đỉnh xuất hiện theo thứ tự của lần duyệt đến sau cùng khi thực hiện giải
Trang 19thuật Một lần duyệt hậu thứ tự một cây biểu thức sẽ cho ra một ký pháp hậu tố
Duyệt đảo hậu thứ tự (reverse postordering): Kết quả của cách duyệt
này là sự đảo ngược lại thứ tự trong kết quả duyệt hậu thứ tự Thông thường, khi duyệt cây, cách này cho ra cùng kết quả với duyệt tiền thứ tự, nhưng xét tổng quát, khi duyệt một đồ thị, tiền thứ tự và đảo hậu thứ tự cho
ra kết quả khác nhau Với các đồ thị có hướng và không có vòng, cách duyệt đảo hậu thứ tự cho ra một trât tự tô-pô của đồ thị đó
Thuật toán tìm kiếm theo chiều sâu của đồ thị vô hướng:
- Ý tưởng thuật toán:DFS trênđồ thị vô hướng cũng giống như khám phá mê cung với một cuộn chỉ và một thùng sơn đỏ để đánh dấu, tránh bị lạc Trong đó mỗi đỉnh s trong đồ thị tượng trưng cho một cửa trong mê cung
Ta bắt đầu từ đỉnh s, buộc đầu cuộn chỉ vào s và đánh đấu đỉnh này này "đã thăm" Sau đó ta đánh dấu s là đỉnh hiện hành u
Bây giờ, nếu ta đi theo cạnh (u,v) bất kỳ
Nếu cạnh (u,v) dẫn chúng ta đến đỉnh "đã thăm" v, ta quay trở về u
Nếu đỉnh v là đỉnh mới, ta di chuyển đến v và lăn cuộn chỉ theo Đánh dấuv là "đã thăm" Đặt v thành đỉnh hiện hành và lặp lại các bước
Cuối cùng, ta có thể đi đến một đỉnh mà tại đó tất cả các cạnh kề với nó đều dẫn chúng ta đến các đỉnh "đã thăm" Khi đó, ta sẽ quay lui bằng cách cuộn ngược cuộn chỉ và quay lại cho đến khi trở lại một đỉnh với một đỉnh còn chưa được khám phá Lại tiếp tục quy trình khám phá như trên
Khi chúng ta trở về s và không còn cạnh nào kề với nó chưa bị khám phá là lúc DFS dừng
- Độ phức tạp của thuật toán:
DFS được gọi đúng 1 lần ứng với mỗi đỉnh
Mỗi cạnh được xem xét đúng 2 lần, mỗi lần từ một đỉnh kề với nó
Trang 20 Với ns đỉnh và ms cạnh thuộc thành phần liên thông chứa s, một phépDFS bắt đầu tại s sẽ chạy với thời gian O(ns + ms) nếu:
Đồ thị đƣợc biểu diễn bằng cấu trúc dữ liệu dạng danh sách kề
Đặt nhãn cho một đỉnh là "đã thăm" và kiểm tra xem một đỉnh "đã thăm chƣa tốn chi phí O(degree)
Bằng cách đặt nhãn cho các đỉnh là "đã thăm", ta có thể xem xét một cách hệ thống các cạnh kề với đỉnh hiện hành nên ta sẽ không xem xét một cạnh quá 1 lần
- Xác định đỉnh kề trong DFS
Kết quả của DFS phụ thuộc vào cách ta chọn đỉnh kế tiếp
Hình 1.4 Xác định đỉnh kề trong thuật toán DFS
Nếu ta bắt đầu tại A và thử cạnh nối đến F, sau đó đến B, rồi
đến E, C, cuối cùng là G ta đƣợc:
Trang 21Hình 1.5 Đường đi bắt đầu từ A và kết thúc tại G
Nếu cũng bắt đầu từ A nhưng đi theo trình tự, tập các cạnh đã
thăm,backedge và các điểm đệ quy sẽ khác trước
Hình 1.6 Bắt đầu từ A nhưng đi theo trình tự tập các cạnh đã thăm
b Thuật toán tìm kiếm theo chiều rộng
Tìm kiếm theo chiều rộngBreadth First Search (BFS) là một thuật toán tìm kiếm trong đồ thị trong đó việc tìm kiếm chỉ bao gồm 2 thao tác: (a) thăm một đỉnh của đồ thị; (b) thêm các đỉnh kề với đỉnh vừa thăm vào danh sách có thể thăm trong tương lai Có thể sử dụng thuật toán tìm kiếm theo chiều rộng cho hai mục đích: tìm kiếm đường đi từ một đỉnh gốc cho trước tới một đỉnh đích, và tìm kiếm đường đi từ đỉnh gốc tới tất cả các đỉnh khác Trong đồ thị không có trọng số, thuật toán tìm kiếm theo chiều rộng luôn tìm ra đường đi ngắn nhất có thể Thuật toán BFS bắt đầu từ đỉnh gốc
và lần lượt thăm các đỉnh kề với đỉnh gốc Sau đó, với mỗi đỉnh trong số
đó, thuật toán lại lần lượt thăm các đỉnh kề với nó mà chưa được thăm trước đó và lặp lại Trong thuật tìm kiếm theo chiều sâu, trong đó cũng sử dụng 2 thao tác trên nhưng có trình tự thăm các đỉnh khác với thuật toán tìm kiếm theo chiều rộng
Trang 22- Cài đặt bằng hàng đợi:
Cơsởcủaphươngphápcàiđặtnàylà"lậplịch"duyệtcácđỉnh.Việcthămmộtđỉnhsẽlênlịch
duyệtcácđỉnhkềnósaochothứtựduyệtlàưutiênchiềurộng(đỉnhnàogầnShơnsẽđượcduyệt
trước).Vídụ:BắtđầutathămđỉnhS.ViệcthămđỉnhSsẽphátsinhthứtựduyệtnhữngđỉnh(x1,x2, ,xp)kềvớiS(nhữngđỉnhgầnSnhất).Khithămđỉnhx1
sẽlạiphátsinhyêucầuduyệtnhữngđỉnh(u1,u2
,uq)kềvớix1.Nhưngrõràngcácđỉnhunày"xa"Shơnnhữngđỉnhxnênchúngchỉ đượcduyệtkhitất cảnhữngđỉnhx đãduyệtxong.Tứclàthứtựduyệt đỉnhsaukhiđãthămx1 sẽlà:(x2, x3 , xp, u1, u2, , uq)
Hình 1.7 Duyệt các đỉnh trong cây
Giảsửtacómộtdanhsáchchứanhữngđỉnhđang"chờ"thăm.Tạimỗibước,tathămmộtđỉnhđầu
danhsáchvàchonhữngđỉnhchưa"xếphàng"kềvớinóxếphàngthêmvàocuốidanhsách.Chínhvìnguyêntắcđónêndanhsáchchứanhữngđỉnhđangchờsẽđượctổchứcdướidạnghàngđợi(Queue)
Ta sẽ dựng giải thuật như sau:
Trang 23Bước 2: Lặp các bước sau đến khi hàng đợi rỗng:
- Lấy u khỏi hàng đợi, thông báo thăm u (Bắt đầu việc duyệt đỉnh u)
- Xét tất cả những đỉnh v kề với u mà chưa được đánh dấu, với mỗi đỉnh v đó:
Ví dụ: Xét đồ thị dưới đây, Đỉnh xuất phát S = 1
Hình 1.8 Ví dụ thuật toán tìm kiếm theo chiều sâu
Cơ sở của thuật toán tìm kiếm theo chiều rộng là lập lịch duyệt cácđỉnh.Việc thăm một đỉnh sẽ lên lịch duyệt tất cả các đỉnh kề của nósao cho thứ tự duyệt là ưu tiên chiều rộng (nghĩa là đỉnh nào gần Shơn sẽ được duyệt trước)
Bảng 1.1 Bảng lập lịch duyệt các đỉnh trong cây
Hàng đợi
Đỉnh u (Lấy ra từ hàng đợi)
Hàng đợi (Sau khi lấy u ra)
Các đỉnh v
kề u mà chưa lên lịch
Hàng đợi sau khi đẩy những đỉnh vào
Trang 24(4,5) 4 (5) 6 (5,6)
Đểýthứtựcácphầntửlấyrakhỏihàngđợi,tathấytrướchếtlà1;sauđóđến2,3;rồimớitới4,5;cuốicùnglà6.RõrànglàđỉnhgầnShơnsẽđượcduyệttrước.Vànhưvậy,tacónhậnxét:nếukết
hợplưuvếttìmđườngđithìđườngđitừStớiFsẽlàđườngđingắnnhất(theonghĩaquaítcạnh nhất)
1.1.4Độ phức tạp tính toán của BFS và DFS
Quátrìnhtìmkiếmtrênđồthịbắtđầutừmộtđỉnhcóthểthămtấtcảcácđỉnhcònlại,khiđócách biểu diễn đồ thị có ảnh hưởng lớn tới chi phí về thời gian thực hiện giải thuật:
- Trong trường hợp ta biểu diễn đồ thị bằng danh sách kề, cả hai thuật toán BFS vàDFSđềucóđộ phức tạp tính toán là O(n + m) = O(max(n, m)).Đây là cách cài đặt tốt nhất
- Nếu ta biểu diễn đồ thị bằng ma trận kề như ở trên thì độ phức tạp
tính toán trong trường hợp này là O(n + n2) = O(n2)
- Nếu ta biểu diễn đồ thị bằng danh sách cạnh, thao tác duyệt những đỉnh kề với đỉnh u sẽ dẫn tới việc phải duyệt qua toàn bộ danh sách cạnh, đây là cài đặt tồi nhất, nó có độ phức tạp tính toán là O(n.m)
1.2 Các khái niệm cơ bản về cây đồ thị
1.2.1 Định nghĩa và các tính chất cơ bản:
Cây là một đồthịmà trong đó hai đỉnh bất kì đều được nối với nhau bằng đúng một đường đi Nói cách khác một đồ thị vô hướng liên thông không chứa chu trình là một cây
Rừng là hợp (disjoint union) của các cây
Trang 25Ví dụ:
Hình 1.9 Cây đồ thị
1.2.2Một số khái niệm
Cho T là một cây có gốc, v là một đỉnh khác gốc của T
- Cha của v là đỉnh u T sao cho có một cạnh có hướng duy nhất
từ u v Khi đó, u được gọi là cha của v; v là con của u
- Các đỉnh có cùng cha được gọi là anh em
- Tổ tiên của một đỉnh khác gốc là các đỉnh trên đường đi từ gốc đến đỉnh đó
- Con cháu của v là các đỉnh có v là tổ tiên
- Các đỉnh của cây không có con được gọi là lá
- Các đỉnh có con được gọi là đỉnh trong
- Trong một cây, cho a là một đỉnh Cây con với gốc a là đồ thì con của cây đang xét, bao gồm a và các con cháu của nó cùng tất cả các cạnh liên thuộc với các con cháu của a
- Mức của một đỉnh v trong một cây có gốc T là khoảng cách từ gốc đến v
- Mức lớn nhất của một đỉnh bất kỳ trong cây gọi là chiều cao của cây
Trang 26CHƯƠNG II: CÁC PHƯƠNG PHÁP XÁC ĐỊNH CHA CHUNG GẦN
NHẤT CỦA HAI NÚT TRONG CÂY 2.1 Giới thiệu bài toán LCA
Tìm kiếm tổ tiên chung thấp nhất Lowest Common Ancestor (LCA) của hai nút trong cây đã được nghiên cứu, ứng dụng từ những năm của thế
kỷ 20 và ngày nay được ứng dụng rộng rãi trong lý thuyết đồ thị Đây là vấn đề thú vị không chỉ cho các thuật toán phức tạp để giải quyết nó mà còn đối với nhiều ứng dụng trong xử lý chuỗi và sinh học tính toán
Bài toán LCA và bài toán RMQ - Range Minimum Query là hai bài toán cổ điển nhưng những nghiên cứu mới về mở rộng của hai bài toán này vẫn được phát triển bởi phạm vi ứng dụng rộng rãi trong lý thuyết cũng như trong thực tế Tầm quan trọng của bài toán LCA và RMQ thể hiện ở 3 điểm: (1) Những thuật toán kinh điển giải quyết bài toán LCA và RMQ đều
là những thuật toán mẫu mực về tính hiệu quả, được chứng minh và đánh giá rõ ràng trong các giáo trình cấu trúc dữ liệu và giải thuật; (2) Rất nhiều thuật toán và ứng dụng thực tế khác cần trả lời truy vấn LCA và RMQ bên trong để tiền xử lý dữ liệu hoặc sử dụng kết quả để xử lý tiếp, việc tăng tốc thuật toán LCA và RMQ sẽ làm tăng tốc thuật toán tổng thể; (3) Có phương pháp quy dẫn tuyến tính từ bài toán LCA sang bài toán RMQ và ngược lại, cho phép phát triển những thuật toán chung cho cả hai bài toán
Bài toán tìm tổ tiên chung gần nhất (Lowest Common Ancestors - LCA) phát biểu như sau: Cho một cây có gốc và một loạt các truy vấn Mỗi truy vấn nhận vào một cặp nút (u,v) và trả về nút tổ tiên chung của cả u và
Trang 27có hướng của cây rồi liệt kê các nút theo đúng thứ tự được thăm trong một danh sách, khi đó tiền bối chung gần nhất của hai nút bất kỳ sẽ là đỉnh có
độ sâu nhỏ nhất nằm giữa hai nút trong danh sách Lúc này, truy vấn LCA trở thành truy vấn tìm giá trị nhỏ nhất trong một phạm vi (Range-Minimum Query - RMQ)
Bài toán RMQ quản lý một danh sách A gồm n phần tử và trả lời một loạt các truy vấn Mỗi truy vấn có dạng RMQ(i, j) nhận vào một cặp số (i,j)
là chỉ số của hai phần tử trong mảng và trả về chỉ số của phần tử nhỏ nhất trong mảng con A[i j] Trong thuật toán quy dẫn từ bài toán LCA về bài toán RMQ sử dụng chu trình Euler, mỗi bài toán LCA tổng quát sẽ được quy dẫn về một trường hợp hạn chế của bài toán RMQ - khi danh sách là số nguyên mà hai phần tử liên tiếp hơn kém nhau đúng 1 đơn vị
Gabow, Bentley và Tarjan lại đề xuất phép quy dẫn tuyến tính theo hướng ngược lại - từ bài toán RMQ về bài toán LCA - bằng cách sử dụng một cấu trúc dữ liệu là cây Trước khi có kết quả này, hầu hết các thuật toán RMQ như sử dụng bảng thưa (sparse tables) hay cây quản lý đoạn (segment trees) đều không đạt được yêu cầu: Thời gian tiền xử lý O(n) và thời gian trả lời mỗi truy vấn O(1) Kết quả của Gabow, Bentley
và Tarjan cho phép quy dẫn tuyến tính bài toán RMQ về bài toán LCA, sau đó bài toán LCA lại có thể quy dẫn tuyến tính về một trường hợp hạn chế của bài toán RMQ bằng chu trình Euler Như vậy người ta chỉ cần phát triển các thuật toán RMQ trong trường hợp hạn chế và đã có những thuật toán trả lời truy vấn RMQ trong thời gian O(1) sau một phép tiền
xử lý trong thời gian O(n) Để hiểu rõ hơn nữa ta cùng đi tìm hiểu mối quan hệ giữa LCA và RMQ
Trang 282.2 Mối quan hệ giữa LCA và RMQ
Bài toán LCA ( Least Common Ancestor ) :
Đầu vào : 1 cây với n đỉnh
Bài toán: với 2 nút u, v bất kỳ của cây T, chất vấn LCA(u,v) cho biết cha
chung gần nhất của 2 đỉnh u,v trong cây T, tức là cho biết đỉnh xa gốc nhất
là cha của cả u, v
Bài toán RMQ (Range Minimum Query ) :
Đầu vào: 1 mảng A với n số
Chất vấn: Với 2 chỉ số i và j, chất vấn RMQ(i,j) cho biết chỉ số của phần tử
nhỏ nhất trong mảng con A[i…j]
Giả sử rằng một thuật toán có thời gian tiền xử lý f(n) và thời gian truy vấn g(n) Các ký hiệu cho sự phức tạp tổng thể cho các thuật toán là
<f(n), g(n)>
Nút xa nhất từ gốc là tổ tiên của cả u và v trong một số cây bắt nguồn từ T là LCAT (u,v)
Bài toán Range Minimum Query (RMQ) được phát biểu như sau:
Cho một mảng A[0,N-1] tìm vị trí của các phần tử có giá trị nhỏ nhất giữa hai chỉ số nhất định
Hình 2.1 Vị trí của các phần tử trong bài toán RQM
Đối với mỗi cặp chỉ số (i,j) lưu giữ những giá trị của RMQA(i,j) trong một bảng M[0,N-1] [0,N-1] Độ phức tạp của thuật toán sẽ là
<O(N3),O(1)> Tuy nhiên, bằng cách sử dụng phương pháp tiếp cận động
dễ dàng chúng ta có thể giảm bớt sự phức tạp <O (N2), O (1)> Các chức năng tiền xử lý sẽ được viết như sau:
Trang 29void process1(int M[MAXN][MAXN], int A[MAXN], int N)
Hình 2.1 Ví dụ về phân chia đoạn trong bài toán RQM
để có đƣợc tối thiểu chung từ sqrt (N) phần nằm bên trong các khoảng phần tử cuối và đầu tiên Để có đƣợc RMQA(2,7) trong ví dụ trên, chúng ta nên so sánh A[2], A[M [1]], A[6] và A[7] và có đƣợc vị trí của các giá trị tối thiểu
Trang 30Thật dễ dàng để thấy rằng thuật toán này không làm cho hơn 3*sqrt (N) hoạt động trên truy vấn
Ưu điểm của phương pháp này là mã hóa nhanh và có thể thay đổi các yếu tố của các mảng giữa các truy vấn
Một cách tiếp cận tốt hơn là để xử lý trước RMQ cho mảng phụ của chiều dài 2k sử dụng lập trìnhđộng Ta sẽ giữ một mảng M[0,N-1] [0,logN] nơi M [i] [j] là chỉ số của các giá trị tối thiểu trong các mảng tiểu bắt đầu từ
i có độ dài 2j Dưới đây là một ví dụ:
Hình 2.2 Ví dụ về bài toán RQM
Đối với máy tính M[i][j], chúng phải tìm kiếm các giá trị tối thiểu trong nửa đầu tiên và thứ hai của khoảng Rõ ràng rằng các mảnh nhỏ có 2j- 1 chiều dài, vì vậy sự tái phát là:
Trang 31Khi những giá trị này đã đƣợc xử lý, ta có thể sử dụng chúng để tính
và tìm thấy những tối thiểu giữa chúng k = [log (j - i + 1)] Đối với máy tính
Vì vậy độ phức tạp của thuật toán là <O(N logN), O(1)>
Để giải quyết bài toán RMQ ta có thể sử dụng cây phân đoạn Cây phân đoạn là một cấu trúc dữ liệu có thể đƣợc sử dụng để làm các hoạt động cập nhật/truy vấn trong mảng trong khoảng thời gian thực hiện thuật toán Ta xác định các cây phân đoạn cho khoảng [i, j] theo cách đệ quy nhƣ sau:
- Nút đầu tiên sẽ tổ chức thông tin cho khoảng [i, j]
- Nếu i <j bên trái và bên phải con sẽ giữ thông tin cho các khoảng [i, (i + j) / 2] và [(i + j) / 2 + 1, j]
Chiều cao của một cây phân đoạn cho mỗi khoảng với các yếu tố N
là [logN] + 1 Đây là cách một cây phân đoạn cho khoảng [0, 9] sẽ nhƣ sau:
Trang 32Hình 2.3: Cấu trúc cây phân đoạn
Cây phân đoạn có cấu trúc giống nhƣ hình trên, vì vậy nếu chúng ta có một số nút x đó không phải là lá con còn lại của x là 2*x và lá con phải 2*x+1
Để giải quyết bài toán RMQ sử dụng cây phân đoạn ta nên sử dụng một mảng M [1, 2 * 2 [logN] + 1] trong đó M [i] chứa các vị trí có giá trị tối thiểu trong khoảng đƣợc giao đến nút i Các cây phải đƣợc khởi tạovới hàm sau(b và e là những giới hạn của khoảng thời gian hiện tại):
void initialize(intnode, int b, int e, int M[MAXIND], int A[MAXN], int N)
//search for the minimum value in the first and
//second half of the interval
if (A[M[2 * node]] <= A[M[2 * node + 1]])
Trang 33đó gọi hàm với node = 1, b = 0 và e = N-1
Bây giờ có thể bắt đầu thực hiện các truy vấn Nếu muốn tìm vị trí của giá trị tối thiểu ở một số khoảng thời gian [i, j] ta sử dụng hàm sau:
int query(int node, int b, int e, int M[MAXIND], int A[MAXN], int i, int j)
{
int p1, p2;
//if the current interval doesn't intersect
//the query interval return -1
if (i > e || j < b)
return -1;
//if the current interval is included in
//the query interval return M[node]
if (b >= i && e <= j)
return M[node];
//compute the minimum position in the
//left and right part of the interval
p1 = query(2 * node, b, (b + e) / 2, M, A, i, j);
p2 = query(2 * node + 1, (b + e) / 2 + 1, e, M, A, i, j);
//return the position where the overall
Trang 34Sử dụng cây phân đoạn có độ phức tạp của thuật toán là<O (N), O(logN)> Cây phân đoạn đang được sử dụng rất phổ biến, không chỉ bởi
vì chúng có thể được sử dụng cho bài toán RMQ Chúng là một cấu trúc dữ liệu rất linh hoạt, có thể giải quyết ngay cả những phiên bản động của bài toán RMQ, và có nhiều ứng dụng trong các lĩnh vực và phạm vi tìm kiếm
Bổ đề:
Nếu có 1 thuật toán với độ phức tạp là <f(n),g(n)> cho bài toán LCA thì sẽ có 1 thuật toán với độ phức tạp là <f(n)+n,g(n)+1> cho bài toán RMQ
Chứng minh:
Giả sử ta có mảng A[1…n] là mảng đầu vào của bài toán RMQ Ta
sẽ xây dựng 1 cây theo cách sau: gốc của cây sẽ tương ứng với phần tử nhỏ nhất của mảng A; sau khi loại bỏ phần tử này đi, mảng A sẽ chia thành 2 phần; con trái và con phải của gốc được xây dựng tương tự từ 2 mảng con bên trái và bên phải mảng ban đầu
Để xây dựng được cây này ta mất thời gian là O(N) Gọi Ti là cây tương ứng với mảng A[1…i], để xây dựng cây Ti+1 ta để ý rằng nút i+1 sẽ thuộc đường đi xuất phát từ gốc và luôn đi sang bên phải (gọi là đường Pr)
Vì thế ta sẽ đi theo đường này từ dưới lên trên cho đến khi gặp vị trí thích hợp để chèn nút i+1 vào Các nút bên dưới sẽ trở thành con trái của nút i+1
Trang 35Để ý rằng mỗi lần kiểm tra xem 1 vị trí có thích hợp để chèn nút mới vào không, ta sẽ thêm vào hoặc loại bỏ 1 nút từ đường Pr, và 1 nút chỉ có thể được thêm vào và loại bỏ khỏi đường Pr nhiều nhất 1 lần Vì thế ta xây dựng cây sẽ mất O(N)
Sau khi xây dựng cây, gọi k = LCA(i,j) với i,j bất kỳ Như thế k sẽ là nút đầu tiên chia cắt i,j Theo cách xây dựng cây thì k chính là phần tử nhỏ nhất của mảng con A[i…j] Vì thế RMQ(i,j) = LCA(i,j)
Như thế để tính RMQ(i,j) ta mất O(N) ở bước chuẩn bị để xây dựng cây và O(1) để gọi thủ tục LCA(i,j) trên cây Bổ đề được chứng minh
Bổ đề:
Nếu có 1 thuật toán với độ phức tạp là <f(n),g(n)> cho bài toán RMQ
thì sẽ có 1 thuật toán với độ phức tạp là <f(n)+n,g(n)+1> cho bài toán LCA
Chứng minh:
Giả sử ta có 1 cây T là cây đầu vào của bài toán LCA Dùng thủ tục DFS cho cây này và viết ra các đỉnh của cây mỗi khi đỉnh đó được đi qua Khi đó ta sẽ nhận được 1 dãy 2*n-1 số bởi vì chúng ta bắt đầu liệt kê từ đỉnh gốc, với mỗi cạnh ta sẽ liệt kê được 2 đỉnh ( ở lần đi và lần về ) Có n-
Trang 36Thực hiện thao tác i = RMQ(R[u], R[v]) trên mảng L, khi đó i sẽ là chỉ số của phần tử nhỏ nhất trong khoảng L[R[u]…R[v]], E[i] cho ta kết của của phép chất vấn LCA(u,v)
Như thế để tính LCA(u,v) ta mất O(n) để khởi tạo các mảng E,L,R
và mất O(1) để gọi thủ tục RMQ(R[u],R[v]) Bổ đề được chứng minh
Nhận xét : bài toán RMQ phát sinh khi giải bài toán LCA chỉ là 1
trường hợp đặc biệt của bài toán RMQ tổng quát bởi các phần tử liên tiếp nhau trong mảng hơn kém nhau đúng 1 đơn vị ( Do 2 phần tử liên tiếp là khoảng cách tới gốc của 2 nút có quan hệ cha con với nhau ) Bài toán này gọi là ±1RMQ
Để giải bài toán RMQ ta có thể sử dụng cấu trúc dữ liệu Interval Tree Khi đó thuật toán sẽ có độ phức tạp là <NlogN,LogN> và sử dụng O(N) bộ nhớ Một thuật toán khác nhanh hơn với độ phức tạp là
<NlogN,1> sẽ được trình bày dưới đây:
Gọi F[i,j] = RMQ(i,i+2^j-1) Ta có thể khởi tạo mảng F trong thời gian NlogN bằng cách sử dụng QHĐ Khi đó RMQ(i,j) = F[i,t] nếu A[F[i,t]] < A[F[j-2^t+1,t]] và RMQ(i,j) = F[j-2^t+1,t] nếu ngược lại với t = Trunc(Log(j-i+1))
Cũng với phương pháp trên và một số cải tiến ta có thể giải bài toán
±1RMQ trong <N,1> như sau :
Giải sử A là mảng đầu vào của bài toán ±1RMQ Chia mảng A thành các block liên tiếp với độ dài là logN/2 Định nghĩa mảng A’[1…2*N/LogN] với A’[i] cho ta biết giá trị nhỏ nhất của block thứ i và B[1…2*N/LogN] với B[i] là vị trí mà giá trị A’[i] xuất hiện trong block đó
Sử dụng thuật toán trên với mảng A’ ta sẽ có thuật toán với độ phức tạp là
<N,1> Để thực hiện chất vấn RMQ(i,j) trên mảng A, nếu i,j thuộc các block khác nhau thì ta sẽ làm như sau :
- Tìm Min của đoạn từ i đến phần cuối của block chứa i
Trang 37- Tìm Min của các block nằm giữa block chứa i và block chứa j
- Tìm Min của đoạn từ đầu block chứa j đến j
Thao tác thứ 2 hoàn toàn có thể thực hiện trong <N,1> dựa vào mảng A’ và B Vì vậy ta chỉ cần quan tâm đến trường hợp i,j nằm trên cùng 1 block
Để ý 1 block có 2 đặc trưng : 1 là giá trị của phần tử đầu tiên, 2 là dãy nhị phân ứng với mỗi phần tử của block cho ta biết nó lớn hơn hay nhỏ hơn phần tử trước Nếu 2 block có cùng đặc trưng 2 thì ta có thể sử dụng kết quả chất vấn của block này để xác định kết quả chất vấn của block kia
Số đặc trưng 2 chỉ vào khoảng 2^(logN/2-1) = O(sqrt(N)) là rất nhỏ, vì thế
ta có thể xác định trước các đặc trưng 2 cũng như kết qủa của tất cả các câu chất vấn chỉ mất O( sqrt(N)*LogN*LogN) Với N đủ lớn ta có thể coi sqrt(N)*Log(N)*Log(N) < N ( nếu muốn ta có thể sử dụng các block với
độ dài là LogN/3, LogN/4 để đạt được bất đẳng thức này) Để xác định đặc trưng 2 của các block trong A cũng chỉ mất O(N) khi khởi tạo Vì thế bài toán ±1RMQ có thể giải quyết trong <N,1> với bộ nhớ là O(N)
Với thuật toán ±1RMQ <N,1> ta có thể đưa ra được thuật toán LCA
<N,1> và thuật toán RMQ tổng quát cũng với thời gian <N,1>
Trong lý thuyết đồ thị và khoa học máy tính, tổ tiên thấp nhất (LCA) của hai nút u và v trong một câylà thấp nhất (tức là sâu nhất) nút đó có cả u
và v là con cháu, mà mỗi nút là một hậu duệ của chính nó (vì vậy nếu v có một kết nối trực tiếp từ v thì v là tổ tiên chung thấp nhất)
Trang 38Ví dụ:
Hình 2.4 Hình cây của thuật toán LCA
- Ở ví dụ trên node 9 và 12 có tổ tiên chung thấp nhất là node 3
Giải quyết bài toán bằng <O (N), O (sqrt (N))>
Chia đầu vào của cây thành những phần kích thước bằng nhau, chứng tỏ là một cách để giải quyết các vấn đề RMQ Phương pháp này có thể được điều chỉnh để giải quyết cho các vấn đề của bài toán LCA Ý tưởng là để phân chia câysqrt(H) thành các bộ phận, là H là chiều cao của cây Như vậy, phần đầu tiên sẽ chứa các mức đánh số từ 0 đến sqrt (H) - 1, thứ hai sẽ chứa các mức đánh số từ sqrt (H) 2 * sqrt (H) - 1, và như vậy Đây là cách các cây trong ví dụ này nên được phân chia: