✨Bài toán chuỗi con chung dài nhất

Bài toán chuỗi con chung dài nhất

nhỏ|So sánh hai bản sửa đổi của một tệp ví dụ, dựa trên dãy con chung dài nhất của chúng (màu đen) Vấn đề chuỗi con chung dài nhất (tiếng anh: Longest common subsequence - LCS) là vấn đề trong việc tìm kiếm một chuỗi con chung dài nhất cho tất cả các chuỗi trong một bộ chuỗi (thường chỉ hai chuỗi). Nó khác với vấn đề về xâu con chung dài nhất ở chỗ: không giống như các xâu con, các chuỗi con không bắt buộc phải chiếm các vị trí liên tiếp trong các chuỗi ban đầu. Bài toán chuỗi con chung dài nhất là một trong những bài toán khoa học máy tính cổ điển, là cơ sở của các chương trình so sánh dữ liệu như diff, và có các ứng dụng trong ngôn ngữ học tính toán và tin sinh học. Nó cũng được sử dụng rộng rãi bởi các hệ thống quản lý phiên bản như Git để điều chỉnh nhiều thay đổi được thực hiện cho một bộ sưu tập tệp được kiểm soát sửa đổi.

Ví dụ, hãy xem xét các chuỗi (ABCD) và (ACBAD). Chúng có 5 chuỗi con chung có độ dài bằng 2: (AB), (AC), (AD), (BD) và (CD); 2 chuỗi con chung có độ dài bằng 3: (ABD) và (ACD); và không còn chuỗi con chung nào khác có độ dài lớn hơn nữa. Vì vậy (ABD) và (ACD) là hai dãy con chung dài nhất của hai chuỗi ban đầu.

Độ phức tạp

Đối với trường hợp tổng quát với số lượng chuỗi trình tự đầu vào là tùy ý, vấn đề là NP-khó. Khi số lượng chuỗi trình tự không đổi, bài toán có thể giải được trong thời gian đa thức bằng quy hoạch động.

Thuật toán cho hai chuỗi

Bài toán LCS có một cấu trúc con tối ưu: Có nghĩa là bài toán có thể được chia thành các bài toán con nhỏ hơn và đơn giản hơn, và các chính bài toán con cũng được chia thành các bài toán con đơn giản hơn, và cứ thế, cho đến khi, cuối cùng, nghiệm của bài toán trở nên đơn giản và dễ nhận thấy. LCS nói riêng có các bài toán con chồng chéo: các nghiệm cho các bài toán con cấp cao sẽ sử dụng lại các nghiệm cho các bài toán con cấp thấp hơn. Các vấn đề với hai thuộc tính này có thể giải quyết được bằng quy hoạch động, trong đó các nghiệm của bài toán con sẽ được lưu lại để xử lý lúc sau.

Tiền tố

Ta định nghĩa tiền tố Sn của S là chuỗi chứa n ký tự đầu tiên của S. Ví dụ: các tiền tố của S = (AGCA) là

: S0 = () : S1 = (A) : S2 = (AG) : S3 = (AGC) : S4 = (AGCA).

Gọi LCS(X, Y) là một hàm tính toán chuỗi con chung dài nhất cho XY. Một hàm như vậy có hai tính chất đặc biệt như sau:

Tính chất đầu tiên

LCS(X^A, Y^A) = LCS (X, Y)^A, cho tất cả các chuỗi X, Y và tất cả các ký hiệu A, trong đó dấu ^ biểu thị phép nối xâu. Điều này cho phép chúng ta đơn giản hóa việc tính toán LCS cho hai chuỗi kết thúc cùng một ký hiệu. Ví dụ: LCS ("BANANA", "ATANA") = LCS ("BANAN", "ATAN") ^ "A", Tiếp tục cho các ký hiệu chung còn lại, LCS ("BANANA", "ATANA") = LCS (" BAN "," AT ") ^" ANA".

Tính chất thứ hai

Nếu AB là hai ký hiệu riêng biệt (AB), thì LCS (X^A, Y^B) là một trong hai xâu có độ dài cực đại trong tập {LCS(X^A, Y), LCS(X, Y^B)}, cho tất cả các xâu X và Y.

Ví dụ: LCS ("ABCDEFG", "BCDGK") là xâu dài hơn của LCS ("ABCDEFG", "BCDG") và LCS ("ABCDEF", "BCDGK"); nếu cả hai có độ dài bằng nhau, ta có thể chọn tùy ý một trong những chuỗi thỏa mãn.

Định nghĩa hàm LCS

Cho hai chuỗi được xác định như sau: X=(x_1 x_2 \cdots x_m)Y=(y_1 y_2 \cdots yn). Các tiền tố của XX{1,2,\dots,m}; tiền tố của YY_{1,2,\dots,n}. Gọi \mathit{LCS}(X_i,Y_j) là đại diện cho tập hợp các chuỗi con chung dài nhất cho các tiền tố của X_iY_j. Tập hợp các chuỗi này được định nghĩa như sau.

: \mathit{LCS}(X_i,Yj)=\begin{cases} \empty & \mbox{if }i=0\mbox{ or }j=0 \ \mathit{LCS}(X{i-1},Y_{j-1}) \hat{} x_i & \mbox{if }i,j>0\mbox{ and }x_i=y_j \ \operatorname{\max}{\mathit{LCS}(Xi,Y{j-1}),\mathit{LCS}(X_{i-1},Y_j)} & \mbox{if }i,j>0\mbox{ and }x_i\ne y_j. \end{cases}

Làm việc với ví dụ

Để lấy ví dụ, ta sẽ tìm chuỗi con dài nhất chung cho hai xâu R = (GAC) và C = (AGCAT). Vì hàm LCS xét từ vị trí 0, nên để thuận tiện, ta sẽ xác định các tiền tố 0 là trống cho các chuỗi này: R0 = Ø; và C0 = Ø. Tất cả các tiền tố được đặt trong một bảng với C ở hàng đầu tiên và R ở cột đầu tiên:

Bảng này được sử dụng để lưu trữ trình tự tính LCS cho mỗi bước tính toán. Cột thứ hai và hàng thứ hai đã được điền bằng Ø, bởi vì khi một chuỗi trống được so sánh với một chuỗi không trống, chuỗi con chung dài nhất luôn là chuỗi trống.

LCS (R1, C1) được xác định bằng cách so sánh các phần tử đầu tiên trong mỗi chuỗi. G và A không giống nhau, vì vậy LCS này nhận (sử dụng tính chất thứ hai trên) chuỗi dài nhất trong hai chuỗi, LCS(R1, C0) và LCS (R0, C1). Theo bảng, cả hai đều trống, vì vậy LCS (R1, C1) cũng trống. Các mũi tên biểu thị chuỗi nhập vào: chuỗi đến từ ô ở trên, LCS (R0, C1) và chuỗi đến từ ô ở bên trái, LCS(R1, C0).

LCS (R1, C2) được xác định bằng cách so sánh G và G. Chúng khớp với nhau, nên G được nối vào chuỗi phía trên bên trái, LCS(R0, C1), là (Ø), cho (ØG), ta được (G).

Đối với LCS (R1, C3), G và C không khớp. Chuỗi trên trống; Chuỗi bên trái chứa một phần tử, (G). Chọn phần tử có độ dài dài nhất trong hai chuỗi này, ta được LCS (R1, C3) là (G). Mũi tên chỉ sang trái, vì đó là chuỗi dài nhất trong hai chuỗi.

Tương tự như vậy, LCS(R1, C4) và LCS(R1, C5) là (G).

Tương tự như vậy, ta hoàn thành hàng R2

Bảng hoàn thiện cuối cùng là

Mã cho giải pháp quy hoạch động

Tính độ dài của LCS

Hàm bên dưới nhận như chuỗi đầu vào X[1..m]Y[1..n], tính LCS giữa X[1..i]Y[1..j] cho tất cả 1 ≤ i ≤ m1 ≤ j ≤ n, và lưu trữ nó trong C[i,j]. C[m,n] sẽ chứa độ dài LCS của XY function LCSLength(X[1..m], Y[1..n]) C = array(0..m, 0..n) for i:= 0..m C[i, 0] = 0 for j:= 0..n C[0, j] = 0 for i:= 1..m for j:= 1..n if X[i] = Y[j] C[i, j]:= C[i-1, j-1] + 1 else C[i, j]:= max(C[i, j-1], C[i-1, j]) return C[m, n]

👁️ 130 | ⌚2025-09-16 22:46:25.022

QC Shopee
nhỏ|So sánh hai bản sửa đổi của một tệp ví dụ, dựa trên dãy con chung dài nhất của chúng (màu đen) **Vấn đề chuỗi con chung dài nhất** **(tiếng anh:** **Longest common subsequence -
nhỏ|So sánh hai bản sửa đổi của một tệp ví dụ, dựa trên dãy con chung dài nhất của chúng (màu đen) **Vấn đề chuỗi con chung dài nhất** **(tiếng anh:** **Longest common subsequence -
Đây là bài toán tìm một xâu (string) hoặc nhiều xâu là xâu con của hai hoặc nhiều xâu. Không nên nhầm lẫn giữa bài toán này với Bài toán chuỗi con chung dài nhất.
Đây là bài toán tìm một xâu (string) hoặc nhiều xâu là xâu con của hai hoặc nhiều xâu. Không nên nhầm lẫn giữa bài toán này với Bài toán chuỗi con chung dài nhất.
Bài viết này là **danh sách các thuật toán** cùng một mô tả ngắn cho mỗi thuật toán. ## Thuật toán tổ hợp ### Thuật toán tổ hợp tổng quát * Thuật toán Brent: tìm
Bài viết này là **danh sách các thuật toán** cùng một mô tả ngắn cho mỗi thuật toán. ## Thuật toán tổ hợp ### Thuật toán tổ hợp tổng quát * Thuật toán Brent: tìm
nhỏ|Nếu người bán hàng xuất phát từ điểm A, và nếu khoảng cách giữa hai điểm bất kì được biết thì đâu là đường đi ngắn nhất mà người bán hàng có thể thực hiện
nhỏ|Nếu người bán hàng xuất phát từ điểm A, và nếu khoảng cách giữa hai điểm bất kì được biết thì đâu là đường đi ngắn nhất mà người bán hàng có thể thực hiện
**Cấu trúc con tối ưu** (tiếng Anh: _Optimal substructure_) là một khái niệm quan trọng trong quy hoạch động. Nó đề cập đến tính chất của một bài toán trong đó một giải pháp tối
**Cấu trúc con tối ưu** (tiếng Anh: _Optimal substructure_) là một khái niệm quan trọng trong quy hoạch động. Nó đề cập đến tính chất của một bài toán trong đó một giải pháp tối
Trong các thuật toán của bộ môn khoa học máy tính, khái niệm **Khoảng cách Levenshtein** thể hiện khoảng cách khác biệt giữa 2 chuỗi ký tự. Khoảng cách Levenshtein giữa chuỗi S và chuỗi
Trong các thuật toán của bộ môn khoa học máy tính, khái niệm **Khoảng cách Levenshtein** thể hiện khoảng cách khác biệt giữa 2 chuỗi ký tự. Khoảng cách Levenshtein giữa chuỗi S và chuỗi
**Bài toán ngược** hay **bài toán nghịch đảo** (Inverse problem) trong khoa học là quá trình tính toán ra các nhân tố nhân quả (causal factors) dựa theo tập hợp các quan sát những đại
**Bài toán ngược** hay **bài toán nghịch đảo** (Inverse problem) trong khoa học là quá trình tính toán ra các nhân tố nhân quả (causal factors) dựa theo tập hợp các quan sát những đại
_Cuốn [[The Compendious Book on Calculation by Completion and Balancing_]] Từ _toán học_ có nghĩa là "khoa học, tri thức hoặc học tập". Ngày nay, thuật ngữ "toán học" chỉ một bộ phận cụ thể
_Cuốn [[The Compendious Book on Calculation by Completion and Balancing_]] Từ _toán học_ có nghĩa là "khoa học, tri thức hoặc học tập". Ngày nay, thuật ngữ "toán học" chỉ một bộ phận cụ thể
Bài này nói về từ điển các chủ đề trong toán học. ## 0-9 * -0 * 0 * 6174 ## A * AES * ARCH * ARMA * Ada Lovelace * Adrien-Marie Legendre *
Bài này nói về từ điển các chủ đề trong toán học. ## 0-9 * -0 * 0 * 6174 ## A * AES * ARCH * ARMA * Ada Lovelace * Adrien-Marie Legendre *
**Làn sóng Đài Loan** hay **Đài lưu** (tiếng Nhật: 台流), hay còn gọi đầy đủ là **làn sóng văn hóa Đài Loan**, là tên gọi bắt nguồn từ Nhật Bản để chỉ sự lan toả
**Làn sóng Đài Loan** hay **Đài lưu** (tiếng Nhật: 台流), hay còn gọi đầy đủ là **làn sóng văn hóa Đài Loan**, là tên gọi bắt nguồn từ Nhật Bản để chỉ sự lan toả
Trong khoa học máy tính, **thuật toán dòng dữ liệu** là thuật toán để xử lý các dòng dữ liệu trong đó dữ liệu vào được cung cấp dưới dạng một dãy các phần tử,
Trong khoa học máy tính, **thuật toán dòng dữ liệu** là thuật toán để xử lý các dòng dữ liệu trong đó dữ liệu vào được cung cấp dưới dạng một dãy các phần tử,
Combo 2 Cuốn Sách Nuôi Dạy Con Hoàn Hảo Cho Các Bà Mẹ: Khí Chất Single Mom + Để Con Được Ốm (Tái Bản 2018) / Sách Làm Cha Mẹ Tuyệt Vời Nhất (Tặng Kèm
Combo 2 Cuốn Sách Nuôi Dạy Con Hoàn Hảo Cho Các Bà Mẹ: Khí Chất Single Mom + Để Con Được Ốm (Tái Bản 2018) / Sách Làm Cha Mẹ Tuyệt Vời Nhất (Tặng Kèm
Combo 2 Cuốn Sách Nuôi Dạy Con Hoàn Hảo Cho Các Bà Mẹ: Khí Chất Single Mom + Để Con Được Ốm (Tái Bản 2018) / Sách Làm Cha Mẹ Tuyệt Vời Nhất (Tặng Kèm
**Biểu tình bài Nhật tại Trung Quốc năm 2012** là một loạt các cuộc biểu tình bài Nhật Bản được tổ chức ở các thành phố lớn tại Trung Quốc và Đài Loan trong khoảng
**Biểu tình bài Nhật tại Trung Quốc năm 2012** là một loạt các cuộc biểu tình bài Nhật Bản được tổ chức ở các thành phố lớn tại Trung Quốc và Đài Loan trong khoảng
phải|nhỏ|[[Lưu đồ thuật toán (thuật toán Euclid) để tính ước số chung lớn nhất (ưcln) của hai số _a_ và _b_ ở các vị trí có tên A và B. Thuật toán tiến hành bằng
phải|nhỏ|[[Lưu đồ thuật toán (thuật toán Euclid) để tính ước số chung lớn nhất (ưcln) của hai số _a_ và _b_ ở các vị trí có tên A và B. Thuật toán tiến hành bằng
Một cặp bánh chưng vuông chưa luộc được gói bằng khuôn với 4 lá, trong đó có 2 lá bên trong với mặt lá màu xanh thẫm quay vào áp với bề mặt gạo để
Một cặp bánh chưng vuông chưa luộc được gói bằng khuôn với 4 lá, trong đó có 2 lá bên trong với mặt lá màu xanh thẫm quay vào áp với bề mặt gạo để
**Nhật thực** () xảy ra khi Mặt Trăng đi qua giữa Trái Đất và Mặt Trời trên cùng một đường thẳng và quan sát từ Trái Đất, lúc đó Mặt Trăng che khuất hoàn toàn
**Nhật thực** () xảy ra khi Mặt Trăng đi qua giữa Trái Đất và Mặt Trời trên cùng một đường thẳng và quan sát từ Trái Đất, lúc đó Mặt Trăng che khuất hoàn toàn
thumb|Bản vẽ của một nghệ sĩ về một [[tiểu hành tinh cách nhau vài km va chạm vào Trái Đất. Một tác động như vậy có thể giải phóng năng lượng tương đương với vài
thumb|Bản vẽ của một nghệ sĩ về một [[tiểu hành tinh cách nhau vài km va chạm vào Trái Đất. Một tác động như vậy có thể giải phóng năng lượng tương đương với vài
Danh sách các vấn đề mở trong toán học ## Danh sách các bài toán mở trong toán học nói chung Nhiều nha toán học và tổ chức đã xuất bản danh sách cái bài
Danh sách các vấn đề mở trong toán học ## Danh sách các bài toán mở trong toán học nói chung Nhiều nha toán học và tổ chức đã xuất bản danh sách cái bài
BỘ SÁCH ĐẦU TIÊN VỀ NHÂN CHUỖI CỬA HÀNG TẠI VIỆT NAM - GIÚP BẠN XÂY DỰNG CHUỖI BÁN LẺ, CÀ PHÊ, NHÀ HÀNG THÀNH CÔNG BỘ SÁCH GỒM 3 QUYỂN: Quyển sách sẽ mang
BỘ SÁCH ĐẦU TIÊN VỀ NHÂN CHUỖI CỬA HÀNG TẠI VIỆT NAM - GIÚP BẠN XÂY DỰNG CHUỖI BÁN LẺ, CÀ PHÊ, NHÀ HÀNG THÀNH CÔNG BỘ SÁCH GỒM 3 QUYỂN: Quyển sách sẽ mang
**Côn trùng** hay còn gọi là **sâu bọ**, là một lớp sinh vật thuộc về ngành động vật không xương sống, chúng có bộ xương ngoài làm bằng kitin. Cơ thể chúng có ba phần
**Côn trùng** hay còn gọi là **sâu bọ**, là một lớp sinh vật thuộc về ngành động vật không xương sống, chúng có bộ xương ngoài làm bằng kitin. Cơ thể chúng có ba phần
**Chiến tranh Nhật Bản – Triều Tiên**, còn gọi là **Chiến tranh Triều - Nhật** (hangul: 조일전쟁, hanja: 朝日戰爭, _Joil jeonjaeng_) hay **Chiến dịch Văn Lộc - Khánh Trường** (kanji: 文禄・慶長の役, hiragana: ぶんろく・けいちょうのえき, _Bunroku・Keichō no
**Chiến tranh Nhật Bản – Triều Tiên**, còn gọi là **Chiến tranh Triều - Nhật** (hangul: 조일전쟁, hanja: 朝日戰爭, _Joil jeonjaeng_) hay **Chiến dịch Văn Lộc - Khánh Trường** (kanji: 文禄・慶長の役, hiragana: ぶんろく・けいちょうのえき, _Bunroku・Keichō no
"**Poker Face**" là một ca khúc nhạc pop-điện tử của nữ ca sĩ-nhạc sĩ người Mỹ Lady Gaga trích từ album đầu tay của cô mang tên _The Fame_ (2008). Bài hát do RedOne sản
"**Poker Face**" là một ca khúc nhạc pop-điện tử của nữ ca sĩ-nhạc sĩ người Mỹ Lady Gaga trích từ album đầu tay của cô mang tên _The Fame_ (2008). Bài hát do RedOne sản