უგრძესი საერთო ქვემიმდევრობის ამოცანა

უგრძესი საერთო ქვემიმდევრობის (უსქ) ამოცანა — ამოცანა, რომელიც ეძებს მიმდევრობებს შორის უგრძეს საერთო ქვემიმდევრობას (ძირითადად ორ მიმდევრობაზე განიხილავენ). მაგალითად, განვიხილოთ ორი მიმდევრობა (ABCD) და (ACBAD). მათ 5 უსქ აქვთ, სიგრძით 2: (AB),(AC),(AD),(BD) და (CD); 2 უსქ, სიგრძით 3: (ABD) და (ACD); უფრო გრძელი კი არ გვაქვს. შესაბამისად, (ABC) და (ACD) არის უგრძესი საერთო ქვემიმდევრობა. ეს ამოცანა არის NP-რთული ამოცანა. ის დინამიური პროგრამირების პრინციპით პოლინომიურ დროში იხსნება. მოცემულია N {\displaystyle N} სიგრძეების მიმდევრობები n 1 , . . . , n N {\displaystyle n_{1},...,n_{N}} , სრული ძებნა შეამოწმებს თითოეულ მათგანის 2 n 1 {\displaystyle 2^{n_{1}}} ქვესიმრავლეს, რათა დაადგინოს, არიან თუ არა ისინი აგრეთვე დანარჩენი მიმდევრობების ქვემიმდევრობები; მოცემული ამოცანის დროის სირთულე იქნება O ( 2 n 1 ∑ i > 1 n i ) . {\displaystyle O\left(2^{n_{1}}\sum _{i>1}n_{i}\right).} n და m სიგრძის ორი მიმდევრობისთვის დროის სირთულე დინამიური პროგრამირებით იქნება O(n × m). ნებისმიერი რაოდენობის ქვემიმდევრობისთვის დინამიური პროგრამირების ამოხსნის დროის სირთულე იქნება O ( N ∏ i = 1 N n i ) . {\displaystyle O\left(N\prod _{i=1}^{N}n_{i}\right).} განვსაზღვროთ ორი მიმდევრობა შემდეგნაირად: X = ( x 1 x 2 ⋯ x m ) {\displaystyle X=(x_{1}x_{2}\cdots x_{m})} და Y = ( y 1 y 2 ⋯ y n ) {\displaystyle Y=(y_{1}y_{2}\cdots y_{n})} . X {\displaystyle X} -ის პრეფიქსები არიან X 1 , 2 , … , m {\displaystyle X_{1,2,\dots ,m}}  ; Y {\displaystyle Y} -ის კი Y 1 , 2 , … , n {\displaystyle Y_{1,2,\dots ,n}} . L C S ( X i , Y j ) {\displaystyle {\mathit {LCS}}(X_{i},Y_{j})} -ით აღვნიშნოთ უგრძესი საერთო ქვემიმდევრობა პრეფიქსებისთვის X i {\displaystyle X_{i}} და Y j {\displaystyle Y_{j}} . L C S ( X i , Y j ) = { ∅ თუ  i = 0  ან  j = 0 L C S ( X i − 1 , Y j − 1 ) + 1 თუ  i , j > 0  და  x i = y j max ⁡ { L C S ( X i , Y j − 1 ) , L C S ( X i − 1 , Y j ) } თუ  i , j > 0  და  x i ≠ y j . {\displaystyle {\mathit {LCS}}(X_{i},Y_{j})={\begin{cases}\emptyset &{\mbox{თუ }}i=0{\mbox{ ან }}j=0\\{\mathit {LCS}}(X_{i-1},Y_{j-1})+1&{\mbox{თუ }}i,j>0{\mbox{ და }}x_{i}=y_{j}\\\operatorname {\max } \{{\mathit {LCS}}(X_{i},Y_{j-1}),{\mathit {LCS}}(X_{i-1},Y_{j})\}&{\mbox{თუ }}i,j>0{\mbox{ და }}x_{i}\neq y_{j}.\end{cases}}} რათა ვიპოვოთ LCS X i {\displaystyle X_{i}} და Y j {\displaystyle Y_{j}} -თვის, შევადაროთ x i {\displaystyle x_{i}} და y j {\displaystyle y_{j}} . თუ ისინი ტოლია, მაშინ ქვემიმდევრობა L C S ( X i − 1 , Y j − 1 ) {\displaystyle {\mathit {LCS}}(X_{i-1},Y_{j-1})} -ზე ერთით მეტი იქნება . თუ ისინი ტოლი არ არიან, მაშინ L C S ( X i , Y j − 1 ) {\displaystyle {\mathit {LCS}}(X_{i},Y_{j-1})} , და L C S ( X i − 1 , Y j ) {\displaystyle {\mathit {LCS}}(X_{i-1},Y_{j})} შორის უგრძესის ტოლი გახდება. int dp[1000][1000]; int getLCS(vector<int>a,vector<int>b){ int n=a.size(); int m=b.size(); for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ if(a[i-1]==b[j-1]){ dp[i][j]=1+dp[i-1][j-1]; }else{ dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } }return dp[n][m]; } Dictionary of Algorithms and Data Structures: longest common subsequence A collection of implementations of the longest common subsequence in many programming languages Implementation of Longest Common Subsequence Algorithm in C Programming Language ↑ David Maier (1978). „The Complexity of Some Problems on Subsequences and Supersequences“. J. ACM. ACM Press. 25 (2): 322–336. doi:10.1145/322063.322075. ↑ Wagner, Robert; Fischer, Michael (January 1974). „The string-to-string correction problem“ (PDF). Journal of the ACM. 21 (1): 168–173. doi:10.1145/321796.321811. ციტირების თარიღი: 2018-05-03.