精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

算法分析的正確姿勢

移動開發 算法
[本系列博文會對常見的數據結構及相應算法進行分析與總結,并會在每篇博文中提供幾道相關的一線互聯網企業面試/筆試題來鞏固所學及幫助我們查漏補缺。項目地址:https://github.com/absfree/Algo。由于個人水平有限,敘述中難免存在不清晰準確的地方,希望大家可以指正,謝謝大家:)]

[本系列博文會對常見的數據結構及相應算法進行分析與總結,并會在每篇博文中提供幾道相關的一線互聯網企業面試/筆試題來鞏固所學及幫助我們查漏補缺。項目地址:https://github.com/absfree/Algo。由于個人水平有限,敘述中難免存在不清晰準確的地方,希望大家可以指正,謝謝大家:)]  

一、前言

在進一步學習數據結構與算法前,我們應該先掌握算法分析的一般方法。算法分析主要包括對算法的時空復雜度進行分析,但有些時候我們更關心算法的實際運行性能如何,此外,算法可視化是一項幫助我們理解算法實際執行過程的實用技能,在分析一些比較抽象的算法時,這項技能尤為實用。在在本篇博文中,我們首先會介紹如何通過設計實驗來量化算法的實際運行性能,然后會介紹算法的時間復雜度的分析方法,我們還會介紹能夠非常便捷的預測算法性能的倍率實驗。當然,在文章的末尾,我們會一起來做幾道一線互聯網的相關面試/筆試題來鞏固所學,達到學以致用。

二、算法分析的一般方法

1. 量化算法的實際運行性能

在介紹算法的時空復雜度分析方法前,我們先來介紹以下如何來量化算法的實際運行性能,這里我們選取的衡量算法性能的量化指標是它的實際運行時間。通常這個運行時間與算法要解決的問題規模相關,比如排序100萬個數的時間通常要比排序10萬個數的時間要長。所以我們在觀察算法的運行時間時,還要同時考慮它所解決問題的規模,觀察隨著問題規模的增長,算法的實際運行時間時怎樣增長的。這里我們采用算法(第4版) (豆瓣)一書中的例子,代碼如下:

  1. public class ThreeSum { 
  2.     public static int count(int[] a) { 
  3.         int N = a.length; 
  4.         int cnt = 0
  5.         for (int i = 0; i < N; i++) { 
  6.             for (int j = i + 1; j < N; j++) { 
  7.                 for (int k = j + 1; k < N; k++) { 
  8.                     if (a[i] + a[j] + a[k] == 0) { 
  9.                         cnt++; 
  10.                     } 
  11.                 } 
  12.             } 
  13.         } 
  14.         return cnt; 
  15.     } 
  16.      
  17.     public static void main(String[] args) { 
  18.         int[] a = StdIn.readAllInts(); 
  19.         StdOut.println(count(a)); 
  20.     } 

以上代碼用到的StdIn和StdOut這兩個類都在這里:https://github.com/absfree/Algo。我們可以看到,以上代碼的功能是統計標準一個int[]數組中的所有和為0的三整數元組的數量。采用的算法十分直接,就是從頭開始遍歷數組,每次取三個數,若和為0,則計數加一,***返回的計數值即為和為0的三元組的數量。這里我們采取含有整數數量分別為1000、2000、4000的3個文件(這些文件可以在上面的項目地址中找到),來對以上算法進行測試,觀察它的運行時間隨著問題規模的增長是怎樣變化的。

測量一個過程的運行時間的一個直接的方法就是,在這個過程運行前后各獲取一次當前時間,兩者的差值即為這個過程的運行時間。當我們的過程本身需要的執行時間很短時間,這個測量方法可能會存在一些誤差,但是我們可以通過執行多次這個過程再取平均數來減小以至可以忽略這個誤差。下面我們來實際測量一下以上算法的運行時間,相關代碼如下:

  1. public static void main(String[] args) { 
  2.         int[] a = In.readInts(args[0]); 
  3.         long startTime = System.currentTimeMillis(); 
  4.         int count = count(a); 
  5.         long endTime = System.currentTimeMillis(); 
  6.         double time = (endTime - startTime) / 1000.0
  7.         StdOut.println("The result is: " + count + ", and takes " + time + " seconds."); 
  8.     } 

 我們分別以1000、2000、4000個整數作為輸入,得到的運行結果如下

  1. The result is: 70, and takes 1.017 seconds. //1000個整數 
  2.  
  3. The result is: 528, and takes 7.894 seconds. //2000個整數 
  4.  
  5. The result is: 4039, and takes 64.348 seconds. //4000個整數 

我們從以上結果大概可你看到,當問題的規模變為原來的2倍時,實際運行時間大約變為原來的8倍。根據這個現象我們可以做出一個猜想:程序的運行時間關于問題規模N的函數關系式為T(N) = k*(n^3).

在這個關系式中,當n變為原來的2倍時,T(N)會變為原來的8倍。那么ThreeSum算法的運行時間與問題規模是否滿足以上的函數關系呢?在介紹算法時間復雜度的相關內容后,我們會回過頭來再看這個問題。

2. 算法的時間復雜度分析

(1)基本概念

關于算法的時間復雜度,這里我們先簡單介紹下相關的三種符號記法:

***種叫Big O notation,它給出了運行時間的”漸進上界“,也就是算法在最壞情況下運行時間的上限。它的定義如下:對于f(n)和g(n),若存在常數c和N0,使得對于所有n > N0,都有 |f(n)| < c * g(n),則稱f(n)為O(g(n)。
第三種叫做Big Ω notation,它給出了運行時間的“漸進下界”,也就是算法在最壞情況下運行時間的下限。它的定義如下:對于f(n)和g(n),若存在常數c和N0,使得對于所有n > N0,都有|f(n)| > c * g(n),則稱f(n)為Ω(g(n))。
第三種叫Big Θ notation,它確定了運行時間的”漸進確界“。定義如下:對于f(n)和g(n),若存在常數c和N0,對于所有n> N0,都有|f(n)| = c * g(n),則稱f(n)為Θ為Θ(g(n))。

我們在平常的算法分析中最常用到的是Big O notation。下面我們將介紹分析算法的時間復雜度的具體方法,若對Big O notation的概念還不是很了解,推薦大家看這篇文章:http://blog.jobbole.com/55184/。

(2)時間復雜度的分析方法

這部分我們將以上面的ThreeSum程序為例,來介紹一下算法時間復雜度的分析方法。為了方便閱讀,這里再貼一下上面的程序:

  1. public static int count(int[] a) { 
  2.         int N = a.length; 
  3.         int cnt = 0
  4.         for (int i = 0; i < N; i++) { 
  5.             for (int j = i + 1; j < N; j++) { 
  6.                 for (int k = j + 1; k < N; k++) { 
  7.                     if (a[i] + a[j] + a[k] == 0) { 
  8.                         cnt++; 
  9.                     } 
  10.                 } 
  11.             } 
  12.         } 
  13.         return cnt; 
  14.     } 

在介紹時間復雜度分析方法前,我們首先來明確下算法的運行時間究竟取決于什么。直觀地想,一個算法的運行時間也就是執行所有程序語句的耗時總和。然而在實際的分析中,我們并不需要考慮所有程序語句的運行時間,我們應該做的是集中注意力于最耗時的部分,也就是執行頻率***而且最耗時的操作。也就是說,在對一個程序的時間復雜度進行分析前,我們要先確定這個程序中哪些語句的執行占用的它的大部分執行時間,而那些盡管耗時大但只執行常數次(和問題規模無關)的操作我們可以忽略。我們選出一個最耗時的操作,通過計算這些操作的執行次數來估計算法的時間復雜度,下面我們來具體介紹這一過程。

首先我們看到以上代碼的第1行和第2行的語句只會執行一次,因此我們可以忽略它們。然后我們看到第4行到第12行是一個三層循環,最內存的循環體包含了一個if語句。也就是說,這個if語句是以上代碼中耗時最多的語句,我們接下來只需要計算if語句的執行次數即可估計出這個算法的時間復雜度。以上算法中,我們的問題規模為N(輸入數組包含的元素數目),我們也可以看到,if語句的執行次數與N是相關的。我們不難得出,if語句會執行N * (N - 1) * (N - 2) / 6次,因此這個算法的時間復雜度為O(n^3)。這也印證了我們之前猜想的運行時間與問題規模的函數關系(T(n) = k * n ^ 3)。由此我們也可以知道,算法的時間復雜度刻畫的是隨著問題規模的增長,算法的運行時間的增長速度是怎樣的。在平常的使用中,Big O notation通常都不是嚴格表示最壞情況下算法的運行時間上限,而是用來表示通常情況下算法的漸進性能的上限,在使用Big O notation描述算法最壞情況下運行時間的上限時,我們通常加上限定詞“最壞情況“。

   通過以上分析,我們知道分析算法的時間復雜度只需要兩步(比把大象放進冰箱還少一步:) ):

分析關鍵操作的執行次數。

 

    在以上的例子中我們可以看到,不論我們輸入的整型數組是怎樣的,if語句的執行次數是不變的,也就是說上面算法的運行時間與輸入無關。而有些算法的實際運行時間高度依賴于我們給定的輸入,關于這一問題下面我們進行介紹。

3. 算法的期望運行時間

    算法的期望運行時間我們可以理解為,在通常情況下,算法的運行時間是多少。在很多時候,我們更關心算法的期望運行時間而不是算法在最壞情況下運行時間的上限,因為最壞情況和***情況發生的概率是比較低的,我們更常遇到的是一般情況。比如說盡管快速排序算法與歸并排序算法的時間復雜度都為O(nlogn),但是在相同的問題規模下,快速排序往往要比歸并排序快,因此快速排序算法的期望運行時間要比歸并排序的期望時間小。然而在最壞情況下,快速排序的時間復雜度會變為O(n^2),快速排序算法就是一個運行時間依賴于輸入的算法,對于這個問題,我們可以通過打亂輸入的待排序數組的順序來避免發生最壞情況。

4. 倍率實驗

下面我們來介紹一下算法(第4版) (豆瓣)一書中的“倍率實驗”。這個方法能夠簡單有效地預測程序的性能并判斷他們的運行時間大致的增長數量級。在正式介紹倍率實驗前,我們先來簡單介紹下“增長數量級“這一概念(同樣引用自《算法》一書):

我們用~f(N)表示所有隨著N的增大除以f(N)的結果趨于1的函數。用g(N)~f(N)表示g(N) / f(N)隨著N的增大趨近于1。通常我們用到的近似方式都是g(N) ~ a * f(N)。我們將f(N)稱為g(N)的增長數量級。

我們還是拿ThreeSum程序來舉例,假設g(N)表示在輸入數組尺寸為N時執行if語句的次數。根據以上的定義,我們就可以得到g(N) ~ N ^ 3(當N趨向于正無窮時,g(N) / N^3 趨近于1)。所以g(N)的增長數量級為N^3,即ThreeSum算法的運行時間的增長數量級為N^3。

現在,我們來正式介紹倍率實驗(以下內容主要引用自上面提到的《算法》一書,同時結合了一些個人理解)。首先我們來一個熱身的小程序:

  1. public class DoublingTest { 
  2.     public static double timeTrial(int N) { 
  3.         int MAX = 1000000
  4.         int[] a = new int[N]; 
  5.         for (int i = 0; i < N; i++) { 
  6.             a[i] = StdRandom.uniform(-MAX, MAX); 
  7.         } 
  8.         long startTime = System.currentTimeMillis(); 
  9.         int count = ThreeSum.count(a); 
  10.         long endTime = System.currentTimeMillis(); 
  11.         double time =  (endTime - startTime) / 1000.0
  12.         return time; 
  13.     } 
  14.      
  15.     public static void main(String[] args) { 
  16.         for (int N = 250true; N += N) { 
  17.             double time = timeTrial(N); 
  18.             StdOut.printf("%7d %5.1f\n", N, time); 
  19.         } 
  20.     } 

以上代碼會以250為起點,每次講ThreeSum的問題規模翻一倍,并在每次運行ThreeSum后輸出本次問題規模和對應的運行時間。運行以上程序得到的輸出如下所示:

  1. 250 0.0 
  2. 500 0.1 
  3. 1000 0.6 
  4. 2000 4.3 
  5. 4000 30.6 

上面的輸出之所以和理論值有所出入是因為實際運行環境是復雜多變的,因而會產生許多偏差,盡可能減小這種偏差的方式就是多次運行以上程序并取平均值。有了上面這個熱身的小程序做鋪墊,接下來我們就可以正式介紹這個“可以簡單有效地預測任意程序執行性能并判斷其運行時間的大致增長數量級”的方法了,實際上它的工作基于以上的DoublingTest程序,大致過程如下:

開發一個[輸入生成器]來產生實際情況下的各種可能的輸入。
反復運行下面的DoublingRatio程序,直至time/prev的值趨近于極限2^b,則該算法的增長數量級約為N^b(b為常數)。

DoublingRatio程序如下:

運行倍率程序,我們可以得到如下輸出:

  1. 0.0 2.0 
  2. 0.1 5.5 
  3. 0.5 5.4 
  4. 3.7 7.0 
  5. 27.4 7.4 
  6. 218.0 8.0 

我們可以看到,time/prev確實收斂到了8(2^3)。那么,為什么通過使輸入不斷翻倍而反復運行程序,運行時間的比例會趨于一個常數呢?答案是下面的[倍率定理]:

若T(N) ~ a * N^b * lgN,那么T(2N) / T(N) ~2^b。

以上定理的證明很簡單,只需要計算T(2N) / T(N)在N趨向于正無窮時的極限即可。其中,“a * N^b * lgN”基本上涵蓋了常見算法的增長量級(a、b為常數)。值得我們注意的是,當一個算法的增長量級為NlogN時,對它進行倍率測試,我們會得到它的運行時間的增長數量級約為N。實際上,這并不矛盾,因為我們并不能根據倍率實驗的結果推測出算法符合某個特定的數學模型,我們只能夠大致預測相應算法的性能(當N在16000到32000之間時,14N與NlgN十分接近)。

5. 均攤分析

考慮下我們之前在 深入理解數據結構之鏈表 中提到的ResizingArrayStack,也就是底層用數組實現的支持動態調整大小的棧。每次添加一個元素到棧中后,我們都會判斷當前元素是否填滿的數組,若是填滿了,則創建一個尺寸為原來兩倍的新數組,并把所有元素從原數組復制到新數組中。我們知道,在數組未填滿的情況下,push操作的復雜度為O(1),而當一個push操作使得數組被填滿,創建新數組及復制這一工作會使得push操作的復雜度驟然上升到O(n)。

對于上面那種情況,我們顯然不能說push的復雜度是O(n),我們通常認為push的“平均復雜度”為O(1),因為畢竟每n個push操作才會觸發一次“復制元素到新數組”,因而這n個push把這一代價一均攤,對于這一系列push中的每個來說,它們的均攤代價就是O(1)。這種記錄所有操作的總成本并除以操作總數來講成本均攤的方法叫做均攤分析(也叫攤還分析)。

三、小試牛刀之實戰名企面試題

前面我們介紹了算法分析的一些姿勢,那么現在我們就來學以致用,一起來解決幾道一線互聯網企業有關于算法分析的面試/筆試題。

【騰訊】下面算法的時間復雜度是____
int foo(int n) {
    if (n <= 1) {
        return 1;
    }
    return n * foo(n - 1);
}

看到這道題要我們分析算法時間復雜度后,我們要做的***步便是確定關鍵操作,這里的關鍵操作顯然是if語句,那么我們只需要判斷if語句執行的次數即可。首先我們看到這是一個遞歸過程:foo會不斷的調用自身,直到foo的實參小于等于1,foo就會返回1,之后便不會再執行if語句了。由此我們可以知道,if語句調用的次數為n次,所以時間復雜度為O(n)。

【京東】以下函數的時間復雜度為____
void recursive(int n, int m, int o) {
    if (n <= 0) {
        printf("%d, %d\n", m, o);
    } else {
        recursive(n - 1, m + 1, o);
        recursive(n - 1, m, o + 1);
    }
}

這道題明顯要比上道題難一些,那么讓我們來按部就班的解決它。首先,它的關鍵操作時if語句,因此我們只需判斷出if語句的執行次數即可。以上函數會在n > 0的時候不斷遞歸調用自身,我們要做的是判斷在到達遞歸的base case(即n <= 0)前,共執行了多少次if語句。我們假設if語句的執行次數為T(n, m, o),那么我們可以進一步得到:T(n, m, o) = T(n-1, m+1, o) + T(n-1, m, o+1) (當n > 0時)。我們可以看到base case與參數m, o無關,因此我們可以把以上表達式進一步簡化為T(n) = 2T(n-1),由此我們可得T(n) = 2T(n-1) = (2^2) * T(n-2)......所以我們可以得到以上算法的時間復雜度為O(2^n)。

【京東】如下程序的時間復雜度為____(其中m > 1,e > 0)
x = m;
>y = 1;
while (x - y > e) {
    x = (x + y) / 2;
    y = m / x;
}
print(x);

以上算法的關鍵操作即while語句中的兩條賦值語句,我們只需要計算這兩條語句的執行次數即可。我們可以看到,當x - y > e時,while語句體內的語句就會執行,x = (x + y) / 2使得x不斷變小(當y<<x時,執行一次這個語句會使x變為約原來的一半),假定y的值固定在1,那么循環體的執行次數即為~logm,而實際情況是y在每次循環體***都會被賦值為m / x,這個值總是比y在上一輪循環中的值大,這樣一來x-y的值就會更小,所以以上算法的時間復雜度為O(logm)。

【搜狗】假設某算法的計算時間可用遞推關系式T(n) = 2T(n/2) + n,T(1) = 1表示,則該算法的時間復雜度為____

根據題目給的遞推關系式,我們可以進一步得到:T(n) = 2(2T(n/4) + n/2) + n = ... 將遞推式進一步展開,我們可以得到該算法的時間復雜度為O(nlogn),這里就不貼上詳細過程了。

四、參考資料

   算法(第4版) (豆瓣)

責任編輯:倪明 來源: 博客園
相關推薦

2017-02-23 15:37:44

OptionObject容器

2018-01-11 15:31:39

命令Linux關機

2017-07-10 13:09:45

前端Flexbox

2017-03-16 11:39:33

Openstack源碼姿勢

2023-01-30 07:41:43

2019-12-27 15:58:57

大數據IT互聯網

2024-09-25 08:22:06

2016-12-12 08:48:24

2021-09-15 16:20:02

Spring BootFilterJava

2021-01-08 08:10:34

MySQL表空間回收

2017-10-12 11:30:34

Spark代碼PR

2018-06-13 10:27:04

服務器性能優化

2022-02-21 11:21:40

golang編程語言

2020-09-04 15:38:19

Web前端開發項目

2023-01-06 08:24:00

PandasPython

2015-07-13 11:32:09

PHP程序員正確姿勢

2021-04-02 12:37:53

RestfulAPI接口架構

2019-11-26 09:36:02

互聯網數據技術

2019-10-30 17:06:50

AWS物聯網IoT

2016-01-05 11:28:20

按需付費云計算docker
點贊
收藏

51CTO技術棧公眾號

99精品国产一区二区三区| 欧美日韩国产网站| 国产不卡一区视频| 午夜精品视频网站| 久久av无码精品人妻系列试探| 欧美性xxx| 国产精品毛片高清在线完整版| 成人有码视频在线播放| 日韩高清精品免费观看| 久久av免费看| 欧美精品 日韩| 欧美一级欧美一级| 成人三级黄色免费网站| 韩国欧美国产一区| 97视频在线观看视频免费视频| 国产精品久久免费观看| 秋霞午夜一区二区三区视频| 丰满岳妇乱一区二区三区| 亚洲一区二区三区精品在线观看| 不卡视频在线播放| 视频一区二区中文字幕| 欧美大胆a视频| 白白色免费视频| 亚洲va欧美va人人爽成人影院| 狠狠色香婷婷久久亚洲精品| 亚洲视频sss| 色窝窝无码一区二区三区成人网站| 日本视频免费一区| 97久久伊人激情网| 秋霞欧美一区二区三区视频免费| 黄色成人美女网站| 91 com成人网| av免费网站观看| 91av久久| 亚洲欧美日韩国产另类专区 | www一区二区三区| 精品久久久视频| 400部精品国偷自产在线观看| 韩国精品视频| 91在线视频免费观看| 5g国产欧美日韩视频| 老熟妇一区二区三区啪啪| 亚洲一区二区网站| 久久久久久久久久久久av| 美女三级黄色片| 成人av资源电影网站| 日韩福利视频在线观看| 三上悠亚 电影| 中文字幕日本一区| 欧美日韩久久不卡| 天天干天天综合| 成人国产精品一区二区免费麻豆| 黑人狂躁日本妞一区二区三区| 国产一二三在线视频| 青草av在线| 有坂深雪av一区二区精品| 日韩视频在线观看视频| 欧美精品videos另类| 中文字幕乱码亚洲精品一区| 日韩欧美亚洲日产国| 麻豆导航在线观看| 国产午夜精品久久| 日韩亚洲不卡在线| 成人欧美亚洲| 国产精品女人毛片| 亚洲欧美精品| 欧洲不卡av| 国产精品女同互慰在线看| 一区二区日本伦理| 精品美女在线观看视频在线观看 | 国产精品久久久久久久无码| 中文字幕日韩高清在线| 精品国产一区二区三区久久影院| 佐佐木明希电影| 中文字幕久久精品一区二区| 亚洲黄色www网站| 性欧美13一14内谢| 欧美亚洲在线日韩| 久久久精品国产| 久久机热这里只有精品| 亚洲看片一区| 国产成人精品在线视频| 真实的国产乱xxxx在线91| 免费观看在线综合色| 91欧美精品午夜性色福利在线| wwwxxxx国产| 99精品国产99久久久久久白柏| 欧美韩国日本精品一区二区三区| 成人在线免费电影| 亚洲欧洲日产国码二区| 一卡二卡三卡视频| а√在线中文网新版地址在线| 色综合久久久久久久久久久| 麻豆一区二区三区视频| 亚洲五码在线| 日韩国产欧美精品一区二区三区| 中文字幕伦理片| 欧美精品日本| 国产精品777| 国产日本精品视频| 久久精品视频在线看| 男人的天堂成人| 筱崎爱全乳无删减在线观看| 欧美精品一二三| 午夜免费福利影院| 日韩精品欧美| 性欧美视频videos6一9| 中文字幕在线2019| 波多野结衣一区二区三区| 亚洲国产一区二区三区在线| 动漫一区二区| 欧美三级视频在线播放| 大尺度在线观看| 日韩免费在线| 全亚洲最色的网站在线观看| www黄色在线观看| 中文字幕乱码久久午夜不卡| 国产在线播放观看| 二区三区精品| 夜夜嗨av色一区二区不卡| 精品99在线观看| 蜜桃久久av一区| 久久亚洲免费| 国产精品69xx| 在线综合+亚洲+欧美中文字幕| 久久无码人妻精品一区二区三区| 亚洲一区二区三区| 国产精品老牛影院在线观看 | 亚洲精品一区中文字幕乱码| 欧美性猛交xxxxx少妇| 日韩av二区在线播放| 久久av免费一区| 国产又色又爽又黄刺激在线视频| 欧美日韩国产高清一区二区| 久久久久久九九九九九| 最新成人av网站| 51国偷自产一区二区三区| 992tv免费直播在线观看| 欧美性猛交99久久久久99按摩| 欧美一级大片免费看| 68国产成人综合久久精品| 国产精品99久久久久久久久| 日韩欧美亚洲系列| 亚洲国产aⅴ天堂久久| 原创真实夫妻啪啪av| 色777狠狠狠综合伊人| 国产精品福利观看| 搞黄视频免费在线观看| 色综合久久中文综合久久97| 国产成人无码一区二区在线观看 | 日韩在线视频二区| 精品无码一区二区三区的天堂| 不卡一区在线观看| 国产一二三在线视频| 成人高潮a毛片免费观看网站| 欧美大胆在线视频| av观看在线免费| 亚洲欧美日韩国产一区二区三区| av在线网站免费观看| 在线精品视频在线观看高清| 69174成人网| 色黄网站在线观看| 精品卡一卡二卡三卡四在线| 国产午夜精品无码一区二区| a美女胸又www黄视频久久| 国产午夜福利100集发布| 精品欠久久久中文字幕加勒比| 韩国一区二区电影| 青青草超碰在线| 在线视频中文字幕一区二区| 丰满的亚洲女人毛茸茸| 精品写真视频在线观看| 国产又粗又长又爽视频| 精品女人视频| 国产精品久久久久久久天堂| 麻豆视频免费在线观看| 精品少妇一区二区三区在线播放 | 无码av免费精品一区二区三区| 亚洲欧洲午夜| 欧洲精品久久| 欧美性aaa| 久久久久久美女| 天堂成人在线| 欧美日韩mp4| 国产精品16p| 久久久精品免费免费| 久久久久久久久久久久久久久国产| 欧美~级网站不卡| 国内精品**久久毛片app| 国产一区二区主播在线| 久久视频在线播放| 天堂在线观看av| 欧美亚洲综合另类| 激情五月少妇a| 国产午夜精品在线观看| 日本少妇激三级做爰在线| 日韩午夜免费| 亚洲一区二区三区精品视频| 成午夜精品一区二区三区软件| 国产成人精品在线| 国产精品—色呦呦| 色老头一区二区三区| 欧美特级特黄aaaaaa在线看| 91高清在线观看| 欧美激情国产精品免费| 中文字幕av在线一区二区三区| 黑人玩弄人妻一区二区三区| 美腿丝袜一区二区三区| 免费在线观看视频a| 日韩欧美伦理| 美媛馆国产精品一区二区| 高清一区二区中文字幕| 啪一啪鲁一鲁2019在线视频| sm国产在线调教视频| 亚洲日本aⅴ片在线观看香蕉| 精品区在线观看| 欧洲生活片亚洲生活在线观看| 日本网站免费观看| 亚洲婷婷综合色高清在线| 在线国产视频一区| 91玉足脚交白嫩脚丫在线播放| www.污网站| 日韩激情中文字幕| 久激情内射婷内射蜜桃| 中文字幕一区二区三三| 亚洲欧美日产图| 一区二区三区日本久久久| 国产传媒一区二区三区| 粉嫩一区二区三区在线观看| 国产美女久久精品香蕉69| 日韩在线伦理| 97人人爽人人喊人人模波多| 性国产高清在线观看| 日韩视频欧美视频| 成人亚洲综合天堂| 亚洲人成77777在线观看网| 手机在线精品视频| 精品国产一区久久| 黄色一级大片在线免费看国产| 制服丝袜成人动漫| 91精品国产乱码久久| 欧美视频一区二区三区在线观看| 亚洲第一网站在线观看| 欧美天天综合色影久久精品| 五月天综合激情| 午夜精品爽啪视频| 亚洲国产综合久久| 亚洲国产你懂的| 精品少妇久久久| 一二三四区精品视频| 国产suv一区二区三区| 亚洲免费观看高清完整版在线观看 | 欧美性一区二区| 狠狠狠狠狠狠狠| 欧洲国产伦久久久久久久| 最新中文字幕第一页| 欧美午夜精品电影| 一级黄色大片免费| 欧美一区二区三区在线观看 | 国产在线观看www| 97在线视频一区| 天堂√8在线中文| 欧美在线视频一区二区| 日韩免费电影| 国产欧美日韩丝袜精品一区| 婷婷精品久久久久久久久久不卡| 91久久国产婷婷一区二区| 国产色99精品9i| www.久久爱.cn| 久久精品色播| 欧美日韩精品免费观看视一区二区| 国语产色综合| 综合一区中文字幕| 女生裸体视频一区二区三区| 黄色国产一级视频| 噜噜噜在线观看免费视频日韩 | 天天色天天综合| 亚洲色图视频网站| 国产在线一区视频| 日韩欧美亚洲国产一区| 最近日韩免费视频| 日韩欧美一级片| 亚洲av电影一区| 国产亚洲精品美女| 中文字幕在线三区| 2020久久国产精品| 深夜福利亚洲| 国产不卡一区二区三区在线观看| 日韩三区视频| 夜夜爽99久久国产综合精品女不卡| 欧美精选一区| 能在线观看的av网站| 国产精品一二三四| 在线免费观看a级片| 国产精品久久久久毛片软件| 一区二区三区免费高清视频| 日本福利一区二区| 午夜精品久久久久久久99| 亚洲老板91色精品久久| av片在线观看永久免费| 日本久久精品视频| 日韩一区二区三区高清在线观看| 欧美xxxx黑人又粗又长精品| 中文精品电影| 人妻丰满熟妇av无码区app| 国产成人免费高清| 成熟人妻av无码专区| 亚洲国产成人高清精品| 国产精品无码专区av免费播放| 精品亚洲永久免费精品| a级毛片免费观看在线| 国产999精品视频| aaa国产精品视频| 在线播放 亚洲| 丝袜亚洲另类丝袜在线| youjizz.com日本| 国产精品传媒在线| 成人h动漫精品一区二区下载| 欧美成人女星排行榜| 1024免费在线视频| 热久久99这里有精品| 国产精品网址| 久久久久久久久影视| 免费高清在线一区| 中文字幕第4页| 黄色一区二区在线观看| www.欧美国产| 日韩在线视频国产| 婷婷激情一区| 欧美国产二区| 日韩视频在线一区二区三区 | 国产精品1024| 女同久久另类69精品国产| 欧美综合一区二区三区| 日本中文字幕一区二区有码在线| 久久久久久久av| 日韩高清一区| 福利网在线观看| 黄网站免费久久| 亚洲女人毛茸茸高潮| 欧美在线看片a免费观看| 久久久资源网| 国产成人免费91av在线| 午夜a一级毛片亚洲欧洲| 日本中文字幕网址| 99精品视频在线观看免费| 国产一级特黄aaa大片| 欧美电影精品一区二区| 91精选在线| 亚洲aa在线观看| 亚洲精品电影| 一个人看的视频www| 亚洲美女精品一区| www日本高清视频| 久久久久久91香蕉国产| 成人av婷婷| 波多野结衣家庭教师在线| 97精品超碰一区二区三区| 91视频免费网址| 亚洲视频欧洲视频| 色综合天天色| 一级一片免费播放| 国产精品一区二区无线| 国产极品美女高潮无套嗷嗷叫酒店| 亚洲国产一区自拍| 在线成人av观看| 日韩精品资源| 极品少妇xxxx精品少妇| 天天干中文字幕| 亚洲精品乱码久久久久久金桔影视| 免费成人在线电影| 日产精品久久久一区二区| 麻豆免费精品视频| 可以直接看的黄色网址| 亚洲国产精品人人爽夜夜爽| 欧美日韩精品免费观看视完整| 日韩精品欧美一区二区三区| 国内久久精品视频| 国产一级免费观看| 亚洲女成人图区| 亚洲国产天堂| 国产精品国产亚洲精品看不卡| 久久九九影视网| 国产一区二区视频免费观看| 久久久久久有精品国产| 国产传媒欧美日韩成人精品大片| 亚洲最大天堂网| 婷婷综合五月天| 香蕉视频在线播放| 国产精品一区在线观看| 青青草国产精品97视觉盛宴| 欧美成人三级在线观看| 亚洲欧美国产精品| 成人97精品毛片免费看| 激情深爱综合网| 中文字幕日韩精品一区| 天天干天天爱天天操| 国产日韩中文在线| 一本一本久久| 破处女黄色一级片|