青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 200, comments - 8, trackbacks - 0, articles - 0

  程序員編程藝術第十一章:最長公共子序列(LCS)問題

0、前言

    程序員編程藝術系列重新開始創作了(前十章,請參考程序員編程藝術第一~十章集錦與總結)。回顧之前的前十章,有些代碼是值得商榷的,因當時的代碼只顧闡述算法的原理或思想,所以,很多的與代碼規范相關的問題都未能做到完美。日后,會著力修繕之。

    搜遍網上,講解這個LCS問題的文章不計其數,但大多給讀者一種并不友好的感覺,稍感晦澀,且代碼也不夠清晰。本文力圖避免此些情況。力保通俗,闡述詳盡。同時,經典算法研究系列的第三章(三、dynamic programming)也論述了此LCS問題。有任何問題,歡迎不吝賜教。

第一節、問題描述

    什么是最長公共子序列呢?好比一個數列 S,如果分別是兩個或多個已知數列的子序列,且是所有符合此條件序列中最長的,則S 稱為已知序列的最長公共子序列。

    舉個例子,如:有兩條隨機序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,則它們的最長公共子序列便是:4 5 5。

    注意最長公共子串(Longest CommonSubstring)和最長公共子序列(LongestCommon Subsequence, LCS)的區別:子串(Substring)是串的一個連續的部分,子序列(Subsequence)則是從不改變序列的順序,而從序列中去掉任意的元素而獲得的新序列;更簡略地說,前者(子串)的字符的位置必須連續,后者(子序列LCS)則不必。比如字符串acdfg同akdfc的最長公共子串為df,而他們的最長公共子序列是adf。LCS可以使用動態規劃法解決。下文具體描述。

第二節、LCS問題的解決思路

  • 窮舉法   

    解最長公共子序列問題時最容易想到的算法是窮舉搜索法,即對X的每一個子序列,檢查它是否也是Y的子序列,從而確定它是否為X和Y的公共子序列,并且在檢查過程中選出最長的公共子序列。X和Y的所有子序列都檢查過后即可求出X和Y的最長公共子序列。X的一個子序列相應于下標序列{1, 2, …, m}的一個子序列,因此,X共有2m個不同子序列(Y亦如此,如為2^n),從而窮舉搜索法需要指數時間(2^m * 2^n)。

  • 動態規劃算法

    事實上,最長公共子序列問題也有最優子結構性質。

記:

Xi=﹤x1,⋯,xi﹥即X序列的前i個字符 (1≤i≤m)(前綴)

Yj=﹤y1,⋯,yj﹥即Y序列的前j個字符 (1≤j≤n)(前綴)

假定Z=﹤z1,⋯,zk﹥∈LCS(X , Y)。

  • xm=yn(最后一個字符相同),則不難用反證法證明:該字符必是X與Y的任一最長公共子序列Z(設長度為k)的最后一個字符,即有zk = xm = yn 且顯然有Zk-1∈LCS(Xm-1 , Yn-1)即Z的前綴Zk-1是Xm-1與Yn-1的最長公共子序列。此時,問題化歸成求Xm-1與Yn-1的LCS(LCS(X , Y)的長度等于LCS(Xm-1 , Yn-1)的長度加1)。

  • xm≠yn,則亦不難用反證法證明:要么Z∈LCS(Xm-1, Y),要么Z∈LCS(X , Yn-1)。由于zk≠xm與zk≠yn其中至少有一個必成立,若zk≠xm則有Z∈LCS(Xm-1 , Y),類似的,若zk≠yn 則有Z∈LCS(X , Yn-1)。此時,問題化歸成求Xm-1與Y的LCS及X與Yn-1的LCS。LCS(X , Y)的長度為:max{LCS(Xm-1 , Y)的長度, LCS(X , Yn-1)的長度}。

    由于上述當xm≠yn的情況中,求LCS(Xm-1 , Y)的長度與LCS(X , Yn-1)的長度,這兩個問題不是相互獨立的:兩者都需要求LCS(Xm-1,Yn-1)的長度。另外兩個序列的LCS中包含了兩個序列的前綴的LCS,故問題具有最優子結構性質考慮用動態規劃法。

    也就是說,解決這個LCS問題,你要求三個方面的東西:1、LCS(Xm-1,Yn-1)+1;2、LCS(Xm-1,Y),LCS(X,Yn-1);3、max{LCS(Xm-1,Y),LCS(X,Yn-1)}

    行文至此,其實對這個LCS的動態規劃解法已敘述殆盡,不過,為了成書的某種必要性,下面,我試著再多加詳細闡述這個問題。

第三節、動態規劃算法解LCS問題

3.1、最長公共子序列的結構

    最長公共子序列的結構有如下表示:

    設序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一個最長公共子序列Z=<z1, z2, …, zk>,則:

  1. 若xm=yn,則zk=xm=yn且Zk-1是Xm-1和Yn-1的最長公共子序列;
  2. 若xm≠yn且zk≠xm ,則Z是Xm-1和Y的最長公共子序列;
  3. 若xm≠yn且zk≠yn ,則Z是X和Yn-1的最長公共子序列。

    其中Xm-1=<x1, x2, …, xm-1>,Yn-1=<y1, y2, …, yn-1>,Zk-1=<z1, z2, …, zk-1>。

3、2.子問題的遞歸結構

    由最長公共子序列問題的最優子結構性質可知,要找出X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最長公共子序列,可按以下方式遞歸地進行:當xm=yn時,找出Xm-1和Yn-1的最長公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一個最長公共子序列。當xm≠yn時,必須解兩個子問題,即找出Xm-1和Y的一個最長公共子序列及X和Yn-1的一個最長公共子序列。這兩個公共子序列中較長者即為X和Y的一個最長公共子序列。

    由此遞歸結構容易看到最長公共子序列問題具有子問題重疊性質。例如,在計算X和Y的最長公共子序列時,可能要計算出X和Yn-1及Xm-1和Y的最長公共子序列。而這兩個子問題都包含一個公共子問題,即計算Xm-1和Yn-1的最長公共子序列。

    與矩陣連乘積最優計算次序問題類似,我們來建立子問題的最優值的遞歸關系。用c[i,j]記錄序列Xi和Yj的最長公共子序列的長度。其中Xi=<x1, x2, …, xi>,Yj=<y1, y2, …, yj>。當i=0或j=0時,空序列是Xi和Yj的最長公共子序列,故c[i,j]=0。其他情況下,由定理可建立遞歸關系如下:

3、3.計算最優值

    直接利用上節節末的遞歸式,我們將很容易就能寫出一個計算c[i,j]的遞歸算法,但其計算時間是隨輸入長度指數增長的。由于在所考慮的子問題空間中,總共只有θ(m*n)個不同的子問題,因此,用動態規劃算法自底向上地計算最優值能提高算法的效率。

    計算最長公共子序列長度的動態規劃算法LCS_LENGTH(X,Y)以序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>作為輸入。輸出兩個數組c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存儲Xi與Yj的最長公共子序列的長度,b[i,j]記錄指示c[i,j]的值是由哪一個子問題的解達到的,這在構造最長公共子序列時要用到。最后,X和Y的最長公共子序列的長度記錄于c[m,n]中。

  1. Procedure LCS_LENGTH(X,Y);  
  2. begin  
  3.   m:=length[X];  
  4.   n:=length[Y];  
  5.   for i:=1 to m do c[i,0]:=0;  
  6.   for j:=1 to n do c[0,j]:=0;  
  7.   for i:=1 to m do  
  8.     for j:=1 to n do  
  9.       if x[i]=y[j] then  
  10.         begin  
  11.           c[i,j]:=c[i-1,j-1]+1;  
  12.           b[i,j]:="↖";  
  13.         end  
  14.       else if c[i-1,j]≥c[i,j-1] then  
  15.         begin  
  16.           c[i,j]:=c[i-1,j];  
  17.           b[i,j]:="↑";  
  18.         end  
  19.       else  
  20.         begin  
  21.           c[i,j]:=c[i,j-1];  
  22.           b[i,j]:="←"  
  23.         end;  
  24.   return(c,b);  
  25. end;   

    由算法LCS_LENGTH計算得到的數組b可用于快速構造序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最長公共子序列。首先從b[m,n]開始,沿著其中的箭頭所指的方向在數組b中搜索。

  • 當b[i,j]中遇到"↖"時(意味著xi=yi是LCS的一個元素),表示Xi與Yj的最長公共子序列是由Xi-1與Yj-1的最長公共子序列在尾部加上xi得到的子序列;
  • 當b[i,j]中遇到"↑"時,表示Xi與Yj的最長公共子序列和Xi-1與Yj的最長公共子序列相同;
  • 當b[i,j]中遇到"←"時,表示Xi與Yj的最長公共子序列和Xi與Yj-1的最長公共子序列相同。

    這種方法是按照反序來找LCS的每一個元素的。由于每個數組單元的計算耗費Ο(1)時間,算法LCS_LENGTH耗時Ο(mn)。

3、4.構造最長公共子序列

    下面的算法LCS(b,X,i,j)實現根據b的內容打印出Xi與Yj的最長公共子序列。通過算法的調用LCS(b,X,length[X],length[Y]),便可打印出序列X和Y的最長公共子序列。

  1. Procedure LCS(b,X,i,j);  
  2. begin  
  3.   if i=0 or j=0 then return;  
  4.   if b[i,j]="↖" then  
  5.     begin  
  6.       LCS(b,X,i-1,j-1);  
  7.       print(x[i]); {打印x[i]}  
  8.     end  
  9.   else if b[i,j]="↑" then LCS(b,X,i-1,j)   
  10.                       else LCS(b,X,i,j-1);  
  11. end;   

在算法LCS中,每一次的遞歸調用使i或j減1,因此算法的計算時間為O(m+n)。

例如,設所給的兩個序列為X=<A,B,C,B,D,A,B>和Y=<B,D,C,A,B,A>。由算法LCS_LENGTH和LCS計算出的結果如下圖所示:


 我來說明下此圖(參考算法導論)。在序列X={A,B,C,B,D,A,B}和 Y={B,D,C,A,B,A}上,由LCS_LENGTH計算出的表c和b。第i行和第j列中的方塊包含了c[i,j]的值以及指向b[i,j]的箭頭。在c[7,6]的項4,表的右下角為X和Y的一個LCS<B,C,B,A>的長度。對于i,j>0,項c[i,j]僅依賴于是否有xi=yi,及項c[i-1,j]和c[i,j-1]的值,這幾個項都在c[i,j]之前計算。為了重構一個LCS的元素,從右下角開始跟蹤b[i,j]的箭頭即可,這條路徑標示為陰影,這條路徑上的每一個“↖”對應于一個使xi=yi為一個LCS的成員的項(高亮標示)。

    所以根據上述圖所示的結果,程序將最終輸出:“B C B A”。

3、5.算法的改進

    對于一個具體問題,按照一般的算法設計策略設計出的算法,往往在算法的時間和空間需求上還可以改進。這種改進,通常是利用具體問題的一些特殊性。

    例如,在算法LCS_LENGTH和LCS中,可進一步將數組b省去。事實上,數組元素c[i,j]的值僅由c[i-1,j-1],c[i-1,j]和c[i,j-1]三個值之一確定,而數組元素b[i,j]也只是用來指示c[i,j]究竟由哪個值確定。因此,在算法LCS中,我們可以不借助于數組b而借助于數組c本身臨時判斷c[i,j]的值是由c[i-1,j-1],c[i-1,j]和c[i,j-1]中哪一個數值元素所確定,代價是Ο(1)時間。既然b對于算法LCS不是必要的,那么算法LCS_LENGTH便不必保存它。這一來,可節省θ(mn)的空間,而LCS_LENGTH和LCS所需要的時間分別仍然是Ο(mn)和Ο(m+n)。不過,由于數組c仍需要Ο(mn)的空間,因此這里所作的改進,只是在空間復雜性的常數因子上的改進。

    另外,如果只需要計算最長公共子序列的長度,則算法的空間需求還可大大減少。事實上,在計算c[i,j]時,只用到數組c的第i行和第i-1行。因此,只要用2行的數組空間就可以計算出最長公共子序列的長度。更進一步的分析還可將空間需求減至min(m, n)。

第四節、編碼實現LCS問題

    動態規劃的一個計算最長公共子序列的方法如下,以兩個序列 XY 為例子:

設有二維數組 f[i][j] 表示 X 的 i 位和 Y 的 j 位之前的最長公共子序列的長度,則有:

f[1][1] = same(1,1)
f[i][j] = max{f[i − 1][j − 1] +same(i,j)f[i − 1][j] ,f[i][j − 1]}

其中,same(a,b)當 X 的第 a 位與 Y 的第 b 位完全相同時為“1”,否則為“0”。

此時,f[i][j]中最大的數便是 X 和 Y 的最長公共子序列的長度,依據該數組回溯,便可找出最長公共子序列。

該算法的空間、時間復雜度均為O(n2),經過優化后,空間復雜度可為O(n),時間復雜度為O(nlogn)。

以下是此算法的java代碼:

  1.    
  2. import java.util.Random;  
  3.    
  4. public class LCS{  
  5.     public static void main(String[] args){  
  6.    
  7.         //設置字符串長度  
  8.         int substringLength1 = 20;  
  9.         int substringLength2 = 20;  //具體大小可自行設置  
  10.    
  11.         // 隨機生成字符串  
  12.         String x = GetRandomStrings(substringLength1);  
  13.         String y = GetRandomStrings(substringLength2);  
  14.    
  15.         Long startTime = System.nanoTime();  
  16.         // 構造二維數組記錄子問題x[i]和y[i]的LCS的長度  
  17.         int[][] opt = new int[substringLength1 + 1][substringLength2 + 1];  
  18.    
  19.         // 動態規劃計算所有子問題  
  20.         for (int i = substringLength1 - 1; i >= 0; i--){  
  21.             for (int j = substringLength2 - 1; j >= 0; j--){  
  22.                 if (x.charAt(i) == y.charAt(j))  
  23.                     opt[i][j] = opt[i + 1][j + 1] + 1;                                 //參考上文我給的公式。  
  24.                 else  
  25.                     opt[i][j] = Math.max(opt[i + 1][j], opt[i][j + 1]);        //參考上文我給的公式。  
  26.             }  
  27.         }  
  28.    
  29.         -------------------------------------------------------------------------------------  
  30.    
  31.         理解上段,參考上文我給的公式:  
  32.    
  33.         根據上述結論,可得到以下公式,  
  34.    
  35.         如果我們記字符串Xi和Yj的LCS的長度為c[i,j],我們可以遞歸地求c[i,j]:  
  36.    
  37.                   /      0                               if i<0 or j<0  
  38.         c[i,j]=          c[i-1,j-1]+1                    if i,j>=0 and xi=xj  
  39.                  /       max(c[i,j-1],c[i-1,j]           if i,j>=0 and xi≠xj  
  40.    
  41.         -------------------------------------------------------------------------------------  
  42.    
  43.         System.out.println("substring1:"+x);  
  44.         System.out.println("substring2:"+y);  
  45.         System.out.print("LCS:");  
  46.    
  47.         int i = 0, j = 0;  
  48.         while (i < substringLength1 && j < substringLength2){  
  49.             if (x.charAt(i) == y.charAt(j)){  
  50.                 System.out.print(x.charAt(i));  
  51.                 i++;  
  52.                 j++;  
  53.             } else if (opt[i + 1][j] >= opt[i][j + 1])  
  54.                 i++;  
  55.             else  
  56.                 j++;  
  57.         }  
  58.         Long endTime = System.nanoTime();  
  59.         System.out.println(" Totle time is " + (endTime - startTime) + " ns");  
  60.     }  
  61.    
  62.     //取得定長隨機字符串  
  63.     public static String GetRandomStrings(int length){  
  64.         StringBuffer buffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz");  
  65.         StringBuffer sb = new StringBuffer();  
  66.         Random r = new Random();  
  67.         int range = buffer.length();  
  68.         for (int i = 0; i < length; i++){  
  69.             sb.append(buffer.charAt(r.nextInt(range)));  
  70.         }  
  71.         return sb.toString();  
  72.     }  
  73. }  

第五節、改進的算法

    下面咱們來了解一種不同于動態規劃法的一種新的求解最長公共子序列問題的方法,該算法主要是把求解公共字符串問題轉化為求解矩陣L(p,m)的問題,在利用定理求解矩陣的元素過程中(1)while(i<k),L(k,i)=null,
                  (2)while(L(k,i)=k),L(k,i+1)=L(k,i+2)=…L(k,m)=k;

    求出每列元素,一直到發現第p+1 行都為null 時退出循環,得出矩陣L(k,m)后,B[L(1,m-p+1)]B[L(2,m-p+2)]…B[L(p,m)]即為A 和B 的LCS,其中p 為LCS 的長度。

6.1 主要定義及定理

  • 定義 1 子序列(Subsequence):給定字符串A=A[1]A[2]…A[m],(A[i]是A 的第i 個字母,A[i]∈字符集Σ,l<= i<m = A , A 表示字符串A 的長度),字符串B 是A 的子序列是指B=A[ 1 i ]A[ 2 i ]…A[ k i ],其中1 i < 2 i <…< k i 且k<=m.
  • 定義2 公共子序列(Common Subsequence):給定字符串A、B、C,C 稱為A 和B 的公共子序列是指C 既是A 的子序列,又是B 的子序列。
  • 定義3 最長公共子序列(Longest Common Subsequence 簡稱LCS):給定字符串A、B、C,C 稱為A 和B 的最長公共子序列是指C 是A 和B 的公共子序列,且對于A 和B 的任意公共子序列D,都有D <= C 。給定字符串A 和B,A =m,B =n,不妨設m<=n,LCS 問題就是要求出A 和B 的LCS。
  • 定義4 給定字符串A=A[1]A[2]…A[m]和字符串B=B[1]B[2]…[n],A( 1:i)表示A 的連續子序列A[1]A[2]…A[i],同樣B(1:j)表示B 的連續子序列B[1]B[2]…[j]。Li(k)表示所有與字符串A(1:i) 有長度為k 的LCS 的字符串B(l:j) 中j 的最小值。用公式表示就是Li(k)=Minj(LCS(A(1:i),B(l:j))=k) [3]。


    定理1 ∀ i∈[1,m],有Li(l)<Li(2)<Li(3)<…<Li(m) .
    定理2 ∀i∈[l,m-1],∀k∈[l,m],有i 1 L + (k)<= i L (k).
    定理3 ∀ i∈[l,m-1], ∀ k∈[l,m-l],有i L (k)< i 1 L + (k+l).
    以上三個定理都不考慮Li(k)無定義的情況。
    定理4[3] i 1 L + (k)如果存在,那么它的取值必為: i 1 L + (k)=Min(j, i L (k))。這里j 是滿足以下條件的最小整數:A[i+l]=B[j]且j> i L (k-1)。


     矩陣中元素L(k,i)=Li(k),這里(1<i<=m,1<k<=m),null 表示L(k,i)不存在。當i<k 時,顯然L(k,i)不存在。
        設p=Maxk(L(k , m) ≠ null) , 可以證明L 矩陣中L(p,m) 所在的對角線,L(1,m-p+1),L(2,m-p+2)…L(p-1,m-1),L(p,m) 所對應的子序列B[L(1,m-p+1)]B[L(2,m-p+2)]…B[L(p,m)]即為A 和B 的LCS,p 為該LCS 的長度。這樣,LCS 問題的求解就轉化為對m m L × 矩陣的求解。

    6.2 算法思想

        根據定理,第一步求出第一行元素,L(1,1),L(1,2),…L(1,m),第二步求第二行,一直到發現第p+1 行都為null 為止。在計算過程中遇到i<k 時,L(k,i)=null, 及L(k,i)=k時,L(k,i+1)=L(k,i+2)=…L(k,m)=k。這樣,計算每行的時間復雜度為O(n),則整個時間復雜度為O(pn)。在求L 矩陣的過程中不用存儲整個矩陣,只需存儲當前行和上一行即可。空間復雜度為O(m+n)。

        下面給出一個例子來說明:給定字符串A 和B,A=acdabbc,B=cddbacaba,(m= A =7,n= B =9)。按照定理給出的遞推公式,求出A 和B 的L 矩陣如圖2,其中的$表示NULL。

    則A 和B 的LCS 為B[1]B[2]B[4]B[6]=cdbc,LCS 的長度為4。

    6.3 算法偽代碼
    算法 L(A,B,L)
    輸入 長度分別為m,n 的字符串A,B
    輸出 A,B 的最長公共子序列LCS

    1. L(A,B,L){//字符串A,B,所求矩陣L  
    2.   for(k=1;k<=m;k++){ //m 為A 的長度  
    3.     for(i=1;i<=m;i++){  
    4.       if(i<k) L[k][i]=N;//i<k 時,L(k,i)=null,N 代表無窮大  
    5.       if(L[k][i]==k)//L(k,i)=k 時,L(k,i+1)=L(k,i+2)=…L(k,m)=k  
    6.       for(l=i+1;l<=m;l++)  
    7.        { L[k][l]=k;  
    8.          Break;}  
    9.       for(j=1;j<=n;j++){//定理4 的實現  
    10.        if(A[i+1]==B[j]&&j>L[k-1][i]){  
    11.         L[k][i+1]=(j<L[k][i]?j:L[k][i]);  
    12.         break;  
    13.       }  
    14.       if(L[k][i+1]==0)  
    15.         L[k][i]=N;  
    16.      }  
    17.      if(L[k][m]==N)  
    18.       {p=k-1;break;}  
    19.   }  
    20.   p=k-1;  
    21. }  

    6.4 結語
        本節主要描述區別于動態規劃法的一種新的求解最長公共子序列問題的方法,在不影響精確度的前提下,提高序列匹配的速度,根據定理i 1 L + (k)=Min(j, i L (k))得出矩陣,在求解矩陣的過程中對最耗時的L(p,m)進行條件約束優化。我們在Intel(R) Core(TM)2 Quad 雙核處理器、1G 內存,軟件環境:windows xp 下試驗結果證明,本文算法與其他經典的比對算法相比,不但能夠取得準確的結果,而且速度有了較大的提高(本節參考了劉佳梅女士的論文)。

        若有任何問題,懇請不吝指正。謝謝各位。完。



 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美刺激性大交免费视频 | 欧美国产专区| 久久久久久国产精品一区| 一区二区三区高清在线观看| 亚洲精品一区久久久久久| 亚洲精品视频在线播放| 99riav1国产精品视频| 日韩亚洲精品电影| 99视频一区二区| 香蕉av福利精品导航| 性欧美1819性猛交| 欧美va亚洲va日韩∨a综合色| 欧美第一黄色网| 亚洲伦理网站| 欧美淫片网站| 欧美黄色日本| 国产精品日日摸夜夜添夜夜av | 亚洲欧美日韩国产综合精品二区| 亚洲综合不卡| 久热精品在线视频| 亚洲一区二区三区中文字幕在线| 亚洲日本理论电影| 亚洲国产精品999| 亚洲一区二区av电影| 久久免费少妇高潮久久精品99| 欧美精品亚洲精品| 午夜精品99久久免费| 久久一区二区三区四区| 欧美日韩一区二区在线播放| 国产乱码精品1区2区3区| 精品成人在线| 欧美一级精品大片| 亚洲人成免费| 99国产精品国产精品久久| 国产精品观看| 亚洲人成网在线播放| 午夜欧美大片免费观看| 亚洲国产你懂的| 欧美中在线观看| 国产精品久久久久国产精品日日| 亚洲精品久久在线| 免费av成人在线| 久久成人羞羞网站| 国产精品一卡二卡| 亚洲一二三四久久| 亚洲人成网站在线观看播放| 久久久久久久综合狠狠综合| 国产精品毛片大码女人| 亚洲精品中文字| 欧美三日本三级少妇三2023| 激情久久久久久| 午夜国产精品视频免费体验区| 欧美a级片网站| 久久精品国产视频| 国产一区二区视频在线观看| 午夜在线视频一区二区区别 | 亚洲美女黄网| 欧美精品福利视频| 日韩五码在线| 亚洲精品免费一区二区三区| 欧美chengren| 一区二区三区免费观看| 亚洲人成小说网站色在线| 欧美激情导航| 日韩一区二区精品| 亚洲精品女av网站| 欧美成人高清| 在线亚洲欧美视频| 宅男66日本亚洲欧美视频| 欧美日韩在线视频一区| 亚洲一区二区三区久久| 99精品久久久| 国产精品女人网站| 欧美有码视频| 久久久久网站| 亚洲国产婷婷香蕉久久久久久99| 欧美福利视频在线| 欧美高清hd18日本| 亚洲精品久久久蜜桃| 99精品视频免费观看视频| 国产精品久久久99| 麻豆久久婷婷| 欧美日韩精品一区视频 | 国内激情久久| 亚洲精品日韩久久| 国产欧美日韩精品在线| 久久久国产精品一区| 久久综合伊人77777| 亚洲美女福利视频网站| 亚洲视频第一页| 蜜月aⅴ免费一区二区三区| 欧美精品一区在线| 中文一区字幕| 欧美一区二区三区四区高清 | 欧美激情一区二区三区在线视频| 99精品视频免费观看视频| 亚洲天堂成人| 亚洲欧洲一区二区三区久久| 亚洲最新视频在线| 国产日韩欧美亚洲| 91久久香蕉国产日韩欧美9色| 欧美日韩系列| 免费一区二区三区| 国产精品久久国产精品99gif| 免费观看在线综合| 国产精品欧美日韩| 亚洲激情一区| 亚洲成人资源网| 午夜精品影院在线观看| 在线视频欧美日韩| 久久午夜精品| 久久久999精品视频| 欧美精品成人一区二区在线观看| 久久国产精品久久久久久久久久| 欧美日韩国产美| 亚洲国产精品精华液2区45| 国产美女一区二区| 亚洲无线观看| aaa亚洲精品一二三区| 久久久久久9| 久久久久9999亚洲精品| 国产精品久久久久秋霞鲁丝 | 国产欧美日韩91| 亚洲视频在线播放| 亚洲毛片在线看| 麻豆九一精品爱看视频在线观看免费| 亚洲自拍电影| 国产精品久久久久aaaa九色| 亚洲精品一区二区在线| 136国产福利精品导航| 久久精品麻豆| 久久一二三区| 精品88久久久久88久久久| 亚洲男人天堂2024| 亚洲天堂黄色| 国产精品av久久久久久麻豆网| 亚洲毛片一区二区| 99re6这里只有精品视频在线观看| 久久gogo国模啪啪人体图| 久久精品久久99精品久久| 国产精品午夜电影| 亚洲自拍偷拍视频| 欧美在线三级| 国产在线高清精品| 久久国产精品99国产精| 免费看亚洲片| 亚洲精品黄色| 欧美日韩国产影片| 一区二区三区视频免费在线观看| 亚洲一区二区在线播放| 欧美丝袜一区二区| 亚洲影音一区| 欧美日韩另类字幕中文| 免播放器亚洲一区| 国产主播一区二区三区| 欧美一级一区| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美午夜精品久久久久免费视| 日韩一区二区精品葵司在线| 亚洲女女做受ⅹxx高潮| 国产一区二区三区黄视频| 久久人人爽人人爽| 亚洲激情av| 亚洲女人天堂成人av在线| 国产日韩亚洲欧美综合| 久久在线91| 中文国产一区| 模特精品在线| 亚洲欧美日韩国产中文| 好看的亚洲午夜视频在线| 免费不卡欧美自拍视频| 亚洲天堂免费观看| 免费在线国产精品| 一区二区三区免费在线观看| 国产精品亚洲激情| 久久免费国产精品1| 在线一区二区日韩| 欧美va日韩va| 欧美一区二区三区四区在线观看 | 欧美一区二区三区男人的天堂| 又紧又大又爽精品一区二区| 欧美国产一区二区在线观看| 亚洲男人天堂2024| 亚洲精品久久久久久下一站| 久久九九99| 亚洲免费在线精品一区| 亚洲国内自拍| 合欧美一区二区三区| 欧美日韩精品一区| 噜噜噜久久亚洲精品国产品小说| 亚洲午夜免费福利视频| 欧美成人精品一区二区| 先锋影音一区二区三区| 99精品国产在热久久下载| 国产欧美一区二区精品忘忧草| 欧美日本国产一区| 欧美1区免费| 久久综合成人精品亚洲另类欧美| 亚洲男人影院| 中文亚洲视频在线|