亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

最長公共子序列(LCS)問題

2019-11-10 20:02:02
字體:
供稿:網(wǎng)友

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

0、前言

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

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

第一節(jié)、問題描述

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

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

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

第二節(jié)、LCS問題的解決思路

窮舉法   

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

動態(tài)規(guī)劃算法

    事實上,最長公共子序列問題也有最優(yōu)子結(jié)構(gòu)性質(zhì)。

記:

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(設(shè)長度為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)的長度}。

    由于上述當(dāng)xm≠yn的情況中,求LCS(Xm-1 , Y)的長度與LCS(X , Yn-1)的長度,這兩個問題不是相互獨(dú)立的:兩者都需要求LCS(Xm-1,Yn-1)的長度。另外兩個序列的LCS中包含了兩個序列的前綴的LCS,故問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)考慮用動態(tài)規(guī)劃法。

    也就是說,解決這個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的動態(tài)規(guī)劃解法已敘述殆盡,不過,為了成書的某種必要性,下面,我試著再多加詳細(xì)闡述這個問題。

第三節(jié)、動態(tài)規(guī)劃算法解LCS問題

3.1、最長公共子序列的結(jié)構(gòu)

    最長公共子序列的結(jié)構(gòu)有如下表示:

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

若xm=yn,則zk=xm=yn且Zk-1是Xm-1和Yn-1的最長公共子序列;若xm≠yn且zk≠xm ,則Z是Xm-1和Y的最長公共子序列;若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.子問題的遞歸結(jié)構(gòu)

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

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

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

3、3.計算最優(yōu)值

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

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

[cpp] view plain copy print?Procedure LCS_LENGTH(X,Y);  begin    m:=length[X];    n:=length[Y];    for i:=1 to m do c[i,0]:=0;    for j:=1 to n do c[0,j]:=0;    for i:=1 to m do      for j:=1 to n do        if x[i]=y[j] then          begin            c[i,j]:=c[i-1,j-1]+1;            b[i,j]:="↖";          end        else if c[i-1,j]≥c[i,j-1] then          begin            c[i,j]:=c[i-1,j];            b[i,j]:="↑";          end        else          begin            c[i,j]:=c[i,j-1];            b[i,j]:="←"          end;    return(c,b);  end;   

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

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

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

3、4.構(gòu)造最長公共子序列

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

[cpp] view plain copy print?Procedure LCS(b,X,i,j);  begin    if i=0 or j=0 then return;    if b[i,j]="↖" then      begin        LCS(b,X,i-1,j-1);        print(x[i]); {打印x[i]}      end    else if b[i,j]="↑" then LCS(b,X,i-1,j)                         else LCS(b,X,i,j-1);  end;   

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

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

    我來說明下此圖(參考算法導(dǎo)論)。在序列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]之前計算。為了重構(gòu)一個LCS的元素,從右下角開始跟蹤b[i,j]的箭頭即可,這條路徑標(biāo)示為陰影,這條路徑上的每一個“↖”對應(yīng)于一個使xi=yi為一個LCS的成員的項(高亮標(biāo)示)。

    所以根據(jù)上述圖所示的結(jié)果,程序?qū)⒆罱K輸出:“B C B A”。

3、5.算法的改進(jìn)

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

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

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

第四節(jié)、編碼實現(xiàn)LCS問題

    動態(tài)規(guī)劃的一個計算最長公共子序列的方法如下,以兩個序列 X、Y 為例子:

設(shè)有二維數(shù)組 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)當(dāng) X 的第 a 位與 Y 的第 b 位完全相同時為“1”,否則為“0”。

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

該算法的空間、時間復(fù)雜度均為O(n2),經(jīng)過優(yōu)化后,空間復(fù)雜度可為O(n),時間復(fù)雜度為O(nlogn)。

以下是此算法的java代碼:

[cpp] view plain copy print?   import java.util.Random;     public class LCS{      public static void main(String[] args){             //設(shè)置字符串長度          int substringLength1 = 20;          int substringLength2 = 20;  //具體大小可自行設(shè)置             // 隨機(jī)生成字符串          String x = GetRandomStrings(substringLength1);          String y = GetRandomStrings(substringLength2);             Long startTime = System.nanoTime();          // 構(gòu)造二維數(shù)組記錄子問題x[i]和y[i]的LCS的長度          int[][] opt = new int[substringLength1 + 1][substringLength2 + 1];             // 動態(tài)規(guī)劃計算所有子問題          for (int i = substringLength1 - 1; i >= 0; i--){              for (int j = substringLength2 - 1; j >= 0; j--){                  if (x.charAt(i) == y.charAt(j))                      opt[i][j] = opt[i + 1][j + 1] + 1;                                 //參考上文我給的公式。                  else                      opt[i][j] = Math.max(opt[i + 1][j], opt[i][j + 1]);        //參考上文我給的公式。              }          }             -------------------------------------------------------------------------------------             理解上段,參考上文我給的公式:             根據(jù)上述結(jié)論,可得到以下公式,             如果我們記字符串Xi和Yj的LCS的長度為c[i,j],我們可以遞歸地求c[i,j]:                       /      0                               if i<0 or j<0          c[i,j]=          c[i-1,j-1]+1                    if i,j>=0 and xi=xj                   /       max(c[i,j-1],c[i-1,j]           if i,j>=0 and xi≠xj             -------------------------------------------------------------------------------------             System.out.println("substring1:"+x);          System.out.println("substring2:"+y);          System.out.print("LCS:");             int i = 0, j = 0;          while (i < substringLength1 && j < substringLength2){              if (x.charAt(i) == y.charAt(j)){                  System.out.print(x.charAt(i));                  i++;                  j++;              } else if (opt[i + 1][j] >= opt[i][j + 1])                  i++;              else                  j++;          }          Long endTime = System.nanoTime();          System.out.println(" Totle time is " + (endTime - startTime) + " ns");      }         //取得定長隨機(jī)字符串      public static String GetRandomStrings(int length){          StringBuffer buffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz");          StringBuffer sb = new StringBuffer();          Random r = new Random();          int range = buffer.length();          for (int i = 0; i < length; i++){              sb.append(buffer.charAt(r.nextInt(range)));          }          return sb.toString();      }  }  

第五節(jié)、改進(jìn)的算法

    下面咱們來了解一種不同于動態(tài)規(guī)劃法的一種新的求解最長公共子序列問題的方法,該算法主要是把求解公共字符串問題轉(zhuǎn)化為求解矩陣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;

    求出每列元素,一直到發(fā)現(xiàn)第p+1 行都為null 時退出循環(huán),得出矩陣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,不妨設(shè)m<=n,LCS 問題就是要求出A 和B 的LCS。定義4 給定字符串A=A[1]A[2]…A[m]和字符串B=B[1]B[2]…[n],A( 1:i)表示A 的連續(xù)子序列A[1]A[2]…A[i],同樣B(1:j)表示B 的連續(xù)子序列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 是滿足以下條件的最小整數(shù):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)不存在。當(dāng)i<k 時,顯然L(k,i)不存在。    設(shè)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) 所對應(yīng)的子序列B[L(1,m-p+1)]B[L(2,m-p+2)]…B[L(p,m)]即為A 和B 的LCS,p 為該LCS 的長度。這樣,LCS 問題的求解就轉(zhuǎn)化為對m m L × 矩陣的求解。

6.2 算法思想    根據(jù)定理,第一步求出第一行元素,L(1,1),L(1,2),…L(1,m),第二步求第二行,一直到發(fā)現(xiàn)第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。這樣,計算每行的時間復(fù)雜度為O(n),則整個時間復(fù)雜度為O(pn)。在求L 矩陣的過程中不用存儲整個矩陣,只需存儲當(dāng)前行和上一行即可。空間復(fù)雜度為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

[cpp] view plain copy print?L(A,B,L){//字符串A,B,所求矩陣L    for(k=1;k<=m;k++){ //m 為A 的長度      for(i=1;i<=m;i++){        if(i<k) L[k][i]=N;//i<k 時,L(k,i)=null,N 代表無窮大        if(L[k][i]==k)//L(k,i)=k 時,L(k,i+1)=L(k,i+2)=…L(k,m)=k        for(l=i+1;l<=m;l++)         { L[k][l]=k;           Break;}        for(j=1;j<=n;j++){//定理4 的實現(xiàn)         if(A[i+1]==B[j]&&j>L[k-1][i]){          L[k][i+1]=(j<L[k][i]?j:L[k][i]);          break;        }        if(L[k][i+1]==0)          L[k][i]=N;       }       if(L[k][m]==N)        {p=k-1;break;}    }    p=k-1;  }  

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

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

轉(zhuǎn)自:http://blog.csdn.net/v_july_v/article/details/6695482

感謝作者,終于把lcs搞懂了


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
欧美xxxhd| 成人ar影院免费观看视频| 久久久久久久久久久久久国产精品| 免费黄色av网址| 欧美精品videossex性护士| 亚洲一区二区高清视频| 中文字幕日本乱码精品影院| 在线高清av| jizz视频| 亚洲最大成人网4388xx| 日韩有码第一页| 成人在线免费观看黄色| 一个人看的www免费观看视频| 国语精品一区| 国产一区二区中文字幕免费看| 国语产色综合| 国产欧美日韩亚洲精品| 99视频精品全部免费看| 日韩一区二区在线| 日日摸天天爽天天爽视频| 亚洲一区欧美激情| 日韩av成人高清| 亚洲欧洲美洲一区二区三区| 另类尿喷潮videofree| www久久精品| 视频在线观看免费影院欧美meiju| 欧美猛交ⅹxxx乱大交视频| 成人国产精品一区二区| 欧美肉大捧一进一出免费视频| 97视频在线| 国产熟女高潮一区二区三区| 欧美孕妇与黑人孕交| 91小视频在线播放| a视频在线观看| 婷婷五月综合久久中文字幕| 高清一区二区三区视频| chinese麻豆新拍video| 19j韩国主播韩宝贝在线| 亚洲va欧美va国产va天堂影院| 特黄视频免费看| 日韩aaaaa| 青青青青在线| 亚洲精品国产品国语在线| 91久久久久久久久久久久久久| 一区二区三区加勒比av| 性疯狂做受xxxx高清视频| 国产91在线播放精品| 无码国模国产在线观看| 在线天堂中文资源最新版| 国产原创在线视频| 久久久久亚洲精品中文字幕| 丝袜综合欧美| 亚洲视频在线观看| 国产精品免费网站| 欧洲av在线播放| 播放灌醉水嫩大学生国内精品| 国产人妻人伦精品1国产丝袜| 欧美在线精品免播放器视频| 久久伊人久久| 亚洲嫩模一区| 国产不卡精品视男人的天堂| 欧美日韩高清影院| 年下总裁被打光屁股sp| 99久久99久久免费精品小说| 欧美高清视频一区二区三区在线观看| 欧美一级淫片aaaaaaa视频| 亚洲国产精品国自产拍久久| 国产美女作爱全过程免费视频| 欧美最猛黑人xxxx黑人猛交3p| 国产aⅴ夜夜欢一区二区三区| 日韩精品分区| 国产成人精品一区二区免费视频| 日韩理论片在线| 亚洲一级视频在线观看| 久久精品人妻一区二区三区| 91精品国产成人观看| av亚洲免费| 番号在线播放| 国产精品毛片久久久久久久| 女人爱爱视频| 欧美日韩一区二| 亚洲蜜臀av乱码久久精品蜜桃| 毛片a片免费观看| 国产在线日韩在线| 精品不卡一区| 国产麻豆麻豆| 久久久久久久人妻无码中文字幕爆| 可以免费观看的黄色网址| 精品日本一区二区| 欧洲av一区二区三区| 欧美激情福利| 欧美日韩国产美女| 国产成人在线播放视频| 国产成人av影院| 女人丝袜激情亚洲| 日韩午夜在线观看| 不卡伊人av在线播放| 色综合久久88色综合天天| 日韩高清一区| 久久精品国产www456c0m| 另类亚洲自拍| 99精品视频免费| 国产又爽又黄ai换脸| 亚洲黄色天堂| 国内在线视频| 欧美日韩一区视频| 国产高清无密码一区二区三区| 高潮毛片在线观看| 欧美乱强性伦xxxxx| 精品久久久久久久久久岛国gif| 伊人一区二区三区| 91麻豆精品国产综合久久久| 天天色天天爱天天射综合| 国产精品久久久高清免费| 亚洲精品国产一区二区在线| 2014国产精品| 国产精品资源| 亚洲精品不卡| av电影在线地址| 欧美成人精品一区二区综合免费| 桃乃木香奈和黑人aⅴ在线播放| 久久久久久久久久久av| 国产伦精品一区二区三区四区| 日韩精品极品在线观看| 亚洲欧美久久婷婷爱综合一区天堂| a看欧美黄色女同性恋| 99久久精品国产亚洲| av中文在线| 色一情一乱一伦一区二区三区丨| 国产亚洲自拍偷拍| 最全影音av资源中文字幕在线| 精品中文av资源站在线观看| 久久99国产精品麻豆| 亚洲国产精品国自产拍久久| 偷拍欧美精品| 亚洲天堂最新地址| 西西大胆午夜视频| 清纯唯美亚洲经典中文字幕| 亚洲午夜在线播放| 91精品国产黑色紧身裤美女| 国产亚洲精品久久久久久打不开| 91av免费观看91av精品在线| 狠狠人妻久久久久久| 一起草av在线| 国产无遮无挡120秒| 51精品免费网站| 久久久久久久久一区二区| 这里只有精品6| 国产三级午夜理伦三级| 日韩一卡二卡在线| 免费观看欧美大片| 色综合天天做天天爱| 日本黄色成人| 色88久久久久高潮综合影院| 欧美激情一级精品国产| 自拍偷拍欧美视频| 伊人色在线观看| 国产精品免费视频观看| 精品粉嫩aⅴ一区二区三区四区| 91中文字幕在线| 亚洲第一成年免费网站| 经典三级久久| 亚洲制服欧美中文字幕中文字幕| 精品一区二区三区四| 在线播放一区二区三区| 97在线国产视频| 国产精品a久久久久| **欧美日韩在线观看| 国产三区在线成人av| 欧美日韩国产精品成人| 国产精品传媒麻豆hd| 国产视频一区二区不卡| 特大黑人巨人吊xxxx| av成人免费在线观看| 人体久久天天| 性久久久久久久久久久久久久| 韩国97影院| 精品久久久久久久无码| 久色婷婷小香蕉久久| 3p在线观看| xxxx欧美18另类的高清| 波多野结衣三级在线| 成人午夜电影在线观看| 手机在线看福利| 亚洲av网址在线| 亚洲黄色一区二区三区| 国产成人在线中文字幕| 天天做天天摸天天爽国产一区| 婷婷亚洲天堂| 日韩av电影免费在线观看| xxxx视频在线| 国产高清亚洲一区| 最美情侣韩剧在线播放| av在线不卡网站| 欧美三电影在线| 欧美在线视频一二三| 久草视频视频在线播放| 国产成人av一区| 原谅我中文字幕| 色先锋aa成人| av一区和二区| 色爱av美腿丝袜综合粉嫩av| 久久综合资源网| 中日韩午夜理伦电影免费| 九一国产精品视频| 久久性爱视频网站| 视频一区二区三区在线观看| 国产精品久久在线观看| 国产男女猛烈无遮挡91| 性高潮久久久久久久久| 国产不卡高清在线观看视频| 国产精品对白刺激久久久| 久久久国产高清| 四虎国产精品永久地址998| 欧美一级中文字幕| 在线看的片片片免费| 久久这里只有精品视频首页| 久久久久国产成人精品亚洲午夜| 欧美日韩在线观看一区| 欧美日韩亚洲系列| 成人做爰69片免费| 国产欧美日韩专区发布| 91综合精品国产丝袜长腿久久| 丁香花在线观看完整版电影| 欧洲午夜精品久久久| 欧美精品一本久久男人的天堂| 国产乱女淫av麻豆国产| 亚洲精品第一区二区三区| 国产欧美日韩在线一区二区| 中文字幕一区视频| 亚洲精品一区二区三区影院| 日韩pacopacomama| 亚洲一区二区三区精品中文字幕| 午夜免费福利在线| 岛国在线视频网站| av久久久久久| 丝袜美腿亚洲综合| 午夜一区二区视频| 午夜羞羞小视频在线观看| 丝袜美腿一区二区三区| 欧美久久久久久久久中文字幕| 亚洲精品男人| 久久天堂电影| 亚洲妇女av| 少妇激情一区二区三区视频| 色婷婷色综合| 欧美一级特黄aaaaaa| 国产欧美第一页| 日本成a人片在线观看| 青青草国产精品97视觉盛宴| 中文字幕亚洲日本| 1000部国产精品成人观看| 久久久99免费| 中文字幕在线观看一区二区三区| 欧美日韩一区二区三区在线看| 国产网站观看9久| 日本三级韩国三级久久| 国产美女玉足交| 一区二区不卡在线观看| 精品不卡在线视频| 亚洲欧美综合乱码精品成人网| www.综合网.com| 亚洲精品国产系列| 东京热av一区| 免费高清在线一区| 成年人在线观看| 在线精品国产成人综合| 中文无码日韩欧| 亚洲区 欧美区| 色综合久久一区二区三区| 51午夜精品| 亚洲警察之高压线| 日韩 国产 在线| 蜜乳av另类精品一区二区| 欧美舌奴丨vk视频| 日韩av色综合| 在线观看毛片av| 亚洲免费不卡视频| 欧美在线观看你懂的| 久久久精品99| 欧美怡红院视频一区二区三区| 国产成人综合精品三级| 国产偷亚洲偷欧美偷精品| 国产精品一区在线播放| 99日在线视频| h视频免费观看| 激情综合丝袜美女一区二区| 欧美视频一区二区在线观看| 欧美在线视频a| 亚洲av无码精品一区二区| 亚洲欧美卡通动漫| 国产呦系列欧美呦日韩呦| 亚洲一区二区三区在线看| 二区三区不卡不卡视频| 美女被内谢流白浆高视频| 国产精品美女久久久久久久| 精品欧美乱码久久久久久| 久久久久久精| 亚洲av综合色区无码一区爱av| 成人av一区二区三区| 一区在线播放视频| 999精品嫩草久久久久久99| 色婷婷激情视频| 香蕉伊大人中文在线观看| 欧美日韩久久精品| 无人区在线高清完整免费版 一区二| 欧美大黑bbbbbbbbb在线| 欧美一区欧美二区| 亚洲天堂在线视频观看| 欧美日韩一区二区三区四区| 日韩网站在线| 国产精品福利网| 国产视频久久网| 一区二区视频在线| 国产精品欧美在线| 手机免费看av| 国产区在线看| 日本一区二区三区四区| www.欧美黄色| 成人免费黄色网| 午夜精彩国产免费不卡不顿大片| 国产浪潮av性色av小说| 亚洲成成品网站| 久久久精品天堂| 色综合久久88| 欧美重口另类videos人妖| 婷婷六月综合网| 日本激情五月|