3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

發布時間:2024/3/13 编程问答 40 豆豆

如何存儲微博、微信等社交網絡中的好友關系?圖。實際上,涉及圖的算法有很多,也非常復雜,比如圖的搜索、最短路徑、最小生成樹、二分圖等等。我們今天聚焦在圖存儲這一方面,后面會分好幾節來依次講解圖相關的算法。

如何理解“圖”?

我們前面講過了樹這種非線性表數據結構,今天我們要講另一種非線性表數據結構,(Graph)。和樹比起來,這是一種更加復雜的非線性表結構。

圖中的元素我們就叫作頂點(vertex)。

圖中的一個頂點可以與任意其他頂點建立連接關系。我們把這種建立的關系叫作(edge)。

我們就拿微信舉例子吧。我們可以把每個用戶看作一個頂點。如果兩個用戶之間互加好友,那就在兩者之間建立一條邊。所以,整個微信的好友關系就可以用一張圖來表示。其中,每個用戶有多少個好友,對應到圖中,就叫作頂點的(degree),就是跟頂點相連接的邊的條數。

微博的社交關系跟微信還有點不一樣,或者說更加復雜一點。微博允許單向關注,也就是說,用戶 A 關注了用戶 B,但用戶 B 可以不關注用戶 A。那我們如何用圖來表示這種單向的社交關系呢?(帶箭頭

我們可以把剛剛講的圖結構稍微改造一下,引入邊的“方向”的概念。

如果用戶 A 關注了用戶 B,我們就在圖中畫一條從 A 到 B 的帶箭頭的邊,來表示邊的方向。如果用戶 A 和用戶 B 互相關注了,那我們就畫一條從 A 指向 B 的邊,再畫一條從 B 指向 A 的邊。我們把這種邊有方向的圖叫作“有向圖”。以此類推,我們把邊沒有方向的圖就叫作“無向圖”。

無向圖中有“度”這個概念,表示一個頂點有多少條邊。在有向圖中,我們把度分為入度(In-degree)和出度(Out-degree)。

頂點的入度,表示有多少條邊指向這個頂點;頂點的出度,表示有多少條邊是以這個頂點為起點指向其他頂點。對應到微博的例子,入度就表示有多少粉絲,出度就表示關注了多少人。

QQ 中的社交關系要更復雜的一點。不知道你有沒有留意過 QQ 親密度這樣一個功能。QQ 不僅記錄了用戶之間的好友關系,還記錄了兩個用戶之間的親密度,如果兩個用戶經常往來,那親密度就比較高;如果不經常往來,親密度就比較低。如何在圖中記錄這種好友關系的親密度呢?

這里就要用到另一種圖,帶權圖(weighted graph)。在帶權圖中,每條邊都有一個權重(weight),我們可以通過這個權重來表示 QQ 好友間的親密度。

如何在內存中存儲圖這種數據結構呢?

鄰接矩陣存儲方法:簡單,浪費內存空間

圖最直觀的一種存儲方法就是,鄰接矩陣(Adjacency Matrix)。

鄰接矩陣的底層依賴一個二維數組。對于無向圖來說,如果頂點 i 與頂點 j 之間有邊,我們就將 A[i][j] 和 A[j][i] 標記為 1;對于有向圖來說,如果頂點 i 到頂點 j 之間,有一條箭頭從頂點 i 指向頂點 j 的邊,那我們就將 A[i][j] 標記為 1。同理,如果有一條箭頭從頂點 j 指向頂點 i 的邊,我們就將 A[j][i] 標記為 1。對于帶權圖,數組中就存儲相應的權重。

如果我們存儲的是稀疏圖(Sparse Matrix),也就是說,頂點很多,但每個頂點的邊并不多,那鄰接矩陣的存儲方法就更加浪費空間了。比如微信有好幾億的用戶,對應到圖上就是好幾億的頂點。但是每個用戶的好友并不會很多,一般也就三五百個而已。如果我們用鄰接矩陣來存儲,那絕大部分的存儲空間都被浪費了。

但這也并不是說,鄰接矩陣的存儲方法就完全沒有優點。首先,鄰接矩陣的存儲方式簡單、直接,因為基于數組,所以在獲取兩個頂點的關系時,就非常高效。其次,用鄰接矩陣存儲圖的另外一個好處是方便計算。這是因為,用鄰接矩陣的方式存儲圖,可以將很多圖的運算轉換成矩陣之間的運算。比如求解最短路徑問題時會提到一個Floyd-Warshall 算法,就是利用矩陣循環相乘若干次得到結果。

鄰接表存儲方法

鄰接表(Adjacency List)。

鄰接表是不是有點像散列表?每個頂點對應一條鏈表,鏈表中存儲的是與這個頂點相連接的其他頂點。

圖中畫的是一個有向圖的鄰接表存儲方式,每個頂點對應的鏈表里面,存儲的是指向的頂點。對于無向圖來說,也是類似的,不過,每個頂點的鏈表中存儲的,是跟這個頂點有邊相連的頂點,你可以自己畫下。

鄰接矩陣存儲起來比較浪費空間,但是使用起來比較節省時間。相反,鄰接表存儲起來比較節省空間,但是使用起來就比較耗時間。

就像圖中的例子,如果我們要確定,是否存在一條從頂點 2 到頂點 4 的邊,那我們就要遍歷頂點 2 對應的那條鏈表,看鏈表中是否存在頂點 4。而且,我們前面也講過,鏈表的存儲方式對緩存不友好。所以,比起鄰接矩陣的存儲方式,在鄰接表中查詢兩個頂點之間的關系就沒那么高效了。

在散列表那幾節里,我講到,在基于鏈表法解決沖突的散列表中,如果鏈過長,為了提高查找效率,我們可以將鏈表換成其他更加高效的數據結構,比如平衡二叉查找樹等。我們剛剛也講到,鄰接表長得很像散列。所以,我們也可以將鄰接表同散列表一樣進行“改進升級”。

我們可以將鄰接表中的鏈表改成平衡二叉查找樹。實際開發中,我們可以選擇用紅黑樹。這樣,我們就可以更加快速地查找兩個頂點之間是否存在邊了。當然,這里的二叉查找樹可以換成其他動態數據結構,比如跳表、散列表等。除此之外,我們還可以將鏈表改成有序動態數組,可以通過二分查找的方法來快速定位兩個頂點之間否是存在邊。

如何存儲微博、微信等社交網絡中的好友關系?

數據結構是為算法服務的,所以具體選擇哪種存儲方法,與期望支持的操作有關系。針對微博用戶關系,假設我們需要支持下面這樣幾個操作:

  • 判斷用戶 A 是否關注了用戶 B;
  • 判斷用戶 A 是否是用戶 B 的粉絲;
  • 用戶 A 關注用戶 B;
  • 用戶 A 取消關注用戶 B;
  • 根據用戶名稱的首字母排序,分頁獲取用戶的粉絲列表;
  • 根據用戶名稱的首字母排序,分頁獲取用戶的關注列表。

關于如何存儲一個圖,前面我們講到兩種主要的存儲方法,鄰接矩陣和鄰接表。因為社交網絡是一張稀疏圖,使用鄰接矩陣存儲比較浪費存儲空間。所以,這里我們采用鄰接表來存儲。

不過,用一個鄰接表來存儲這種有向圖是不夠的。我們去查找某個用戶關注了哪些用戶非常容易,但是如果要想知道某個用戶都被哪些用戶關注了,也就是用戶的粉絲列表,是非常困難的。

基于此,我們需要一個逆鄰接表。鄰接表中存儲了用戶的關注關系,逆鄰接表中存儲的是用戶的被關注關系。對應到圖上,鄰接表中,每個頂點的鏈表中,存儲的就是這個頂點指向的頂點,逆鄰接表中,每個頂點的鏈表中,存儲的是指向這個頂點的頂點。如果要查找某個用戶關注了哪些用戶,我們可以在鄰接表中查找;如果要查找某個用戶被哪些用戶關注了,我們從逆鄰接表中查找。

基礎的鄰接表不適合快速判斷兩個用戶之間是否是關注與被關注的關系,所以我們選擇改進版本,將鄰接表中的鏈表改為支持快速查找的動態數據結構。選擇哪種動態數據結構呢?紅黑樹、跳表、有序動態數組還是散列表呢?

因為我們需要按照用戶名稱的首字母排序,分頁來獲取用戶的粉絲列表或者關注列表,用跳表這種結構再合適不過了。這是因為,跳表插入、刪除、查找都非常高效,時間復雜度是 O(logn),空間復雜度上稍高,是 O(n)。最重要的一點,跳表中存儲的數據本來就是有序的了,分頁獲取粉絲列表或關注列表,就非常高效。

如果對于小規模的數據,比如社交網絡中只有幾萬、幾十萬個用戶,我們可以將整個社交關系存儲在內存中,上面的解決思路是沒有問題的。但是如果像微博那樣有上億的用戶,數據規模太大,我們就無法全部存儲在內存中了。這個時候該怎么辦呢?

我們可以通過哈希算法等數據分片方式,將鄰接表存儲在不同的機器上。你可以看下面這幅圖,我們在機器 1 上存儲頂點 1,2,3 的鄰接表,在機器 2 上,存儲頂點 4,5 的鄰接表。逆鄰接表的處理方式也一樣。當要查詢頂點與頂點關系的時候,我們就利用同樣的哈希算法,先定位頂點所在的機器,然后再在相應的機器上查找。

另外一種解決思路,就是利用外部存儲(比如硬盤),因為外部存儲的存儲空間要比內存會寬裕很多。數據庫是我們經常用來持久化存儲關系數據的,所以我這里介紹一種數據庫的存儲方式。

我用下面這張表來存儲這樣一個圖。為了高效地支持前面定義的操作,我們可以在表上建立多個索引,比如第一列、第二列,給這兩列都建立索引。

微信好友關系存儲方式。無向圖,也可以使用鄰接表的方式存儲每個人所對應的好友列表。為了支持快速查找,好友列表可以使用紅黑樹存儲。

字符串匹配算法之

比較簡單的、好理解的,它們分別是:BF 算法和 RK 算法。單模式串匹配的算法,一個串跟一個串進行匹配

比較難理解、但更加高效的,它們是:BM 算法和 KMP 算法。在一個串中同時查找多個串,它們分別是 Trie 樹和 AC 自動機。

RK 算法是 BF 算法的改進,它巧妙借助了我們前面講過的哈希算法,讓匹配的效率有了很大的提升。那RK 算法是如何借助哈希算法來實現高效字符串匹配的呢

BF 算法

BF 算法中文叫作暴力匹配算法,也叫樸素匹配算法。從名字可以看出,這種算法的字符串匹配方式很“暴力”,當然也就會比較簡單、好懂,但相應的性能也不高。

先定義兩個概念,分別是主串模式串。(在A中查找B,A主串,長度n;B模式串,長度m)

,BF 算法的思想可以用一句話來概括,我們在主串中,檢查起始位置分別是 0、1、2…n-m 且長度為 m 的 n-m+1 個子串,看有沒有跟模式串匹配的

在極端情況下,比如主串是“aaaaa…aaaaaa”(省略號表示有很多重復的字符 a),模式串是“aaaaab”。我們每次都比對 m 個字符,要比對 n-m+1 次,所以,這種算法的最壞情況時間復雜度是 O(n*m)。

盡管理論上,BF 算法的時間復雜度很高,是 O(n*m),但在實際的開發中,它卻是一個比較常用的字符串匹配算法。為什么這么說呢?原因有兩點。

第一,實際的軟件開發中,大部分情況下,模式串和主串的長度都不會太長。而且每次模式串與主串中的子串匹配的時候,當中途遇到不能匹配的字符的時候,就可以就停止了,不需要把 m 個字符都比對一下。所以,盡管理論上的最壞情況時間復雜度是 O(n*m),但是,統計意義上,大部分情況下,算法執行效率要比這個高很多。

第二,樸素字符串匹配算法思想簡單,代碼實現也非常簡單。簡單意味著不容易出錯,如果有 bug 也容易暴露和修復。在工程中,在滿足性能要求的前提下,簡單是首選。這也是我們常說的KISS(Keep it Simple and Stupid)設計原則。

所以,在實際的軟件開發中,絕大部分情況下,樸素的字符串匹配算法就夠用了。

RK 算法

RK 算法,其實就是剛剛講的 BF 算法的升級版。

BF 算法,如果模式串長度為 m,主串長度為 n,那在主串中,就會有 n-m+1 個長度為 m 的子串,我們只需要暴力地對比這 n-m+1 個子串與模式串,就可以找出主串與模式串匹配的子串。

但是,每次檢查主串與子串是否匹配,需要依次比對每個字符,所以 BF 算法的時間復雜度就比較高,是 O(n*m)。我們對樸素的字符串匹配算法稍加改造,引入哈希算法,時間復雜度立刻就會降低。

RK 算法的思路是這樣的:

我們通過哈希算法主串中的 n-m+1 個子串分別求哈希值,然后逐個與模式串的哈希值比較大小。如果某個子串的哈希值與模式串相等,那就說明對應的子串和模式串匹配了(這里先不考慮哈希沖突的問題,后面我們會講到)。因為哈希值是一個數字,數字之間比較是否相等是非常快速的,所以模式串和子串比較的效率就提高了。

不過,通過哈希算法計算子串的哈希值的時候,我們需要遍歷子串中的每個字符。盡管模式串與子串比較的效率提高了,但是,算法整體的效率并沒有提高。有沒有方法可以提高哈希算法計算子串哈希值的效率呢?

這就需要哈希算法設計的非常有技巧了。我們假設要匹配的字符串的字符集中只包含 K 個字符,我們可以用一個 K 進制數來表示一個子串,這個 K 進制數轉化成十進制數,作為子串的哈希值。表述起來有點抽象,我舉了一個例子,看完你應該就能懂了。

比如要處理的字符串只包含 a~z 這 26 個小寫字母,那我們就用二十六進制來表示一個字符串。我們把 a~z 這 26 個字符映射到 0~25 這 26 個數字,a 就表示 0,b 就表示 1,以此類推,z 表示 25。

在十進制的表示法中,一個數字的值是通過下面的方式計算出來的。對應到二十六進制,一個包含 a 到 z 這 26 個字符的字符串,計算哈希的時候,我們只需要把進位從 10 改成 26 就可以

這個哈希算法你應該看懂了吧?現在,為了方便解釋,在下面的講解中,我假設字符串中只包含 a~z 這 26 個小寫字符,我們用二十六進制來表示一個字符串,對應的哈希值就是二十六進制數轉化成十進制的結果。

這種哈希算法有一個特點,在主串中,相鄰兩個子串的哈希值的計算公式有一定關系。我這有個個例子,你先找一下規律,再來看我后面的講解。

從這里例子中,我們很容易就能得出這樣的規律:相鄰兩個子串 s[i-1] 和 s[i](i 表示子串在主串中的起始位置,子串的長度都為 m),對應的哈希值計算公式有交集,也就是說,我們可以使用 s[i-1] 的哈希值很快的計算出 s[i] 的哈希值。如果用公式表示的話,就是下面這個樣子:

不過,這里有一個小細節需要注意,那就是 26^(m-1) 這部分的計算,我們可以通過查表的方法來提高效率。我們事先計算好 260、261、262……26(m-1),并且存儲在一個長度為 m 的數組中,公式中的“次方”就對應數組的下標。當我們需要計算 26 的 x 次方的時候,就可以從數組的下標為 x 的位置取值,直接使用,省去了計算的時間。

我們開頭的時候提過,RK 算法的效率要比 BF 算法高,現在,我們就來分析一下,RK 算法的時間復雜度到底是多少呢?

整個 RK 算法包含兩部分,計算子串哈希值模式串哈希值與子串哈希值之間的比較。第一部分,我們前面也分析了,可以通過設計特殊的哈希算法,只需要掃描一遍主串就能計算出所有子串的哈希值了,所以這部分的時間復雜度是 O(n)

模式串哈希值與每個子串哈希值之間的比較的時間復雜度是 O(1),總共需要比較 n-m+1 個子串的哈希值,所以,這部分的時間復雜度也是 O(n)。所以,RK 算法整體的時間復雜度就是 O(n)。

這里還有一個問題就是,模式串很長,相應的主串中的子串也會很長,通過上面的哈希算法計算得到的哈希值就可能很大,如果超過了計算機中整型數據可以表示的范圍,那該如何解決呢?

剛剛我們設計的哈希算法是沒有散列沖突的,也就是說,一個字符串與一個二十六進制數一一對應,不同的字符串的哈希值肯定不一樣。因為我們是基于進制來表示一個字符串的,你可以類比成十進制、十六進制來思考一下。實際上,我們為了能將哈希值落在整型數據范圍內,可以犧牲一下,允許哈希沖突。這個時候哈希算法該如何設計呢?

哈希算法的設計方法有很多,我舉一個例子說明一下。假設字符串中只包含 a~z 這 26 個英文字母,那我們每個字母對應一個數字,比如 a 對應 1,b 對應 2,以此類推,z 對應 26。我們可以把字符串中每個字母對應的數字相加,最后得到的和作為哈希值。這種哈希算法產生的哈希值的數據范圍就相對要小很多了。

不過,你也應該發現,這種哈希算法的哈希沖突概率也是挺高的。當然,我只是舉了一個最簡單的設計方法,還有很多更加優化的方法,比如將每一個字母從小到大對應一個素數,而不是 1,2,3……這樣的自然數,這樣沖突的概率就會降低一些。

那現在新的問題來了。之前我們只需要比較一下模式串和子串的哈希值,如果兩個值相等,那這個子串就一定可以匹配模式串。但是,當存在哈希沖突的時候,有可能存在這樣的情況,子串和模式串的哈希值雖然是相同的,但是兩者本身并不匹配。

實際上,解決方法很簡單。當我們發現一個子串的哈希值跟模式串的哈希值相等的時候,我們只需要再對比一下子串和模式串本身就好了。當然,如果子串的哈希值與模式串的哈希值不相等,那對應的子串和模式串肯定也是不匹配的,就不需要比對子串和模式串本身了。

RK 算法是借助哈希算法對 BF 算法進行改造,即對每個子串分別求哈希值,然后拿子串的哈希值與模式串的哈希值比較,減少了比較的時間。所以,理想情況下,RK 算法的時間復雜度是 O(n),跟 BF 算法相比,效率提高了很多。不過這樣的效率取決于哈希算法的設計方法,如果存在沖突的情況下,時間復雜度可能會退化。極端情況下,哈希算法大量沖突,時間復雜度就退化為 O(n*m)。但也不要太悲觀,一般情況下,沖突不會很多,RK 算法的效率還是比 BF 算法高的。

BM 算法

BM算法原理

BM算法定義了兩個規則:

壞字符規則:當文本串中的某個字符跟模式串的某個字符不匹配時,我們稱文本串中的這個失配字符為壞字符,此時模式串需要向右移動,移動的位數 = 壞字符在模式串中的位置 - 壞字符在模式串中最右出現的位置。此外,如果"壞字符"不包含在模式串之中,則最右出現位置為-1。
好后綴規則:當字符失配時,后移位數 = 好后綴在模式串中的位置 - 好后綴在模式串上一次出現的位置,且如果好后綴在模式串中沒有再次出現,則為-1。

下面舉例說明BM算法。例如,給定文本串“HERE IS A SIMPLE EXAMPLE”,和模式串“EXAMPLE”,現要查找模式串是否在文本串中,如果存在,返回模式串在文本串中的位置。

  • 首先,“文本串"與"模式串"頭部對齊,從尾部開始比較。”S“與”E“不匹配。這時,”S“就被稱為"壞字符”(bad character),即不匹配的字符,它對應著模式串的第6位。且"S“不包含在模式串”EXAMPLE“之中(相當于最右出現位置是-1),這意味著可以把模式串后移6-(-1)=7位,從而直接移到”S"的后一位。

  • 依然從尾部開始比較,發現"P“與”E“不匹配,所以”P“是"壞字符”。但是,"P“包含在模式串”EXAMPLE"之中。因為“P”這個“壞字符”對應著模式串的第6位(從0開始編號),且在模式串中的最右出現位置為4,所以,將模式串后移6-4=2位,兩個"P"對齊。

  • 依次比較,得到 “MPLE”匹配,稱為"好后綴"(good suffix),即所有尾部匹配的字符串。注意,“MPLE”、“PLE”、“LE”、"E"都是好后綴。

  • 發現“I”與“A”不匹配:“I”是壞字符。如果是根據壞字符規則,此時模式串應該后移2-(-1)=3位。問題是,有沒有更優的移法?

  • 更優的移法是利用好后綴規則:當字符失配時,后移位數 = 好后綴在模式串中的位置 - 好后綴在模式串中上一次出現的位置,且如果好后綴在模式串中沒有再次出現,則為-1。所有的“好后綴”(MPLE、PLE、LE、E)之中,只有“E”在“EXAMPLE”的頭部出現,所以后移6-0=6位。可以看出,“壞字符規則”只能移3位,“好后綴規則”可以移6位。每次后移這兩個規則之中的較大值。這兩個規則的移動位數,只與模式串有關,與原文本串無關。

  • 繼續從尾部開始比較,“P”與“E”不匹配,因此“P”是“壞字符”,根據“壞字符規則”,后移 6 - 4 = 2位。因為是最后一位就失配,尚未獲得好后綴。

好后綴加深理解

由上可知,BM算法不僅效率高,而且構思巧妙,容易理解。壞字符規則相對而言比較好理解,好后綴如果還不理解,我這里再繼續舉個例子解釋一下,這里加深理解。

  • 如果模式串中存在已經匹配成功的好后綴,則把目標串與好后綴對齊,然后從模式串的最尾元素開始往前匹配。

  • 如果無法找到匹配好的后綴,找一個匹配的最長的前綴,讓目標串與最長的前綴對齊(如果這個前綴存在的話)。模式串[m-s,m] = 模式串[0,s] 。

  • 如果完全不存在和好后綴匹配的子串,則右移整個模式串。

先實現好字符規則

BM算法還是很好理解的,其實如果你之前學習KMP算法你也會有同樣的感受,KMP算法理解起來不是很難,但是重點在于怎么去實現next數組。BM算法也是,原理理解起來其實非常的容易,不過怎么去實現,沒有一套標準的代碼。不過可以研究別人的代碼,然后實現一套盡量適合精簡的代碼。還是一樣,一步一步來,我們先來實現好字符規則。好字符規則的代碼如下,我會在代碼中必要的地方加入注釋,輔助理解,代碼是最好的老師。

public static void getRight(String pat, int[] right) {//首先創建一個模式串的字符位置的數組,初始化為-1,就是用于記錄模式串//中,每個字符在模式串中的相對位置,這里直接用的是256,也//就是ASCII碼的最大值,當然,如果你的字符串中只限制了26個//字符,你也可以直接使用26for (int i = 0; i < 256; i++) {right[i] = -1;}//值得一提的是,通過這種方式,可以你會發現,如果模式串中存在相同的//字符,那么right數組中,記錄的是最右的那個字符的位置for (int j = 0; j < pat.length(); j++) {right[pat.charAt(j)] = j;} }public static int Search(String txt, String pat, int[] right) {int M = txt.length();//主串的長度int N = pat.length();//模式串的長度int skip;//用于記錄跳過幾個字符for (int i = 0; i < M - N; i += skip) {skip = 0;//每次進入循環要記得初始化為0for (int j = N - 1; j >= 0; j--) {//不相等,意味著出現壞字符,按照上面的規則移動if (pat.charAt(j) != txt.charAt(i + j)) {skip = j - right[txt.charAt(i + j)];//skip之所以會小于1,可能是因為壞字符在模式串中最右的位置,可能//在j指向字符的右側,就是已經越過了。if (skip < 1) skip = 1;break;}}//注意了這個時候循環了一遍之后,skip如果等于0,意味著沒有壞字符出現,所以//匹配成功,返回當前字符i的位置if (skip == 0)return i;}return -1; }

完整BM實現

上面的代碼不難理解,相信你已經看懂了,那么接下來也不用單獨來講好后綴的實現,直接上完整的實現代碼。因為完整的BM實現中,就是比較壞字符規則以及好后綴規則,哪個移動的字符數更多,就使用哪個。老樣子,下面的代碼中我盡量的加注釋。

public static int pattern(String pattern, String target) {int tLen = target.length();//主串的長度int pLen = pattern.length();//模式串的長度//如果模式串比主串長,沒有可比性,直接返回-1if (pLen > tLen) {return -1;}int[] bad_table = build_bad_table(pattern);// 獲得壞字符數值的數組,實現看下面int[] good_table = build_good_table(pattern);// 獲得好后綴數值的數組,實現看下面for (int i = pLen - 1, j; i < tLen;) {System.out.println("跳躍位置:" + i);//這里和上面實現壞字符的時候不一樣的地方,我們之前提前求出壞字符以及好后綴//對應的數值數組,所以,我們只要在一邊循環中進行比較。還要說明的一點是,這里//沒有使用skip記錄跳過的位置,直接針對主串中移動的指針i進行移動for (j = pLen - 1; target.charAt(i) == pattern.charAt(j); i--, j--) {if (j == 0) {//指向模式串的首字符,說明匹配成功,直接返回就可以了System.out.println("匹配成功,位置:" + i);//如果你還要匹配不止一個模式串,那么這里直接跳出這個循環,并且讓i++//因為不能直接跳過整個已經匹配的字符串,這樣的話可能會丟失匹配。 // i++; // 多次匹配 // break;return i;}}//如果出現壞字符,那么這個時候比較壞字符以及好后綴的數組,哪個大用哪個i += Math.max(good_table[pLen - j - 1], bad_table[target.charAt(i)]);}return -1; }//字符信息表 public static int[] build_bad_table(String pattern) {final int table_size = 256;//上面已經解釋過了,字符的種類int[] bad_table = new int[table_size];//創建一個數組,用來記錄壞字符出現時,應該跳過的字符數int pLen = pattern.length();//模式串的長度for (int i = 0; i < bad_table.length; i++) {bad_table[i] = pLen; //默認初始化全部為匹配字符串長度,因為當主串中的壞字符在模式串中沒有出//現時,直接跳過整個模式串的長度就可以了}for (int i = 0; i < pLen - 1; i++) {int k = pattern.charAt(i);//記錄下當前的字符ASCII碼值//這里其實很值得思考一下,bad_table就不多說了,是根據字符的ASCII值存儲//壞字符出現最右的位置,這在上面實現壞字符的時候也說過了。不過你仔細思考//一下,為什么這里存的壞字符數值,是最右的那個壞字符相對于模式串最后一個//字符的位置?為什么?首先你要理解i的含義,這個i不是在這里的i,而是在上面//那個pattern函數的循環的那個i,為了方便我們稱呼為I,這個I很神奇,雖然I是//在主串上的指針,但是由于在循環中沒有使用skip來記錄,直接使用I隨著j匹配//進行移動,也就意味著,在某種意義上,I也可以直接定位到模式串的相對位置,//理解了這一點,就好理解在本循環中,i的行為了。//其實仔細去想一想,我們分情況來思考,如果模式串的最//后一個字符,也就是匹配開始的第一個字符,出現了壞字符,那么這個時候,直//接移動這個數值,那么正好能讓最右的那個字符正對壞字符。那么如果不是第一個//字符出現壞字符呢?這種情況你仔細想一想,這種情況也就意味著出現了好后綴的//情況,假設我們將最右的字符正對壞字符bad_table[k] = pLen - 1 - i;}return bad_table; }//匹配偏移表 public static int[] build_good_table(String pattern) {int pLen = pattern.length();//模式串長度int[] good_table = new int[pLen];//創建一個數組,存好后綴數值//用于記錄最新前綴的相對位置,初始化為模式串長度,因為意思就是當前后綴字符串為空//要明白lastPrefixPosition 的含義int lastPrefixPosition = pLen;for (int i = pLen - 1; i >= 0; --i) {if (isPrefix(pattern, i + 1)) {//如果當前的位置存在前綴匹配,那么記錄當前位置lastPrefixPosition = i + 1;}good_table[pLen - 1 - i] = lastPrefixPosition - i + pLen - 1;}for (int i = 0; i < pLen - 1; ++i) {//計算出指定位置匹配的后綴的字符串長度int slen = suffixLength(pattern, i);good_table[slen] = pLen - 1 - i + slen;}return good_table; }//前綴匹配 private static boolean isPrefix(String pattern, int p) {int patternLength = pattern.length();//模式串長度//這里j從模式串第一個字符開始,i從指定的字符位置開始,通過循環判斷當前指定的位置p//之后的字符串是否匹配模式串前綴for (int i = p, j = 0; i < patternLength; ++i, ++j) {if (pattern.charAt(i) != pattern.charAt(j)) {return false;}}return true; }//后綴匹配 private static int suffixLength(String pattern, int p) {int pLen = pattern.length();int len = 0;for (int i = p, j = pLen - 1; i >= 0 && pattern.charAt(i) == pattern.charAt(j); i--, j--) {len += 1;}return len; }

理解一下上面代碼,這里我針對上面代碼舉個例子,計算之后的兩張表的數值如下:

版權聲明:本文為CSDN博主「BoCong-Deng」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/DBC_121/article/details/105569440

KMP算法

KMP算法是一種字符串匹配算法,可以在 O(n+m) 的時間復雜度內實現兩個字符串的匹配。本文將引導您學習KMP算法,閱讀大約需要30分鐘。

字符串匹配問題

所謂字符串匹配,是這樣一種問題:“字符串 P 是否為字符串 S 的子串?如果是,它出現在 S 的哪些位置?” 其中 S 稱為**主串;P 稱為模式串**。下面的圖片展示了一個例子。

主串是莎翁那句著名的 “to be or not to be”,這里刪去了空格。“no” 這個模式串的匹配結果是“出現了一次,從S[6]開始”;“ob”這個模式串的匹配結果是“出現了兩次,分別從s[1]、s[10]開始”。按慣例,主串和模式串都以0開始編號。
  字符串匹配是一個非常頻繁的任務。例如,今有一份名單,你急切地想知道自己在不在名單上;又如,假設你拿到了一份文獻,你希望快速地找到某個關鍵字(keyword)所在的章節……凡此種種,不勝枚舉。
  我們先從最樸素的Brute-Force算法開始講起。

Brute-Force

顧名思義,Brute-Force是一個純暴力算法。說句題外話,我懷疑,“暴力”一詞在算法領域表示“窮舉、極低效率的實現”,可能就是源于這個英文詞。
  首先,我們應該如何實現兩個字符串 A,B 的比較?所謂字符串比較,就是問“兩個字符串是否相等”。最樸素的思想,就是從前往后逐字符比較,一旦遇到不相同的字符,就返回False;如果兩個字符串都結束了,仍然沒有出現不對應的字符,則返回True。實現如下:

既然我們可以知道“兩個字符串是否相等”,那么最樸素的字符串匹配算法 Brute-Force 就呼之欲出了——

  • 枚舉 i = 0, 1, 2 … , len(S)-len§
  • 將 S[i : i+len§] 與 P 作比較。如果一致,則找到了一個匹配。

現在我們來模擬 Brute-Force 算法,對主串 “AAAAAABC” 和模式串 “AAAB” 做匹配:

這是一個清晰明了的算法,實現也極其簡單。下面給出Python和C++的實現:

我們成功實現了 Brute-Force 算法。現在,我們需要對它的時間復雜度做一點討論。按照慣例,記 n = |S| 為串 S 的長度,m = |P| 為串 P 的長度。
  考慮“字符串比較”這個小任務的復雜度。最壞情況發生在:兩個字符串唯一的差別在最后一個字符。這種情況下,字符串比較必須走完整個字符串,才能給出結果,因此復雜度是 O(len) 的。

由此,不難想到 Brute-Force 算法所面對的最壞情況:主串形如“AAAAAAAAAAA…B”,而模式串形如“AAAAA…B”。每次字符串比較都需要付出 |P| 次字符比較的代價,總共需要比較 |S| - |P| + 1次,因此總時間復雜度是 O(|P|?(|S|?|P|+1))O(|P|\cdot (|S| - |P| + 1) )O(|P|\cdot (|S| - |P| + 1) ) . 考慮到主串一般比模式串長很多,故 Brute-Force 的復雜度是 O(|P|?|S|)O(|P| \cdot |S|)O(|P| \cdot |S|) ,也就是 O(nm)的。這太慢了!

Brute-Force的改進思路

經過剛剛的分析,您已經看到,Brute-Force 慢得像爬一樣。它最壞的情況如下圖所示:

我們很難降低字符串比較的復雜度(因為比較兩個字符串,真的只能逐個比較字符)。因此,我們考慮降低比較的趟數。如果比較的趟數能降到足夠低,那么總的復雜度也將會下降很多。  要優化一個算法,首先要回答的問題是“我手上有什么信息?” 我們手上的信息是否足夠、是否有效,決定了我們能把算法優化到何種程度。請記住:盡可能利用殘余的信息,是KMP算法的思想所在
  在 Brute-Force 中,如果從 S[i] 開始的那一趟比較失敗了,算法會直接開始嘗試從 S[i+1] 開始比較。這種行為,屬于典型的“沒有從之前的錯誤中學到東西”。我們應當注意到,一次失敗的匹配,會給我們提供寶貴的信息——如果 S[i : i+len§] 與 P 的匹配是在第 r 個位置失敗的,那么從 S[i] 開始的 (r-1) 個連續字符,一定與 P 的前 (r-1) 個字符一模一樣!

需要實現的任務是“字符串匹配”,而每一次失敗都會給我們換來一些信息——能告訴我們,主串的某一個子串等于模式串的某一個前綴。但是這又有什么用呢?

跳過不可能成功的字符串比較

有些趟字符串比較是有可能會成功的;有些則毫無可能。我們剛剛提到過,優化 Brute-Force 的路線是“盡量減少比較的趟數”,而如果我們跳過那些絕不可能成功的字符串比較,則可以希望復雜度降低到能接受的范圍。
  那么,哪些字符串比較是不可能成功的?來看一個例子。已知信息如下:

  • 模式串 P = “abcabd”.
  • 和主串從S[0]開始匹配時,在 P[5] 處失配。

首先,利用上一節的結論。既然是在 P[5] 失配的,那么說明 S[0:5] 等于 P[0:5],即"abcab". 現在我們來考慮:從 S[1]、S[2]、S[3] 開始的匹配嘗試,有沒有可能成功?
  從 S[1] 開始肯定沒辦法成功,因為 S[1] = P[1] = ‘b’,和 P[0] 并不相等。從 S[2] 開始也是沒戲的,因為 S[2] = P[2] = ‘c’,并不等于P[0]. 但是從 S[3] 開始是有可能成功的——至少按照已知的信息,我們推不出矛盾。

帶著“跳過不可能成功的嘗試”的思想,我們來看next數組。

next數組

next數組是對于模式串而言的。P 的 next 數組定義為:next[i] 表示 P[0] ~ P[i] 這一個子串,使得 前k個字符恰等于后k個字符 的最大的k. 特別地,k不能取i+1(因為這個子串一共才 i+1 個字符,自己肯定與自己相等,就沒有意義了)。

上圖給出了一個例子。P=“abcabd"時,next[4]=2,這是因為P[0] ~ P[4] 這個子串是"abcab”,前兩個字符與后兩個字符相等,因此next[4]取2. 而next[5]=0,是因為"abcabd"找不到前綴與后綴相同,因此只能取0.

如果把模式串視為一把標尺,在主串上移動,那么 Brute-Force 就是每次失配之后只右移一位;改進算法則是每次失配之后,移很多位,跳過那些不可能匹配成功的位置。但是該如何確定要移多少位呢?

在 S[0] 嘗試匹配,失配于 S[3] <=> P[3] 之后,我們直接把模式串往右移了兩位,讓 S[3] 對準 P[1]. 接著繼續匹配,失配于 S[8] <=> P[6], 接下來我們把 P 往右平移了三位,把 S[8] 對準 P[3]. 此后繼續匹配直到成功。
  我們應該如何移動這把標尺?很明顯,如圖中藍色箭頭所示,舊的后綴要與新的前綴一致(如果不一致,那就肯定沒法匹配上了)!

回憶next數組的性質:P[0] 到 P[i] 這一段子串中,前next[i]個字符與后next[i]個字符一模一樣。既然如此,如果失配在 P[r], 那么P[0]~P[r-1]這一段里面,前next[r-1]個字符恰好和后next[r-1]個字符相等——也就是說,我們可以拿長度為 next[r-1] 的那一段前綴,來頂替當前后綴的位置,讓匹配繼續下去!
  您可以驗證一下上面的匹配例子:P[3]失配后,把P[next[3-1]]也就是P[1]對準了主串剛剛失配的那一位;P[6]失配后,把P[next[6-1]]也就是P[3]對準了主串剛剛失配的那一位。

如上圖所示,綠色部分是成功匹配,失配于紅色部分。深綠色手繪線條標出了相等的前綴和后綴,其長度為next[右端]. 由于手繪線條部分的字符是一樣的,所以直接把前面那條移到后面那條的位置。因此說,next數組為我們如何移動標尺提供了依據。接下來,我們實現這個優化的算法。

利用next數組進行匹配

了解了利用next數組加速字符串匹配的原理,我們接下來代碼實現之。分為兩個部分:建立next數組、利用next數組進行匹配。
  首先是建立next數組。我們暫且用最樸素的做法,以后再回來優化:

如上圖代碼所示,直接根據next數組的定義來建立next數組。不難發現它的復雜度是 O(m2)O(m2)O(m2) 的。
  接下來,實現利用next數組加速字符串匹配。代碼如下:

如何分析這個字符串匹配的復雜度呢?乍一看,pos值可能不停地變成next[pos-1],代價會很高;但我們使用攤還分析,顯然pos值一共頂多自增len(S)次,因此pos值減少的次數不會高于len(S)次。由此,復雜度是可以接受的,不難分析出整個匹配算法的時間復雜度:O(n+m).

快速求next數組

終于來到了我們最后一個問題——如何快速構建next數組。
  首先說一句:快速構建next數組,是KMP算法的精髓所在,核心思想是“P自己與自己做匹配”。
  為什么這樣說呢?回顧next數組的完整定義:

  • 定義 “k-前綴” 為一個字符串的前 k 個字符; “k-后綴” 為一個字符串的后 k 個字符。k 必須小于字符串長度。
  • next[x] 定義為: P[0]~P[x] 這一段字符串,使得k-前綴恰等于k-后綴的最大的k.

這個定義中,不知不覺地就包含了一個匹配——前綴和后綴相等。接下來,我們考慮采用遞推的方式求出next數組。如果next[0], next[1], … next[x-1]均已知,那么如何求出 next[x] 呢?

來分情況討論。首先,已經知道了 next[x-1](以下記為now),如果 P[x] 與 P[now] 一樣,那最長相等前后綴的長度就可以擴展一位,很明顯 next[x] = now + 1. 圖示如下。

剛剛解決了 P[x] = P[now] 的情況。那如果 P[x] 與 P[now] 不一樣,又該怎么辦?

如圖。長度為 now 的子串 A 和子串 B 是 P[0]~P[x-1] 中最長的公共前后綴。可惜 A 右邊的字符和 B 右邊的那個字符不相等,next[x]不能改成 now+1 了。因此,我們應該縮短這個now,把它改成小一點的值,再來試試 P[x] 是否等于 P[now].
  now該縮小到多少呢?顯然,我們不想讓now縮小太多。因此我們決定,在保持“P[0]~P[x-1]的now-前綴仍然等于now-后綴”的前提下,讓這個新的now盡可能大一點。 P[0]~P[x-1] 的公共前后綴,前綴一定落在串A里面、后綴一定落在串B里面。換句話講:接下來now應該改成:使得 A的k-前綴等于B的k-后綴 的最大的k.
  您應該已經注意到了一個非常強的性質——串A和串B是相同的!B的后綴等于A的后綴!因此,使得A的k-前綴等于B的k-后綴的最大的k,其實就是串A的最長公共前后綴的長度 —— next[now-1]!

來看上面的例子。當P[now]與P[x]不相等的時候,我們需要縮小now——把now變成next[now-1],直到P[now]=P[x]為止。P[now]=P[x]時,就可以直接向右擴展了。

代碼實現如下:

應用攤還分析,不難證明構建next數組的時間復雜度是O(m)的。至此,我們以O(n+m)的時間復雜度,實現了構建next數組、利用next數組進行字符串匹配。

以上就是KMP算法。它于1977年被提出,全稱 Knuth–Morris–Pratt 算法。讓我們記住前輩們的名字:Donald Knuth(K), James H. Morris(M), Vaughan Pratt§.
  希望本文對你有幫助。 本文在我博客的url是 https://ruanx.pw/kmp/ , 以后可能會更新。


最后附上洛谷P3375 【模板】KMP字符串匹配 的Python和Java版代碼:

轉載自:

作者:阮行止
鏈接:如何更好地理解和掌握 KMP 算法? - 阮行止的回答 - 知乎
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

Trie樹

搜索引擎的搜索關鍵詞提示功能,我想你應該不陌生吧?為了方便快速輸入,當你在搜索引擎的搜索框中,輸入要搜索的文字的某一部分的時候,搜索引擎就會自動彈出下拉框,里面是各種關鍵詞提示。

什么是“Trie 樹”?

Trie 樹,也叫“字典樹”。顧名思義,它是一個樹形結構。它是一種專門處理字符串匹配的數據結構,用來解決在一組字符串集合中快速查找某個字符串的問題。

當然,這樣一個問題可以有多種解決方法,比如散列表、紅黑樹,或者我們前面幾節講到的一些字符串匹配算法,但是,Trie 樹在這個問題的解決上,有它特有的優點。不僅如此,Trie 樹能解決的問題也不限于此,我們一會兒慢慢分析。

現在,我們先來看下,Trie 樹到底長什么樣子。

我舉個簡單的例子來說明一下。我們有 6 個字符串,它們分別是:how,hi,her,hello,so,see。我們希望在里面多次查找某個字符串是否存在。如果每次查找,都是拿要查找的字符串跟這 6 個字符串依次進行字符串匹配,那效率就比較低,有沒有更高效的方法呢?

這個時候,我們就可以先對這 6 個字符串做一下預處理,組織成 Trie 樹的結構,之后每次查找,都是在 Trie 樹中進行匹配查找。Trie 樹的本質,就是利用字符串之間的公共前綴,將重復的前綴合并在一起。最后構造出來的就是下面這個圖中的樣子。

根節點不包含任何信息。每個節點表示一個字符串中的字符,從根節點到紅色節點的一條路徑表示一個字符串(注意:紅色節點并不都是葉子節點)。

Trie 樹構造的分解過程。構造過程的每一步,都相當于往 Trie 樹中插入一個字符串。當所有字符串都插入完成之后,Trie 樹就構造好了。

如何實現一棵 Trie 樹?

知道了 Trie 樹長什么樣子,我們現在來看下,如何用代碼來實現一個 Trie 樹。

從剛剛 Trie 樹的介紹來看,Trie 樹主要有兩個操作,一個是將字符串集合構造成 Trie 樹。這個過程分解開來的話,就是一個將字符串插入到 Trie 樹的過程。另一個是在 Trie 樹中查詢一個字符串

了解了 Trie 樹的兩個主要操作之后,我們再來看下,如何存儲一個 Trie 樹?

從前面的圖中,我們可以看出,Trie 樹是一個多叉樹。我們知道,二叉樹中,一個節點的左右子節點是通過兩個指針來存儲的,如下所示 Java 代碼。那對于多叉樹來說,我們怎么存儲一個節點的所有子節點的指針呢?

class BinaryTreeNode {char data;BinaryTreeNode left;BinaryTreeNode right; }

我先介紹其中一種存儲方式,也是經典的存儲方式,大部分數據結構和算法書籍中都是這么講的。還記得我們前面講到的散列表嗎?借助散列表的思想,我們通過一個下標與字符一一映射的數組,來存儲子節點的指針。這句話稍微有點抽象,不怎么好懂,我畫了一張圖你可以看看。

假設我們的字符串中只有從 a 到 z 這 26 個小寫字母,我們在數組中下標為 0 的位置,存儲指向子節點 a 的指針,下標為 1 的位置存儲指向子節點 b 的指針,以此類推,下標為 25 的位置,存儲的是指向的子節點 z 的指針。如果某個字符的子節點不存在,我們就在對應的下標的位置存儲 null。

class TrieNode {char data;TrieNode children[26]; }

當我們在 Trie 樹中查找字符串的時候,我們就可以通過字符的 ASCII 碼減去“a”的 ASCII 碼,迅速找到匹配的子節點的指針。比如,d 的 ASCII 碼減去 a 的 ASCII 碼就是 3,那子節點 d 的指針就存儲在數組中下標為 3 的位置中。

描述了這么多,有可能你還是有點懵,我把上面的描述翻譯成了代碼,你可以結合著一塊看下,應該有助于你理解。

public class Trie {private TrieNode root = new TrieNode('/'); // 存儲無意義字符// 往 Trie 樹中插入一個字符串public void insert(char[] text) {TrieNode p = root;for (int i = 0; i < text.length; ++i) {int index = text[i] - 'a';if (p.children[index] == null) {TrieNode newNode = new TrieNode(text[i]);p.children[index] = newNode;}p = p.children[index];}p.isEndingChar = true;}// 在 Trie 樹中查找一個字符串public boolean find(char[] pattern) {TrieNode p = root;for (int i = 0; i < pattern.length; ++i) {int index = pattern[i] - 'a';if (p.children[index] == null) {return false; // 不存在 pattern}p = p.children[index];}if (p.isEndingChar == false) return false; // 不能完全匹配,只是前綴else return true; // 找到 pattern}public class TrieNode {public char data;public TrieNode[] children = new TrieNode[26];public boolean isEndingChar = false;public TrieNode(char data) {this.data = data;}} }

Trie 樹的實現,你現在應該搞懂了。現在,我們來看下,在 Trie 樹中,查找某個字符串的時間復雜度是多少?

如果要在一組字符串中,頻繁地查詢某些字符串,用 Trie 樹會非常高效。構建 Trie 樹的過程,需要掃描所有的字符串,時間復雜度是 O(n)(n 表示所有字符串的長度和)。但是一旦構建成功之后,后續的查詢操作會非常高效。

每次查詢時,如果要查詢的字符串長度是 k,那我們只需要比對大約 k 個節點,就能完成查詢操作。跟原本那組字符串的長度和個數沒有任何關系。所以說,構建好 Trie 樹后,在其中查找字符串的時間復雜度是 O(k),k 表示要查找的字符串的長度。

Trie 樹真的很耗內存嗎?

前面我們講了 Trie 樹的實現,也分析了時間復雜度。現在你應該知道,Trie 樹是一種非常獨特的、高效的字符串匹配方法。但是,關于 Trie 樹,你有沒有聽過這樣一種說法:“Trie 樹是非常耗內存的,用的是一種空間換時間的思路”。這是什么原因呢?

剛剛我們在講 Trie 樹的實現的時候,講到用數組來存儲一個節點的子節點的指針。如果字符串中包含從 a 到 z 這 26 個字符,那每個節點都要存儲一個長度為 26 的數組,并且每個數組存儲一個 8 字節指針(或者是 4 字節,這個大小跟 CPU、操作系統、編譯器等有關)。而且,即便一個節點只有很少的子節點,遠小于 26 個,比如 3、4 個,我們也要維護一個長度為 26 的數組。

我們前面講過,Trie 樹的本質是避免重復存儲一組字符串的相同前綴子串,但是現在每個字符(對應一個節點)的存儲遠遠大于 1 個字節。按照我們上面舉的例子,數組長度為 26,每個元素是 8 字節,那每個節點就會額外需要 26*8=208 個字節。而且這還是只包含 26 個字符的情況。

如果字符串中不僅包含小寫字母,還包含大寫字母、數字、甚至是中文,那需要的存儲空間就更多了。所以,也就是說,在某些情況下,Trie 樹不一定會節省存儲空間。在重復的前綴并不多的情況下,Trie 樹不但不能節省內存,還有可能會浪費更多的內存。

當然,我們不可否認,Trie 樹盡管有可能很浪費內存,但是確實非常高效。那為了解決這個內存問題,我們是否有其他辦法呢?

我們可以稍微犧牲一點查詢的效率,將每個節點中的數組換成其他數據結構,來存儲一個節點的子節點指針。用哪種數據結構呢?我們的選擇其實有很多,比如有序數組、跳表、散列表、紅黑樹等。

假設我們用有序數組,數組中的指針按照所指向的子節點中的字符的大小順序排列。查詢的時候,我們可以通過二分查找的方法,快速查找到某個字符應該匹配的子節點的指針。但是,在往 Trie 樹中插入一個字符串的時候,我們為了維護數組中數據的有序性,就會稍微慢了點。

替換成其他數據結構的思路是類似的,這里我就不一一分析了,你可以結合前面學過的內容,自己分析一下。

實際上,Trie 樹的變體有很多,都可以在一定程度上解決內存消耗的問題。比如,縮點優化,就是對只有一個子節點的節點,而且此節點不是一個串的結束節點,可以將此節點與子節點合并。這樣可以節省空間,但卻增加了編碼難度。這里我就不展開詳細講解了,你如果感興趣,可以自行研究下。

Trie 樹與散列表、紅黑樹的比較

實際上,字符串的匹配問題,籠統上講,其實就是數據的查找問題。對于支持動態數據高效操作的數據結構,我們前面已經講過好多了,比如散列表、紅黑樹、跳表等等。實際上,這些數據結構也可以實現在一組字符串中查找字符串的功能。我們選了兩種數據結構,散列表和紅黑樹,跟 Trie 樹比較一下,看看它們各自的優缺點和應用場景。

在剛剛講的這個場景,在一組字符串中查找字符串,Trie 樹實際上表現得并不好。它對要處理的字符串有及其嚴苛的要求。

第一,字符串中包含的字符集不能太大。我們前面講到,如果字符集太大,那存儲空間可能就會浪費很多。即便可以優化,但也要付出犧牲查詢、插入效率的代價。

第二,要求字符串的前綴重合比較多,不然空間消耗會變大很多。

第三,如果要用 Trie 樹解決問題,那我們就要自己從零開始實現一個 Trie 樹,還要保證沒有 bug,這個在工程上是將簡單問題復雜化,除非必須,一般不建議這樣做。

第四,我們知道,通過指針串起來的數據塊是不連續的,而 Trie 樹中用到了指針,所以,對緩存并不友好,性能上會打個折扣。

綜合這幾點,針對在一組字符串中查找字符串的問題,我們在工程中,更傾向于用散列表或者紅黑樹。因為這兩種數據結構,我們都不需要自己去實現,直接利用編程語言中提供的現成類庫就行了。

講到這里,你可能要疑惑了,講了半天,我對 Trie 樹一通否定,還讓你用紅黑樹或者散列表,那 Trie 樹是不是就沒用了呢?是不是今天的內容就白學了呢?

實際上,Trie 樹只是不適合精確匹配查找,這種問題更適合用散列表或者紅黑樹來解決。Trie 樹比較適合的是查找前綴匹配的字符串,也就是類似開篇問題的那種場景。

實際上,Trie 樹的這個應用可以擴展到更加廣泛的一個應用上,就是自動輸入補全,比如輸入法自動補全功能、IDE 代碼編輯器自動補全功能、瀏覽器網址輸入的自動補全功能等等。

Trie 樹是一種解決字符串快速匹配問題的數據結構。如果用來構建 Trie 樹的這一組字符串中,前綴重復的情況不是很多,那 Trie 樹這種數據結構總體上來講是比較費內存的,是一種空間換時間的解決問題思路。

盡管比較耗費內存,但是對內存不敏感或者內存消耗在接受范圍內的情況下,在 Trie 樹中做字符串匹配還是非常高效的,時間復雜度是 O(k),k 表示要匹配的字符串的長度。

但是,Trie 樹的優勢并不在于,用它來做動態集合數據的查找,因為,這個工作完全可以用更加合適的散列表或者紅黑樹來替代。Trie 樹最有優勢的是查找前綴匹配的字符串,比如搜索引擎中的關鍵詞提示功能這個場景,就比較適合用它來解決,也是 Trie 樹比較經典的應用場景。

擴展閱讀:Trie樹的開源庫:Apache Commons、DAT(雙數組trie樹)、后綴樹

AC自動機

很多支持用戶發表文本內容的網站,比如 BBS,大都會有敏感詞過濾功能,用來過濾掉用戶輸入的一些淫穢、反動、謾罵等內容。你有沒有想過,這個功能是怎么實現的呢?

實際上,這些功能最基本的原理就是字符串匹配算法,也就是通過維護一個敏感詞的字典,當用戶輸入一段文字內容之后,通過字符串匹配算法,來查找用戶輸入的這段文字,是否包含敏感詞。如果有,就用“***”把它替代掉。

我們前面講過好幾種字符串匹配算法了,它們都可以處理這個問題。但是,對于訪問量巨大的網站來說,比如淘寶,用戶每天的評論數有幾億、甚至幾十億。這時候,我們對敏感詞過濾系統的性能要求就要很高。畢竟,我們也不想,用戶輸入內容之后,要等幾秒才能發送出去吧?我們也不想,為了這個功能耗費過多的機器吧?那如何才能實現一個高性能的敏感詞過濾系統呢?這就要用到今天的多模式串匹配算法

基于單模式串和 Trie 樹實現的敏感詞過濾

我們前面幾節講了好幾種字符串匹配算法,有 BF 算法、RK 算法、BM 算法、KMP 算法,還有 Trie 樹。前面四種算法都是單模式串匹配算法,只有 Trie 樹是多模式串匹配算法。

我說過,單模式串匹配算法,是在一個模式串和一個主串之間進行匹配,也就是說,在一個主串中查找一個模式串。多模式串匹配算法,就是在多個模式串和一個主串之間做匹配,也就是說,在一個主串中查找多個模式串。

盡管,單模式串匹配算法也能完成多模式串的匹配工作。例如開篇的思考題,我們可以針對每個敏感詞,通過單模式串匹配算法(比如 KMP 算法)與用戶輸入的文字內容進行匹配。但是,這樣做的話,每個匹配過程都需要掃描一遍用戶輸入的內容。整個過程下來就要掃描很多遍用戶輸入的內容。如果敏感詞很多,比如幾千個,并且用戶輸入的內容很長,假如有上千個字符,那我們就需要掃描幾千遍這樣的輸入內容。很顯然,這種處理思路比較低效。

與單模式匹配算法相比,多模式匹配算法在這個問題的處理上就很高效了。它只需要掃描一遍主串,就能在主串中一次性查找多個模式串是否存在,從而大大提高匹配效率。我們知道,Trie 樹就是一種多模式串匹配算法。那如何用 Trie 樹實現敏感詞過濾功能呢?

我們可以對敏感詞字典進行預處理,構建成 Trie 樹結構。這個預處理的操作只需要做一次,如果敏感詞字典動態更新了,比如刪除、添加了一個敏感詞,那我們只需要動態更新一下 Trie 樹就可以了。

當用戶輸入一個文本內容后,我們把用戶輸入的內容作為主串,從第一個字符(假設是字符 C)開始,在 Trie 樹中匹配。當匹配到 Trie 樹的葉子節點,或者中途遇到不匹配字符的時候,我們將主串的開始匹配位置后移一位,也就是從字符 C 的下一個字符開始,重新在 Trie 樹中匹配。

基于 Trie 樹的這種處理方法,有點類似單模式串匹配的 BF 算法。我們知道,單模式串匹配算法中,KMP 算法對 BF 算法進行改進,引入了 next 數組,讓匹配失敗時,盡可能將模式串往后多滑動幾位。借鑒單模式串的優化改進方法,能否對多模式串 Trie 樹進行改進,進一步提高 Trie 樹的效率呢?這就要用到 AC 自動機算法了。

經典的多模式串匹配算法:AC 自動機

AC 自動機算法,全稱是 Aho-Corasick 算法。其實,Trie 樹跟 AC 自動機之間的關系,就像單串匹配中樸素的串匹配算法,跟 KMP 算法之間的關系一樣,只不過前者針對的是多模式串而已。所以,AC 自動機實際上就是在 Trie 樹之上,加了類似 KMP 的 next 數組,只不過此處的 next 數組是構建在樹上罷了。如果代碼表示,就是下面這個樣子:

public class AcNode {public char data; public AcNode[] children = new AcNode[26]; // 字符集只包含 a~z 這 26 個字符public boolean isEndingChar = false; // 結尾字符為 truepublic int length = -1; // 當 isEndingChar=true 時,記錄模式串長度public AcNode fail; // 失敗指針public AcNode(char data) {this.data = data;} }

所以,AC 自動機的構建,包含兩個操作:

  • 將多個模式串構建成 Trie 樹;
  • 在 Trie 樹上構建失敗指針(相當于 KMP 中的失效函數 next 數組)。

關于如何構建 Trie 樹,我們上一節已經講過了。所以,這里我們就重點看下,構建好 Trie 樹之后,如何在它之上構建失敗指針?

我用一個例子給你講解。這里有 4 個模式串,分別是 c,bc,bcd,abcd;主串是 abcd。

Trie 樹中的每一個節點都有一個失敗指針,它的作用和構建過程,跟 KMP 算法中的 next 數組極其相似。所以要想看懂這節內容,你要先理解 KMP 算法中 next 數組的構建過程。如果你還有點不清楚,建議你先回頭去弄懂 KMP 算法。

假設我們沿 Trie 樹走到 p 節點,也就是下圖中的紫色節點,那 p 的失敗指針就是從 root 走到紫色節點形成的字符串 abc,跟所有模式串前綴匹配的最長可匹配后綴子串,就是箭頭指的 bc 模式串。

這里的最長可匹配后綴子串,我稍微解釋一下。字符串 abc 的后綴子串有兩個 bc,c,我們拿它們與其他模式串匹配,如果某個后綴子串可以匹配某個模式串的前綴,那我們就把這個后綴子串叫作可匹配后綴子串

我們從可匹配后綴子串中,找出最長的一個,就是剛剛講到的最長可匹配后綴子串。我們將 p 節點的失敗指針指向那個最長匹配后綴子串對應的模式串的前綴的最后一個節點,就是下圖中箭頭指向的節點。

計算每個節點的失敗指針這個過程看起來有些復雜。其實,如果我們把樹中相同深度的節點放到同一層,那么某個節點的失敗指針只有可能出現在它所在層的上一層。

我們可以像 KMP 算法那樣,當我們要求某個節點的失敗指針的時候,我們通過已經求得的、深度更小的那些節點的失敗指針來推導。也就是說,我們可以逐層依次來求解每個節點的失敗指針。所以,失敗指針的構建過程,是一個按層遍歷樹的過程。

首先 root 的失敗指針為 NULL,也就是指向自己。當我們已經求得某個節點 p 的失敗指針之后,如何尋找它的子節點的失敗指針呢?

我們假設節點 p 的失敗指針指向節點 q,我們看節點 p 的子節點 pc 對應的字符,是否也可以在節點 q 的子節點中找到。如果找到了節點 q 的一個子節點 qc,對應的字符跟節點 pc 對應的字符相同,則將節點 pc 的失敗指針指向節點 qc。

如果節點 q 中沒有子節點的字符等于節點 pc 包含的字符,則令 q=q->fail(fail 表示失敗指針,這里有沒有很像 KMP 算法里求 next 的過程?),繼續上面的查找,直到 q 是 root 為止,如果還沒有找到相同字符的子節點,就讓節點 pc 的失敗指針指向 root。

我將構建失敗指針的代碼貼在這里,你可以對照著講解一塊看下,應該更容易理解。這里面,構建 Trie 樹的代碼我并沒有貼出來,你可以參看上一節的代碼,自己實現。

public void buildFailurePointer() {Queue<AcNode> queue = new LinkedList<>();root.fail = null;queue.add(root);while (!queue.isEmpty()) {AcNode p = queue.remove();for (int i = 0; i < 26; ++i) {AcNode pc = p.children[i];if (pc == null) continue;if (p == root) {pc.fail = root;} else {AcNode q = p.fail;while (q != null) {AcNode qc = q.children[pc.data - 'a'];if (qc != null) {pc.fail = qc;break;}q = q.fail;}if (q == null) {pc.fail = root;}}queue.add(pc);}} }

通過按層來計算每個節點的子節點的失效指針,剛剛舉的那個例子,最后構建完成之后的 AC 自動機就是下面這個樣子:

AC 自動機到此就構建完成了。我們現在來看下,如何在 AC 自動機上匹配主串?

我們還是拿之前的例子來講解。在匹配過程中,主串從 i=0 開始,AC 自動機從指針 p=root 開始,假設模式串是 b,主串是 a。

  • 如果 p 指向的節點有一個等于 b[i] 的子節點 x,我們就更新 p 指向 x,這個時候我們需要通過失敗指針,檢測一系列失敗指針為結尾的路徑是否是模式串。這一句不好理解,你可以結合代碼看。處理完之后,我們將 i 加一,繼續這兩個過程;
  • 如果 p 指向的節點沒有等于 b[i] 的子節點,那失敗指針就派上用場了,我們讓 p=p->fail,然后繼續這 2 個過程。

關于匹配的這部分,文字描述不如代碼看得清楚,所以我把代碼貼了出來,非常簡短,并且添加了詳細的注釋,你可以對照著看下。這段代碼輸出的就是,在主串中每個可以匹配的模式串出現的位置。

public void match(char[] text) { // text 是主串int n = text.length;AcNode p = root;for (int i = 0; i < n; ++i) {int idx = text[i] - 'a';while (p.children[idx] == null && p != root) {p = p.fail; // 失敗指針發揮作用的地方}p = p.children[idx];if (p == null) p = root; // 如果沒有匹配的,從 root 開始重新匹配AcNode tmp = p;while (tmp != root) { // 打印出可以匹配的模式串if (tmp.isEndingChar == true) {int pos = i-tmp.length+1;System.out.println(" 匹配起始下標 " + pos + "; 長度 " + tmp.length);}tmp = tmp.fail;}} }

解答開篇

AC 自動機的內容講完了,關于開篇的問題,你應該能解答了吧?實際上,我上面貼出來的代碼,已經是一個敏感詞過濾的原型代碼了。它可以找到所有敏感詞出現的位置(在用戶輸入的文本中的起始下標)。你只需要稍加改造,再遍歷一遍文本內容(主串),就可以將文本中的所有敏感詞替換成“***”。

所以我這里著重講一下,AC 自動機實現的敏感詞過濾系統,是否比單模式串匹配方法更高效呢?

首先,我們需要將敏感詞構建成 AC 自動機,包括構建 Trie 樹以及構建失敗指針。

我們上一節講過,Trie 樹構建的時間復雜度是 O(m*len),其中 len 表示敏感詞的平均長度,m 表示敏感詞的個數。那構建失敗指針的時間復雜度是多少呢?我這里給出一個不是很緊確的上界。

假設 Trie 樹中總的節點個數是 k,每個節點構建失敗指針的時候,(你可以看下代碼)最耗時的環節是 while 循環中的 q=q->fail,每運行一次這個語句,q 指向節點的深度都會減少 1,而樹的高度最高也不會超過 len,所以每個節點構建失敗指針的時間復雜度是 O(len)。整個失敗指針的構建過程就是 O(k*len)。

不過,AC 自動機的構建過程都是預先處理好的,構建好之后,并不會頻繁地更新,所以不會影響到敏感詞過濾的運行效率。

我們再來看下,用 AC 自動機做匹配的時間復雜度是多少?

跟剛剛構建失敗指針的分析類似,for 循環依次遍歷主串中的每個字符,for 循環內部最耗時的部分也是 while 循環,而這一部分的時間復雜度也是 O(len),所以總的匹配的時間復雜度就是 O(n*len)。因為敏感詞并不會很長,而且這個時間復雜度只是一個非常寬泛的上限,實際情況下,可能近似于 O(n),所以 AC 自動機做敏感詞過濾,性能非常高。

你可以會說,從時間復雜度上看,AC 自動機匹配的效率跟 Trie 樹一樣啊。實際上,因為失效指針可能大部分情況下都指向 root 節點,所以絕大部分情況下,在 AC 自動機上做匹配的效率要遠高于剛剛計算出的比較寬泛的時間復雜度。只有在極端情況下,如圖所示,AC 自動機的性能才會退化的跟 Trie 樹一樣。

多模式串匹配算法,AC 自動機。單模式串匹配算法是為了快速在主串中查找一個模式串,而多模式串匹配算法是為了快速在主串中查找多個模式串。

AC 自動機是基于 Trie 樹的一種改進算法,它跟 Trie 樹的關系,就像單模式串中,KMP 算法與 BF 算法的關系一樣。KMP 算法中有一個非常關鍵的 next 數組,類比到 AC 自動機中就是失敗指針。而且,AC 自動機失敗指針的構建過程,跟 KMP 算法中計算 next 數組極其相似。所以,要理解 AC 自動機,最好先掌握 KMP 算法,因為 AC 自動機其實就是 KMP 算法在多模式串上的改造。

整個 AC 自動機算法包含兩個部分,第一部分是將多個模式串構建成 AC 自動機,第二部分是在 AC 自動機中匹配主串。第一部分又分為兩個小的步驟,一個是將模式串構建成 Trie 樹,另一個是在 Trie 樹上構建失敗指針。

總結

以上是生活随笔為你收集整理的数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

成人亚洲精品久久久久 | 色婷婷av一区二区三区之红樱桃 | 国产精品亚洲综合色区韩国 | √天堂资源地址中文在线 | 国产无套内射久久久国产 | 日韩精品无码免费一区二区三区 | 又黄又爽又色的视频 | 久久精品99久久香蕉国产色戒 | 四虎国产精品免费久久 | 久久久久久a亚洲欧洲av冫 | 欧美精品无码一区二区三区 | av人摸人人人澡人人超碰下载 | 久久久国产精品无码免费专区 | 亚洲欧美日韩国产精品一区二区 | 国产美女极度色诱视频www | 欧美日韩在线亚洲综合国产人 | 粉嫩少妇内射浓精videos | 亚洲码国产精品高潮在线 | 青草视频在线播放 | 伦伦影院午夜理论片 | 欧美激情综合亚洲一二区 | 久久久久成人片免费观看蜜芽 | v一区无码内射国产 | 老子影院午夜伦不卡 | 性生交大片免费看l | 久久久久久久女国产乱让韩 | 麻豆国产人妻欲求不满谁演的 | 国产艳妇av在线观看果冻传媒 | 天堂无码人妻精品一区二区三区 | 377p欧洲日本亚洲大胆 | 久久久精品人妻久久影视 | 国产人妻精品一区二区三区 | 免费人成在线视频无码 | 中文字幕无码免费久久99 | 国产精品视频免费播放 | 欧美性色19p | 欧美三级不卡在线观看 | 中文字幕av日韩精品一区二区 | 国产亚av手机在线观看 | 国产三级久久久精品麻豆三级 | 国产av无码专区亚洲a∨毛片 | 丰腴饱满的极品熟妇 | 国产精品免费大片 | 国产高清av在线播放 | 18无码粉嫩小泬无套在线观看 | 在线看片无码永久免费视频 | 亚洲中文字幕乱码av波多ji | 成人综合网亚洲伊人 | 少妇无套内谢久久久久 | 综合人妻久久一区二区精品 | 国产suv精品一区二区五 | 欧美 丝袜 自拍 制服 另类 | 亚洲日韩av一区二区三区四区 | 一本色道久久综合亚洲精品不卡 | 亚洲成a人片在线观看无码 | 亚洲日韩一区二区三区 | 乱人伦人妻中文字幕无码久久网 | 99久久无码一区人妻 | 久久综合九色综合欧美狠狠 | 国产又粗又硬又大爽黄老大爷视 | 红桃av一区二区三区在线无码av | 成人精品视频一区二区 | 国产成人无码av在线影院 | a在线亚洲男人的天堂 | 在线 国产 欧美 亚洲 天堂 | 国产亚洲欧美日韩亚洲中文色 | 亚洲色欲久久久综合网东京热 | 一个人看的www免费视频在线观看 | 在线а√天堂中文官网 | 无码人妻少妇伦在线电影 | 中文亚洲成a人片在线观看 | 国産精品久久久久久久 | 日本饥渴人妻欲求不满 | 激情人妻另类人妻伦 | 国产在线精品一区二区高清不卡 | 亚洲中文字幕无码中文字在线 | 丰腴饱满的极品熟妇 | 人人爽人人澡人人人妻 | 中文久久乱码一区二区 | 人人妻人人澡人人爽欧美一区 | 久久久国产一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 扒开双腿吃奶呻吟做受视频 | 久久无码人妻影院 | 日本熟妇人妻xxxxx人hd | 性做久久久久久久免费看 | 亚洲一区二区三区播放 | 亚洲另类伦春色综合小说 | 在线观看国产一区二区三区 | 精品国产成人一区二区三区 | 蜜桃视频韩日免费播放 | 波多野42部无码喷潮在线 | 久久无码中文字幕免费影院蜜桃 | 欧美日本精品一区二区三区 | 国产莉萝无码av在线播放 | 成人精品一区二区三区中文字幕 | 久久精品国产精品国产精品污 | 兔费看少妇性l交大片免费 | 亚洲精品久久久久avwww潮水 | 人人妻人人澡人人爽欧美精品 | 国产成人精品久久亚洲高清不卡 | 中国大陆精品视频xxxx | 熟女少妇在线视频播放 | 国产后入清纯学生妹 | 亚洲成av人片在线观看无码不卡 | 欧美黑人性暴力猛交喷水 | 18禁黄网站男男禁片免费观看 | 国产精品亚洲专区无码不卡 | 国产精品鲁鲁鲁 | 无码av最新清无码专区吞精 | 国产成人久久精品流白浆 | 亚洲男人av天堂午夜在 | 一区二区三区高清视频一 | 无码免费一区二区三区 | 欧美成人午夜精品久久久 | 男女下面进入的视频免费午夜 | 色一情一乱一伦一视频免费看 | 少妇人妻av毛片在线看 | 丰满少妇女裸体bbw | 天堂亚洲免费视频 | 六月丁香婷婷色狠狠久久 | 麻豆成人精品国产免费 | 久久精品国产日本波多野结衣 | 野外少妇愉情中文字幕 | 久久久久se色偷偷亚洲精品av | 粗大的内捧猛烈进出视频 | 乌克兰少妇性做爰 | 国产成人无码av在线影院 | 国产精品人妻一区二区三区四 | 亚洲精品国产第一综合99久久 | 久久久www成人免费毛片 | 一本色道久久综合亚洲精品不卡 | 久久久久人妻一区精品色欧美 | 牲交欧美兽交欧美 | 天天燥日日燥 | 中文字幕人妻无码一夲道 | 无码国产激情在线观看 | av人摸人人人澡人人超碰下载 | 捆绑白丝粉色jk震动捧喷白浆 | 久久综合狠狠综合久久综合88 | 岛国片人妻三上悠亚 | 男女超爽视频免费播放 | 少妇人妻av毛片在线看 | 精品久久久无码人妻字幂 | 久久久久久久久蜜桃 | 亚洲大尺度无码无码专区 | 无码精品人妻一区二区三区av | 日本一区二区三区免费高清 | 永久免费精品精品永久-夜色 | 女人被爽到呻吟gif动态图视看 | 99久久久国产精品无码免费 | 国产综合在线观看 | 国产超级va在线观看视频 | 国产特级毛片aaaaaa高潮流水 | 熟女体下毛毛黑森林 | 国产精品爱久久久久久久 | 午夜无码人妻av大片色欲 | 亚洲一区二区三区播放 | 色妞www精品免费视频 | 欧美freesex黑人又粗又大 | 国产亚洲精品久久久久久久 | 国产真实乱对白精彩久久 | 国产色精品久久人妻 | 国产精品第一区揄拍无码 | 无码国内精品人妻少妇 | 久久熟妇人妻午夜寂寞影院 | 亚洲爆乳精品无码一区二区三区 | 亚洲精品综合一区二区三区在线 | 2020久久香蕉国产线看观看 | 极品尤物被啪到呻吟喷水 | 日韩亚洲欧美中文高清在线 | 高清无码午夜福利视频 | 成熟人妻av无码专区 | 成人av无码一区二区三区 | 欧美xxxx黑人又粗又长 | 内射后入在线观看一区 | 精品偷拍一区二区三区在线看 | www成人国产高清内射 | 一个人看的www免费视频在线观看 | 丰满人妻翻云覆雨呻吟视频 | 日本www一道久久久免费榴莲 | 狂野欧美性猛交免费视频 | av小次郎收藏 | 亚洲精品成人福利网站 | 亚洲人亚洲人成电影网站色 | 日韩欧美成人免费观看 | 亚洲va欧美va天堂v国产综合 | 亚洲男人av香蕉爽爽爽爽 | 美女扒开屁股让男人桶 | 日本熟妇人妻xxxxx人hd | 亚洲 欧美 激情 小说 另类 | 国产精品无码一区二区桃花视频 | 午夜丰满少妇性开放视频 | 亚洲男人av香蕉爽爽爽爽 | 午夜无码人妻av大片色欲 | 国产精品.xx视频.xxtv | 日日摸夜夜摸狠狠摸婷婷 | www一区二区www免费 | 一个人免费观看的www视频 | 欧美国产亚洲日韩在线二区 | 亚洲欧洲日本综合aⅴ在线 | 国产99久久精品一区二区 | 亚洲欧洲日本综合aⅴ在线 | 国产精品第一国产精品 | 中文字幕av无码一区二区三区电影 | 免费人成在线观看网站 | 精品久久久久久亚洲精品 | 狂野欧美性猛交免费视频 | 啦啦啦www在线观看免费视频 | 色综合久久网 | 人人爽人人爽人人片av亚洲 | 精品熟女少妇av免费观看 | 色婷婷久久一区二区三区麻豆 | 免费无码肉片在线观看 | 中文字幕 亚洲精品 第1页 | 国产精品无码一区二区桃花视频 | 蜜臀av在线播放 久久综合激激的五月天 | 精品久久久久久人妻无码中文字幕 | 国产后入清纯学生妹 | 一本色道久久综合亚洲精品不卡 | 少妇高潮喷潮久久久影院 | 无码精品人妻一区二区三区av | 欧美日韩人成综合在线播放 | 天天拍夜夜添久久精品大 | 亚洲人成人无码网www国产 | 国产又粗又硬又大爽黄老大爷视 | 成 人 免费观看网站 | 日韩人妻系列无码专区 | 亚洲一区二区三区无码久久 | 亚洲国产欧美国产综合一区 | 精品 日韩 国产 欧美 视频 | 日本精品久久久久中文字幕 | 精品久久久无码人妻字幂 | 领导边摸边吃奶边做爽在线观看 | 国产一区二区三区四区五区加勒比 | 久久精品一区二区三区四区 | 伦伦影院午夜理论片 | 55夜色66夜色国产精品视频 | 色欲综合久久中文字幕网 | 日日夜夜撸啊撸 | 欧美三级不卡在线观看 | 亚无码乱人伦一区二区 | 精品人妻中文字幕有码在线 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 最新国产乱人伦偷精品免费网站 | 精品一区二区三区波多野结衣 | 欧美真人作爱免费视频 | 国产av久久久久精东av | 国产农村妇女高潮大叫 | 色噜噜亚洲男人的天堂 | 日韩精品无码一区二区中文字幕 | 综合激情五月综合激情五月激情1 | 日日碰狠狠躁久久躁蜜桃 | 欧美精品免费观看二区 | 久久精品国产亚洲精品 | 妺妺窝人体色www在线小说 | 人妻有码中文字幕在线 | 久久久久人妻一区精品色欧美 | 日本精品久久久久中文字幕 | 色狠狠av一区二区三区 | 在教室伦流澡到高潮hnp视频 | 老太婆性杂交欧美肥老太 | 丰满人妻被黑人猛烈进入 | 一本加勒比波多野结衣 | 精品水蜜桃久久久久久久 | 亚洲成av人综合在线观看 | 精品无码成人片一区二区98 | 久久精品国产日本波多野结衣 | 乱人伦人妻中文字幕无码 | 四虎国产精品一区二区 | 欧美激情一区二区三区成人 | 亚洲无人区一区二区三区 | 日日摸日日碰夜夜爽av | 狠狠色噜噜狠狠狠狠7777米奇 | 无码福利日韩神码福利片 | 色爱情人网站 | yw尤物av无码国产在线观看 | 人妻少妇精品久久 | 无码国产色欲xxxxx视频 | 黑人巨大精品欧美一区二区 | av无码不卡在线观看免费 | 欧美色就是色 | 欧美 丝袜 自拍 制服 另类 | 亚洲成a人片在线观看无码3d | 亚洲七七久久桃花影院 | 日日天日日夜日日摸 | 国产精品成人av在线观看 | 久久综合给久久狠狠97色 | 亚洲欧洲日本无在线码 | 免费观看的无遮挡av | 中文无码成人免费视频在线观看 | 四虎影视成人永久免费观看视频 | 亚洲国产av美女网站 | 亚洲国产日韩a在线播放 | 久久久久久久人妻无码中文字幕爆 | 久9re热视频这里只有精品 | 无码人妻黑人中文字幕 | 国产av剧情md精品麻豆 | 1000部夫妻午夜免费 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产亚洲人成在线播放 | 丰满少妇人妻久久久久久 | 日本www一道久久久免费榴莲 | 国产电影无码午夜在线播放 | 亚洲а∨天堂久久精品2021 | 日韩在线不卡免费视频一区 | 国产精品美女久久久久av爽李琼 | 国产内射爽爽大片视频社区在线 | 精品无码一区二区三区爱欲 | 国产成人亚洲综合无码 | 夜先锋av资源网站 | 国产69精品久久久久app下载 | 国产无遮挡又黄又爽又色 | 女人被男人爽到呻吟的视频 | 欧美日韩精品 | 亚洲の无码国产の无码步美 | 国产香蕉97碰碰久久人人 | a在线观看免费网站大全 | 久久久久se色偷偷亚洲精品av | 国产精品怡红院永久免费 | 亚洲色偷偷男人的天堂 | 一本精品99久久精品77 | 国产精品爱久久久久久久 | 四十如虎的丰满熟妇啪啪 | 国产亚洲美女精品久久久2020 | 中文字幕人妻丝袜二区 | 成年美女黄网站色大免费全看 | 波多野42部无码喷潮在线 | 亚洲人交乣女bbw | 日韩人妻无码一区二区三区久久99 | 奇米影视7777久久精品人人爽 | 日本大香伊一区二区三区 | 亚洲日韩精品欧美一区二区 | 漂亮人妻洗澡被公强 日日躁 | 久久综合九色综合欧美狠狠 | 日本饥渴人妻欲求不满 | 亚洲狠狠婷婷综合久久 | 久久久久成人片免费观看蜜芽 | 中文字幕精品av一区二区五区 | 最近中文2019字幕第二页 | 色婷婷久久一区二区三区麻豆 | 老司机亚洲精品影院无码 | 亚洲自偷自偷在线制服 | 无码人妻丰满熟妇区五十路百度 | 国产精品福利视频导航 | 亚洲精品美女久久久久久久 | 国产成人无码专区 | 久久精品人人做人人综合试看 | 青草视频在线播放 | 成人影院yy111111在线观看 | 少妇人妻av毛片在线看 | 强奷人妻日本中文字幕 | a在线亚洲男人的天堂 | 丰满妇女强制高潮18xxxx | 精品国产乱码久久久久乱码 | 亚洲一区二区三区在线观看网站 | 欧美日本免费一区二区三区 | 日韩无套无码精品 | 国产xxx69麻豆国语对白 | 亚洲国产综合无码一区 | 国产 浪潮av性色四虎 | 国产午夜精品一区二区三区嫩草 | 欧美黑人巨大xxxxx | 99久久久无码国产aaa精品 | 美女极度色诱视频国产 | 色妞www精品免费视频 | 国产婷婷色一区二区三区在线 | 久激情内射婷内射蜜桃人妖 | 国内揄拍国内精品少妇国语 | 超碰97人人射妻 | 精品国精品国产自在久国产87 | 青春草在线视频免费观看 | 人人澡人人透人人爽 | 性欧美videos高清精品 | 青草视频在线播放 | 自拍偷自拍亚洲精品10p | 国产人妻大战黑人第1集 | 国产精品香蕉在线观看 | 久久精品中文字幕大胸 | 国产激情一区二区三区 | 免费无码的av片在线观看 | 夜夜影院未满十八勿进 | 黑人粗大猛烈进出高潮视频 | 亚洲乱码日产精品bd | 免费看少妇作爱视频 | 亚洲精品一区国产 | 双乳奶水饱满少妇呻吟 | 国产av久久久久精东av | 99精品国产综合久久久久五月天 | 99国产精品白浆在线观看免费 | 一本久道久久综合婷婷五月 | 人人妻人人藻人人爽欧美一区 | 久久99精品久久久久婷婷 | 国产成人无码av一区二区 | 国产精品美女久久久网av | 亚洲色欲久久久综合网东京热 | 日韩人妻无码一区二区三区久久99 | 一本久道高清无码视频 | 精品久久综合1区2区3区激情 | 日日躁夜夜躁狠狠躁 | 亚洲日韩中文字幕在线播放 | 日日摸日日碰夜夜爽av | 老熟女重囗味hdxx69 | 欧洲vodafone精品性 | 无码人妻精品一区二区三区下载 | 日本一区二区三区免费播放 | 亚洲色欲色欲欲www在线 | 国内老熟妇对白xxxxhd | 中文字幕无码人妻少妇免费 | 国产麻豆精品一区二区三区v视界 | 国产一区二区三区影院 | 久久aⅴ免费观看 | 无码av中文字幕免费放 | 欧美丰满熟妇xxxx性ppx人交 | 综合激情五月综合激情五月激情1 | 一本无码人妻在中文字幕免费 | 九月婷婷人人澡人人添人人爽 | 在线观看国产一区二区三区 | 亚洲国产精品久久久天堂 | 国产婷婷色一区二区三区在线 | 男人和女人高潮免费网站 | 久久国产精品二国产精品 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 强辱丰满人妻hd中文字幕 | 中文字幕无码免费久久99 | 免费无码肉片在线观看 | 免费乱码人妻系列无码专区 | 国产人妻人伦精品1国产丝袜 | 国产亚洲精品精品国产亚洲综合 | 亚洲日韩av一区二区三区中文 | 色综合视频一区二区三区 | 日韩人妻系列无码专区 | 国产成人无码av在线影院 | 亚洲精品中文字幕乱码 | 在线a亚洲视频播放在线观看 | 国产婷婷色一区二区三区在线 | 免费观看黄网站 | 日韩在线不卡免费视频一区 | 欧美国产日产一区二区 | 色一情一乱一伦一视频免费看 | 真人与拘做受免费视频一 | 国产超碰人人爽人人做人人添 | 亚洲成av人片在线观看无码不卡 | 日日麻批免费40分钟无码 | 精品国精品国产自在久国产87 | 熟妇人妻激情偷爽文 | 欧美性猛交xxxx富婆 | 天干天干啦夜天干天2017 | 精品国精品国产自在久国产87 | 色偷偷人人澡人人爽人人模 | 欧美自拍另类欧美综合图片区 | 老司机亚洲精品影院 | 欧美黑人性暴力猛交喷水 | 久久亚洲精品中文字幕无男同 | 亚洲天堂2017无码 | 97夜夜澡人人爽人人喊中国片 | 国产成人无码区免费内射一片色欲 | 男女超爽视频免费播放 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲精品一区二区三区四区五区 | 久久久www成人免费毛片 | 欧美人与牲动交xxxx | 亚洲春色在线视频 | 色婷婷久久一区二区三区麻豆 | 中文字幕乱码中文乱码51精品 | 亚洲国产精品一区二区美利坚 | 性史性农村dvd毛片 | 久久午夜无码鲁丝片 | 色欲av亚洲一区无码少妇 | 少妇被黑人到高潮喷出白浆 | 内射巨臀欧美在线视频 | 国产无遮挡又黄又爽又色 | 97精品国产97久久久久久免费 | 国产精品毛片一区二区 | 在线天堂新版最新版在线8 | 娇妻被黑人粗大高潮白浆 | 97久久精品无码一区二区 | 无码毛片视频一区二区本码 | 国産精品久久久久久久 | 成人无码视频在线观看网站 | 中文字幕无线码免费人妻 | 麻豆精产国品 | 精品亚洲韩国一区二区三区 | 久久精品丝袜高跟鞋 | 亚洲日韩一区二区三区 | 国产国产精品人在线视 | 亚洲综合无码久久精品综合 | 国产av久久久久精东av | 无套内谢的新婚少妇国语播放 | 又粗又大又硬毛片免费看 | 色婷婷综合中文久久一本 | 装睡被陌生人摸出水好爽 | 成人无码视频免费播放 | 欧美人与善在线com | 乌克兰少妇xxxx做受 | 国产成人无码av一区二区 | 丝袜人妻一区二区三区 | 中文字幕无码日韩专区 | 又粗又大又硬又长又爽 | 女人和拘做爰正片视频 | 中文字幕无码热在线视频 | 日本成熟视频免费视频 | 性生交大片免费看女人按摩摩 | 国产麻豆精品精东影业av网站 | 欧美精品无码一区二区三区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲中文字幕在线观看 | 欧美日韩一区二区综合 | 无码av中文字幕免费放 | 精品午夜福利在线观看 | 狠狠躁日日躁夜夜躁2020 | 野狼第一精品社区 | av人摸人人人澡人人超碰下载 | 蜜桃av抽搐高潮一区二区 | 特黄特色大片免费播放器图片 | 最近中文2019字幕第二页 | 欧美老妇交乱视频在线观看 | 欧美成人家庭影院 | 国产av剧情md精品麻豆 | 中文字幕无码av激情不卡 | 亚洲一区二区三区在线观看网站 | 99久久人妻精品免费一区 | 鲁大师影院在线观看 | 最近中文2019字幕第二页 | 西西人体www44rt大胆高清 | 精品国产一区二区三区四区在线看 | 人人澡人人透人人爽 | 狠狠综合久久久久综合网 | 奇米影视888欧美在线观看 | 亚洲午夜福利在线观看 | 精品久久久久久人妻无码中文字幕 | 中文字幕无码人妻少妇免费 | 亚洲 a v无 码免 费 成 人 a v | 精品亚洲成av人在线观看 | 国产熟妇另类久久久久 | 少妇无码av无码专区在线观看 | 高潮喷水的毛片 | 在线播放无码字幕亚洲 | 亚洲va欧美va天堂v国产综合 | 俺去俺来也在线www色官网 | 强伦人妻一区二区三区视频18 | 亚洲一区av无码专区在线观看 | 久久zyz资源站无码中文动漫 | 无码人妻av免费一区二区三区 | 久久精品女人天堂av免费观看 | 97无码免费人妻超级碰碰夜夜 | 色综合久久网 | 免费看男女做好爽好硬视频 | 动漫av网站免费观看 | 一本大道伊人av久久综合 | 亚洲成a人片在线观看无码 | 无码午夜成人1000部免费视频 | 国产人成高清在线视频99最全资源 | 最新国产麻豆aⅴ精品无码 | 狠狠色噜噜狠狠狠7777奇米 | 捆绑白丝粉色jk震动捧喷白浆 | 青青久在线视频免费观看 | 蜜臀aⅴ国产精品久久久国产老师 | 日韩人妻无码一区二区三区久久99 | 国产无av码在线观看 | 99久久精品无码一区二区毛片 | 性欧美疯狂xxxxbbbb | 无码一区二区三区在线观看 | 色欲av亚洲一区无码少妇 | 国产偷国产偷精品高清尤物 | 国产suv精品一区二区五 | 国产人妻精品一区二区三区 | 宝宝好涨水快流出来免费视频 | 中文字幕无线码免费人妻 | 成在人线av无码免观看麻豆 | 国产精品无套呻吟在线 | 在线播放亚洲第一字幕 | 亚洲色欲色欲欲www在线 | 99在线 | 亚洲 | 国内丰满熟女出轨videos | 国内揄拍国内精品少妇国语 | 日本精品人妻无码免费大全 | 精品午夜福利在线观看 | 久久精品国产大片免费观看 | 久久精品国产精品国产精品污 | 成人女人看片免费视频放人 | 黑人玩弄人妻中文在线 | 久久亚洲中文字幕精品一区 | 精品偷自拍另类在线观看 | 成人免费视频视频在线观看 免费 | 国产精品内射视频免费 | 少妇激情av一区二区 | 精品国产福利一区二区 | 97无码免费人妻超级碰碰夜夜 | 麻豆人妻少妇精品无码专区 | 精品久久综合1区2区3区激情 | 久久这里只有精品视频9 | 一本无码人妻在中文字幕免费 | 性欧美牲交xxxxx视频 | 欧美乱妇无乱码大黄a片 | 国产无遮挡吃胸膜奶免费看 | 日韩欧美群交p片內射中文 | 国产精品人人妻人人爽 | 国产精品美女久久久网av | 中文字幕人成乱码熟女app | 无套内谢老熟女 | 又色又爽又黄的美女裸体网站 | 97无码免费人妻超级碰碰夜夜 | 亚洲无人区午夜福利码高清完整版 | 亚洲综合精品香蕉久久网 | 国产超级va在线观看视频 | 嫩b人妻精品一区二区三区 | 国产舌乚八伦偷品w中 | 成年女人永久免费看片 | 成人片黄网站色大片免费观看 | 内射欧美老妇wbb | 丰满肥臀大屁股熟妇激情视频 | 久久精品国产99精品亚洲 | 久久综合九色综合97网 | 国产精品久久久久久久9999 | 天天摸天天透天天添 | 久久99精品久久久久婷婷 | 97se亚洲精品一区 | 国产成人精品久久亚洲高清不卡 | 99国产精品白浆在线观看免费 | 成人免费视频视频在线观看 免费 | 亚洲欧洲日本综合aⅴ在线 | 国产va免费精品观看 | 亚洲の无码国产の无码影院 | 好爽又高潮了毛片免费下载 | 成人免费视频一区二区 | 亚洲午夜久久久影院 | 国产激情无码一区二区app | 帮老师解开蕾丝奶罩吸乳网站 | 国产精品美女久久久久av爽李琼 | 亚洲精品一区二区三区婷婷月 | a国产一区二区免费入口 | 久久国产劲爆∧v内射 | 国产精品99爱免费视频 | 久久亚洲a片com人成 | 久久久久久a亚洲欧洲av冫 | 亚洲天堂2017无码 | 四虎永久在线精品免费网址 | 综合激情五月综合激情五月激情1 | 日本一本二本三区免费 | 国产欧美精品一区二区三区 | 免费无码的av片在线观看 | 大地资源网第二页免费观看 | 特黄特色大片免费播放器图片 | 亚洲aⅴ无码成人网站国产app | 精品成在人线av无码免费看 | 日韩成人一区二区三区在线观看 | 未满成年国产在线观看 | 正在播放东北夫妻内射 | 少妇久久久久久人妻无码 | 国产 浪潮av性色四虎 | www国产亚洲精品久久久日本 | 美女黄网站人色视频免费国产 | 国产午夜精品一区二区三区嫩草 | 亚洲狠狠婷婷综合久久 | 色婷婷久久一区二区三区麻豆 | 国产精品福利视频导航 | 国产精品亚洲综合色区韩国 | 久久99精品国产.久久久久 | 日韩人妻少妇一区二区三区 | √8天堂资源地址中文在线 | 亚洲人亚洲人成电影网站色 | 亚洲爆乳无码专区 | 性欧美疯狂xxxxbbbb | 久久久精品欧美一区二区免费 | 日韩无套无码精品 | 高中生自慰www网站 | 欧美国产日韩久久mv | 精品久久久中文字幕人妻 | 给我免费的视频在线观看 | 日日橹狠狠爱欧美视频 | 日韩av无码一区二区三区不卡 | 亚欧洲精品在线视频免费观看 | 久久精品丝袜高跟鞋 | 成人一在线视频日韩国产 | 青青青爽视频在线观看 | 奇米影视7777久久精品人人爽 | 亚洲熟熟妇xxxx | 亚洲国产av精品一区二区蜜芽 | 亚洲日韩av一区二区三区四区 | 日日天日日夜日日摸 | 中文字幕日韩精品一区二区三区 | 国产猛烈高潮尖叫视频免费 | 丰满岳乱妇在线观看中字无码 | 99久久精品国产一区二区蜜芽 | 久久久无码中文字幕久... | 日日橹狠狠爱欧美视频 | 波多野42部无码喷潮在线 | 大色综合色综合网站 | 一本大道伊人av久久综合 | 福利一区二区三区视频在线观看 | 国产真人无遮挡作爱免费视频 | 日韩欧美中文字幕公布 | 亚洲熟悉妇女xxx妇女av | 蜜桃视频韩日免费播放 | 水蜜桃av无码 | 秋霞成人午夜鲁丝一区二区三区 | 97久久超碰中文字幕 | 日本熟妇大屁股人妻 | 亚洲国产精品无码一区二区三区 | 青青久在线视频免费观看 | 国精品人妻无码一区二区三区蜜柚 | 午夜福利试看120秒体验区 | 日韩精品无码一区二区中文字幕 | 欧美日韩色另类综合 | 台湾无码一区二区 | 国内精品一区二区三区不卡 | 牲交欧美兽交欧美 | 欧美 日韩 人妻 高清 中文 | 国产无av码在线观看 | 欧美野外疯狂做受xxxx高潮 | 国产av无码专区亚洲a∨毛片 | 久久99精品久久久久婷婷 | 国产成人综合在线女婷五月99播放 | 青草青草久热国产精品 | 老头边吃奶边弄进去呻吟 | 麻豆md0077饥渴少妇 | 亚洲aⅴ无码成人网站国产app | 俺去俺来也在线www色官网 | 天天综合网天天综合色 | 色欲av亚洲一区无码少妇 | 内射爽无广熟女亚洲 | 国产一区二区三区四区五区加勒比 | 永久黄网站色视频免费直播 | 97夜夜澡人人双人人人喊 | 精品欧美一区二区三区久久久 | 国模大胆一区二区三区 | 久久人人爽人人人人片 | 精品无人国产偷自产在线 | 亚洲高清偷拍一区二区三区 | 十八禁真人啪啪免费网站 | 久久精品女人的天堂av | 麻花豆传媒剧国产免费mv在线 | 乱人伦人妻中文字幕无码久久网 | 亚洲乱码中文字幕在线 | 午夜免费福利小电影 | 人妻人人添人妻人人爱 | 国产情侣作爱视频免费观看 | 亚洲熟女一区二区三区 | 亚洲精品久久久久avwww潮水 | 久久99久久99精品中文字幕 | 在线精品国产一区二区三区 | 奇米影视888欧美在线观看 | 无码免费一区二区三区 | 中文无码成人免费视频在线观看 | 午夜精品久久久久久久 | 97资源共享在线视频 | 亚洲国产精品成人久久蜜臀 | 成人亚洲精品久久久久软件 | 激情内射亚州一区二区三区爱妻 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产精品成人av在线观看 | 精品人妻人人做人人爽夜夜爽 | 无码av中文字幕免费放 | 无码精品人妻一区二区三区av | 国产精品国产三级国产专播 | 内射欧美老妇wbb | 成人精品一区二区三区中文字幕 | 免费无码av一区二区 | 久久久精品国产sm最大网站 | 色 综合 欧美 亚洲 国产 | 欧美日韩亚洲国产精品 | 国产成人无码av片在线观看不卡 | 无码毛片视频一区二区本码 | 亚洲a无码综合a国产av中文 | 久久亚洲日韩精品一区二区三区 | 天天燥日日燥 | 99er热精品视频 | 国内少妇偷人精品视频 | 一区二区三区乱码在线 | 欧洲 | 亚洲自偷自偷在线制服 | 亚洲日韩中文字幕在线播放 | 久久久精品成人免费观看 | ass日本丰满熟妇pics | 又紧又大又爽精品一区二区 | 亚洲欧美国产精品专区久久 | 少妇被粗大的猛进出69影院 | 狠狠色欧美亚洲狠狠色www | 亚洲日韩av一区二区三区四区 | 中文字幕无码日韩欧毛 | 97无码免费人妻超级碰碰夜夜 | 乱码av麻豆丝袜熟女系列 | 老太婆性杂交欧美肥老太 | 亚洲精品鲁一鲁一区二区三区 | 成人欧美一区二区三区黑人免费 | 亚洲综合无码一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 两性色午夜视频免费播放 | 亚洲爆乳无码专区 | 国精产品一区二区三区 | 国产乱人无码伦av在线a | 又大又黄又粗又爽的免费视频 | 一个人看的www免费视频在线观看 | 亚洲人成影院在线无码按摩店 | 国产精品久久国产精品99 | 国产乱人伦av在线无码 | 国产精品igao视频网 | 天天拍夜夜添久久精品 | 国产另类ts人妖一区二区 | 久久久久av无码免费网 | 久久国产精品精品国产色婷婷 | 中文字幕久久久久人妻 | 国产高潮视频在线观看 | 欧美丰满熟妇xxxx | 国产深夜福利视频在线 | 久久精品无码一区二区三区 | 欧美大屁股xxxxhd黑色 | 图片小说视频一区二区 | 欧美黑人性暴力猛交喷水 | 两性色午夜视频免费播放 | 黑人巨大精品欧美黑寡妇 | 欧美老妇与禽交 | 国内精品一区二区三区不卡 | 久久久久成人精品免费播放动漫 | 国产香蕉97碰碰久久人人 | 国产成人精品久久亚洲高清不卡 | 久久人妻内射无码一区三区 | 熟女少妇在线视频播放 | 天堂亚洲2017在线观看 | 国产又爽又猛又粗的视频a片 | 76少妇精品导航 | www国产亚洲精品久久久日本 | 天天爽夜夜爽夜夜爽 | 夜夜躁日日躁狠狠久久av | 亚洲成在人网站无码天堂 | 国产午夜无码精品免费看 | 久久婷婷五月综合色国产香蕉 | 欧美日韩在线亚洲综合国产人 | 大色综合色综合网站 | 国产精品久久久久久无码 | 大屁股大乳丰满人妻 | 国产成人精品优优av | 日韩欧美成人免费观看 | 精品无码国产一区二区三区av | 狠狠综合久久久久综合网 | 久久精品人妻少妇一区二区三区 | 国产精品无码成人午夜电影 | 成年美女黄网站色大免费全看 | 亚洲性无码av中文字幕 | 好屌草这里只有精品 | 亚洲aⅴ无码成人网站国产app | av香港经典三级级 在线 | 欧美第一黄网免费网站 | 小鲜肉自慰网站xnxx | 欧美精品国产综合久久 | 亚洲人成影院在线无码按摩店 | 日韩欧美群交p片內射中文 | 色噜噜亚洲男人的天堂 | 日本一区二区三区免费高清 | 精品一区二区三区无码免费视频 | 青青青爽视频在线观看 | 久久久久国色av免费观看性色 | 日韩精品乱码av一区二区 | 成人性做爰aaa片免费看不忠 | 日日麻批免费40分钟无码 | 亚洲高清偷拍一区二区三区 | 国产精品a成v人在线播放 | av小次郎收藏 | 99久久久无码国产精品免费 | 国产超碰人人爽人人做人人添 | 天干天干啦夜天干天2017 | 人人爽人人澡人人人妻 | 久久人人爽人人爽人人片av高清 | 九九热爱视频精品 | 亚洲国产av精品一区二区蜜芽 | 又色又爽又黄的美女裸体网站 | 国产精品久久久久无码av色戒 | 亚洲国产日韩a在线播放 | 午夜精品一区二区三区的区别 | 国产区女主播在线观看 | 亚洲日韩精品欧美一区二区 | 亚洲自偷精品视频自拍 | 丰满人妻翻云覆雨呻吟视频 | 国产在线精品一区二区三区直播 | 国产午夜无码精品免费看 | 性欧美大战久久久久久久 | 99久久精品无码一区二区毛片 | 美女黄网站人色视频免费国产 | 在线亚洲高清揄拍自拍一品区 | 国产精品怡红院永久免费 | 中文字幕av日韩精品一区二区 | 高潮毛片无遮挡高清免费视频 | 国产艳妇av在线观看果冻传媒 | 亚洲无人区午夜福利码高清完整版 | 国产人妻精品午夜福利免费 | 久热国产vs视频在线观看 | 激情亚洲一区国产精品 | 麻豆果冻传媒2021精品传媒一区下载 | 精品厕所偷拍各类美女tp嘘嘘 | 日日麻批免费40分钟无码 | 男人和女人高潮免费网站 | 国产精品无码一区二区三区不卡 | 欧美性生交xxxxx久久久 | 欧美亚洲国产一区二区三区 | 日日夜夜撸啊撸 | 国产精品欧美成人 | 在线精品国产一区二区三区 | 一本加勒比波多野结衣 | 久久久无码中文字幕久... | 午夜精品久久久久久久久 | 国产sm调教视频在线观看 | 欧美肥老太牲交大战 | 无码av免费一区二区三区试看 | a国产一区二区免费入口 | 亚洲色偷偷男人的天堂 | 1000部啪啪未满十八勿入下载 | 波多野结衣 黑人 | 亚洲第一无码av无码专区 | 国产精品免费大片 | 国产 浪潮av性色四虎 | 激情内射亚州一区二区三区爱妻 | 久久人人爽人人爽人人片ⅴ | 色婷婷综合激情综在线播放 | 国产精品久久久久无码av色戒 | 精品成人av一区二区三区 | 日欧一片内射va在线影院 | 欧洲熟妇精品视频 | 精品一区二区三区波多野结衣 | 女人和拘做爰正片视频 | 亚洲中文字幕无码中文字在线 | 大肉大捧一进一出视频出来呀 | 成熟妇人a片免费看网站 | 欧洲欧美人成视频在线 | 黑人大群体交免费视频 | 国产成人无码一二三区视频 | 人妻互换免费中文字幕 | 亚洲综合色区中文字幕 | 国产成人亚洲综合无码 | 国产偷国产偷精品高清尤物 | 性生交片免费无码看人 | 十八禁真人啪啪免费网站 | 无码国内精品人妻少妇 | 日韩精品无码一本二本三本色 | 日日碰狠狠躁久久躁蜜桃 | 奇米影视7777久久精品人人爽 | 久久久久国色av免费观看性色 | 欧美性生交活xxxxxdddd | 亚洲区欧美区综合区自拍区 | 色欲久久久天天天综合网精品 | 国产精品久久国产精品99 | 国产莉萝无码av在线播放 | 日本免费一区二区三区最新 | 亚洲熟妇色xxxxx欧美老妇 | 丰满护士巨好爽好大乳 | 鲁鲁鲁爽爽爽在线视频观看 | 久久熟妇人妻午夜寂寞影院 | 久久99精品国产麻豆蜜芽 | 荫蒂添的好舒服视频囗交 | 性生交大片免费看l | 国产无套粉嫩白浆在线 | 骚片av蜜桃精品一区 | 黑人巨大精品欧美黑寡妇 | 动漫av网站免费观看 | 久久久久久亚洲精品a片成人 | 午夜熟女插插xx免费视频 | 色情久久久av熟女人妻网站 | 男女爱爱好爽视频免费看 | 98国产精品综合一区二区三区 | 色老头在线一区二区三区 | 强伦人妻一区二区三区视频18 | www国产亚洲精品久久网站 | 丝袜足控一区二区三区 | 中文字幕人妻丝袜二区 | 综合激情五月综合激情五月激情1 | 四虎4hu永久免费 | 久久无码人妻影院 | 人妻插b视频一区二区三区 | 国产av剧情md精品麻豆 | 欧洲熟妇精品视频 | 牲欲强的熟妇农村老妇女 | 欧美精品免费观看二区 | 亚洲一区二区三区国产精华液 | 欧美国产日韩久久mv | 久久久精品成人免费观看 | 成人无码精品1区2区3区免费看 | 理论片87福利理论电影 | 国产人妻精品一区二区三区不卡 | 激情亚洲一区国产精品 | 亚洲小说春色综合另类 | 久久久www成人免费毛片 | 精品国产成人一区二区三区 | 国产香蕉97碰碰久久人人 | 欧美 日韩 人妻 高清 中文 | 欧洲熟妇精品视频 | 老熟妇乱子伦牲交视频 | 人妻插b视频一区二区三区 | 国产激情综合五月久久 | 欧美丰满熟妇xxxx性ppx人交 | 性欧美牲交在线视频 | 国产精品无码成人午夜电影 | 最新版天堂资源中文官网 | 少妇被黑人到高潮喷出白浆 | 亚洲乱码日产精品bd | 国产精品99爱免费视频 | 三级4级全黄60分钟 | 亚洲人交乣女bbw | 国产suv精品一区二区五 | 色综合久久久久综合一本到桃花网 | 亚洲国产精品无码久久久久高潮 | 国产精品手机免费 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲阿v天堂在线 | 色情久久久av熟女人妻网站 | 国产成人无码av片在线观看不卡 | 成人试看120秒体验区 | 最新国产麻豆aⅴ精品无码 | √天堂中文官网8在线 | 真人与拘做受免费视频 | 成人毛片一区二区 | 欧美三级a做爰在线观看 | 人人澡人摸人人添 | 中文无码精品a∨在线观看不卡 | 欧美人与牲动交xxxx | 女人被爽到呻吟gif动态图视看 | 国产亚洲欧美在线专区 | 亚洲人成影院在线无码按摩店 | 欧美性生交活xxxxxdddd | 国产精品人人爽人人做我的可爱 | 日本饥渴人妻欲求不满 | 日韩欧美中文字幕公布 | 欧美精品在线观看 | 伊人久久大香线蕉亚洲 | 131美女爱做视频 | 国产成人无码一二三区视频 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产va免费精品观看 | 97夜夜澡人人爽人人喊中国片 | 国产综合在线观看 | 中文字幕精品av一区二区五区 | 国产乱人无码伦av在线a | 久久精品丝袜高跟鞋 | 国产 浪潮av性色四虎 | 亚洲日韩精品欧美一区二区 | 双乳奶水饱满少妇呻吟 | 色一情一乱一伦一区二区三欧美 | 亚洲色大成网站www | 娇妻被黑人粗大高潮白浆 | 少妇性俱乐部纵欲狂欢电影 | 国产亚洲视频中文字幕97精品 | 亚洲熟悉妇女xxx妇女av | 国产黑色丝袜在线播放 | 国产成人无码区免费内射一片色欲 | 熟妇人妻中文av无码 | 一本精品99久久精品77 | 成人影院yy111111在线观看 | 国产亚洲欧美日韩亚洲中文色 | 人妻体内射精一区二区三四 | 狠狠色噜噜狠狠狠狠7777米奇 | 99riav国产精品视频 | 久久99精品久久久久久 | 欧美亚洲日韩国产人成在线播放 | 1000部啪啪未满十八勿入下载 | 中文精品无码中文字幕无码专区 | 九九在线中文字幕无码 | 国产人妻大战黑人第1集 | 亚洲无人区午夜福利码高清完整版 | 牲交欧美兽交欧美 | 久久久久久亚洲精品a片成人 | 东京热一精品无码av | 久久精品视频在线看15 | 3d动漫精品啪啪一区二区中 | 亚洲午夜福利在线观看 | 午夜精品久久久内射近拍高清 | 欧美丰满熟妇xxxx | 久久综合激激的五月天 | 国产成人综合色在线观看网站 | 老熟妇仑乱视频一区二区 | 国产手机在线αⅴ片无码观看 | 欧美大屁股xxxxhd黑色 | 中文字幕久久久久人妻 | 亚洲精品国产精品乱码视色 | 无码人妻久久一区二区三区不卡 | 国模大胆一区二区三区 | 国产成人无码午夜视频在线观看 | 欧洲熟妇色 欧美 | 亚洲人成网站免费播放 | 国产亚洲日韩欧美另类第八页 | 国产成人无码区免费内射一片色欲 | 欧美一区二区三区视频在线观看 | 无码国产激情在线观看 | 人妻夜夜爽天天爽三区 | а√天堂www在线天堂小说 | 国产舌乚八伦偷品w中 | 人妻人人添人妻人人爱 | 水蜜桃亚洲一二三四在线 | 久久精品女人的天堂av | 久久久精品国产sm最大网站 | 捆绑白丝粉色jk震动捧喷白浆 | 蜜桃av抽搐高潮一区二区 | 中文无码成人免费视频在线观看 | 国产另类ts人妖一区二区 | 国内综合精品午夜久久资源 | 亚洲欧美日韩成人高清在线一区 | 欧美老熟妇乱xxxxx | 99视频精品全部免费免费观看 | 国产在线精品一区二区高清不卡 | 久久久久国色av免费观看性色 | 国产色在线 | 国产 | 免费国产成人高清在线观看网站 | 天天摸天天透天天添 | 天下第一社区视频www日本 | 狠狠躁日日躁夜夜躁2020 | 男女作爱免费网站 | 高清不卡一区二区三区 | 久久国产精品二国产精品 | 久久综合网欧美色妞网 | 中文字幕人成乱码熟女app | 一个人看的视频www在线 | 日韩少妇内射免费播放 | 精品偷拍一区二区三区在线看 | 日韩精品乱码av一区二区 | 国产精品高潮呻吟av久久 | 乱人伦中文视频在线观看 | 亚洲人成网站在线播放942 | 丁香啪啪综合成人亚洲 | 一本色道久久综合狠狠躁 | 国产精品无码成人午夜电影 | 色五月丁香五月综合五月 | 1000部夫妻午夜免费 | 初尝人妻少妇中文字幕 | 精品国产av色一区二区深夜久久 | 亚洲人成影院在线无码按摩店 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产亚洲人成在线播放 | 久久国内精品自在自线 | 日韩人妻无码中文字幕视频 | 无套内谢的新婚少妇国语播放 | 内射白嫩少妇超碰 | 亚洲va中文字幕无码久久不卡 | 国产又爽又猛又粗的视频a片 | 人人爽人人爽人人片av亚洲 | 5858s亚洲色大成网站www | 亚洲熟妇自偷自拍另类 | 99久久精品无码一区二区毛片 | 亚洲欧美精品aaaaaa片 | 国产成人精品视频ⅴa片软件竹菊 | 熟妇女人妻丰满少妇中文字幕 | 激情内射亚州一区二区三区爱妻 | 午夜无码人妻av大片色欲 | 四虎国产精品免费久久 | 国产精品人人妻人人爽 | 人人妻人人澡人人爽欧美一区 | 精品国产av色一区二区深夜久久 | 久久久婷婷五月亚洲97号色 | 久激情内射婷内射蜜桃人妖 | 国产性生大片免费观看性 | 骚片av蜜桃精品一区 | a在线观看免费网站大全 | 成人欧美一区二区三区黑人免费 | 国产精品无码成人午夜电影 | 天天做天天爱天天爽综合网 | 国产亚洲精品久久久久久久 | 暴力强奷在线播放无码 | 久久久精品456亚洲影院 | 性生交大片免费看l | 精品人妻中文字幕有码在线 | 国产高潮视频在线观看 | 久久久久99精品国产片 | 思思久久99热只有频精品66 | 三级4级全黄60分钟 | 亚洲成a人片在线观看无码3d | 久久国产精品偷任你爽任你 | 亚洲天堂2017无码 | 日韩av无码一区二区三区不卡 | 激情内射日本一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲男人av天堂午夜在 | 国产高潮视频在线观看 | 日日麻批免费40分钟无码 | 久久久久人妻一区精品色欧美 | 久久久久久九九精品久 | 亚洲性无码av中文字幕 | 波多野结衣一区二区三区av免费 | 久久国产36精品色熟妇 | 日本免费一区二区三区最新 | 国产精品美女久久久久av爽李琼 | 99在线 | 亚洲 | 四虎影视成人永久免费观看视频 | 秋霞特色aa大片 | 曰韩无码二三区中文字幕 | 国产精品办公室沙发 | 一本精品99久久精品77 | 丰满少妇弄高潮了www | 精品国产一区二区三区四区在线看 | 国产激情综合五月久久 | 日韩欧美成人免费观看 | 国内精品久久久久久中文字幕 | 亚洲中文字幕无码一久久区 | 强辱丰满人妻hd中文字幕 | 55夜色66夜色国产精品视频 | 男女超爽视频免费播放 | 国产亚洲精品久久久闺蜜 | 国产精品对白交换视频 | 娇妻被黑人粗大高潮白浆 | 欧美丰满老熟妇xxxxx性 | 中文无码伦av中文字幕 | 精品国产麻豆免费人成网站 | 亚洲精品成人福利网站 | 国产精品va在线播放 | 小sao货水好多真紧h无码视频 | 国产人妻人伦精品 | 精品无人国产偷自产在线 | 久久久久免费精品国产 | 午夜福利不卡在线视频 | 免费男性肉肉影院 | 亚洲成色www久久网站 | 熟女俱乐部五十路六十路av | 伊人久久大香线蕉av一区二区 | 少妇性l交大片欧洲热妇乱xxx | 日日摸天天摸爽爽狠狠97 | 亚洲欧美综合区丁香五月小说 | 四虎国产精品一区二区 | 99riav国产精品视频 | 欧美真人作爱免费视频 | 国产成人无码av一区二区 | 18禁止看的免费污网站 | 日韩人妻无码一区二区三区久久99 | 精品日本一区二区三区在线观看 | 中文字幕无码乱人伦 | 国产午夜福利亚洲第一 | 国产乱码精品一品二品 | 亚洲中文字幕久久无码 | 国产高潮视频在线观看 | 国产超级va在线观看视频 | 日韩人妻无码一区二区三区久久99 | 噜噜噜亚洲色成人网站 | 色婷婷欧美在线播放内射 | 男女猛烈xx00免费视频试看 | 日日摸夜夜摸狠狠摸婷婷 | 亚洲а∨天堂久久精品2021 | 欧美性生交活xxxxxdddd | 亚洲日本va中文字幕 | 久久精品国产大片免费观看 | 国产亚洲精品久久久久久 | 无码人妻av免费一区二区三区 | 亚洲大尺度无码无码专区 | 欧美大屁股xxxxhd黑色 | 国产成人精品视频ⅴa片软件竹菊 | 久久伊人色av天堂九九小黄鸭 | av人摸人人人澡人人超碰下载 | 日本爽爽爽爽爽爽在线观看免 | 丰满少妇熟乱xxxxx视频 | 亚洲a无码综合a国产av中文 | 精品人人妻人人澡人人爽人人 | 日韩少妇内射免费播放 | 精品无码一区二区三区爱欲 | 免费看男女做好爽好硬视频 | 日韩 欧美 动漫 国产 制服 | 亚洲欧洲日本综合aⅴ在线 | 2019nv天堂香蕉在线观看 | 欧美老人巨大xxxx做受 | 粉嫩少妇内射浓精videos | 四虎4hu永久免费 | 水蜜桃色314在线观看 | 狠狠色色综合网站 | 亚洲国产精品一区二区第一页 | 中文字幕乱码人妻无码久久 | 亚洲综合无码久久精品综合 | 超碰97人人射妻 | 中文字幕乱码亚洲无线三区 | 女人被爽到呻吟gif动态图视看 | 亚洲精品中文字幕乱码 | 性欧美大战久久久久久久 | 国产亚洲精品久久久久久国模美 | 国产精品第一国产精品 | 天天av天天av天天透 | 无码国产乱人伦偷精品视频 | 成 人 免费观看网站 | 久久97精品久久久久久久不卡 | 亚洲七七久久桃花影院 | 亚洲国产一区二区三区在线观看 | 在线视频网站www色 | 欧洲美熟女乱又伦 | 亚洲中文字幕在线无码一区二区 | 中文字幕乱码中文乱码51精品 | 性生交大片免费看女人按摩摩 | 伊人色综合久久天天小片 | 国产激情无码一区二区 | 亚洲gv猛男gv无码男同 | 国产亚洲精品精品国产亚洲综合 | 激情综合激情五月俺也去 | 国产精品对白交换视频 | 无遮挡啪啪摇乳动态图 | 无码人妻av免费一区二区三区 | 亚洲国产高清在线观看视频 | 久久亚洲a片com人成 | 99久久人妻精品免费二区 | 国产精品第一区揄拍无码 | 亚洲精品www久久久 | 无码午夜成人1000部免费视频 | 国产两女互慰高潮视频在线观看 | 久久综合网欧美色妞网 | 日韩精品久久久肉伦网站 | 成在人线av无码免费 | 麻豆国产丝袜白领秘书在线观看 | 爽爽影院免费观看 | 国产激情无码一区二区app | 全黄性性激高免费视频 | 国产成人综合在线女婷五月99播放 | 亚洲欧美精品aaaaaa片 | 日韩精品a片一区二区三区妖精 | 在线 国产 欧美 亚洲 天堂 | 国产莉萝无码av在线播放 | 色婷婷欧美在线播放内射 | 4hu四虎永久在线观看 | 久精品国产欧美亚洲色aⅴ大片 | 男女超爽视频免费播放 | 四十如虎的丰满熟妇啪啪 | 日日摸日日碰夜夜爽av | 国产另类ts人妖一区二区 | 中国女人内谢69xxxxxa片 | 亚洲精品成a人在线观看 | 国产成人综合色在线观看网站 | 国产97人人超碰caoprom | 天天综合网天天综合色 | 学生妹亚洲一区二区 | 久久久久久亚洲精品a片成人 | 欧美人与动性行为视频 | 无遮挡啪啪摇乳动态图 | 中文毛片无遮挡高清免费 | 人妻中文无码久热丝袜 | √8天堂资源地址中文在线 | 一本无码人妻在中文字幕免费 | 少妇无码av无码专区在线观看 | 爆乳一区二区三区无码 | 亚洲精品国产精品乱码视色 | 在线精品国产一区二区三区 | 最近中文2019字幕第二页 | 日韩欧美成人免费观看 | 人妻无码αv中文字幕久久琪琪布 | 亚洲a无码综合a国产av中文 | 理论片87福利理论电影 | 欧美成人午夜精品久久久 | 国产成人人人97超碰超爽8 | 女人被男人躁得好爽免费视频 | 国产精品人人妻人人爽 | 日韩欧美群交p片內射中文 | 午夜丰满少妇性开放视频 | 欧美三级a做爰在线观看 | 国产激情一区二区三区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产人妻大战黑人第1集 | 日日天干夜夜狠狠爱 | 中文字幕人成乱码熟女app | aⅴ在线视频男人的天堂 | 亚洲自偷精品视频自拍 | 色噜噜亚洲男人的天堂 | 欧美成人高清在线播放 | 亚洲精品无码人妻无码 | 精品久久久无码人妻字幂 | 久久人人爽人人爽人人片ⅴ | 亚洲男人av香蕉爽爽爽爽 | 欧美自拍另类欧美综合图片区 | 久久人人爽人人爽人人片av高清 | 男女猛烈xx00免费视频试看 | 欧美性猛交内射兽交老熟妇 | 国产一区二区三区精品视频 | 精品夜夜澡人妻无码av蜜桃 | 国产无遮挡吃胸膜奶免费看 | 永久免费观看美女裸体的网站 | 国产两女互慰高潮视频在线观看 | 老熟妇仑乱视频一区二区 | 久久亚洲精品中文字幕无男同 | 国产精品香蕉在线观看 | 又粗又大又硬毛片免费看 | 综合人妻久久一区二区精品 | 香港三级日本三级妇三级 | 久久国内精品自在自线 | 精品aⅴ一区二区三区 | 网友自拍区视频精品 | 精品无码国产一区二区三区av | 婷婷五月综合激情中文字幕 | 蜜桃视频插满18在线观看 | 美女扒开屁股让男人桶 | 波多野42部无码喷潮在线 | 99久久亚洲精品无码毛片 | 国产精品-区区久久久狼 | 亚洲色在线无码国产精品不卡 | 麻豆成人精品国产免费 | 亚洲国产精品无码久久久久高潮 | 亚洲色成人中文字幕网站 | 亚洲熟妇色xxxxx欧美老妇y | 四虎影视成人永久免费观看视频 | 蜜臀av无码人妻精品 | 无码一区二区三区在线观看 | 国产精品多人p群无码 | 婷婷五月综合缴情在线视频 | 国产成人一区二区三区在线观看 | 夜精品a片一区二区三区无码白浆 | 午夜精品久久久久久久 | 国产在线aaa片一区二区99 | 国产真实乱对白精彩久久 | 欧美怡红院免费全部视频 | 无码人中文字幕 | 天堂一区人妻无码 | 377p欧洲日本亚洲大胆 | 伊人久久大香线蕉午夜 | 国产激情艳情在线看视频 | 亚洲国产日韩a在线播放 | 国产精品亚洲一区二区三区喷水 | 久久精品99久久香蕉国产色戒 | 精品一区二区三区波多野结衣 | 少妇人妻大乳在线视频 | 曰韩少妇内射免费播放 | 亚洲一区二区三区偷拍女厕 | 成年女人永久免费看片 | 国产免费久久精品国产传媒 | 日本一区二区三区免费播放 | 人妻少妇被猛烈进入中文字幕 | 日韩人妻无码一区二区三区久久99 | 无码任你躁久久久久久久 | 又大又黄又粗又爽的免费视频 | 亚洲热妇无码av在线播放 | 亚洲一区av无码专区在线观看 | 国产特级毛片aaaaaa高潮流水 | 色五月五月丁香亚洲综合网 | 性欧美videos高清精品 | 色综合久久久无码网中文 | 欧美成人高清在线播放 | 国产三级久久久精品麻豆三级 | 国产精品高潮呻吟av久久4虎 | 国产农村妇女高潮大叫 | 精品久久久无码中文字幕 | 欧美人与禽猛交狂配 | 色综合久久久无码网中文 | 好屌草这里只有精品 | 樱花草在线社区www | 中文精品无码中文字幕无码专区 | 无码国模国产在线观看 | 爱做久久久久久 | 麻豆精品国产精华精华液好用吗 | 久久午夜无码鲁丝片秋霞 | 99久久亚洲精品无码毛片 | 好爽又高潮了毛片免费下载 | 国产乱码精品一品二品 | 无码人中文字幕 | 亚洲国产av美女网站 | 丰满人妻被黑人猛烈进入 | 狠狠综合久久久久综合网 | 午夜理论片yy44880影院 | 国产一区二区三区精品视频 | 亚洲日韩av一区二区三区四区 | 久久久久国色av免费观看性色 | 日本一卡2卡3卡四卡精品网站 | 一本色道久久综合亚洲精品不卡 | 国产精品igao视频网 | 草草网站影院白丝内射 | 欧美激情内射喷水高潮 | 99久久久无码国产aaa精品 | 成人免费无码大片a毛片 | 中文字幕乱码中文乱码51精品 | 日本大香伊一区二区三区 | 国产午夜手机精彩视频 | 色综合久久久无码中文字幕 | 亚洲爆乳大丰满无码专区 | 好男人www社区 | 中文字幕人妻无码一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 中文无码伦av中文字幕 | 少女韩国电视剧在线观看完整 | 久久国产精品偷任你爽任你 | 欧美亚洲国产一区二区三区 | 女人被男人躁得好爽免费视频 | 无码人妻少妇伦在线电影 | 国产亚洲欧美在线专区 | 成人片黄网站色大片免费观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 成人综合网亚洲伊人 | 国产乱人偷精品人妻a片 | 性史性农村dvd毛片 | 人人妻人人澡人人爽人人精品 | 亚洲一区av无码专区在线观看 | 人妻少妇精品无码专区动漫 | 中文无码成人免费视频在线观看 | 国产精品久久久av久久久 | 亚洲男人av香蕉爽爽爽爽 | 少妇的肉体aa片免费 | 亚洲 日韩 欧美 成人 在线观看 | 国产成人精品优优av | 乱码午夜-极国产极内射 | 国内精品九九久久久精品 | 亚洲经典千人经典日产 | 欧美性猛交内射兽交老熟妇 | 爆乳一区二区三区无码 | 国产精品久久久一区二区三区 | 亚洲成a人片在线观看无码 | 丰满少妇高潮惨叫视频 | 亚洲精品中文字幕久久久久 | 偷窥村妇洗澡毛毛多 | 久久久久久av无码免费看大片 | 亚洲精品一区二区三区在线观看 | 欧美黑人乱大交 | 精品国产一区二区三区四区在线看 | 国产精品对白交换视频 | 日日夜夜撸啊撸 | 人人妻人人澡人人爽精品欧美 | 黄网在线观看免费网站 | 免费无码av一区二区 | 乱人伦人妻中文字幕无码久久网 | 久久久精品成人免费观看 | 欧美老妇交乱视频在线观看 | 动漫av网站免费观看 | 在线播放免费人成毛片乱码 | 久久久久久久女国产乱让韩 | 亚洲色欲久久久综合网东京热 | 伦伦影院午夜理论片 | 久久午夜无码鲁丝片午夜精品 | 无码人妻久久一区二区三区不卡 | 99久久精品午夜一区二区 | 日日天日日夜日日摸 | 国产亚洲精品久久久久久国模美 | 极品尤物被啪到呻吟喷水 | 久热国产vs视频在线观看 | 久久久久99精品成人片 | 少妇被粗大的猛进出69影院 | 国产人妻精品午夜福利免费 | 97久久超碰中文字幕 | a在线观看免费网站大全 | 小鲜肉自慰网站xnxx | 久久aⅴ免费观看 | 天堂一区人妻无码 | 99久久精品日本一区二区免费 | 一本色道久久综合狠狠躁 | 成人欧美一区二区三区黑人免费 | 国产一区二区三区影院 | 无码人妻黑人中文字幕 | 中文字幕人妻无码一夲道 | 欧美zoozzooz性欧美 | 娇妻被黑人粗大高潮白浆 | 丝袜美腿亚洲一区二区 | 国精品人妻无码一区二区三区蜜柚 | 精品欧美一区二区三区久久久 | 内射白嫩少妇超碰 | 一本久道高清无码视频 | 亚洲高清偷拍一区二区三区 | 精品国产福利一区二区 | 亚洲欧洲日本综合aⅴ在线 | 亚洲欧美精品伊人久久 | 野狼第一精品社区 | 欧美丰满少妇xxxx性 | 老司机亚洲精品影院无码 | 国产成人精品无码播放 | 色一情一乱一伦一区二区三欧美 | 18黄暴禁片在线观看 | 精品人妻中文字幕有码在线 | 76少妇精品导航 | 亚洲成色在线综合网站 | 亚洲精品美女久久久久久久 | 精品无码国产自产拍在线观看蜜 | 欧美色就是色 | 久久99精品久久久久久 | 日韩成人一区二区三区在线观看 | 国产精品高潮呻吟av久久 | 色欲综合久久中文字幕网 | 超碰97人人射妻 | 精品国精品国产自在久国产87 | www一区二区www免费 | 久久久国产精品无码免费专区 | 女人被男人躁得好爽免费视频 | 鲁一鲁av2019在线 | 中文无码成人免费视频在线观看 | 久久久久99精品国产片 | 又大又黄又粗又爽的免费视频 | 国产精品香蕉在线观看 | 又黄又爽又色的视频 | 欧洲vodafone精品性 | 亚洲中文无码av永久不收费 | 宝宝好涨水快流出来免费视频 | 亚洲精品中文字幕久久久久 | 精品国产av色一区二区深夜久久 | 国产热a欧美热a在线视频 | 99精品视频在线观看免费 | 国产精品爱久久久久久久 | 久久精品国产99精品亚洲 | 色偷偷人人澡人人爽人人模 | 97人妻精品一区二区三区 | 少妇人妻av毛片在线看 | 日韩精品一区二区av在线 | 日本高清一区免费中文视频 | 人妻少妇被猛烈进入中文字幕 | 狂野欧美性猛交免费视频 | 人妻互换免费中文字幕 | 国产精品无码成人午夜电影 | 97精品国产97久久久久久免费 | 国产成人一区二区三区别 | 伊人久久婷婷五月综合97色 | 天堂а√在线中文在线 | 中文精品久久久久人妻不卡 | 日本又色又爽又黄的a片18禁 | 少妇人妻偷人精品无码视频 | 中国女人内谢69xxxx | 亚洲伊人久久精品影院 | 日韩视频 中文字幕 视频一区 | 精品欧洲av无码一区二区三区 | 久久午夜夜伦鲁鲁片无码免费 | 麻花豆传媒剧国产免费mv在线 | 亚洲日韩av一区二区三区中文 | 亚洲熟熟妇xxxx | 国内老熟妇对白xxxxhd | 在线看片无码永久免费视频 | aa片在线观看视频在线播放 | 欧美野外疯狂做受xxxx高潮 | 俄罗斯老熟妇色xxxx | 国产精品亚洲lv粉色 | 色欲久久久天天天综合网精品 | 精品国产一区av天美传媒 | 无码毛片视频一区二区本码 | 小sao货水好多真紧h无码视频 | 国产香蕉尹人视频在线 | 青青草原综合久久大伊人精品 | 国内综合精品午夜久久资源 | 日产国产精品亚洲系列 | 性啪啪chinese东北女人 | 一本久久a久久精品vr综合 | 欧美人与禽zoz0性伦交 | 欧美一区二区三区视频在线观看 | 无遮挡啪啪摇乳动态图 | 亚洲国产欧美日韩精品一区二区三区 | 蜜桃无码一区二区三区 | 久久人人97超碰a片精品 | 亚洲另类伦春色综合小说 | 在线欧美精品一区二区三区 | 美女扒开屁股让男人桶 | 久久久久久久女国产乱让韩 | 欧美日韩一区二区三区自拍 | 澳门永久av免费网站 | 狠狠色欧美亚洲狠狠色www | 成人免费视频在线观看 | 日本一区二区三区免费高清 | 久久www免费人成人片 | 日韩欧美中文字幕公布 | 一个人免费观看的www视频 | 久久午夜无码鲁丝片 | 麻豆果冻传媒2021精品传媒一区下载 | 天天躁夜夜躁狠狠是什么心态 | 国产绳艺sm调教室论坛 | 无码人妻黑人中文字幕 | 人妻天天爽夜夜爽一区二区 | 99久久婷婷国产综合精品青草免费 | 久久久久久av无码免费看大片 | 久久天天躁夜夜躁狠狠 | 成 人 网 站国产免费观看 | 久久久久成人精品免费播放动漫 | 国产亚洲日韩欧美另类第八页 | 国产69精品久久久久app下载 | 正在播放老肥熟妇露脸 | av在线亚洲欧洲日产一区二区 | 东京无码熟妇人妻av在线网址 | 波多野结衣一区二区三区av免费 | 国产av无码专区亚洲a∨毛片 | 无码国内精品人妻少妇 | 国产一精品一av一免费 | 小鲜肉自慰网站xnxx | 免费无码的av片在线观看 | 玩弄人妻少妇500系列视频 | 国产激情无码一区二区app | 乱人伦人妻中文字幕无码 | 两性色午夜视频免费播放 | 欧美激情一区二区三区成人 | 丝袜美腿亚洲一区二区 | 丰满肥臀大屁股熟妇激情视频 | 天堂久久天堂av色综合 | 国内精品一区二区三区不卡 | 一本久道高清无码视频 | 婷婷综合久久中文字幕蜜桃三电影 | 丝袜人妻一区二区三区 | 国产午夜亚洲精品不卡下载 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲色欲色欲欲www在线 | 最新版天堂资源中文官网 | 在线欧美精品一区二区三区 | 狠狠躁日日躁夜夜躁2020 | 在线播放亚洲第一字幕 | 精品乱子伦一区二区三区 | 久久综合香蕉国产蜜臀av |