2 LỜI MỞ ĐẦU Trong bài này, tôi sẽ trình bày phương pháp lắp ráp các đoạn reads rời rạc thành một đoạn ADN hoàn chỉnh sử dụng phép duyệt rộng cũng như duyệt sâu để tìm kiếm tất cả đường
Trang 1LẮP RÁP DE NOVO TRONG GIẢI TRÌNH TỰ GENE
THẾ HỆ TIẾP THEO
THÀNH PHỐ HỒ CHÍ MINH, THÁNG 6, NĂM 2016
GIẢNG VIÊN HƯỚNG DẪN: PSG TS Phạm Thế Bảo
SINH VIÊN THỰC HIỆN: Võ Hoàng Trọng
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA TOÁN – TIN HỌC
ĐỀ TÀI MÔN XỬ LÝ ĐA CHIỀU
Trang 21
MỤC LỤC
LỜI MỞ ĐẦU 2
1 GIỚI THIỆU 3
1.1 Tổng Quan về ADN và Gene 3
1.2 Trình Tự Thế Hệ Gene Đầu Tiên 4
1.3 Trình Tự Thế Hệ Gene Tiếp Theo 5
1.4 Xử Lý Dữ Liệu 6
2 THUẬT TOÁN LẮP RÁP BẰNG ĐỒ THỊ DE BRUIJN 6
2.1 Cơ Sở Lý Thuyết 6
2.2 Xây Dựng Đồ Thị de Bruijn 7
2.3 Áp Dụng Đồ Thị de Bruijn vào Lắp Ráp Gene 8
2.3.1 Xây Dựng Đồ Thị dựa trên 𝑘_𝑚𝑒𝑟 8
2.3.2 Kết Quả Thực Nghiệm 13
2.3.3 Xây Dựng Đồ Thị dựa trên 𝑘_𝑚𝑒𝑟 Kép 14
3 THỬ THÁCH 18
4 HƯỚNG PHÁT TRIỂN TIẾP THEO 19
5 TÀI LIỆU THAM KHẢO 20
PHỤ LỤC 1: KHẢO SÁT THỜI GIAN CHẠY CHƯƠNG TRÌNH SỬ DỤNG BFS VÀ 𝑘_𝑚𝑒𝑟 ĐƠN 21
Trang 32
LỜI MỞ ĐẦU
Trong bài này, tôi sẽ trình bày phương pháp lắp ráp các đoạn reads rời rạc thành một
đoạn ADN hoàn chỉnh sử dụng phép duyệt rộng cũng như duyệt sâu để tìm kiếm tất
cả đường đi Euler trên đồ thị de Bruijn, đánh giá ưu, nhược điểm của phương pháp và
đề xuất hướng nghiên cứu tiếp theo
Nội dung của bài này gồm 6 phần:
- Phần 1: Giới thiệu những kiến thức cơ bản về ADN cũng như trình tự thế hệ
gene đầu tiên và tiếp theo, cách xử lý dữ liệu trên trình tự gene thế hệ tiếp theo
- Phần 2: Trình bày cơ sở lý thuyết của phương pháp sử dụng đồ thị de Bruijn,
cách lắp ráp chuỗi ADN sử dụng đồ thị này kết hợp với phép duyệt rộng hoặc
duyệt sâu Ngoài ra, phần này còn trình bày thêm một phương pháp khác có thể
lắp ráp nhanh hơn phương pháp đề ra trong lý thuyết
- Phần 3; Trình bày một số thử thách thực tế khi lắp ráp
- Phần 4: Trình bày hướng phát triển tiếp theo của đề tài này
- Phần 5: Giới thiệu một số tài liệu tham khảo mà tôi đã sử dụng phục vụ cho đề
Trang 43
1 GIỚI THIỆU
1.1 Tổng Quan về ADN và Gene
Vì sao mỗi loài vật là có những đặc điểm riêng biệt? Trong cùng một bộ Linh trưởng, con người khác con đười ươi ở những điểm nào? Nếu chỉ nhìn vào những đặc điểm bên ngoài thì ta không khó để trả lời những câu hỏi này, nhưng đối với các nhà khoa học thì họ muốn tìm hiểu sâu xa hơn thế, họ muốn tìm hiểu sâu hơn cái gì đã tạo nên hình dạng bàn tay con người khác với tay con đười ươi, hay trong những bộ phim viễn tưởng có những cảnh con chuột biến thành con người, điều này trong Sinh học có thể xảy ra hay không?
Vào thế kỷ 20, người ta đã khám phá ra ADN, một khám phá có ý nghĩa rất quan trọng trong khoa học ADN ta có thể hiểu nôm na là một thứ chứa thông tin di truyền, bàn tay người khác với bàn tay đười ươi là do cấu trúc ADN của tay người khác với tay đười ươi, giống như 2 chương trình máy tính khác nhau là do 2 mã nguồn tạo nên chương trình đó khác nhau vậy Mỗi loài trên Trái Đất này đều có một trình tự ADN riêng biêt (giống như dấu vân tay ở mỗi người), điều này tao nên nét độc đáo ở mỗi sinh vật Do đó, muốn biến con chuột thành con người, ta chỉ việc biến cấu trúc ADN của chuột thành cấu trúc ADN của người (đương nhiên tôi chỉ nói về lý thuyết) Nếu nói về khái niệm ADN thuần tuý khoa học thì đây là một phân tử Acid nucleic, ADN là tên viết tắt của từ Acid Deoxyribonucleic (một số nước gọi là DNA – Deoxyribonucleic Acid), phân tử này được tạo từ 4 base cơ bản là Adenin (A), Cytosine (C), Guanine(G) và Thymine (T) Trong tế bào, ADN có dạng chuỗi xoắn kép (tức 2 nhánh ADN xoắn lại với nhau), chuỗi này được liên kết bằng mỗi liên kết hydro, trong đó base A liên kết với base T và base G liên kết với base C
Trang 54
Hình 1.1 Cấu trúc dạng xoắn kép của phân tử ADN trong tế bảo, 2 nhánh đơn liên
kết với nhau bằng mối liên kết hydro (A – T, G - C) Nguồn ảnh: www.iptv.org Gene là một đoạn ADN nhằm quy định một chức năng nào đó, ví dụ như gene quy định màu tóc, màu mắt, kích thước bàn tay chẳng hạn
Khái niệm ADN và gene đơn giản vậy thôi, thế nhưng tại sao các nhà khoa học là bỏ nhiều thời gian từ ngày này sang ngày khác để nghiên cứu về nó? Vì nghiên cứu về gene (cũng như ADN) có nhiều ứng dụng cho đời sống con người Ví dụ như con người hễ ai mang căn bệnh ung thư thì điều đó đồng nghĩa với một “án tử” dành cho
họ Cho đến nay, bệnh ung thư vẫn chưa có một phương pháp hay liều thuốc nào trị triệt để Tuy nhiên, loài cá mập lại có một khả năng đặc biệt: Chúng miễn dịch với tất
cả các loại bệnh, kể cả ung thư Điều gì đã khiến loài cá mập có khả năng này? Cấu trúc gene nào trong loài cá mập quy định khả năng đó? Nếu ta biết cách “cấy” cấu trúc gene đó ra và “ghép” những tế bào bị ung thư thì quá tuyệt diệu Hay ta có thể tìm hiểu các chức năng của gene người thông qua gene tương tự của ruồi hay thậm chí là vi khuẩn
1.2 Trình Tự Thế Hệ Gene Đầu Tiên
Năm 1977, Frederick Sanger lần đầu tiên xác định được trình tự gene vi khuẩn 𝜑𝑋174 bằng phương pháp do ông tìm ra – phương pháp Sanger Ta có hiểu đơn giản cách của ông làm đó là sao chép gnene này thành 4 phần, cho vào 4 hũ A, C, G, T, mỗi hũ có nhiệm vụ phát hiện base tương ứng trong gene, khi phát hiện ra, hũ đó sẽ tạo phản ứng chuỗi trùng hợp (PCR) bằng phóng xạ lên một bản gel Cuối cùng, ta sẽ được bản gel chứa các vạch là vị trí của mỗi base trong ADN Ví dụ với chuỗi ATGCTCAG, sau phản ứng, ta được bản gel sau:
Trang 65
Hình 1.2 Ảnh bản gel sau phản ứng
Từ hình 1.2, ta đọc từ dưới lên sẽ thấy trình tự xác vạch suất hiện ứng với base tương ứng là A, T, G, C, T, C, A, G → ATGCTCAG
Phương pháp này trong một lần chạy có thể xác định được 500 base nhưng có hạn chế
là tốc độ chậm, chi phí cao (Vào năm 2004, chi phí để xác định trình tự gene vào khoảng 10 triệu USD) và độ chính xác phụ thuộc vào vật liệu phóng xạ Do đó, nếu sử dụng phương pháp Sanger để xác định trình tự gene người (khoảng 3 tỷ base) và dùng
96 chiếc máy trình tự thì mỗi lần chạy, ta được 48 000 base Do đó, ta cần chạy 96 chiếc máy này 62 500 lần, nếu lấy 1 ngày chạy 10 lần (1 lần chạy khoảng 2 tiếng) thì phải đến 17 năm sau ta mới có kết quả
Vì vậy, các nhà khoa học phải tìm một phương pháp xác định trình tự mới sao cho tốc
độ xác định nhanh với chi phí thấp
1.3 Trình Tự Thế Hệ Gene Tiếp Theo
Nếu phương pháp Sanger xác định trình tự toàn bộ gene trong một lần chạy gây tốn nhiều thời gian thì ở thế hệ genen tiếp theo, về cơ bản người ta vẫn sử dụng phương pháp Sanger nhưng họ sẽ bẻ ADN thành nhiều đoạn nhỏ hơn, xác định cùng lúc trình
tự trên những đoạn nhỏ đó rồi ghép các kết quả lại Quy trình này gọi lại “Sắp xếp trình tự lớn song song – Massively Parallel Sequencing” giúp giảm chi phí từ 10 triệu USD xuống còn 5 000 USD đến 8 000 USD
Năm 2005 đánh dấu một kỷ nguyên mới trong quá trình phân giải DNA khi phương pháp mới ra đời đã đạt hiệu quả ở 4 hướng:
- Giảm chi phí phân giải
- Tăng tốc độ trong quá trình phân giải
- Tự động thực hiện các quy trình còn lại
- Tăng độ chính xác kết quả phân giải
Lần đầu phân giải gene người mất khoảng 10 năm với hàng triệu USD thì với phương pháp này, việc phân giải chỉ mất khoảng 1 ngày với chi phí xấp xỉ 5 000 USD
Trang 76
Hình 1.3 Sau khi trình tự thế hệ gene tiếp theo ra đời, từ khoảng năm 2007, chi phí
phân giải giảm rõ rệt
Như vậy, bài toán đặt ra đó là với những đoạn ADN rời rạc, ta phải có một cách lắp ráp để ra được đoạn ADN hoàn chỉnh
1.4 Xử Lý Dữ Liệu
Với trình tự thế hệ gene tiếp theo, sau khi phân giải, ta sẽ được tập các đoạn ADN rời rạc, nhiệm vụ của tôi sẽ ghép những đoạn ADN rời rạc đó thành một đoạn ADN hoàn chỉnh
Input: Tập các đoạn ADN rời rạc
Output: Đoạn ADN hoàn chỉnh
Hiện có 2 thuật toán chính dùng để lắp ráp: OLC và đồ thị de Bruijn, bài này chủ yếu nói về thuật toán sử dụng đồ thị de Bruijn
2 THUẬT TOÁN LẮP RÁP BẰNG ĐỒ THỊ DE BRUIJN 2.1 Cơ Sở Lý Thuyết
Đồ thị de Bruijn do nhà Toán học người Hà Lan tên Nicolaas Govert de Bruijn cùng cộng sự phát triển nhằm giải quyết bài toán sau:
Cho tập 𝑇 gồm các chuỗi 𝑡1, 𝑡2, … , 𝑡𝑛, tìm chuỗi 𝑆 có độ dài nhỏ nhất sao cho mỗi 𝑡𝑖đều là chuỗi con của chuỗi 𝑆 và xuất hiện đúng 1 lần trong 𝑆
Ví dụ: 𝑡1 = 𝐴𝐴, 𝑡2 = 𝐴𝐵, 𝑡3 = 𝐵𝐴, 𝑡4 = 𝐵𝐵, khi đó 𝑆 = 𝐴𝐴𝐵𝐵𝐴
Định nghĩa 2.1: Cho chuỗi 𝑆
- 𝑝𝑟𝑒(𝑆, 𝑘): 𝑘 ký tự đầu tiên của chuỗi 𝑆
- 𝑠𝑢𝑓(𝑆, 𝑘): 𝑘 ký tự cuối cùng của chuỗi 𝑆
Trang 87
- 𝑘_𝑚𝑒𝑟(𝑆): Tập tất cả các chuỗi con của chuỗi 𝑆 có độ dài bằng 𝑘
Định nghĩa 2.2: Hai chuỗi 𝑡1 và 𝑡2 gọi là 𝑜𝑣𝑒𝑟𝑙𝑎𝑝 nếu với 𝑘 ∈ ℕ, 𝑝𝑟𝑒(𝑡1, 𝑘) =𝑠𝑢𝑓(𝑡2, 𝑘) hay 𝑠𝑢𝑓(𝑡1, 𝑘) = 𝑝𝑟𝑒(𝑡2, 𝑘)
Định nghĩa 2.3: Một giá trị 𝑎 ∈ ℕ gọi là 𝑜𝑣𝑒𝑟𝑙𝑎𝑝𝑚𝑎𝑥(𝐴) khi 𝑎 là giá trị lớn nhất sao
cho bất kỳ 2 chuỗi 𝑡𝑖, 𝑡𝑗 ∈ 𝐴 thì 𝑝𝑟𝑒(𝑡𝑖, 𝑎) = 𝑠𝑢𝑓(𝑡𝑗, 𝑎) hay 𝑝𝑟𝑒(𝑡𝑗, 𝑎) = 𝑠𝑢𝑓(𝑡𝑖, 𝑎) Nếu như mỗi chuỗi 𝑡𝑖, 𝑡𝑗 (𝑖 ≠ 𝑗) bất kỳ trong tập 𝑇 không overlap thì giải bài toán này không khó, một đáp án đó là ta ghép chuỗi này nối đuôi chuỗi kia tuần tự từ 𝑡1 đến 𝑡𝑛 Vấn đề cần giải quyết đó là tồn tại 2 chuỗi 𝑡𝑖 và 𝑡𝑗 overlap, để giải bài toán đó, ta sẽ xây dựng đồ thị de Bruijn
𝐴𝑇𝐶𝐶𝑇𝐺 𝑇𝐶𝐶𝑇𝐺𝐺 𝐶𝐶𝑇𝐺𝐺𝐶 𝐶𝑇𝐺𝐺𝐶𝐴 𝑇𝐺𝐺𝐶𝐴𝑇 Với mỗi chuỗi 𝑡𝑖, ta tách thành phần 𝑝𝑟𝑒(𝑡𝑖, 5) và 𝑠𝑢𝑓(𝑡𝑖, 5), khi đó, ta được 𝑡𝑖 =𝑝𝑟𝑒(𝑡𝑖, 4) → 𝑠𝑢𝑓(𝑡𝑖, 4), cụ thể:
𝐴𝑇𝐶𝐶𝑇𝐺 = 𝐴𝑇𝐶𝐶𝑇 → 𝑇𝐶𝐶𝑇𝐺 𝑇𝐶𝐶𝑇𝐺𝐺 = 𝑇𝐶𝐶𝑇𝐺 → 𝐶𝐶𝑇𝐺𝐺 𝐶𝐶𝑇𝐺𝐺𝐶 = 𝐶𝐶𝑇𝐺𝐺 → 𝐶𝑇𝐺𝐺𝐶 𝐶𝑇𝐺𝐺𝐶𝐴 = 𝐶𝑇𝐺𝐺𝐶 → 𝑇𝐺𝐺𝐶𝐴 𝑇𝐺𝐺𝐶𝐴𝑇 = 𝑇𝐺𝐺𝐶𝐴 → 𝐺𝐺𝐶𝐴𝑇
Trang 92.3 Áp Dụng Đồ Thị de Bruijn vào Lắp Ráp Gene
2.3.1 Xây Dựng Đồ Thị dựa trên 𝒌_𝒎𝒆𝒓
Để áp dụng đồ thị de Bruijn, ta cần có cơ sở đảm bảo tính chính xác của đồ thị này Vì vậy tôi sẽ tự cho một đoạn ADN, sau đó lấy tất cả 𝑘_𝑚𝑒𝑟(𝐴𝐷𝑁) và dùng đồ thị de Bruijn để lắp ráp lại thành đoạn ADN ban đầu
Xét đoạn ADN: 𝑇𝐴𝐴𝑇𝐺𝐶𝐶𝐴𝑇𝐺𝐺𝐺𝐴𝑇𝐺𝑇𝑇
Tập 3_𝑚𝑒𝑟(𝐴𝐷𝑁)
= {𝑇𝐴𝐴, 𝐴𝐴𝑇, 𝐴𝑇𝐺, 𝑇𝐺𝐶, 𝐺𝐶𝐶, 𝐶𝐶𝐴, 𝐶𝐴𝑇, 𝐴𝑇𝐺, 𝑇𝐺𝐺, 𝐺𝐺𝐺, 𝐺𝐺𝐴, 𝐺𝐴𝑇, 𝐴𝑇𝐺, 𝑇𝐺𝑇, 𝐺𝑇𝑇} Với mỗi cặp 𝑡𝑖, 𝑡𝑗 trong 3_𝑚𝑒𝑟 đều có tính chất 𝑝𝑟𝑒(𝑡𝑖, 2) = 𝑠𝑢𝑓(𝑡𝑗, 2) hoặc 𝑝𝑟𝑒(𝑡𝑗, 2) = 𝑠𝑢𝑓(𝑡𝑖, 2) và 2 = 𝑜𝑣𝑒𝑟𝑙𝑎𝑝𝑚𝑎𝑥(3_𝑚𝑒𝑟(𝐴𝐷𝑁)), ta tách thành 𝑡𝑖 =𝑝𝑟𝑒(𝑡𝑖, 2) → 𝑠𝑢𝑓(𝑡𝑖, 2), cụ thể:
Trang 10Dưới đây là hình ảnh đồ thị de Bruijn đã được xây dựng:
Trang 1110
Hình 2.1 Đồ thị de Bruijn xây dựng từ bảng 2.1 và bảng 2.2
Tiếp theo, ta xác định tất cả đường đi Euler trong đồ thị de Bruijn này Xét node 𝑢 bất
kỳ, ta ký hiệu 𝑖𝑛_𝑑𝑒𝑔(𝑢) là số đường đi kết thúc tại 𝑢, 𝑜𝑢𝑡_𝑑𝑒𝑔(𝑢) là số đường đi bắt đầu tại 𝑢 Ví dụ như trong hình 2.1, ta có 𝑖𝑛_𝑑𝑒𝑔(𝑇𝐺) = 3, 𝑜𝑢𝑡_𝑑𝑒𝑔(𝑇𝐺) = 3 hay 𝑖𝑛_𝑑𝑒𝑔(𝑇𝐴) = 0, 𝑜𝑢𝑡_𝑑𝑒𝑔(𝑇𝐴) = 1
Trong đồ thị có hướng, để xác định đồ thị có tồn tại đường đi hay chu trình Euler hay không, ta áp dụng định lý sau:
Định lý 2.1: Một đồ thị 𝐺 có hướng có đường đi Euler khi và chỉ khi 𝐺 tồn tại đúng 2
node 𝑢 và 𝑣 sao cho 𝑜𝑢𝑡_𝑑𝑒𝑔(𝑢) = 𝑖𝑛_𝑑𝑒𝑔(𝑢) + 1 và 𝑜𝑢𝑡_𝑑𝑒𝑔(𝑣) = 𝑖𝑛_𝑑𝑒𝑔(𝑢) −
1 và 𝑜𝑢𝑡_𝑑𝑒𝑔(𝑥) = 𝑖𝑛_𝑑𝑒𝑔(𝑥) với các node 𝑥 còn lại trong đồ thị Đường đi bắt đầu tại 𝑢 và kết thúc tại 𝑣
Định lý 2.2: Một đồ thị 𝐺 có hướng có chu trình Euler khi và chỉ khi mỗi node 𝑥 ∈ 𝐺
Trang 12Dựa vào đồ thị, xét các phần tử trên dòng của node 𝑖, phần tử 𝑗 nào có giá trị khác 0 tức 𝑀(𝑖, 𝑗) ≠ 0 thì ta trừ giá trị của 𝑀(𝑖, 𝑗) xuống 1 đơn vị, lấy node 𝑗 làm chuẩn và thực hiện lại quy trình trên cho đến khi không thể tìm được phần tử trong dòng có giá trị khác 0 Xuất kết quả đường đi Euler khi ma trận thành ma trận không Ta áp dụng điều này vào đồ thị:
- Xuất phát từ 𝑇𝐴, xét dòng 𝑇𝐴 chỉ có 𝑀(𝑇𝐴, 𝐴𝐴) = 1 ≠ 0, thực hiện 𝑀(𝑇𝐴, 𝐴𝐴) = 𝑀(𝑇𝐴, 𝐴𝐴) − 1 và lấy 𝐴𝐴 làm chuẩn
- Xuất phát từ 𝐴𝐴, xét dòng 𝐴𝐴 chỉ có 𝑀(𝐴𝐴, 𝐴𝑇) = 1 ≠ 0, thực hiện 𝑀(𝐴𝐴, 𝐴𝑇) = 𝑀(𝐴𝐴, 𝐴𝑇) − 1 và lấy 𝐴𝑇 làm chuẩn
- Xuất phát từ 𝐴𝑇, xét dòng 𝐴𝑇 chỉ có 𝑀(𝐴𝑇, 𝑇𝐺) = 3 ≠ 0, thực hiện 𝑀(𝐴𝑇, 𝑇𝐺) = 𝑀(𝐴𝑇, 𝑇𝐺) − 1 và lấy 𝑇𝐺 làm chuẩn
- Xuất phát từ 𝑇𝐺, xét dòng 𝑇𝐺, có 𝑀(𝑇𝐺, 𝐺𝐶) = 𝑀(𝑇𝐺, 𝐺𝐺) = 𝑀(𝑇𝐺, 𝐺𝑇) =
1 ≠ 0, ta nên lấy 𝐺𝐶, 𝐺𝐺 hay 𝑇𝐺 làm chuẩn?
Vấn đề phát sinh khi từ một node có thể có nhiều đường đi đến các node khác Do đó
để tìm tất cả đường đi Euler, tôi sử dụng ý tưởng của phép tìm kiếm duyệt rộng (Breadth – First Search - BFS) hoặc tìm kiếm duyệt sâu (Deep – First Search - DFS)
để thực hiện với các node trong cây tìm kiếm chính là trạng thái của ma trận
2.3.1.1 Sử Dụng BFS
Thuật toán 2.1 Sử dụng BFS để tìm tất cả đường đi Euler
1
input: Ma trận ban đầu (matrix), vị trí xuất phát
(start), kích thước 1 hàng của ma trận (n)
2 output: Tất cả đường đi Euler
3 Tạo queue map,path;
Trang 13input: Ma trận ban đầu (matrix), vị trí xuất phát
(start), kích thước 1 hàng của ma trận (n), đường
Trang 1413
Đối với thuật toán BFS có thể tính với dữ liệu lớn nhưng tốc độ chậm, còn thuật toán DFS cho ra tốc độ nhanh nhưng không thể tính dữ liệu lớn do gây nặng máy tính Sau khi thực hiện thuật toán trên, ta được 2 kết quả:
Tôi xây dựng chương trình có chức nặng tạo một chuỗi ADN có độ dài do người dùng
tự nhập (điều kiện độ dài lớn hơn 25), chương trình sẽ tự động chọn 𝑘 bằng 18% độ dài chuỗi ADN, sau đó chương trình sẽ tính toàn bộ tập 𝑘_𝑚𝑒𝑟 và lưu vào trong tập
tin reads.txt Chương trình sẽ tự động sử dụng nội dung trong tập tin này và xây dựng
đồ thị de Bruijn và áp dụng BFS để lắp ráp Cuối cùng, tôi viết một hàm để đối chiếu các kết quả với chuỗi ADN ban đầu để xác định có tồn tại kết quả đúng hay sai Kết quả:
Hình 2.2 Kết quả khảo sát thời gian lắp ráp sử dụng BFS với chuỗi ADN có độ dài
từ 25 đến 374, thời gian trung bình 8.1045 giây, độ chính xác 100% Xem thêm trong
Phụ lục 1
Sử dụng hàm polyfit trong MATLAB, ta có độ phức tạp thuật toán là 𝑂(𝑁2)
Trang 1514
2.3.3 Xây Dựng Đồ Thị dựa trên 𝒌_𝒎𝒆𝒓 Kép
Ở hướng đi trên, dù ta đã lắp ráp được thành chuỗi ban đầu nhưng ta bị thừa đi 1 kết quả, điều này làm cho chương trình phải tốn thời gian để giải ra kết quả sai này, do đó trong phần này tôi trình bày cách khắc phục bằng ý tưởng 𝑘_𝑚𝑒𝑟 kép, ý tưởng này đã được thực hiện trong phần mềm SPAdes do trường Đại học St Petersburg và trường Đại học San Diego, California thực hiện
Ta sẽ xây dựng đồ thị de Bruijn sao cho đồ thị này xuất ra càng ít kết quả càng tốt mà vẫn đảm bảo tính chính xác của kết quả Một hướng đi để giảm số lượng kết quả đó là giảm số lượng node cũng như được đi trong đồ thị
Định nghĩa 2.4: 𝑏𝑖𝑙𝑎𝑏𝑒𝑙(𝑎|𝑏) là một chuỗi kép tạo thành từ 2 chuỗi 𝑎 và 𝑏 có độ dài
bằng nhau Khi đó 𝑝𝑟𝑒(𝑏𝑖𝑙𝑎𝑏𝑒𝑙(𝑎|𝑏), 𝑟) = 𝑝𝑟𝑒 (𝑏𝑖𝑙𝑎𝑏𝑒𝑙 (𝑝𝑟𝑒(𝑎, 𝑟)|(𝑝𝑟𝑒(𝑏, 𝑟))))
và 𝑠𝑢𝑓(𝑏𝑖𝑙𝑎𝑏𝑒𝑙(𝑎|𝑏), 𝑡) = 𝑠𝑢𝑓 (𝑏𝑖𝑙𝑎𝑏𝑒𝑙 (𝑠𝑢𝑓(𝑎, 𝑡)|(𝑠𝑢𝑓(𝑏, 𝑡))))
Ví dụ: 𝑎 = 𝐴𝐴𝑇𝐺, 𝑏 = 𝑇𝐶𝐺𝐴𝐴𝑇, khi đó:
𝑏𝑖𝑙𝑎𝑏𝑒𝑙(𝑎|𝑏) = 𝐴𝐴𝑇𝐺|𝑇𝐶𝐺𝐴𝐴𝑇 𝑝𝑟𝑒(𝑏𝑖𝑙𝑎𝑏𝑒𝑙(𝑎|𝑏), 3) = 𝐴𝐴𝑇|𝑇𝐶𝐺 𝑠𝑢𝑓(𝑏𝑖𝑙𝑎𝑏𝑒𝑙(𝑎, 𝑏), 2) = 𝑇𝐺|𝐴𝑇
Định nghĩa 2.5: Cho chuỗi 𝑆, với 2 chuỗi 𝑡𝑖, 𝑡𝑗 ∈ 𝑘_𝑚𝑒𝑟(𝑆), 𝑖 ≠ 𝑗, 2 chuỗi này là một 𝑘_𝑚𝑒𝑟 kép của chuỗi 𝑆 với khoảng cách 𝑑 khi:
(i) |𝑡𝑖| = |𝑡𝑗|, ký hiệu |𝑎| là độ dài chuỗi 𝑎
(ii) Khoảng cách từ ký tự cuối cùng của chuỗi 𝑡𝑖 trong chuỗi 𝑆 đến ký tự cuối
cùng của chuỗi 𝑡𝑗 trong chuỗi 𝑆 bằng 𝑑
Ta ký hiệu (𝑘, 𝑑)_𝑚𝑒𝑟(𝑆) là tập tất cả các 𝑘_𝑚𝑒𝑟 kép của chuỗi 𝑆 với khoảng cách 𝑑, chuỗi 𝑥 ∈ (𝑘, 𝑑)_𝑚𝑒𝑟(𝑆) có dạng 𝑥 = 𝑏𝑖𝑙𝑎𝑏𝑒𝑙(𝑡𝑖|𝑡𝑗)
Ta quan sát lại 2 đáp án sau:
1 (TAA|GCC) (TAA|GGG)
Trang 16Hai tập (3,4)_𝑚𝑒𝑟(𝐾1) và (3,4)_𝑚𝑒𝑟(𝐾2) khác nhau, đồng thời số lượng các phần
tử trong tập (3,4)_𝑚𝑒𝑟(𝐾1) ít hơn tập 3_𝑚𝑒𝑟(𝐾1) Do đó ta hi vọng sẽ xây dựng đồ thị de Bruijn từ tập (3,4)_𝑚𝑒𝑟(𝐾1) với số node cũng như số đường đi ít hơn, số lượng đường đi ít hơn nhưng vẫn đảm bảo tính chính xác
Với mỗi 𝑥𝑖 ∈ (3,4)_𝑚𝑒𝑟(𝐾1), ta tách các thành phần 𝑝𝑟𝑒, 𝑠𝑢𝑓 như sau:
Bảng 2.4 Tách mỗi 𝑥𝑖 thành 𝑝𝑟𝑒(𝑥𝑖, 2) và 𝑠𝑢𝑓(𝑥𝑖, 2) bằng định nghĩa 2.4
𝑖 𝑝𝑟𝑒(𝑥𝑖, 2) → 𝑠𝑢𝑓(𝑥𝑖, 2) 𝑥𝑖
1 (TA|GC) (AA|CC) (TAA|GCC)
2 (AA|CC) (AT|CA) (AAT|CCA)
3 (AT|CA) (TG|AT) (ATG|CAT)
4 (TG|AT) (GC|TG) (TGC|ATG)
5 (GC|TG) (CC|GG) (GCC|TGG)
6 (CC|GG) (CA|GG) (CCA|GGG)
7 (CA|GG) (AT|GA) (CAT|GGA)
8 (AT|GA) (TG|AT) (ATG|GAT)
9 (TG|AT) (GG|TG) (TGG|ATG)
10 (GG|TG) (GG|GT) (GGG|TGT)
11 (GG|GT) (GA|TT) (GGA|GTT)