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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

微软100题第5题

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微软100题第5题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://blog.csdn.net/littlestream9527/article/details/8104731

http://blog.csdn.net/v_july_v/article/details/6370650

http://blog.csdn.net/insistgogo/article/details/7689297

下面,我試圖用最清晰易懂,最易令人理解的思維或方式闡述有關尋找最小的k個數這個問題(這幾天一直在想,除了計數排序外,這題到底還有沒有其它的O(n)的算法? )。希望,有任何問題,歡迎不吝指正。謝謝。

尋找最小的k個數
題目描述:5.查找最小的k個元素
題目:輸入n個整數,輸出其中最小的k個。
例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。

第一節、各種思路,各種選擇

  • 0、?咱們先簡單的理解,要求一個序列中最小的k個數,按照慣有的思維方式,很簡單,先對這個序列從小到大排序,然后輸出前面的最小的k個數即可。

  • 1、?至于選取什么的排序方法,我想你可能會第一時間想到快速排序,我們知道,快速排序平均所費時間為n*logn,然后再遍歷序列中前k個元素輸出,即可,總的時間復雜度為O(n*logn+k)=O(n*logn)

  • 2、?咱們再進一步想想,題目并沒有要求要查找的k個數,甚至后n-k個數是有序的,既然如此,咱們又何必對所有的n個數都進行排序列?
    這時,咱們想到了用選擇或交換排序,即遍歷n個數,先把最先遍歷到得k個數存入大小為k的數組之中,對這k個數,利用選擇或交換排序,找到k個數中的最大數kmax(kmax設為k個元素的數組中最大元素),用時O(k)(你應該知道,插入或選擇排序查找操作需要O(k)的時間),后再繼續遍歷后n-k個數,x與kmax比較:如果x<kmax,則x代替kmax,并再次重新找出k個元素的數組中最大元素kmax‘(多謝kk791159796 提醒修正);如果x>kmax,則不更新數組。這樣,每次更新或不更新數組的所用的時間為O(k)或O(0),整趟下來,總的時間復雜度平均下來為:n*O(k)=O(n*k)

  • 3、?當然,更好的辦法是維護k個元素的最大堆,原理與上述第2個方案一致,即用容量為k的最大堆存儲最先遍歷到的k個數,并假設它們即是最小的k個數,建堆費時O(k)后,有k1<k2<...<kmax(kmax設為大頂堆中最大元素)。繼續遍歷數列,每次遍歷一個元素x,與堆頂元素比較,x<kmax,更新堆(用時logk),否則不更新堆。這樣下來,總費時O(k+(n-k)*logk)=O(n*logk)。此方法得益于在堆中,查找等各項操作時間復雜度均為logk(不然,就如上述思路2所述:直接用數組也可以找出前k個小的元素,用時O(n*k))。

  • 4、?按編程之美第141頁上解法二的所述,類似快速排序的劃分方法,N個數存儲在數組S中,再從數組中隨機選取一個數X(隨機選取樞紐元,可做到線性期望時間O(N)的復雜度,在第二節論述),把數組劃分為Sa和Sb倆部分,Sa<=X<=Sb,如果要查找的k個元素小于Sa的元素個數,則返回Sa中較小的k個元素,否則返回Sa中k個小的元素+Sb中小的k-|Sa|個元素。像上述過程一樣,這個運用類似快速排序的partition的快速選擇SELECT算法尋找最小的k個元素,在最壞情況下亦能做到O(N)的復雜度。不過值得一提的是,這個快速選擇SELECT算法是選取數組中“中位數的中位數”作為樞紐元,而非隨機選取樞紐元。

  • 5、?RANDOMIZED-SELECT,每次都是隨機選取數列中的一個元素作為主元,在0(n)的時間內找到第k小的元素,然后遍歷輸出前面的k個小的元素。 如果能的話,那么總的時間復雜度為線性期望時間:O(n+k)=O(n)(當k比較小時)

Ok,稍后第二節中,我會具體給出RANDOMIZED-SELECT(A, p, r, i)的整體完整偽碼。在此之前,要明確一個問題:我們通常所熟知的快速排序是以固定的第一個或最后一個元素作為主元,每次遞歸劃分都是不均等的,最后的平均時間復雜度為:O(n*logn),但RANDOMIZED-SELECT與普通的快速排序不同的是,每次遞歸都是隨機選擇序列從第一個到最后一個元素中任一一個作為主元。

  • 6、?線性時間的排序,即計數排序,時間復雜度雖能達到O(n),但限制條件太多,不常用。

  • 7、updated: huaye502在本文的評論下指出:“可以用最小堆初始化數組,然后取這個優先隊列前k個值。復雜度O(n)+k*O(log n)”。huaye502的意思是針對整個數組序列建最小堆,建堆所用時間為O(n)(算法導論一書上第6章第6.3節已經論證,在線性時間內,能將一個無序的數組建成一個最小堆),然后取堆中的前k個數,總的時間復雜度即為:O(n+k*logn)

關于上述第7點思路的繼續闡述:至于思路7的O(n+k*logn)是否小于上述思路3的O(n*logk),即O(n+k*logn)?< O(n*logk)。粗略數學證明可參看如下第一幅圖,我們可以這么解決:當k是常數,n趨向于無窮大時,求(n*logk)/(n+k*logn)的極限T,如果T>1,那么可得O(n*logk)>O(n+k*logn),也就是O(n+k*logn)< O(n*logk)。雖然這有違我們慣常的思維,然事實最終證明的確如此,這個極值T=logk>1,即采取建立n個元素的最小堆后取其前k個數的方法的復雜度小于采取常規的建立k個元素最大堆后通過比較尋找最小的k個數的方法的復雜度。但,最重要的是,如果建立n個元素的最小堆的話,那么其空間復雜度勢必為O(N),而建立k個元素的最大堆的空間復雜度為O(k)。所以,綜合考慮,我們一般還是選擇用建立k個元素的最大堆的方法解決此類尋找最小的k個數的問題。

也可以如gbb21所述粗略證明:要證原式k+n*logk-n-k*logn>0,等價于證(logk-1)n-k*logn+k>0。當when n -> +/inf(n趨向于正無窮大)時,logk-1-0-0>0,即只要滿足logk-1>0即可。原式得證。即O(k+n*logk)>O(n+k*logn) =>O(n+k*logn)< O(n*logk),與上面得到的結論一致。

事實上,是建立最大堆還是建立最小堆,其實際的程序運行時間相差并不大,運行時間都在一個數量級上。因為后續,我們還專門寫了個程序進行測試,即針對1000w的數據尋找其中最小的k個數的問題,采取兩種實現,一是采取常規的建立k個元素最大堆后通過比較尋找最小的k個數的方案,一是采取建立n個元素的最小堆,然后取其前k個數的方法,發現兩相比較,運行時間實際上相差無幾。結果可看下面的第二幅圖。

  • 8、@lingyun310:與上述思路7類似,不同的是在對元素數組原地建最小堆O(n)后,然后提取K次,但是每次提取時,換到頂部的元素只需要下移頂多k次就足夠了,下移次數逐次減少(而上述思路7每次提取都需要logn,所以提取k次,思路7需要k*logn。而本思路8只需要K^2)。此種方法的復雜度為O(n+k^2)。@July:對于這個O(n+k^2)的復雜度,我相當懷疑。因為據我所知,n個元素的堆,堆中任何一項操作的復雜度皆為logn,所以按理說,lingyun310方法的復雜度應該跟下述思路8一樣,也為O(n+k*logn),而非O(n+k*k)。ok,先放到這,待時間考證。06.02。

updated:
經過和幾個朋友的討論,已經證實,上述思路7lingyun310所述的思路應該是完全可以的。下面,我來具體解釋下他的這種方法。

我們知道,n個元素的最小堆中,可以先取出堆頂元素得到我們第1小的元素,然后把堆中最后一個元素(較大的元素)上移至堆頂,成為新的堆頂元素(取出堆頂元素之后,把堆中下面的最后一個元素送到堆頂的過程可以參考下面的第一幅圖。至于為什么是怎么做,為什么是把最后一個元素送到堆頂成為堆頂元素,而不是把原來堆頂元素的兒子送到堆頂呢?具體原因可參考相關書籍)。

此時,堆的性質已經被破壞了,所以此后要調整堆。怎么調整呢?就是一般人所說的針對新的堆頂元素shiftdown,逐步下移(因為新的堆頂元素由最后一個元素而來,比較大嘛,既然是最小堆,當然大的元素就要下沉到堆的下部了)。下沉多少步呢?即如lingyun310所說的,下沉k次就足夠了。

下移k次之后,此時的堆頂元素已經是我們要找的第2小的元素。然后,取出這個第2小的元素(堆頂元素),再次把堆中的最后一個元素送到堆頂,又經過k-1次下移之后(此后下移次數逐步減少,k-2,k-3,...k=0后算法中斷)....,如此重復k-1趟操作,不斷取出的堆頂元素即是我們要找的最小的k個數。雖然上述算法中斷后整個堆已經不是最小堆了,但是求得的k個最小元素已經滿足我們題目所要求的了,就是說已經找到了最小的k個數,那么其它的咱們不管了。

我可以再舉一個形象易懂的例子。你可以想象在一個水桶中,有很多的氣泡,這些氣泡從上到下,總體的趨勢是逐漸增大的,但卻不是嚴格的逐次大(正好這也符合最小堆的性質)。ok,現在我們取出第一個氣泡,那這個氣泡一定是水桶中所有氣泡中最小的,把它取出來,然后把最下面的那個大氣泡(但不一定是最大的氣泡)移到最上面去,此時違反了氣泡從上到下總體上逐步變大的趨勢,所以,要把這個大氣泡往下沉,下沉到哪個位置呢?就是下沉k次。下沉k次后,最上面的氣泡已經肯定是最小的氣泡了,把他再次取出。然后又將最下面最后的那個氣泡移至最上面,移到最上面后,再次讓它逐次下沉,下沉k-1次...,如此循環往復,最終取到最小的k個氣泡。

ok,所以,上面方法所述的過程,更進一步來說,其實是第一趟調整保持第0層到第k層是最小堆,第二趟調整保持第0層到第k-1層是最小堆...,依次類推。但這個思路只是下述思路8中正規的最小堆算法(因為它最終對全部元素都進行了調整,算法結束后,整個堆還是一個最小堆)的調優,時間復雜度O(n+k^2)沒有量級的提高,空間復雜度為O(N)也不會減少。

原理理解透了,那么寫代碼,就不難了,完整粗略代碼如下(有問題煩請批評指正):

  • //copyright@泡泡魚
  • //July、2010.06.02。
  • ?
  • //@lingyun310:先對元素數組原地建最小堆,O(n)。然后提取K次,但是每次提取時,
  • //換到頂部的元素只需要下移頂多k次就足夠了,下移次數逐次減少。此種方法的復雜度為O(n+k^2)。
  • #include<stdio.h>
  • #include<stdlib.h>
  • #defineMAXLEN123456
  • #defineK100
  • ?
  • //
  • voidHeapAdjust(intarray[],inti,intLength)
  • {
  • intchild,temp;
  • for(temp=array[i];2*i+1<Length;i=child)
  • {
  • child=2*i+1;
  • if(child<Length-1&&array[child+1]<array[child])
  • child++;
  • if(temp>array[child])
  • array[i]=array[child];
  • else
  • break;
  • array[child]=temp;
  • }
  • }
  • ?
  • voidSwap(int*a,int*b)
  • {
  • *a=*a^*b;
  • *b=*a^*b;
  • *a=*a^*b;
  • }
  • ?
  • intGetMin(intarray[],intLength,intk)
  • {
  • intmin=array[0];
  • Swap(&array[0],&array[Length-1]);
  • ?
  • intchild,temp;
  • inti=0,j=k-1;
  • for(temp=array[0];j>0&&2*i+1<Length;--j,i=child)
  • {
  • child=2*i+1;
  • if(child<Length-1&&array[child+1]<array[child])
  • child++;
  • if(temp>array[child])
  • array[i]=array[child];
  • else
  • break;
  • array[child]=temp;
  • }
  • ?
  • returnmin;
  • }
  • ?
  • voidKmin(intarray[],intLength,intk)
  • {
  • for(inti=Length/2-1;i>=0;--i)
  • //初始建堆,時間復雜度為O(n)
  • HeapAdjust(array,i,Length);
  • ?
  • intj=Length;
  • for(i=k;i>0;--i,--j)
  • //k次循環,每次循環的復雜度最多為k次交換,復雜度為o(k^2)
  • {
  • intmin=GetMin(array,j,i);
  • printf("%d,",min);
  • }
  • }
  • ?
  • intmain()
  • {
  • intarray[MAXLEN];
  • for(inti=MAXLEN;i>0;--i)
  • array[MAXLEN-i]=i;
  • ?
  • Kmin(array,MAXLEN,K);
  • return0;
  • }
  • ?

    算法導論第6章有下面這樣一張圖,因為開始時曾一直糾結過這個問題,“取出堆頂元素之后,把堆中下面的最后一個元素送到堆頂”。因為算法導論上下面這張圖給了我一個假象,從a)->b)中,讓我誤以為是取出堆頂元素之后,是把原來堆頂元素的兒子送到堆頂。而事實上不是這樣的。因為在下面的圖中,16被刪除后,堆中最后一個元素1代替16成為根結點,然后1下沉(注意下圖所示的過程是最大堆的堆排序過程,不再是上面的最小堆了,所以小的元素當然要下移),14上移到堆頂。所以,圖中小圖圖b)是已經在小圖a)之和被調整過的最大堆了,只是調整了logn次,非上面所述的k次。

    ok,接下來,咱們再著重分析下上述思路4。或許,你不會相信上述思路4的觀點,但我馬上將用事實來論證我的觀點。這幾天,我一直在想,也一直在找資料查找類似快速排序的partition過程的分治算法(即上述在編程之美上提到的第4點思路),是否能做到O(N)的論述或證明,

    然找了三天,不但在算法導論上找到了RANDOMIZED-SELECT,在平均情況下為線性期望時間O(N)的論證(請參考本文第二節),還在mark allen weiss所著的數據結構與算法分析--c語言描述一書(還得多謝朋友sheguang提醒)中,第7章第7.7.6節(本文下面的第4節末,也有關此問題的闡述也找到了在最壞情況下,為線性時間O(N)(是的,不含期望,是最壞情況下為O(N))的快速選擇算法(此算法,本文文末,也有闡述),請看下述文字(括號里的中文解釋為本人添加):

    Quicksort can be modified to solve the selection problem, which we have seen in chapters 1 and 6. Recall that by using a priority queue, we can find the kth largest (or smallest) element in O(n + k log n)(即上述思路7). For the special case of finding the median, this gives an O(n log n) algorithm.

    Since we can sort the file in O(nlog n) time, one might expect to obtain a better time bound for selection. The algorithm we present to find the kth smallest element in a set S is almost identical to quicksort. In fact, the first three steps are the same. We will call this algorithm quickselect(叫做快速選擇). Let |Si| denote the number of elements in Si(令|Si|為Si中元素的個數). The steps of quickselect are(快速選擇,即上述編程之美一書上的,思路4,步驟如下):

    1. If |S| = 1, then k = 1 and return the elements in S as the answer. If a cutoff for small files is being used and |S| <=CUTOFF, then sort S and return the kth smallest element.
    2. Pick a pivot element, v (- S.(選取一個樞紐元v屬于S)
    3. Partition S - {v} into S1 and S2, as was done with quicksort.
    (將集合S-{v}分割成S1和S2,就像我們在快速排序中所作的那樣)

    4. If k <= |S1|, then the kth smallest element must be in S1. In this case, return quickselect (S1, k). If k = 1 + |S1|, then the pivot is the kth smallest element and we can return it as the answer. Otherwise, the kth smallest element lies in S2, and it is the (k - |S1| - 1)st smallest element in S2. We make a recursive call and return quickselect (S2, k - |S1| - 1).
    (如果k<=|S1|,那么第k個最小元素必然在S1中。在這種情況下,返回quickselect(S1,k)。如果k=1+|S1|,那么樞紐元素就是第k個最小元素,即找到,直接返回它。否則,這第k個最小元素就在S2中,即S2中的第(k-|S1|-1)(多謝王洋提醒修正)個最小元素,我們遞歸調用并返回quickselect(S2,k-|S1|-1))。

    In contrast to quicksort, quickselect makes only one recursive call instead of two. The worst case of quickselect is identical to that of quicksort and is O(n2). Intuitively, this is because quicksort's worst case is when one of S1 and S2 is empty; thus, quickselect(快速選擇) is not really saving a recursive call. The average running time, however, is O(n)(不過,其平均運行時間為O(N)。看到了沒,就是平均復雜度為O(N)這句話). The analysis is similar to quicksort's and is left as an exercise.

    The implementation of quickselect is even simpler than the abstract description might imply. The code to do this shown in Figure 7.16. When the algorithm terminates, the kth smallest element is in position k. This destroys the original ordering; if this is not desirable, then a copy must be made.

    并給出了代碼示例:

  • //copyright@markallenweiss
  • //July、updated,2011.05.05凌晨.
  • ?
  • //q_selectplacesthekthsmallestelementina[k]
  • voidq_select(input_typea[],intk,intleft,intright)
  • {
  • inti,j;
  • input_typepivot;
  • if(left+CUTOFF<=right)
  • {
  • pivot=median3(a,left,right);
  • //取三數中值作為樞紐元,可以消除最壞情況而保證此算法是O(N)的。不過,這還只局限在理論意義上。
  • //稍后,除了下文的第二節的隨機選取樞紐元,在第四節末,您將看到另一種選取樞紐元的方法。
  • ?
  • i=left;j=right-1;
  • for(;;)
  • {
  • while(a[++i]<pivot);
  • while(a[--j]>pivot);
  • if(i<j)
  • swap(&a[i],&a[j]);
  • else
  • break;
  • }
  • swap(&a[i],&a[right-1]);/*restorepivot*/
  • if(k<i)
  • q_select(a,k,left,i-1);
  • else
  • if(k>i)
  • q-select(a,k,i+1,right);
  • }
  • else
  • insert_sort(a,left,right);
  • }
  • ?

    結論:

  • 與快速排序相比,快速選擇只做了一次遞歸調用而不是兩次。快速選擇的最壞情況和快速排序的相同,也是O(N^2),最壞情況發生在樞紐元的選取不當,以致S1,或S2中有一個序列為空。
  • 這就好比快速排序的運行時間與劃分是否對稱有關,劃分的好或對稱,那么快速排序可達最佳的運行時間O(n*logn),劃分的不好或不對稱,則會有最壞的運行時間為O(N^2)。而樞紐元的選取則完全決定快速排序的partition過程是否劃分對稱。
  • 快速選擇也是一樣,如果樞紐元的選取不當,則依然會有最壞的運行時間為O(N^2)的情況發生。那么,怎么避免這個最壞情況的發生,或者說就算是最壞情況下,亦能保證快速選擇的運行時間為O(N)列?對了,關鍵,還是看你的樞紐元怎么選取。
  • 像上述程序使用三數中值作為樞紐元的方法可以使得最壞情況發生的概率幾乎可以忽略不計。然而,稍后,在本文第四節末,及本文文末,您將看到:通過一種更好的方法,如“五分化中項的中項”,或“中位數的中位數”等方法選取樞紐元,我們將能徹底保證在最壞情況下依然是線性O(N)的復雜度。
  • 至于編程之美上所述:從數組中隨機選取一個數X,把數組劃分為Sa和Sb倆部分,那么這個問題就轉到了下文第二節RANDOMIZED-SELECT,以線性期望時間做選擇,無論如何,編程之美上的解法二的復雜度為O(n*logk)都是有待商榷的。至于最壞情況下一種全新的,為O(N)的快速選擇算法,直接跳轉到本文第四節末,或文末部分吧)。

    不過,為了公正起見,把編程之美第141頁上的源碼貼出來,由大家來評判:

  • Kbig(S,k):
  • if(k<=0):
  • return[]//返回空數組
  • if(lengthS<=k):
  • returnS
  • (Sa,Sb)=Partition(S)
  • returnKbig(Sa,k).Append(Kbig(Sb,k–lengthSa)
  • ?
  • Partition(S):
  • Sa=[]//初始化為空數組
  • Sb=[]//初始化為空數組
  • Swap(s[1],S[Random()%lengthS])//隨機選擇一個數作為分組標準,以
  • //避免特殊數據下的算法退化,也可
  • //以通過對整個數據進行洗牌預處理
  • //實現這個目的
  • p=S[1]
  • foriin[2:lengthS]:
  • S[i]>p?Sa.Append(S[i]):Sb.Append(S[i])
  • //將p加入較小的組,可以避免分組失敗,也使分組
  • //更均勻,提高效率
  • lengthSa<lengthSb?Sa.Append(p):Sb.Append(p)
  • return(Sa,Sb)
  • ?

    你已經看到,它是隨機選取數組中的任一元素為樞紐的,這就是本文下面的第二節RANDOMIZED-SELECT的問題了,只是要修正的是,此算法的平均時間復雜度為線性期望O(N)的時間。而,稍后在本文的第四節或本文文末,您還將會看到此問題的進一步闡述(SELECT算法,即快速選擇算法),此SELECT算法能保證即使在最壞情況下,依然是線性O(N)的復雜度。

    updated:

    1、為了照顧手中沒編程之美這本書的friends,我拍了張照片,現貼于下供參考(提醒:1、書上為尋找最大的k個數,而我們面對的問題是尋找最小的k個數,兩種形式,一個本質(該修改的地方,上文已經全部修改)。2、書中描述與上文思路4并無原理性出入,不過,勿被圖中記的筆記所誤導,因為之前也曾被書中的這個n*logk復雜度所誤導過。ok,相信,看完本文后,你不會再有此疑惑):

    2、同時,在編程之美原書上此節的解法五的開頭提到,“上面類似快速排序的方法平均時間復雜度是線性的”,我想上面的類似快速排序的方法,應該是指解法(即如上所述的類似快速排序partition過程的方法),但解法二得出的平均時間復雜度卻為O(N*logk),明擺著前后矛盾(參見下圖)。

    3、此文創作后的幾天,已把本人的意見反饋給鄒欣等人,下面是編程之美bop1的改版修訂地址的頁面截圖(本人也在參加其改版修訂的工作),下面的文字是我的記錄(同時,本人聲明,此狂想曲系列文章系我個人獨立創作,與其它的事不相干):

    第二節、Randomized-Select,線性期望時間
    下面是RANDOMIZED-SELECT(A, p, r)完整偽碼(來自算法導論),我給了注釋,或許能給你點啟示。在下結論之前,我還需要很多的時間去思量,以確保結論之完整與正確。

    PARTITION(A, p, r) //partition過程 p為第一個數,r為最后一個數
    1 x ← A[r] //以最后一個元素作為主元
    2 i ← p - 1
    3 for j ← p to r - 1
    4 do if A[j] ≤ x
    5 then i ← i + 1
    6 exchange A[i] <-> A[j]
    7 exchange A[i + 1] <-> A[r]
    8 return i + 1

    RANDOMIZED-PARTITION(A, p, r) //隨機快排的partition過程
    1 i ← RANDOM(p, r) //i 隨機取p到r中個一個值
    2 exchange A[r] <-> A[i] //以隨機的 i作為主元
    3 return PARTITION(A, p, r) //調用上述原來的partition過程

    RANDOMIZED-SELECT(A, p, r, i) //以線性時間做選擇,目的是返回數組A[p..r]中的第i 小的元素
    1 if p = r //p=r,序列中只有一個元素?
    2 then return A[p]
    3 q ← RANDOMIZED-PARTITION(A, p, r) //隨機選取的元素q作為主元?
    4 k ← q - p + 1 //k表示子數組 A[p…q]內的元素個數,處于劃分低區的元素個數加上一個主元元素
    5 if i == k //檢查要查找的i 等于子數組中A[p....q]中的元素個數k
    6 then return A[q] //則直接返回A[q]?
    7 else if i < k?
    8 then return RANDOMIZED-SELECT(A, p, q - 1, i)
    //得到的k 大于要查找的i 的大小,則遞歸到低區間A[p,q-1]中去查找
    9 else return RANDOMIZED-SELECT(A, q + 1, r, i - k)
    //得到的k 小于要查找的i 的大小,則遞歸到高區間A[q+1,r]中去查找。

    寫此文的目的,在于起一個拋磚引玉的作用。希望,能引起你的重視及好的思路,直到有個徹底明白的結果。

    updated:算法導論原英文版有關于RANDOMIZED-SELECT(A, p, r)為O(n)的證明。為了一個徹底明白的闡述,我現將其原文的證明自個再翻譯加工后,闡述如下:

    此RANDOMIZED-SELECT最壞情況下時間復雜度為Θ(n2),即使是要選擇最小元素也是如此,因為在劃分時可能極不走運,總是按余下元素中的最大元素進行劃分,而劃分操作需要O(n)的時間。

    然而此算法的平均情況性能極好,因為它是隨機化的,故沒有哪一種特別的輸入會導致其最壞情況的發生。

    算法導論上,針對此RANDOMIZED-SELECT算法平均時間復雜度為O(n)的證明,引用如下,或許,能給你我多點的啟示(本來想直接引用第二版中文版的翻譯文字,但在中英文對照閱讀的情況下,發現第二版中文版的翻譯實在不怎么樣,所以,得自己一個一個字的敲,最終敲完修正如下),分4步證明:

    1、當RANDOMIZED-SELECT作用于一個含有n個元素的輸入數組A[p?..r]上時,所需時間是一個隨機變量,記為T(n),我們可以這樣得到線性期望值E [T(n)]的下界:程序RANDOMIZED-PARTITION會以等同的可能性返回數組中任何一個元素為主元,因此,對于每一個k,(1 ≤k?≤n),子數組A[p?..q]有k個元素,它們全部小于或等于主元元素的概率為1/n.對k?= 1, 2,...,n,我們定指示器Xk,為:

    Xk?= I{子數組A[p?..q]恰有k個元素} ,

    我們假定元素的值不同,因此有

    E[Xk]=1/n

    當調用RANDOMIZED-SELECT并且選擇A[q]作為主元元素的時候,我們事先不知道是否會立即找到我們所想要的第i小的元素,因為,我們很有可能需要在子數組A[p?..q?- 1], 或A[q?+ 1 ..r]上遞歸繼續進行尋找.具體在哪一個子數組上遞歸尋找,視第i小的元素與A[q]的相對位置而定.

    2、假設T(n)是單調遞增的,我們可以將遞歸所需時間的界限限定在輸入數組時可能輸入的所需遞歸調用的最大時間(此句話,原中文版的翻譯也是有問題的).換言之,我們斷定,為得到一個上界,我們假定第i小的元素總是在劃分的較大的一邊,對一個給定的RANDOMIZED-SELECT,指示器Xk剛好在一個k值上取1,在其它的k值時,都是取0.當Xk =1時,可能要遞歸處理的倆個子數組的大小分別為k-1,和n-k,因此可得到遞歸式為

    取期望值為:

    為了能應用等式(C.23),我們依賴于Xk和T(max(k?- 1,n?-?k))是獨立的隨機變量(這個可以證明,證明此處略)。

    3、下面,我們來考慮下表達式max(k?- 1,n?-k)的結果.我們有:

    如果n是偶數,從T(?)到T(n?- 1)每個項在總和中剛好出現倆次,T(?)出現一次。因此,有

    我們可以用替換法來解上面的遞歸式。假設對滿足這個遞歸式初始條件的某個常數c,有T(n) ≤cn。我們假設對于小于某個常數c(稍后再來說明如何選取這個常數)的n,有T(n) =O(1)。 同時,還要選擇一個常數a,使得對于所有的n>0,由上式中O(n)項(用來描述這個算法的運行時間中非遞歸的部分)所描述的函數,可由an從上方限界得到(這里,原中文版的翻譯的確是有點含糊)。利用這個歸納假設,可以得到:

    (此段原中文版翻譯有點問題,上述文字已經修正過來,對應的此段原英文為:We solve the recurrence by substitution. Assume thatT(n)≤cn?for some constant?c?that satisfies the initial conditions of the recurrence. We assume thatT(n) =O(1) fornless than some constant; we shall pick this constant later. We also pick a constanta?such that the function described by theO(n) term above (which describes the non-recursive component of the running time of the algorithm) is bounded from above byan?for alln> 0. Using this inductive hypothesis, we have)

    4、為了完成證明,還需要證明對足夠大的n,上面最后一個表達式最大為cn,即要證明:cn/4 -c/2 -an?≥ 0.如果在倆邊加上c/2,并且提取因子n,就可以得到n(c/4 -a) ≥c/2.只要我們選擇的常數c能滿足c/4 -a?> 0, i.e.,即c?> 4a,我們就可以將倆邊同時除以c/4 -a, 最終得到:

    綜上,如果假設對n?< 2c/(c?-4a),有T(n) =O(1),我們就能得到E[T(n)] =O(n)。所以,最終我們可以得出這樣的結論,并確認無疑:在平均情況下,任何順序統計量(特別是中位數)都可以在線性時間內得到。

    結論:如你所見,RANDOMIZED-SELECT有線性期望時間O(N)的復雜度,但此RANDOMIZED-SELECT算法在最壞情況下有O(N^2)的復雜度。所以,我們得找出一種在最壞情況下也為線性時間的算法。稍后,在本文的第四節末,及本文文末部分,你將看到一種在最壞情況下是線性時間O(N)的復雜度的快速選擇SELECT算法。

    第三節、各執己見,百家爭鳴

    updated :本文昨晚發布后,現在朋友們之間,主要有以下幾種觀點(在徹底弄清之前,最好不要下結論):

  • luuillu:我不認為隨機快排比直接快排的時間復雜度小。使用快排處理數據前,我們是不知道數據的排列規律的,因此一般情況下,被處理的數據本來就是一組隨機數據,對于隨機數據再多進行一次隨機化處理,數據仍然保持隨機性,對排序沒有更好的效果。 對一組數據采用隨選主元的方法,在極端的情況下,也可能出現每次選出的主元恰好是從大到小排列的,此時時間復雜度為O(n^2).當然這個概率極低。隨機選主元的好處在于,由于在現實中常常需要把一些數據保存為有序數據,因此,快速排序碰到有序數據的概率就會高一些,使用隨機快排可以提高對這些數據的處理效率。這個概率雖然高一些,但仍屬于特殊情況,不影響一般情況的時間復雜度。我覺得樓主上面提到的的思路4和思路5的時間復雜度是一樣的。

  • 571樓 得分:0 Sorehead 回復于:2011-03-09 16:29:58
    關于第五題:
    Sorehead:?這兩天我總結了一下,有以下方法可以實現:
    1、第一次遍歷取出最小的元素,第二次遍歷取出第二小的元素,依次直到第k次遍歷取出第k小的元素。這種方法最簡單,時間復雜度是O(k*n)。看上去效率很差,但當k很小的時候可能是最快的。
    2、對這n個元素進行排序,然后取出前k個數據即可,可以采用比較普遍的堆排序或者快速排序,時間復雜度是O(n*logn)。這種方法有著很大的弊端,題目并沒有要求這最小的k個數是排好序的,更沒有要求對其它數據進行排序,對這些數據進行排序某種程度上來講完全是一種浪費。而且當k=1時,時間復雜度依然是O(n*logn)。
    3、可以把快速排序改進一下,應該和樓主的kth_elem一樣,這樣的好處是不用對所有數據都進行排序。平均時間復雜度應該是O(n*logk)。(在本文最后一節,你或將看到,復雜度可能應該為O(n))
    4、使用我開始講到的平衡二叉樹或紅黑樹,樹只用來保存k個數據即可,這樣遍歷所有數據只需要一次。時間復雜度為O(n*logk)。后來我發現這個思路其實可以再改進,使用堆排序中的堆,堆中元素數量為k,這樣中最大元素就是頭節點,遍歷所有數據時比較次數更少,當然時間復雜度并沒有變化。
    5、使用計數排序的方法,創建一個數組,以元素值為該數組下標,數組的值為該元素在數組中出現的次數。這樣遍歷一次就可以得到這個數組,然后查詢這個數組就可以得到答案了。時間復雜度為O(n)。如果元素值沒有重復的,還可以使用位圖方式。這種方式有一定局限性,元素必須是正整數,并且取值范圍不能太大,否則就造成極大的空間浪費,同時時間復雜度也未必就是O(n)了。當然可以再次改進,使用一種比較合適的哈希算法來代替元素值直接作為數組下標。

  • litaoye:按照算法導論上所說的,最壞情況下線性時間找第k大的數。證明一下:把數組中的元素,5個分為1組排序,排序需要進行7次比較(2^7 > 5!),這樣需要1.4 * n次比較,可以完成所有組的排序。取所有組的中位數,形成一個新的數組,有n/5個元素,5個分為1組排序,重復上面的操作,直到只剩下小于5個元素,找出中位數。根據等比數列求和公式,求出整個過程的比較次數:7/5 + 7/25 + 7/125 +...... = 7/4,用7/4 * n次比較可以找出中位數的中位數M。能夠證明,整個數組中>=M的數超過3*n / 10 - 6,<=M的數超過3*n / 10 - 6。以M為基準,執行上面的PARTITION,每次至少可以淘汰3*n / 10 - 6,約等于3/10 * n個數,也就是說是用(7/4 + 1) * n次比較之后,最壞情況下可以讓數據量變為原來的7/10,同樣根據等比數列求和公式,可以算出最壞情況下找出第k大的數需要的比較次數,1 + 7/10 + 49/100 + .... = 10/3, 10/3 * 11/4 * n = 110/12 * n,也就是說整個過程是O(n)的,盡管隱含的常數比較大?。

  • 總結:

    關于RANDOMIZED-SELECT(A, q + 1, r, i - k),期望運行時間為O(n)已經沒有疑問了,更嚴格的論證在上面的第二節也已經給出來了。

    ok,現在,咱們剩下的問題是,除了此RANDOMIZED-SELECT(A, q + 1, r, i - k)方法(實用價值并不大)和計數排序,都可以做到O(n)之外,還有類似快速排序的partition過程,是否也能做到O(n)?

    第四節、類似partition過程,最壞亦能做到O(n)?

    我想,經過上面的各路好漢的思路轟炸,您的頭腦和思維肯定有所混亂了。ok,下面,我盡量以通俗易懂的方式來繼續闡述咱們的問題。上面第三節的總結提出了一個問題,即類似快速排序的partition過程,是否也能做到O(n)?

    我們說對n個數進行排序,快速排序的平均時間復雜度為O(n*logn),這個n*logn的時間復雜度是如何得來的列?

    經過之前我的有關快速排序的三篇文章,相信您已經明了了以下過程:快速排序每次選取一個主元X,依據這個主元X,每次把整個序列劃分為A,B倆個部分,且有Ax<X<Bx。

    假如我們每次劃分總是產生9:1 的劃分,那么,快速排序運行時間的遞歸式為:T(n)=T(9n/10)+T(n/10)+cn。形成的遞歸樹,(注:最后同樣能推出T(n)=n*logn,即如下圖中,每一層的代價為cn,共有logn層(深度),所以,最后的時間復雜度為O(n)*logn)如下:

    而我們知道,如果我們每次劃分都是平衡的,即每次都劃分為均等的兩部分元素(對應上圖,第一層1/2,1/2,,第二層1/4,1/4.....),那么,此時快速排序的運行時間的遞歸式為:

    T (n) ≤ 2T (n/2) + Θ(n) ,同樣,可推導出:T (n) = O(n lg n).

    這就是快速排序的平均時間復雜度的由來。

    那么,咱們要面對的問題是什么,要尋找n個數的序列中前k個元素。如何找列?假設咱們首先第一次對n個數運用快速排序的partition過程劃分,主元為Xm,此刻找到的主元元素Xm肯定為序列中第m小的元素,此后,分為三種情況:
    1、如果m=k,即返回的主元即為我們要找的第k小的元素,那么直接返回主元Xm即可,然后直接輸出Xm前面的m-1個元素,這m個元素,即為所求的前k個最小的元素。
    2、如果m>k,那么接下來要到低區間A[0....m-1]中尋找,丟掉高區間;
    3、如果m<k,那么接下來要到高區間A[m+1...n-1]中尋找,丟掉低區間。

    當m一直>k的時候,好說,區間總是被不斷的均分為倆個區間(理想情況),那么最后的時間復雜度如luuillu所說,T(n)=n + T(n/2) = n + n/2 + n/4 + n/8 + ...+1 . 式中一共logn項。可得出:T(n)為O(n)。
    但當m<k的時候,上述情況,就不好說了。正如luuillu所述:當m<k,那么接下來要到高區間A[m+1...n-1]中尋找,新區間的長度為n-m-1, 需要尋找 k-m個數。此時可令:k=k-m, m=n-m-1, 遞歸調用原算法處理,本次執行次數為 m,當m減到1算法停止(當m<k 時 ,k=m-k.這個判斷過程實際上相當于對m取模運算,即:k=k%m;)。
    最終在高區間找到的k-m個數,加上在低區間的k個數,即可找到最小的k個數,是否也能得出T(n)=O(n),則還有待驗證(本文已經全面更新,所有的論證,都已經給出,確認無誤的是:類似快速排序的partition過程,明確的可以做到O(N))。

    Ok,如果在評論里回復,有諸多不便,歡迎到此帖子上回復:微軟100題維護地址,我會隨時追蹤這個帖子。謝謝。

  • //求取無序數組中第K個數,本程序樞紐元的選取有問題,不作推薦。
  • //copyright@飛羽
  • //July、yansha,updated,2011.05.18。
  • #include<iostream>
  • #include<time.h>
  • usingnamespacestd;
  • ?
  • intkth_elem(inta[],intlow,inthigh,intk)
  • {
  • intpivot=a[low];
  • //這個程序之所以做不到O(N)的最最重要的原因,就在于這個樞紐元的選取。
  • //而這個程序直接選取數組中第一個元素作為樞紐元,是做不到平均時間復雜度為O(N)的。
  • ?
  • //要做到,就必須把上面選取樞紐元的代碼改掉,要么是隨機選擇數組中某一元素作為樞紐元,能達到線性期望的時間
  • //要么是選取數組中中位數的中位數作為樞紐元,保證最壞情況下,依然為線性O(N)的平均時間復雜度。
  • intlow_temp=low;
  • inthigh_temp=high;
  • while(low<high)
  • {
  • while(low<high&&a[high]>=pivot)
  • --high;
  • a[low]=a[high];
  • while(low<high&&a[low]<pivot)
  • ++low;
  • a[high]=a[low];
  • }
  • a[low]=pivot;
  • ?
  • //以下就是主要思想中所述的內容
  • if(low==k-1)
  • returna[low];
  • elseif(low>k-1)
  • returnkth_elem(a,low_temp,low-1,k);
  • else
  • returnkth_elem(a,low+1,high_temp,k);
  • }
  • ?
  • intmain()//以后盡量不再用隨機產生的數組進行測試,沒多大必要。
  • {
  • for(intnum=5000;num<50000001;num*=10)
  • {
  • int*array=newint[num];
  • ?
  • intj=num/10;
  • intacc=0;
  • for(intk=1;k<=num;k+=j)
  • {
  • //隨機生成數據
  • srand(unsigned(time(0)));
  • for(inti=0;i<num;i++)
  • array[i]=rand()*RAND_MAX+rand();
  • //”如果數組本身就是利用隨機化產生的話,那么選擇其中任何一個元素作為樞軸都可以看作等價于隨機選擇樞軸,
  • //(雖然這不叫隨機選擇樞紐)”,這句話,是完全不成立的,是錯誤的。
  • ?
  • //“因為你總是選擇隨機數組中第一個元素作為樞紐元,不是隨機選擇樞紐元”
  • //相當于把上面這句話中前面的“隨機”兩字去掉,就是:
  • //因為你總是選擇數組中第一個元素作為樞紐元,不是隨機選擇樞紐元。
  • //所以,這個程序,始終做不到平均時間復雜度為O(N)。
  • ?
  • //隨機數組和給定一個非有序而隨機手動輸入的數組,是一個道理。稍后,還將就程序的運行結果繼續解釋這個問題。
  • //July、updated,2011.05.18。
  • ?
  • //計算一次查找所需的時鐘周期數
  • clock_tstart=clock();
  • intdata=kth_elem(array,0,num-1,k);
  • clock_tend=clock();
  • acc+=(end-start);
  • }
  • cout<<"Theaveragetimeofsearchingadateinthearraysizeof"<<num<<"is"<<acc/10<<endl;
  • }
  • return0;
  • }
  • ?

    關于上述程序的更多闡述,請參考此文第三章續、Top K算法問題的實現中,第一節有關實現三的說明。

    updated:

    近日,再次在Mark Allen Weiss的數據結構與算法分析一書上,第10章,第10.2.3節看到了關于此分治算法的應用,平均時間復雜度為O(N)的闡述與證明,可能本文之前的敘述將因此而改寫(July、updated,2011.05.05):

    The selection problem requires us to find the kth smallest element in a list S of n elements(要求我們找出含N個元素的表S中的第k個最小的元素). Of particular interest is the special case of finding the median. This occurs when k = |-n/2-|(向上取整).(我們對找出中間元素的特殊情況有著特別的興趣,這種情況發生在k=|-n/2-|的時候)

    In Chapters 1, 6, 7 we have seen several solutions to the selection problem. The solution in Chapter 7 uses a variation of quicksort and runs in O(n) average time(第7章中的解法,即本文上面第1節所述的思路4,用到快速排序的變體并以平均時間O(N)運行). Indeed, it is described in Hoare's original paper on quicksort.

    Although this algorithm runs in linear average time, it has a worst case of O (n2)(但它有一個O(N^2)的最快情況). Selection can easily be solved in O(n log n) worst-case time by sorting the elements, but for a long time it was unknown whether or not selection could be accomplished in O(n) worst-case time. The quickselect algorithm outlined in Section 7.7.6 is quite efficient in practice, so this was mostly a question of theoretical interest.

    Recall that the basic algorithm is a simple recursive strategy. Assuming that n is larger than the cutoff point where elements are simply sorted, an element v, known as the pivot, is chosen. The remaining elements are placed into two sets, S1 and S2. S1 contains elements that are guaranteed to be no larger than v, and S2 contains elements that are no smaller than v. Finally, if k <= |S1|, then the kth smallest element in S can be found by recursively computing the kth smallest element in S1. If k = |S1| + 1, then the pivot is the kth smallest element. Otherwise, the kth smallest element in S is the (k - |S1| -1 )st smallest element in S2. The main difference between this algorithm and quicksort is that there is only one subproblem to solve instead of two(這個快速選擇算法與快速排序之間的主要區別在于,這里求解的只有一個子問題,而不是兩個子問題)。

    定理10.9
    The running time of quickselect using median-of-median-of-five partitioning is O(n)。

    The basic idea is still useful. Indeed, we will see that we can use it to improve the expected number of comparisons that quickselect makes. To get a good worst case, however, the key idea is to use one more level of indirection. Instead of finding the median from a sample of random elements, we will find the median from a sample of medians.

    The basic pivot selection algorithm is as follows:
    1. Arrange the n elements into |_n/5_| groups of 5 elements, ignoring the (at most four) extra elements.
    2. Find the median of each group. This gives a list M of |_n/5_| medians.
    3. Find the median of M. Return this as the pivot, v.

    We will use the term?median-of-median-of-five partitioning?to describe the quickselect algorithm that uses the pivot selection rule given above. (我們將用術語“五分化中項的中項”來描述使用上面給出的樞紐元選擇法的快速選擇算法)。We will now show that median-of-median-of-five partitioning guarantees that each recursive subproblem is at most roughly 70 percent as large as the original(現在我們要證明,“五分化中項的中項”,得保證每個遞歸子問題的大小最多為原問題的大約70%). We will also show that the pivot can be computed quickly enough to guarantee an O (n) running time for the entire selection algorithm(我們還要證明,對于整個選擇算法,樞紐元可以足夠快的算出,以確保O(N)的運行時間。看到了沒,這再次佐證了我們的類似快速排序的partition過程的分治方法為O(N)的觀點)。
    ..........
    證明從略,更多,請參考Mark Allen Weiss的數據結構與算法分析--c語言描述一書上,第10章,第10.2.3節。

    updated again:

    為了給讀者一個徹徹底底、明明白白的論證,我還是決定把書上面的整個論證過程全程貼上來,下面,接著上面的內容,然后直接從其中文譯本上截兩張圖來說明好了(更清晰明了):

    關于上圖提到的定理10.8,如下圖所示,至于證明,留給讀者練習(可參考本文第二節關于RANDOMIZED-SELECT為線性時間的證明):

    ok,第四節,有關此問題的更多論述,請參見下面的本文文末updated again部分。

    第五節、堆結構實現,處理海量數據

    文章,可不能這么完了,咱們還得實現一種靠譜的方案,從整個文章來看,處理這個尋找最小的k個數,最好的方案是第一節中所提到的思路3:當然,更好的辦法是維護k個元素的最大堆,原理與上述第2個方案一致,即用容量為k的最大堆存儲最小的k個數,此時,k1<k2<...<kmax(kmax設為大頂堆中最大元素)。遍歷一次數列,n,每次遍歷一個元素x,與堆頂元素比較,x<kmax,更新堆(用時logk),否則不更新堆。這樣下來,總費時O(n*logk)。

    為什么?道理很簡單,如果要處理的序列n比較小時,思路2(選擇排序)的n*k的復雜度還能說得過去,但當n很大的時候列?同時,別忘了,如果選擇思路1(快速排序),還得在數組中存儲n個數。當面對海量數據處理的時候列?n還能全部存放于電腦內存中么?(或許可以,或許很難)。

    ok,相信你已經明白了我的意思,下面,給出借助堆(思路3)這個數據結構,來尋找最小的k個數的完整代碼,如下:

  • //借助堆,查找最小的k個數
  • //copyright@yansha&&July
  • //July、updated,2011.04.28。
  • #include<iostream>
  • #include<assert.h>
  • usingnamespacestd;
  • voidMaxHeap(intheap[],inti,intlen);
  • /*-------------------
  • BUILD-MIN-HEAP(A)
  • 1heap-size[A]←length[A]
  • 2fori←|_length[A]/2_|downto1
  • 3doMAX-HEAPIFY(A,i)
  • */
  • //建立大根堆
  • voidBuildHeap(intheap[],intlen)
  • {
  • if(heap==NULL)
  • return;
  • ?
  • intindex=len/2;
  • for(inti=index;i>=1;i--)
  • MaxHeap(heap,i,len);
  • }
  • /*----------------------------
  • PARENT(i)
  • return|_i/2_|
  • LEFT(i)
  • return2i
  • RIGHT(i)
  • return2i+1
  • MIN-HEAPIFY(A,i)
  • 1l←LEFT(i)
  • 2r←RIGHT(i)
  • 3ifl≤heap-size[A]andA[l]<A[i]
  • 4thensmallest←l
  • 5elsesmallest←i
  • 6ifr≤heap-size[A]andA[r]<A[smallest]
  • 7thensmallest←r
  • 8ifsmallest≠i
  • 9thenexchangeA[i]<->A[smallest]
  • 10MIN-HEAPIFY(A,smallest)
  • */
  • //調整大根堆
  • voidMaxHeap(intheap[],inti,intlen)
  • {
  • intlargeIndex=-1;
  • intleft=i*2;
  • intright=i*2+1;
  • ?
  • if(left<=len&&heap[left]>heap[i])
  • largeIndex=left;
  • else
  • largeIndex=i;
  • ?
  • if(right<=len&&heap[right]>heap[largeIndex])
  • largeIndex=right;
  • ?
  • if(largeIndex!=i)
  • {
  • swap(heap[i],heap[largeIndex]);
  • MaxHeap(heap,largeIndex,len);
  • }
  • }
  • intmain()
  • {
  • //定義數組存儲堆元素
  • intk;
  • cin>>k;
  • int*heap=newint[k+1];//注,只需申請存儲k個數的數組
  • FILE*fp=fopen("data.txt","r");//從文件導入海量數據(便于測試,只截取了9M的數據大小)
  • assert(fp);
  • ?
  • for(inti=1;i<=k;i++)
  • fscanf(fp,"%d",&heap[i]);
  • ?
  • BuildHeap(heap,k);//建堆
  • ?
  • intnewData;
  • while(fscanf(fp,"%d",&newData)!=EOF)
  • {
  • if(newData<heap[1])//如果遇到比堆頂元素kmax更小的,則更新堆
  • {
  • heap[1]=newData;
  • MaxHeap(heap,1,k);//調整堆
  • }
  • ?
  • }
  • ?
  • for(intj=1;j<=k;j++)
  • cout<<heap[j]<<"";
  • cout<<endl;
  • ?
  • fclose(fp);
  • return0;
  • }
  • ?

    咱們用比較大量的數據文件測試一下,如這個數據文件:

    輸入k=4,即要從這大量的數據中尋找最小的k個數,可得到運行結果,如下圖所示:

    至于,這4個數,到底是不是上面大量數據中最小的4個數,這個,咱們就無從驗證了,非人力之所能及也。畢。

    第六節、stl之_nth_element ,逐步實現

    以下代碼摘自stl中_nth_element的實現,且逐步追蹤了各項操作,其完整代碼如下:

  • //_nth_element(...)的實現
  • template<classRandomAccessIterator,classT>
  • void__nth_element(RandomAccessIteratorfirst,RandomAccessIteratornth,
  • RandomAccessIteratorlast,T*){
  • while(last-first>3){
  • RandomAccessIteratorcut=__unguarded_partition//下面追蹤__unguarded_partition
  • (first,last,T(__median(*first,*(first+(last-first)/2),
  • *(last-1))));
  • if(cut<=nth)
  • first=cut;
  • else
  • last=cut;
  • }
  • __insertion_sort(first,last);//下面追蹤__insertion_sort(first,last)
  • }
  • ?
  • //__unguarded_partition()的實現
  • template<classRandomAccessIterator,classT>
  • RandomAccessIterator__unguarded_partition(RandomAccessIteratorfirst,
  • RandomAccessIteratorlast,
  • Tpivot){
  • while(true){
  • while(*first<pivot)++first;
  • --last;
  • while(pivot<*last)--last;
  • if(!(first<last))returnfirst;
  • iter_swap(first,last);
  • ++first;
  • }
  • }
  • ?
  • //__insertion_sort(first,last)的實現
  • template<classRandomAccessIterator>
  • void__insertion_sort(RandomAccessIteratorfirst,RandomAccessIteratorlast){
  • if(first==last)return;
  • for(RandomAccessIteratori=first+1;i!=last;++i)
  • __linear_insert(first,i,value_type(first));//下面追蹤__linear_insert
  • }
  • ?
  • //_linear_insert()的實現
  • template<classRandomAccessIterator,classT>
  • inlinevoid__linear_insert(RandomAccessIteratorfirst,
  • RandomAccessIteratorlast,T*){
  • Tvalue=*last;
  • if(value<*first){
  • copy_backward(first,last,last+1);//這個追蹤,待續
  • *first=value;
  • }
  • else
  • __unguarded_linear_insert(last,value);//最后,再追蹤__unguarded_linear_insert
  • }
  • ?
  • //_unguarded_linear_insert()的實現
  • template<classRandomAccessIterator,classT>
  • void__unguarded_linear_insert(RandomAccessIteratorlast,Tvalue){
  • RandomAccessIteratornext=last;
  • --next;
  • while(value<*next){
  • *last=*next;
  • last=next;
  • --next;
  • }
  • *last=value;
  • }
  • ?

    第七節、再探Selection_algorithm,類似partition方法O(n)再次求證

    網友反饋:
    stupidcat:用類似快排的partition的方法,只求2邊中的一邊,在O(N)時間得到第k大的元素v;?
    弄完之后,vector<int> &data的前k個元素,就是最小的k個元素了。?
    時間復雜度是O(N),應該是最優的算法了。并給出了代碼示例:

  • //copyright@stupidcat
  • //July、updated,2011.05.08
  • intPartition(vector<int>&data,intheadId,inttailId)
  • //這里,采用的是算法導論上的partition過程方法
  • {
  • intposSlow=headId-1,posFast=headId;//一前一后,倆個指針
  • for(;posFast<tailId;++posFast)
  • {
  • if(data[posFast]<data[tailId])//以最后一個元素作為主元
  • {
  • ++posSlow;
  • swap(data[posSlow],data[posFast]);
  • }
  • }
  • ++posSlow;
  • swap(data[posSlow],data[tailId]);
  • returnposSlow;//寫的不錯,命名清晰
  • }
  • ?
  • voidFindKLeast(vector<int>&data,intheadId,inttailId,intk)
  • //尋找第k小的元素
  • {
  • if(headId<tailId)
  • {
  • intmidId=Partition(data,headId,tailId);
  • //可惜這里,沒有隨機或中位數的方法選取樞紐元(主元),使得本程序思路雖對,卻不達O(N)的目標
  • ?
  • if(midId>k)
  • {
  • FindKLeast(data,headId,midId-1,k);//k<midid,直接在低區間找
  • }
  • ?
  • else
  • {
  • if(midId<k)
  • {
  • FindKLeast(data,midId+1,tailId,k);//k>midid,遞歸到高區間找
  • }
  • }
  • }
  • }
  • ?
  • voidFindKLeastNumbers(vector<int>&data,unsignedintk)
  • {
  • intlen=data.size();
  • if(k>len)
  • {
  • thrownewstd::exception("Invalidargument!");
  • }
  • FindKLeast(data,0,len-1,k);
  • }
  • ?

    看來,這個問題,可能會因此糾纏不清了,近日,在維基百科的英文頁面上,找到有關Selection_algorithm的資料,上面給出的示例代碼為:

  • functionpartition(list,left,right,pivotIndex)
  • pivotValue:=list[pivotIndex]
  • swaplist[pivotIndex]andlist[right]//Movepivottoend
  • storeIndex:=left
  • forifromlefttoright
  • iflist[i]<pivotValue
  • swaplist[storeIndex]andlist[i]
  • incrementstoreIndex
  • swaplist[right]andlist[storeIndex]//Movepivottoitsfinalplace
  • returnstoreIndex
  • ?
  • functionselect(list,left,right,k)
  • ifleft=right
  • returnlist[left]
  • selectpivotIndexbetweenleftandright
  • pivotNewIndex:=partition(list,left,right,pivotIndex)
  • pivotDist:=pivotNewIndex-left+1
  • ifpivotDist=k
  • returnlist[pivotNewIndex]
  • elseifk<pivotDist
  • returnselect(list,left,pivotNewIndex-1,k)
  • else
  • returnselect(list,pivotNewIndex+1,right,k-pivotDist)
  • ?

    這個算法,其實就是在本人這篇文章:當今世界最受人們重視的十大經典算法里提到的:第三名:BFPRT 算法:

    A worst-case linear algorithm for the general case of selecting the kth largest element was published by Blum,
    Floyd, Pratt, Rivest and Tarjan in their 1973 paper "Time bounds for selection",?
    sometimes called BFPRT after the last names of the authors.?
    It is based on the quickselect algorithm and is also known as the median-of-medians algorithm.

    同時據維基百科上指出,若能選取一個好的pivot,則此算法能達到O(n)的最佳時間復雜度。

    The median-calculating recursive call does not exceed worst-case linear behavior?
    because the list of medians is 20% of the size of the list,?
    while the other recursive call recurs on at most 70% of the list, making the running time

    T(n) ≤ T(n/5) + T(7n/10) + O(n)

    The O(n) is for the partitioning work (we visited each element a constant number of times,
    in order to form them into O(n) groups and take each median in O(1) time).?
    From this, one can then show that T(n) ≤ c*n*(1 + (9/10) + (9/10)2 + ...) = O(n).

    當然,上面也提到了用堆這個數據結構,掃描一遍數組序列,建k個元素的堆O(k)的同時,調整堆(logk),然后再遍歷剩下的n-k個元素,根據其與堆頂元素的大小比較,決定是否更新堆,更新一次logk,所以,最終的時間復雜度為O(k*logk+(n-k)*logk)=O(n*logk)。

    Another simple method is to add each element of the list into an ordered set data structure,
    such as a heap or self-balancing binary search tree, with at most k elements.?
    Whenever the data structure has more than k elements, we remove the largest element,
    which can be done in O(log k) time. Each insertion operation also takes O(log k) time,
    resulting in O(nlog k) time overall.

    而如果上述類似快速排序的partition過程的BFPRT 算法成立的話,則將最大限度的優化了此尋找第k個最小元素的算法復雜度(經過第1節末+第二節+第4節末的updated,以及本節的論證,現最終確定,運用類似快速排序的partition算法尋找最小的k個元素能做到O(N)的復雜度,并確認無疑。July、updated,2011.05.05.凌晨)。

    updated again:

    為了再次佐證上述論證之不可懷疑的準確性,我再原文引用下第九章第9.3節全部內容(最壞情況線性時間的選擇),如下(我酌情對之參考原中文版做了翻譯,下文中括號內的中文解釋,為我個人添加):

    9.3 Selection in worst-case linear time(最壞情況下線性時間的選擇算法)

    We now examine a selection algorithm whose running time isO(n) in the worst case(現在來看,一個最壞情況運行時間為O(N)的選擇算法SELECT). Like RANDOMIZED-SELECT, the algorithm SELECT finds the desired element by recursively partitioning the input array. The idea behind the algorithm, however, is toguarantee?a good split when the array is partitioned. SELECT uses the deterministic partitioning algorithm PARTITION from quicksort (seeSection 7.1), modified to take the element to partition around as an input parameter(像RANDOMIZED-SELECT一樣,SELECTT通過輸入數組的遞歸劃分來找出所求元素,但是,該算法的基本思想是要保證對數組的劃分是個好的劃分。SECLECT采用了取自快速排序的確定性劃分算法partition,并做了修改,把劃分主元元素作為其參數).

    The SELECT algorithm determines theith smallest of an input array ofn?> 1 elements by executing the following steps. (Ifn?= 1, then SELECT merely returns its only input value as theith smallest.)(算法SELECT通過執行下列步驟來確定一個有n>1個元素的輸入數組中的第i小的元素。(如果n=1,則SELECT返回它的唯一輸入數值作為第i個最小值。))

  • Divide then?elements of the input array into? groups of 5 elements each and at most one group made up of the remainingn?mod 5 elements.
  • Find the median of each of the? groups by first insertion sorting the elements of each group (of which there are at most 5) and then picking the median from the sorted list of group elements.
  • Use SELECT recursively to find the medianx?of the? medians found in step 2. (If there are an even number of medians, then by our convention,x?is the lower median.)
  • Partition the input array around the median-of-mediansx?using the modified version of PARTITION. Letk?be one more than the number of elements on the low side of the partition, so thatx?is thekth smallest element and there aren-k?elements on the high side of the partition.(利用修改過的partition過程,按中位數的中位數x對輸入數組進行劃分,讓k比劃低去的元素數目多1,所以,x是第k小的元素,并且有n-k個元素在劃分的高區)
  • Ifi?=k, then returnx. Otherwise, use SELECT recursively to find theith smallest element on the low side ifi?<k, or the (i?-k)th smallest element on the high side ifi?>k.(如果要找的第i小的元素等于程序返回的k,即i=k,則返回x。否則,如果i<k,則在低區遞歸調用SELECT以找出第i小的元素,如果i>k,則在高區間找第(i-k)個最小元素)
  • (以上五個步驟,即本文上面的第四節末中所提到的所謂“五分化中項的中項”的方法。)

    To analyze the running time of SELECT, we first determine a lower bound on the number of elements that are greater than the partitioning element?x. (為了分析SELECT的運行時間,先來確定大于劃分主元元素x的的元素數的一個下界)Figure 9.1 is helpful in visualizing this bookkeeping. At least half of the medians found in step 2 are greater than[1]?the median-of-medians?x. Thus, at least half of the ? groupscontribute 3 elements that are greater than?x, except for the one group that has fewer than 5 elements if 5 does not dividen?exactly, and the one group containingx?itself. Discounting these two groups, it follows that the number of elements greater thanx?is at least:


    (Figure 9.1:對上圖的解釋或稱對SELECT算法的分析:n個元素由小圓圈來表示,并且每一個組占一縱列。組的中位數用白色表示,而各中位數的中位數x也被標出。(當尋找偶數數目元素的中位數時,使用下中位數)。箭頭從比較大的元素指向較小的元素,從中可以看出,在x的右邊,每一個包含5個元素的組中都有3個元素大于x,在x的左邊,每一個包含5個元素的組中有3個元素小于x。大于x的元素以陰影背景表示。 )

    Similarly, the number of elements that are less thanx?is at least 3n/10 - 6. Thus, in the worst case, SELECT is called recursively on at most 7n/10 + 6 elements in step 5.

    We can now develop a recurrence for the worst-case running timeT(n) of the algorithm SELECT. Steps 1, 2, and 4 take?O(n) time. (Step 2 consists ofO(n) calls of insertion sort on sets of sizeO(1).) Step 3 takes timeT(?), and step 5 takes time at mostT(7n/10+ 6), assuming thatT?is monotonically increasing. We make the assumption, which seems unmotivated at first, that any input of 140 or fewer elements requiresO(1) time; the origin of the magic constant 140 will be clear shortly. We can therefore obtain the recurrence:

    We show that the running time is linear by substitution. More specifically, we will show thatT(n) ≤cn?for some suitably large constant?c?and alln?> 0. We begin by assuming thatT(n) ≤cn?for some suitably large constantc?and alln?≤ 140; this assumption holds ifc?is large enough. We also pick a constanta?such that the function described by theO(n) term above (which describes the non-recursive component of the running time of the algorithm) is bounded above byan?for alln?> 0. Substituting this inductive hypothesis into the right-hand side of the recurrence yields

    T(n)

    c? +c(7n/10 + 6) +an

    ?

    cn/5 +c?+ 7cn/10 + 6c?+an

    ?

    =

    9cn/10 + 7c?+an

    ?

    =

    cn?+ (-cn/10 + 7c?+an) ,

    which is at mostcn?if

    Inequality (9.2) is equivalent to the inequalityc?≥ 10a(n/(n?- 70)) when?n?> 70. Because we assume thatn?≥ 140, we have?n/(n?- 70) ≤ 2, and so choosing?c?≥ 20awill satisfyinequality (9.2). (Note that there is nothing special about the constant 140; we could replace it by any integer strictly greater than 70 and then choosecaccordingly.) The worst-case running time of SELECT is therefore linear(因此,此SELECT的最壞情況的運行時間是線性的).

    As in a comparison sort (seeSection 8.1), SELECT and RANDOMIZED-SELECT determine information about the relative order of elements only by comparing elements. Recall fromChapter 8 that sorting requires(n?lgn) time in the comparison model, even on average (see Problem 8-1). The linear-time sorting algorithms in Chapter 8 make assumptions about the input. In contrast, the linear-time selection algorithms in this chapter do not require any assumptions about the input. They are not subject to the (n?lgn) lower bound because they manage to solve the selection problem without sorting.

    (與比較排序(算法導論8.1節)中的一樣,SELECT和RANDOMIZED-SELECT僅通過元素間的比較來確定它們之間的相對次序。在算法導論第8章中,我們知道在比較模型中,即使在平均情況下,排序仍然要O(n*logn)的時間。第8章得線性時間排序算法在輸入上做了假設。相反地,本節提到的此類似partition過程的SELECT算法不需要關于輸入的任何假設,它們不受下界O(n*logn)的約束,因為它們沒有使用排序就解決了選擇問題(看到了沒,道出了此算法的本質阿))

    Thus, the running time is linear because these algorithms do not sort; the linear-time behavior is not a result of assumptions about the input, as was the case for the sorting algorithms inChapter 8. Sorting requires(n?lgn) time in the comparison model, even on average (see Problem 8-1), and thus the method of sorting and indexing presented in the introduction to this chapter is asymptotically inefficient.(所以,本節中的選擇算法之所以具有線性運行時間,是因為這些算法沒有進行排序;線性時間的結論并不需要在輸入上所任何假設,即可得到。.....)

    ok,綜述全文,根據選取不同的元素作為主元(或樞紐)的情況,可簡單總結如下:
    1、RANDOMIZED-SELECT,以序列中隨機選取一個元素作為主元,可達到線性期望時間O(N)的復雜度。
    這個在本文第一節有關編程之美第2.5節關于尋找最大的k個元素(但其n*logk的復雜度是嚴重錯誤的,待勘誤,應以算法導論上的為準,隨機選取主元,可達線性期望時間的復雜度),及本文第二節中涉及到的算法導論上第九章第9.2節中(以線性期望時間做選擇),都是以隨機選取數組中任一元素作為樞紐元的。

    2、SELECT,快速選擇算法,以序列中“五分化中項的中項”,或“中位數的中位數”作為主元(樞紐元),則不容置疑的可保證在最壞情況下亦為O(N)的復雜度。
    這個在本文第四節末,及本文第七節,本文文末中都有所闡述,具體涉及到了算法導論一書中第九章第9.3節的最快情況線性時間的選擇,及Mark Allen Weiss所著的數據結構與算法分析--c語言描述一書的第10章第10.2.3節(選擇問題)中,都有所闡述。

    本文結論:至此,可以毫無保留的確定此問題之結論:運用類似快速排序的partition的快速選擇SELECT算法尋找最小的k個元素能做到O(N)的復雜度。RANDOMIZED-SELECT可能會有O(N^2)的最壞的時間復雜度,但上面的SELECT算法,采用如上所述的“中位數的中位數”的取元方法,則可保證此快速選擇算法在最壞情況下是線性時間O(N)的復雜度

    最終驗證:

    1、我想,我想,是的,僅僅是我猜想,你可能會有這樣的疑問:經過上文大量嚴謹的論證之后,利用SELECT算法,以序列中“五分化中項的中項”,或“中位數的中位數”作為主元(樞紐元),的的確確在最壞情況下O(N)的時間復雜度內找到第k小的元素,但是,但是,咱們的要面對的問題是什么?咱們是要找最小的k個數阿!不是找第k小的元素,而是找最小的k個數(即不是要你找1個數,而是要你找k個數)?哈哈,問題提的非常之好阿。

    2、事實上,在最壞情況下,能在O(N)的時間復雜度內找到第k小的元素,那么,亦能保證最壞情況下在O(N)的時間復雜度內找到前最小的k個數,咱們得找到一個理論依據,即一個證明(我想,等你看到找到前k個數的時間復雜度與找第k小的元素,最壞情況下,同樣是O(N)的時間復雜度后,你便會100%的相信本文的結論了,然后可以通告全世界,你找到了這個世界上最靠譜的中文算法blog,ok,這是后話)。

    算法導論第9章第9.3節練習里,有2個題目,與我們將要做的證明是一個道理,請看:

    Exercises 9.3-4:?
    Suppose that an algorithm uses only comparisons to find the ith smallest element in a set of n elements. Show that it can also find the i - 1 smaller elements and the n - i larger elements without performing any additional comparisons.(假設對一個含有n個元素的集合,某算法只需比較來確定第i小的元素。證明:無需另外的比較操作,它也能找到比i 小的i-1個元素和比i大的n-i個元素)。

    Exercises 9.3-7?
    Describe an O(n)-time algorithm that, given a set S of n distinct numbers and a positive integer k ≤ n, determines the k numbers in S that are closest to the median of S.(給出一個O(N)時間的算法,在給定一個有n個不同數字的集合S以及一個正整數K<=n后,它能確定出S中最接近其中位數的k個數。)

    怎么樣,能證明么?既然通過本文,咱們已經證明了上述的SELECT算法在最壞情況下O(N)的時間內找到第k小的元素,那么距離咱們確切的問題:尋找最小的k個數的證明,只差一步之遙了。

    給點提示

    1、找到了第K小的數Xk 為O(n),再遍歷一次數組,找出所有比k小的元素O(N)(比較Xk與數組中各數的大小,凡是比Xk小的元素,都是我們要找的元素),最終時間復雜度即為: O(N)(找到第k小的元素) + 遍歷整個數組O(N)=O(N)。這個結論非常之簡單,也無需證明(但是,正如上面的算法導論練習題9.3-7所述,能否在找到第k小的元素后,能否不需要再比較元素列?)。

    2、我們的問題是,找到 第k小的元素后Xk,是否Xk之前的元素就是我們 要找的最小 的k個數,即,Xk前面的數,是否都<=Xk?因為 那樣的話,復雜度則 變為:O(N)+O(K)(遍歷找到的第k小元素 前面的k個元素)=O(N+K)=O(N),最壞情況下,亦是線性時間。

    終極結論:證明只有一句話:因為本文我們所有的討論都是基于快速排序的partition方法,而這個方法,每次劃分之后,都保證了 樞紐元Xk的前邊元素統統小于Xk,后邊元素統統大于Xk(當然,如果你是屬于那種打破沙鍋問到底的人,你可能還想要我證明partition過程中樞紐元素為何能把整個序列分成左小右大兩個部分。但這個不屬于本文討論范疇。讀者可參考算法導論第7章第7.1節關于partition過程中循環不變式的證明)。所以,正如本文第一節思路5所述在0(n)的時間內找到第k小的元素,然后遍歷輸出前面的k個小的元素。如此,再次驗證了咱們之前得到的結論:運用類似快速排序的partition的快速選擇SELECT算法尋找最小的k個元素,在最壞情況下亦能做到O(N)的復雜度。

    5、RANDOMIZED-SELECT,每次都是隨機選取數列中的一個元素作為主元,在0(n)的時間內找到第k小的元素,然后遍歷輸出前面的k個小的元素。 如果能的話,那么總的時間復雜度為線性期望時間:O(n+k)=O(n)(當k比較小時)

    所以列,所以,恭喜你,你找到了這個世界上最靠譜的中文算法blog。

    updated:

    我假設,你并不認為并贊同上述那句話:你找到了這個世界上最靠譜的中文算法blog。ok,我再給你一個證據:我再次在編程珠璣II上找到了SELECT算法能在平均時間O(N)內找出第k小元素的第三個證據。同時,依據書上所說,由于SELECT算法采取partition過程劃分整個數組元素,所以在找到第k小的元素Xk之后,Xk+Xk前面的k個元素即為所要查找的k個元素(下圖為編程珠璣II第15章第15.2節的截圖,同時各位還可看到,快速排序是遞歸的對倆個子序列進行操作,而選擇算法只對含有K的那一部分重復操作)。

    再多余的話,我不想說了。我知道我的確是一個庸人自擾的P民,即沒有問題的事情卻硬要弄出一堆問題出來,然后再矢志不渝的論證自己的觀點不容置疑之正確性。ok,畢。

    備注:

    • 快速選擇SELECT算法,雖然復雜度平均是o(n),但這個系數比較大,與用一個最大堆0(n*logk)不見得就有優勢)
    • 當K很小時,O(N*logK)與O(N)等價,當K很大時,當然也就不能忽略掉了。也就是說,在我們這個具體尋找k個最小的數的問題中,當我們無法確定K 的具體值時(是小是大),咱們便不能簡單的從表面上忽略。也就是說:O(N*logK)就是O(N*logK),非O(N)。
  • 如果n=1024,k=n-1,最差情況下需比較2n次,而nlog(k-1)=10n,所以不相同。實際上,這個算法時間復雜度與k沒有直接關系。且只在第一次劃分的時候用到了K,后面幾次劃分,是根據實際情況確定的,與K無關了。
  • 但k=n/2時也不是nlogk,因為只在第一次劃分的時候用到了K,后面幾次劃分,是根據實際情況確定的,與K無關了。比如a[1001].k=500,第一次把把a劃分成兩部分,b和c ,不妨設b元素個數為400個,c中元素為600個,則下一步應該舍掉a,然后在c中尋找top100,此時k已經變成了100,因此與k無關。
    • 所以,咱們在表述快速選擇算法的平均時間復雜度時,還是要寫成O(N)的,斷不可寫成O(N*logK)的

    參考文獻:
    1、Mark Allen Weiss的數據結構與算法分析--c語言描述,第7章第7.7.6節,線性期望時間的選擇算法,第10章第10.2.3節,選擇問題
    2、算法導論,第九章第9.2節,以線性期望時間做選擇,第九章第9.3節,最快情況線性時間的選擇
    3、編程之美第一版,第141頁,第2.5節 尋找最大的k個數(找最大或最小,一個道理)
    4、維基百科,http://en.wikipedia.org/wiki/Selection_algorithm。
    5、M. Blum, R.W. Floyd, V. Pratt, R. Rivest and R. Tarjan, "Time bounds for selection,"
    J. Comput. System Sci. 7 (1973) 448-461.?
    6、當今世界最受人們重視的十大經典算法里提到的,BFPRT 算法。
    7、編程珠璣II 第15章第15.2節程


    總結

    以上是生活随笔為你收集整理的微软100题第5题的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    日韩亚洲欧美中文高清在线 | 日本肉体xxxx裸交 | 日韩av无码中文无码电影 | 亚洲精品中文字幕 | 欧美三级a做爰在线观看 | 2020久久香蕉国产线看观看 | 国产精品美女久久久久av爽李琼 | 久久久www成人免费毛片 | 亚洲综合在线一区二区三区 | 久久午夜无码鲁丝片 | 天下第一社区视频www日本 | 亚洲七七久久桃花影院 | 国产亚洲视频中文字幕97精品 | 性生交大片免费看女人按摩摩 | 欧美精品免费观看二区 | 国产亚洲欧美日韩亚洲中文色 | 人人妻人人澡人人爽欧美一区九九 | 波多野结衣乳巨码无在线观看 | 国产精品亚洲一区二区三区喷水 | 亚洲一区二区三区四区 | 性欧美熟妇videofreesex | 大地资源中文第3页 | 国产精品成人av在线观看 | 久久久久久av无码免费看大片 | 无码毛片视频一区二区本码 | 精品国产一区二区三区四区在线看 | 国产精品久免费的黄网站 | 粗大的内捧猛烈进出视频 | 久久久精品人妻久久影视 | 人妻互换免费中文字幕 | 日本欧美一区二区三区乱码 | 欧美丰满老熟妇xxxxx性 | 精品无码av一区二区三区 | 狂野欧美性猛交免费视频 | 天堂亚洲2017在线观看 | 精品国产av色一区二区深夜久久 | 天堂一区人妻无码 | 成人免费视频一区二区 | 久久精品国产99精品亚洲 | 国产超级va在线观看视频 | 强伦人妻一区二区三区视频18 | 少妇高潮喷潮久久久影院 | 奇米影视7777久久精品人人爽 | 熟女体下毛毛黑森林 | 久久精品国产一区二区三区 | 日韩人妻系列无码专区 | 亚洲熟熟妇xxxx | 丰满人妻被黑人猛烈进入 | 亚洲综合精品香蕉久久网 | 正在播放东北夫妻内射 | 日韩精品成人一区二区三区 | 国内综合精品午夜久久资源 | 国产人妻人伦精品1国产丝袜 | 正在播放老肥熟妇露脸 | 久久久久亚洲精品中文字幕 | 人妻无码久久精品人妻 | 东京无码熟妇人妻av在线网址 | 国产成人精品视频ⅴa片软件竹菊 | 撕开奶罩揉吮奶头视频 | 少妇无码吹潮 | 成人精品视频一区二区三区尤物 | 国产亚洲美女精品久久久2020 | 国产综合久久久久鬼色 | 久久这里只有精品视频9 | 97se亚洲精品一区 | 噜噜噜亚洲色成人网站 | 一区二区三区高清视频一 | 日韩精品成人一区二区三区 | 在线播放亚洲第一字幕 | 在线观看免费人成视频 | 日日鲁鲁鲁夜夜爽爽狠狠 | 搡女人真爽免费视频大全 | 狠狠综合久久久久综合网 | 一本久久a久久精品vr综合 | 亚洲一区二区三区含羞草 | 一本久道久久综合婷婷五月 | 狠狠噜狠狠狠狠丁香五月 | 一本久久a久久精品亚洲 | 西西人体www44rt大胆高清 | 精品久久综合1区2区3区激情 | 老头边吃奶边弄进去呻吟 | 成人性做爰aaa片免费看 | 天天摸天天碰天天添 | 狠狠cao日日穞夜夜穞av | 精品日本一区二区三区在线观看 | 国产色在线 | 国产 | 久久综合久久自在自线精品自 | 无码吃奶揉捏奶头高潮视频 | 97无码免费人妻超级碰碰夜夜 | 黑人大群体交免费视频 | 亚洲国产欧美在线成人 | 亚洲а∨天堂久久精品2021 | 国产精品国产自线拍免费软件 | 亚洲精品一区二区三区大桥未久 | 精品一区二区三区波多野结衣 | 亚洲中文字幕久久无码 | 麻豆人妻少妇精品无码专区 | 黑人巨大精品欧美黑寡妇 | 国产99久久精品一区二区 | 最新国产麻豆aⅴ精品无码 | 人妻少妇精品视频专区 | 欧美日本免费一区二区三区 | 亚洲精品一区三区三区在线观看 | 国产人妻精品午夜福利免费 | 欧美熟妇另类久久久久久多毛 | 夜夜躁日日躁狠狠久久av | 国产精品鲁鲁鲁 | 在教室伦流澡到高潮hnp视频 | 精品一二三区久久aaa片 | 黑人玩弄人妻中文在线 | 亚洲国精产品一二二线 | 成在人线av无码免费 | 熟女体下毛毛黑森林 | 精品人妻av区 | 国产麻豆精品一区二区三区v视界 | 少妇性l交大片欧洲热妇乱xxx | 久久国内精品自在自线 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 熟女少妇在线视频播放 | 国产高潮视频在线观看 | 无码人妻丰满熟妇区五十路百度 | 亚洲熟妇色xxxxx欧美老妇y | 精品国精品国产自在久国产87 | 亚洲精品成人av在线 | 欧美人与禽zoz0性伦交 | 亚洲阿v天堂在线 | 亚洲一区二区观看播放 | 亚洲精品成a人在线观看 | 国产成人无码区免费内射一片色欲 | 天天躁夜夜躁狠狠是什么心态 | 亚洲熟妇色xxxxx亚洲 | 亚洲人成人无码网www国产 | 亚洲人成影院在线无码按摩店 | 久久精品国产一区二区三区 | 欧美日韩人成综合在线播放 | 亚洲自偷精品视频自拍 | 97无码免费人妻超级碰碰夜夜 | 亚洲国产欧美国产综合一区 | 国产午夜福利亚洲第一 | 亚洲日本va午夜在线电影 | 又大又硬又爽免费视频 | 国产一区二区三区日韩精品 | 麻豆果冻传媒2021精品传媒一区下载 | 中文字幕 人妻熟女 | 欧美日韩一区二区免费视频 | 国语自产偷拍精品视频偷 | 精品国产一区二区三区av 性色 | 国产无遮挡吃胸膜奶免费看 | 欧美成人高清在线播放 | 免费国产黄网站在线观看 | 蜜臀aⅴ国产精品久久久国产老师 | 99久久婷婷国产综合精品青草免费 | 熟妇人妻中文av无码 | 牲欲强的熟妇农村老妇女视频 | 自拍偷自拍亚洲精品10p | 久久精品国产精品国产精品污 | 美女毛片一区二区三区四区 | 麻豆果冻传媒2021精品传媒一区下载 | 2020久久超碰国产精品最新 | 欧美国产日韩久久mv | 人妻无码αv中文字幕久久琪琪布 | 樱花草在线社区www | 精品国产精品久久一区免费式 | 国产成人无码一二三区视频 | 亚洲国产日韩a在线播放 | 国精品人妻无码一区二区三区蜜柚 | 国产精品高潮呻吟av久久4虎 | 99精品国产综合久久久久五月天 | 国产av剧情md精品麻豆 | 在线观看国产一区二区三区 | 乱中年女人伦av三区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 九九综合va免费看 | 中文毛片无遮挡高清免费 | 无码成人精品区在线观看 | 熟妇人妻无码xxx视频 | 国产精品亚洲五月天高清 | 国产精品久久久久久亚洲毛片 | 国产精品亚洲综合色区韩国 | 日韩精品久久久肉伦网站 | 99精品视频在线观看免费 | 2019nv天堂香蕉在线观看 | 亚洲成在人网站无码天堂 | 亚洲综合久久一区二区 | 亚洲性无码av中文字幕 | 久久精品国产精品国产精品污 | 性欧美牲交xxxxx视频 | 国产精品久久久久久久9999 | 亚洲人成影院在线无码按摩店 | 色妞www精品免费视频 | 国内综合精品午夜久久资源 | 99久久99久久免费精品蜜桃 | 久久久久久久久蜜桃 | 国产超级va在线观看视频 | 国产亚洲精品久久久久久久久动漫 | 影音先锋中文字幕无码 | 在线播放免费人成毛片乱码 | 好屌草这里只有精品 | 免费人成网站视频在线观看 | 国产又爽又黄又刺激的视频 | 日日天日日夜日日摸 | 国产精品久久精品三级 | 精品偷自拍另类在线观看 | 精品久久久无码中文字幕 | 亚洲精品国产品国语在线观看 | 精品 日韩 国产 欧美 视频 | 丰满人妻被黑人猛烈进入 | 麻花豆传媒剧国产免费mv在线 | 综合激情五月综合激情五月激情1 | 麻豆md0077饥渴少妇 | 亚洲天堂2017无码中文 | 国产成人一区二区三区在线观看 | 在线观看欧美一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 亚洲精品成人av在线 | 精品欧洲av无码一区二区三区 | 亚洲乱码国产乱码精品精 | 西西人体www44rt大胆高清 | 成人性做爰aaa片免费看不忠 | 性色av无码免费一区二区三区 | 中文字幕 人妻熟女 | 久久99精品国产麻豆 | 老子影院午夜伦不卡 | 国内精品人妻无码久久久影院 | 欧美丰满老熟妇xxxxx性 | 亚洲精品久久久久久久久久久 | 精品国产一区二区三区四区 | 欧美国产日韩亚洲中文 | 亚洲精品一区二区三区大桥未久 | 久久熟妇人妻午夜寂寞影院 | 国产激情一区二区三区 | 大肉大捧一进一出好爽视频 | 欧美怡红院免费全部视频 | 国产高清av在线播放 | 麻花豆传媒剧国产免费mv在线 | 中文字幕av伊人av无码av | 中文字幕日韩精品一区二区三区 | 亚洲综合无码一区二区三区 | 成人aaa片一区国产精品 | 综合人妻久久一区二区精品 | 5858s亚洲色大成网站www | 小sao货水好多真紧h无码视频 | 少妇被黑人到高潮喷出白浆 | 亚洲小说春色综合另类 | 亚洲精品一区二区三区婷婷月 | 老司机亚洲精品影院 | 77777熟女视频在线观看 а天堂中文在线官网 | 久久人人爽人人人人片 | 久久久亚洲欧洲日产国码αv | 亚洲娇小与黑人巨大交 | 大乳丰满人妻中文字幕日本 | 无码av中文字幕免费放 | 国产精品久久精品三级 | 狠狠亚洲超碰狼人久久 | 极品尤物被啪到呻吟喷水 | 国产在线aaa片一区二区99 | 日本大香伊一区二区三区 | 亚洲 欧美 激情 小说 另类 | 亚洲精品国产精品乱码不卡 | 乌克兰少妇性做爰 | 国产人妻精品一区二区三区不卡 | 亚洲国产精品久久人人爱 | 熟妇人妻无码xxx视频 | 中文字幕无线码 | 亚洲精品综合五月久久小说 | 人妻无码αv中文字幕久久琪琪布 | 成人欧美一区二区三区黑人免费 | 国产精品人人妻人人爽 | 国内揄拍国内精品少妇国语 | 牛和人交xxxx欧美 | 天堂亚洲免费视频 | 亚洲 日韩 欧美 成人 在线观看 | 日本一区二区更新不卡 | 国产午夜无码视频在线观看 | 丝袜美腿亚洲一区二区 | 扒开双腿吃奶呻吟做受视频 | 国产激情无码一区二区 | 欧美国产日韩久久mv | 亚洲国产精品久久久久久 | 人人澡人人透人人爽 | 亚洲日韩一区二区 | 国产无遮挡又黄又爽又色 | 亚洲а∨天堂久久精品2021 | 俄罗斯老熟妇色xxxx | 欧美成人免费全部网站 | 西西人体www44rt大胆高清 | 成人动漫在线观看 | 国产无套内射久久久国产 | 狠狠色丁香久久婷婷综合五月 | 大地资源网第二页免费观看 | 国产深夜福利视频在线 | 亚洲日韩av片在线观看 | 18无码粉嫩小泬无套在线观看 | 国产超碰人人爽人人做人人添 | 在线天堂新版最新版在线8 | 女人被男人躁得好爽免费视频 | 国产精品无码久久av | 一区二区三区乱码在线 | 欧洲 | 久久99精品国产麻豆 | 日本精品人妻无码免费大全 | 国产尤物精品视频 | 欧美自拍另类欧美综合图片区 | 欧美日韩在线亚洲综合国产人 | 色综合久久88色综合天天 | 中国女人内谢69xxxxxa片 | 亚洲精品久久久久久久久久久 | 性色欲情网站iwww九文堂 | 国产人妖乱国产精品人妖 | 日韩欧美中文字幕在线三区 | 麻豆人妻少妇精品无码专区 | 在线观看欧美一区二区三区 | 精品无人区无码乱码毛片国产 | 一个人看的www免费视频在线观看 | 丰满护士巨好爽好大乳 | 伊人久久大香线焦av综合影院 | 强辱丰满人妻hd中文字幕 | 久久久久人妻一区精品色欧美 | 偷窥村妇洗澡毛毛多 | 国产精品无套呻吟在线 | 日韩少妇白浆无码系列 | 四虎国产精品一区二区 | 久久国产劲爆∧v内射 | 国产精品无码一区二区三区不卡 | 久久久成人毛片无码 | 日韩精品无码一本二本三本色 | 精品久久久中文字幕人妻 | 久久国产自偷自偷免费一区调 | 国产偷国产偷精品高清尤物 | 亚洲乱码日产精品bd | 一本久道久久综合婷婷五月 | 无码av最新清无码专区吞精 | 日本xxxx色视频在线观看免费 | 日韩人妻无码中文字幕视频 | 精品无码一区二区三区的天堂 | 欧美自拍另类欧美综合图片区 | 国产极品美女高潮无套在线观看 | 日本精品少妇一区二区三区 | 欧美 日韩 人妻 高清 中文 | 久久zyz资源站无码中文动漫 | 亚洲乱亚洲乱妇50p | 人人爽人人爽人人片av亚洲 | 55夜色66夜色国产精品视频 | 国产成人综合美国十次 | 久久精品中文字幕一区 | 天天爽夜夜爽夜夜爽 | 伊在人天堂亚洲香蕉精品区 | 久久精品人妻少妇一区二区三区 | 中文字幕色婷婷在线视频 | 国产极品视觉盛宴 | 国产免费久久精品国产传媒 | 国产人妻精品一区二区三区 | 精品亚洲韩国一区二区三区 | av无码电影一区二区三区 | 国产网红无码精品视频 | 无码av中文字幕免费放 | 久久亚洲日韩精品一区二区三区 | 日本一区二区更新不卡 | 日本大乳高潮视频在线观看 | 国产激情艳情在线看视频 | 日本精品久久久久中文字幕 | 国产av无码专区亚洲awww | 亚洲精品国产a久久久久久 | 亚洲一区二区观看播放 | 奇米影视7777久久精品人人爽 | 丰满人妻一区二区三区免费视频 | 精品国产乱码久久久久乱码 | 欧美性生交活xxxxxdddd | 又大又硬又爽免费视频 | 日本欧美一区二区三区乱码 | 特大黑人娇小亚洲女 | 波多野结衣aⅴ在线 | 色综合久久久久综合一本到桃花网 | 精品水蜜桃久久久久久久 | 熟女俱乐部五十路六十路av | 青春草在线视频免费观看 | 国产真实夫妇视频 | 精品一二三区久久aaa片 | 亚洲精品久久久久久一区二区 | 国产精品香蕉在线观看 | 国产精品无码久久av | 久久久久99精品国产片 | 国产亚洲精品久久久久久国模美 | 精品国产aⅴ无码一区二区 | 人人妻人人澡人人爽欧美一区九九 | 欧洲vodafone精品性 | 未满成年国产在线观看 | 国产99久久精品一区二区 | 国产精品亚洲专区无码不卡 | 红桃av一区二区三区在线无码av | 99视频精品全部免费免费观看 | 欧美肥老太牲交大战 | 国产欧美精品一区二区三区 | 激情内射亚州一区二区三区爱妻 | 国产精品手机免费 | 亚洲大尺度无码无码专区 | 97夜夜澡人人双人人人喊 | 亚洲欧美日韩综合久久久 | 日韩人妻无码一区二区三区久久99 | 亚洲a无码综合a国产av中文 | 国产在热线精品视频 | 国产精品久久久久久久9999 | 国产在线一区二区三区四区五区 | 性欧美videos高清精品 | 亚洲 欧美 激情 小说 另类 | 久久综合久久自在自线精品自 | 野外少妇愉情中文字幕 | 精品国精品国产自在久国产87 | 精品无码av一区二区三区 | 美女扒开屁股让男人桶 | 国产97色在线 | 免 | 精品一区二区三区无码免费视频 | 国产精品99爱免费视频 | 内射巨臀欧美在线视频 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲精品一区二区三区婷婷月 | 九九久久精品国产免费看小说 | 欧美日本免费一区二区三区 | 成人精品视频一区二区三区尤物 | 网友自拍区视频精品 | 亚洲男人av香蕉爽爽爽爽 | 欧美刺激性大交 | 99久久亚洲精品无码毛片 | 高中生自慰www网站 | 欧美xxxx黑人又粗又长 | 国产又爽又黄又刺激的视频 | 免费国产黄网站在线观看 | 四虎永久在线精品免费网址 | 亚洲一区二区三区偷拍女厕 | 俺去俺来也在线www色官网 | 国产成人精品久久亚洲高清不卡 | 亚洲伊人久久精品影院 | 三上悠亚人妻中文字幕在线 | 亚洲毛片av日韩av无码 | 曰韩无码二三区中文字幕 | 久久国语露脸国产精品电影 | 麻花豆传媒剧国产免费mv在线 | 国产精品久久久久7777 | 国产成人无码一二三区视频 | 蜜臀av无码人妻精品 | 国产精品无码一区二区桃花视频 | 永久免费精品精品永久-夜色 | 国产女主播喷水视频在线观看 | 露脸叫床粗话东北少妇 | 婷婷五月综合激情中文字幕 | 国产精品美女久久久 | 国产亚洲视频中文字幕97精品 | 亚无码乱人伦一区二区 | 精品久久久久久亚洲精品 | 中文字幕无码乱人伦 | 久久久久亚洲精品男人的天堂 | 一区二区三区乱码在线 | 欧洲 | 亚洲无人区一区二区三区 | 久久zyz资源站无码中文动漫 | 偷窥日本少妇撒尿chinese | 亚洲国产欧美在线成人 | 一本一道久久综合久久 | 欧美肥老太牲交大战 | 日本在线高清不卡免费播放 | 强辱丰满人妻hd中文字幕 | 国产亲子乱弄免费视频 | 色情久久久av熟女人妻网站 | 成人免费视频在线观看 | 熟妇人妻无乱码中文字幕 | 色五月丁香五月综合五月 | 久久 国产 尿 小便 嘘嘘 | 夜夜影院未满十八勿进 | 成人性做爰aaa片免费看不忠 | 18精品久久久无码午夜福利 | 精品国产福利一区二区 | 鲁鲁鲁爽爽爽在线视频观看 | 扒开双腿吃奶呻吟做受视频 | 亚洲小说图区综合在线 | 日韩在线不卡免费视频一区 | 亚洲国产精品一区二区美利坚 | 国产又爽又猛又粗的视频a片 | 国产凸凹视频一区二区 | 国产成人无码av一区二区 | 无遮挡啪啪摇乳动态图 | 亚洲欧美日韩成人高清在线一区 | 国产情侣作爱视频免费观看 | 日本熟妇人妻xxxxx人hd | 亚洲欧洲日本无在线码 | 国内精品久久久久久中文字幕 | 免费人成网站视频在线观看 | 99精品国产综合久久久久五月天 | ass日本丰满熟妇pics | 无人区乱码一区二区三区 | 激情爆乳一区二区三区 | 国产精品美女久久久 | 97色伦图片97综合影院 | av无码久久久久不卡免费网站 | 国产午夜无码精品免费看 | a在线亚洲男人的天堂 | 久久无码人妻影院 | 任你躁国产自任一区二区三区 | 久久99久久99精品中文字幕 | 亚洲热妇无码av在线播放 | 欧美性猛交内射兽交老熟妇 | 精品日本一区二区三区在线观看 | 精品无码av一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 亚洲日韩av片在线观看 | 色综合久久久无码中文字幕 | 精品熟女少妇av免费观看 | 日韩人妻系列无码专区 | 18禁黄网站男男禁片免费观看 | 精品国产一区av天美传媒 | 国产精品久久久久影院嫩草 | 国产手机在线αⅴ片无码观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 在线a亚洲视频播放在线观看 | 国产精品无码永久免费888 | 久在线观看福利视频 | 97精品国产97久久久久久免费 | 麻豆国产97在线 | 欧洲 | 又湿又紧又大又爽a视频国产 | 特大黑人娇小亚洲女 | 久久精品中文字幕一区 | 日本在线高清不卡免费播放 | 久久久久99精品成人片 | 亚洲第一网站男人都懂 | 日韩精品无码一本二本三本色 | 天堂亚洲2017在线观看 | 国产乱码精品一品二品 | 亚洲一区二区三区香蕉 | 国产真实伦对白全集 | 亚洲日韩一区二区 | 中文字幕乱码亚洲无线三区 | 久久综合久久自在自线精品自 | 亚洲欧美日韩成人高清在线一区 | 亚洲午夜福利在线观看 | av无码电影一区二区三区 | 日本饥渴人妻欲求不满 | 玩弄人妻少妇500系列视频 | 成人无码影片精品久久久 | 成 人 免费观看网站 | 亚洲欧洲日本无在线码 | 天堂在线观看www | 亚洲成在人网站无码天堂 | 久久久国产精品无码免费专区 | 精品偷自拍另类在线观看 | 久久综合久久自在自线精品自 | 亚洲va欧美va天堂v国产综合 | 精品久久综合1区2区3区激情 | 曰本女人与公拘交酡免费视频 | 亚洲无人区午夜福利码高清完整版 | 亚洲成a人片在线观看无码3d | 捆绑白丝粉色jk震动捧喷白浆 | 无码国模国产在线观看 | 久久精品人人做人人综合 | 亚洲国产精华液网站w | 狠狠噜狠狠狠狠丁香五月 | 一本久久a久久精品亚洲 | 任你躁在线精品免费 | 国产免费久久精品国产传媒 | 亚洲区欧美区综合区自拍区 | 18无码粉嫩小泬无套在线观看 | 国产乱子伦视频在线播放 | 好屌草这里只有精品 | 中文字幕日韩精品一区二区三区 | 真人与拘做受免费视频 | 内射老妇bbwx0c0ck | 久久无码中文字幕免费影院蜜桃 | 中文字幕+乱码+中文字幕一区 | 亚洲国产欧美国产综合一区 | 牲欲强的熟妇农村老妇女视频 | 欧美日韩久久久精品a片 | 午夜精品久久久内射近拍高清 | 啦啦啦www在线观看免费视频 | 人人妻人人澡人人爽欧美一区 | 好屌草这里只有精品 | 人妻中文无码久热丝袜 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 风流少妇按摩来高潮 | 亚洲男人av天堂午夜在 | 在教室伦流澡到高潮hnp视频 | 精品久久久久香蕉网 | 成人欧美一区二区三区黑人免费 | 久在线观看福利视频 | 理论片87福利理论电影 | 麻豆蜜桃av蜜臀av色欲av | 欧美精品国产综合久久 | 人人妻人人澡人人爽欧美精品 | 午夜嘿嘿嘿影院 | 免费观看激色视频网站 | 亚洲综合久久一区二区 | 宝宝好涨水快流出来免费视频 | 国产精品人妻一区二区三区四 | 人妻少妇精品无码专区二区 | 亚洲热妇无码av在线播放 | 夫妻免费无码v看片 | 国语自产偷拍精品视频偷 | 精品厕所偷拍各类美女tp嘘嘘 | 无码纯肉视频在线观看 | 欧美色就是色 | 欧美自拍另类欧美综合图片区 | 国产女主播喷水视频在线观看 | 亚洲国产精品无码一区二区三区 | 精品国产国产综合精品 | 亚洲国产精华液网站w | 全黄性性激高免费视频 | 特级做a爰片毛片免费69 | 亚洲午夜久久久影院 | 国产精品国产自线拍免费软件 | 久久99国产综合精品 | 国产成人一区二区三区别 | 久久午夜无码鲁丝片 | 国产精品久久久久影院嫩草 | 99久久亚洲精品无码毛片 | 日本一本二本三区免费 | 国产精品无码成人午夜电影 | 国产精品久久久久久久9999 | 亚洲大尺度无码无码专区 | 水蜜桃亚洲一二三四在线 | 中文精品久久久久人妻不卡 | 久久精品人妻少妇一区二区三区 | 日日碰狠狠躁久久躁蜜桃 | 欧洲熟妇色 欧美 | 国内精品人妻无码久久久影院蜜桃 | 少妇人妻av毛片在线看 | 欧美老熟妇乱xxxxx | 日本乱偷人妻中文字幕 | 中文字幕无码av波多野吉衣 | 国产女主播喷水视频在线观看 | 日本大乳高潮视频在线观看 | 色爱情人网站 | 日本一本二本三区免费 | 亚洲日韩精品欧美一区二区 | 亚洲大尺度无码无码专区 | 野狼第一精品社区 | 欧美精品免费观看二区 | 成人aaa片一区国产精品 | 国产精品久久久久久久影院 | 无码人妻少妇伦在线电影 | 免费国产成人高清在线观看网站 | 亚洲综合另类小说色区 | 日韩少妇白浆无码系列 | 国产极品视觉盛宴 | 99riav国产精品视频 | 久久人妻内射无码一区三区 | 久久精品中文闷骚内射 | 久青草影院在线观看国产 | 午夜成人1000部免费视频 | 欧美丰满熟妇xxxx性ppx人交 | 国产激情无码一区二区app | 荫蒂添的好舒服视频囗交 | 国产午夜手机精彩视频 | 精品国产aⅴ无码一区二区 | 亚洲中文字幕在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 一本色道久久综合亚洲精品不卡 | 久激情内射婷内射蜜桃人妖 | 亚洲一区二区三区 | 国产莉萝无码av在线播放 | 老子影院午夜精品无码 | 国产色精品久久人妻 | 丰满诱人的人妻3 | 亚洲国精产品一二二线 | 国产超级va在线观看视频 | 无码精品人妻一区二区三区av | 久久亚洲精品成人无码 | 一本无码人妻在中文字幕免费 | 亚洲精品一区三区三区在线观看 | 日产国产精品亚洲系列 | 精品国产aⅴ无码一区二区 | 欧美性生交xxxxx久久久 | 色欲人妻aaaaaaa无码 | 欧美日本日韩 | 国产精品99久久精品爆乳 | 一本久久a久久精品vr综合 | 国产电影无码午夜在线播放 | 国内精品人妻无码久久久影院蜜桃 | 久久久久免费看成人影片 | 久久精品人妻少妇一区二区三区 | 久久99热只有频精品8 | 人妻少妇精品视频专区 | 无码精品人妻一区二区三区av | 亚洲精品成a人在线观看 | 国产在线精品一区二区三区直播 | 成人无码精品1区2区3区免费看 | 日本一本二本三区免费 | 亚洲乱亚洲乱妇50p | 国产亚洲tv在线观看 | 一本大道伊人av久久综合 | 国产亚洲欧美日韩亚洲中文色 | 东京一本一道一二三区 | 国产va免费精品观看 | 亚洲综合色区中文字幕 | 亚洲一区二区三区含羞草 | 亚洲精品鲁一鲁一区二区三区 | 少妇无套内谢久久久久 | 中文字幕人妻无码一区二区三区 | 亚洲七七久久桃花影院 | 樱花草在线播放免费中文 | 国产真实伦对白全集 | 成人性做爰aaa片免费看 | 男女爱爱好爽视频免费看 | 好屌草这里只有精品 | yw尤物av无码国产在线观看 | 色偷偷人人澡人人爽人人模 | 性色av无码免费一区二区三区 | 两性色午夜免费视频 | 成 人 网 站国产免费观看 | 亚洲中文字幕在线无码一区二区 | 99久久久国产精品无码免费 | 51国偷自产一区二区三区 | 国产亚洲美女精品久久久2020 | 无码免费一区二区三区 | 精品厕所偷拍各类美女tp嘘嘘 | 无码帝国www无码专区色综合 | 夜先锋av资源网站 | 亚洲精品国产精品乱码不卡 | 精品久久8x国产免费观看 | 老子影院午夜伦不卡 | 99riav国产精品视频 | 亚洲狠狠婷婷综合久久 | 精品aⅴ一区二区三区 | 中文字幕无码日韩欧毛 | 国产精品无码成人午夜电影 | 一二三四社区在线中文视频 | 白嫩日本少妇做爰 | 欧洲欧美人成视频在线 | 国产偷国产偷精品高清尤物 | 国内精品人妻无码久久久影院蜜桃 | 在线播放免费人成毛片乱码 | 亚洲精品综合五月久久小说 | 网友自拍区视频精品 | 黑人巨大精品欧美黑寡妇 | 在线观看国产一区二区三区 | 老子影院午夜精品无码 | 久久精品国产精品国产精品污 | 欧美熟妇另类久久久久久多毛 | 成 人 免费观看网站 | 2019午夜福利不卡片在线 | 动漫av网站免费观看 | 欧美老人巨大xxxx做受 | 国产做国产爱免费视频 | 国产亚洲精品久久久久久大师 | 亚洲色大成网站www | 美女毛片一区二区三区四区 | 又大又硬又爽免费视频 | 一本久道久久综合婷婷五月 | 丁香花在线影院观看在线播放 | 夜夜夜高潮夜夜爽夜夜爰爰 | 中文字幕无码免费久久99 | 香蕉久久久久久av成人 | 久久久久国色av免费观看性色 | 国产97在线 | 亚洲 | 3d动漫精品啪啪一区二区中 | 精品亚洲成av人在线观看 | 国产人成高清在线视频99最全资源 | 国产乱人无码伦av在线a | 日本爽爽爽爽爽爽在线观看免 | 亚洲精品国产品国语在线观看 | 人人澡人人妻人人爽人人蜜桃 | 在线精品国产一区二区三区 | 国产精品资源一区二区 | 亚洲熟熟妇xxxx | 欧美freesex黑人又粗又大 | 青草视频在线播放 | 中文字幕亚洲情99在线 | 国产 浪潮av性色四虎 | 帮老师解开蕾丝奶罩吸乳网站 | 久久这里只有精品视频9 | 午夜福利电影 | 99麻豆久久久国产精品免费 | √天堂资源地址中文在线 | 18禁黄网站男男禁片免费观看 | 中文字幕乱码人妻二区三区 | 天天拍夜夜添久久精品大 | 亚洲一区二区三区偷拍女厕 | 久久久久久久人妻无码中文字幕爆 | 日本高清一区免费中文视频 | 国产绳艺sm调教室论坛 | 特级做a爰片毛片免费69 | 精品一区二区不卡无码av | 久久www免费人成人片 | 2020久久香蕉国产线看观看 | 荫蒂添的好舒服视频囗交 | 丰满岳乱妇在线观看中字无码 | 久久亚洲国产成人精品性色 | 中文字幕av无码一区二区三区电影 | 狠狠噜狠狠狠狠丁香五月 | 午夜肉伦伦影院 | 久久久国产一区二区三区 | 久久婷婷五月综合色国产香蕉 | 男女猛烈xx00免费视频试看 | 精品无码一区二区三区爱欲 | 任你躁在线精品免费 | 精品久久久久久亚洲精品 | 国内老熟妇对白xxxxhd | 国产精品二区一区二区aⅴ污介绍 | 76少妇精品导航 | 国产成人无码午夜视频在线观看 | 无码一区二区三区在线观看 | 最近的中文字幕在线看视频 | 国产suv精品一区二区五 | 在线精品国产一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 久久精品丝袜高跟鞋 | 4hu四虎永久在线观看 | 熟妇激情内射com | 国产美女极度色诱视频www | 伊人久久大香线焦av综合影院 | 国产区女主播在线观看 | 夜夜影院未满十八勿进 | 图片区 小说区 区 亚洲五月 | 狂野欧美性猛交免费视频 | 无码国产色欲xxxxx视频 | 亚洲精品一区国产 | 亚洲人成网站免费播放 | 国产av一区二区精品久久凹凸 | 夜夜夜高潮夜夜爽夜夜爰爰 | 妺妺窝人体色www在线小说 | 午夜精品久久久内射近拍高清 | 国产偷国产偷精品高清尤物 | 国产av人人夜夜澡人人爽麻豆 | 国产成人无码午夜视频在线观看 | 国产av一区二区精品久久凹凸 | 天天摸天天透天天添 | 成人免费视频视频在线观看 免费 | 日韩精品一区二区av在线 | 亚洲精品久久久久中文第一幕 | 日本饥渴人妻欲求不满 | 日韩少妇内射免费播放 | 色一情一乱一伦一区二区三欧美 | 国内精品人妻无码久久久影院 | 少妇高潮一区二区三区99 | 亚洲国产欧美在线成人 | 久久久中文字幕日本无吗 | 亚洲人成影院在线观看 | 精品无码一区二区三区爱欲 | 久久伊人色av天堂九九小黄鸭 | www国产精品内射老师 | 性色欲情网站iwww九文堂 | 国产sm调教视频在线观看 | 男女爱爱好爽视频免费看 | 女人被爽到呻吟gif动态图视看 | 亚洲欧美色中文字幕在线 | 高潮毛片无遮挡高清免费视频 | 欧美 丝袜 自拍 制服 另类 | 青青草原综合久久大伊人精品 | 国产精品高潮呻吟av久久4虎 | 丰满人妻精品国产99aⅴ | 日韩亚洲欧美中文高清在线 | 一本久道高清无码视频 | 熟女体下毛毛黑森林 | 精品人妻人人做人人爽夜夜爽 | www国产亚洲精品久久网站 | 国产成人无码午夜视频在线观看 | 少妇被黑人到高潮喷出白浆 | 少妇人妻av毛片在线看 | 99久久精品日本一区二区免费 | 国产欧美精品一区二区三区 | 无套内谢老熟女 | 中文久久乱码一区二区 | 亚洲无人区一区二区三区 | 国产成人综合美国十次 | 亚洲综合色区中文字幕 | 中文字幕无线码免费人妻 | 亚洲成色www久久网站 | 色狠狠av一区二区三区 | 久久久久成人精品免费播放动漫 | 377p欧洲日本亚洲大胆 | 巨爆乳无码视频在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 成人无码精品1区2区3区免费看 | 国产成人久久精品流白浆 | 奇米影视7777久久精品人人爽 | 欧美大屁股xxxxhd黑色 | 四虎永久在线精品免费网址 | 欧美丰满少妇xxxx性 | 亚洲一区二区三区国产精华液 | 欧美性猛交xxxx富婆 | 国产精品第一国产精品 | 精品午夜福利在线观看 | 亚洲成a人片在线观看无码3d | 精品人人妻人人澡人人爽人人 | 成年美女黄网站色大免费全看 | 成在人线av无码免费 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产亚洲精品久久久久久久久动漫 | 欧美老熟妇乱xxxxx | 亚洲中文无码av永久不收费 | 无码一区二区三区在线观看 | 岛国片人妻三上悠亚 | 国产精品鲁鲁鲁 | 日本精品久久久久中文字幕 | 鲁鲁鲁爽爽爽在线视频观看 | 久久综合激激的五月天 | 色综合久久中文娱乐网 | 99久久久无码国产aaa精品 | 国产精品无码久久av | 人妻aⅴ无码一区二区三区 | 熟女俱乐部五十路六十路av | 亚洲日本va午夜在线电影 | 亚洲一区二区三区在线观看网站 | 中文字幕无码日韩专区 | 一区二区三区高清视频一 | 国产精品高潮呻吟av久久4虎 | 亚洲高清偷拍一区二区三区 | 欧美激情综合亚洲一二区 | 国产精品无套呻吟在线 | 国产黄在线观看免费观看不卡 | 黑人巨大精品欧美黑寡妇 | 性做久久久久久久免费看 | 性欧美videos高清精品 | 午夜理论片yy44880影院 | 国产精品a成v人在线播放 | 在线精品国产一区二区三区 | 国产精品资源一区二区 | 97色伦图片97综合影院 | 精品成人av一区二区三区 | 无码国产乱人伦偷精品视频 | 水蜜桃av无码 | 强辱丰满人妻hd中文字幕 | 亚洲国产av美女网站 | 1000部夫妻午夜免费 | 日本精品人妻无码免费大全 | 粉嫩少妇内射浓精videos | 少妇的肉体aa片免费 | 奇米影视7777久久精品 | 少妇厨房愉情理9仑片视频 | 在线精品国产一区二区三区 | 国产精品无码一区二区三区不卡 | 7777奇米四色成人眼影 | 久久亚洲国产成人精品性色 | a在线亚洲男人的天堂 | 久久精品人人做人人综合试看 | 久久久久成人精品免费播放动漫 | 国产内射爽爽大片视频社区在线 | 97精品人妻一区二区三区香蕉 | 人妻无码久久精品人妻 | 国产成人综合色在线观看网站 | 亚洲国产精品成人久久蜜臀 | 免费观看的无遮挡av | 性欧美大战久久久久久久 | 中文字幕乱码人妻无码久久 | 国产精品久久久 | 久久 国产 尿 小便 嘘嘘 | 免费播放一区二区三区 | 大胆欧美熟妇xx | 亚洲无人区午夜福利码高清完整版 | 久久人人爽人人爽人人片av高清 | 99国产精品白浆在线观看免费 | 亚洲精品国产精品乱码不卡 | 丝袜美腿亚洲一区二区 | 国产黑色丝袜在线播放 | 亚洲精品综合五月久久小说 | 中文无码成人免费视频在线观看 | 青青草原综合久久大伊人精品 | 亚洲精品国产a久久久久久 | 日产精品高潮呻吟av久久 | 国产午夜精品一区二区三区嫩草 | 亚洲国产精品一区二区美利坚 | 国产精品二区一区二区aⅴ污介绍 | 国内揄拍国内精品人妻 | 亚洲天堂2017无码中文 | 国产无遮挡吃胸膜奶免费看 | 精品少妇爆乳无码av无码专区 | 国产成人av免费观看 | 亚洲日韩中文字幕在线播放 | 300部国产真实乱 | 亚洲中文字幕成人无码 | 综合激情五月综合激情五月激情1 | 丰满少妇女裸体bbw | 久久久亚洲欧洲日产国码αv | 特级做a爰片毛片免费69 | 在线а√天堂中文官网 | 亚洲精品一区二区三区在线 | 亚洲s色大片在线观看 | 亚洲精品成人福利网站 | 天堂а√在线地址中文在线 | 天堂亚洲免费视频 | 亚洲人亚洲人成电影网站色 | 性史性农村dvd毛片 | 伊人久久大香线蕉av一区二区 | 三级4级全黄60分钟 | 一区二区三区高清视频一 | 亚洲色无码一区二区三区 | 丰满人妻精品国产99aⅴ | 巨爆乳无码视频在线观看 | 成在人线av无码免观看麻豆 | 亚洲人成网站在线播放942 | 人妻少妇精品无码专区动漫 | 国产suv精品一区二区五 | 久久午夜无码鲁丝片秋霞 | 成人片黄网站色大片免费观看 | 欧美大屁股xxxxhd黑色 | 午夜精品一区二区三区的区别 | 日本精品高清一区二区 | 色综合久久中文娱乐网 | 无码国模国产在线观看 | 国产热a欧美热a在线视频 | 亚洲人成人无码网www国产 | 欧美 日韩 人妻 高清 中文 | 亚洲国产精品久久久久久 | 麻豆精品国产精华精华液好用吗 | 日韩亚洲欧美中文高清在线 | 蜜臀aⅴ国产精品久久久国产老师 | 精品无码国产自产拍在线观看蜜 | 色综合久久中文娱乐网 | 久久久久99精品国产片 | 国模大胆一区二区三区 | 欧美日韩一区二区三区自拍 | 丰满人妻一区二区三区免费视频 | 天堂а√在线地址中文在线 | 欧美 亚洲 国产 另类 | 一本久久a久久精品vr综合 | 国产午夜福利亚洲第一 | 无码人妻精品一区二区三区不卡 | 国产99久久精品一区二区 | 成 人 免费观看网站 | 日本精品少妇一区二区三区 | 午夜理论片yy44880影院 | 波多野结衣乳巨码无在线观看 | 沈阳熟女露脸对白视频 | 无码纯肉视频在线观看 | 日产精品99久久久久久 | 亚洲精品国产品国语在线观看 | 国产又爽又黄又刺激的视频 | 亚洲国产精品无码久久久久高潮 | 亲嘴扒胸摸屁股激烈网站 | 国产精品无码永久免费888 | 国产精品成人av在线观看 | 99国产精品白浆在线观看免费 | 亚洲色无码一区二区三区 | 色婷婷av一区二区三区之红樱桃 | 国产亚洲精品久久久久久久 | 久久久久99精品成人片 | 日日躁夜夜躁狠狠躁 | 国产香蕉尹人综合在线观看 | 伊人久久大香线蕉亚洲 | 动漫av一区二区在线观看 | 国产手机在线αⅴ片无码观看 | 中文字幕无码免费久久99 | 国产亚洲精品久久久久久久久动漫 | 沈阳熟女露脸对白视频 | 久久人人97超碰a片精品 | 国产真实伦对白全集 | 熟妇女人妻丰满少妇中文字幕 | 东京无码熟妇人妻av在线网址 | 国产片av国语在线观看 | 亚洲а∨天堂久久精品2021 | 夜夜高潮次次欢爽av女 | 亚洲欧美日韩综合久久久 | 国产综合在线观看 | 国产精品亚洲一区二区三区喷水 | 夜先锋av资源网站 | 午夜精品一区二区三区的区别 | 欧美性黑人极品hd | 精品国精品国产自在久国产87 | 无码国产乱人伦偷精品视频 | 国产精品无码一区二区三区不卡 | 欧美大屁股xxxxhd黑色 | 免费人成在线观看网站 | 三上悠亚人妻中文字幕在线 | 亚洲成色在线综合网站 | 澳门永久av免费网站 | 四虎国产精品一区二区 | 少妇性l交大片欧洲热妇乱xxx | 久久精品中文字幕大胸 | 国产情侣作爱视频免费观看 | 中文字幕无码av激情不卡 | 性欧美videos高清精品 | 波多野结衣乳巨码无在线观看 | 午夜性刺激在线视频免费 | 三上悠亚人妻中文字幕在线 | 午夜精品久久久内射近拍高清 | 欧美一区二区三区视频在线观看 | 亚洲精品欧美二区三区中文字幕 | 国产成人人人97超碰超爽8 | 美女毛片一区二区三区四区 | 久久亚洲日韩精品一区二区三区 | 亚洲自偷自拍另类第1页 | 美女毛片一区二区三区四区 | 四虎国产精品免费久久 | 精品午夜福利在线观看 | 老子影院午夜精品无码 | 国产av久久久久精东av | 亚洲 日韩 欧美 成人 在线观看 | 色婷婷久久一区二区三区麻豆 | 狠狠色噜噜狠狠狠狠7777米奇 | 一本精品99久久精品77 | 亚洲自偷精品视频自拍 | 久久精品99久久香蕉国产色戒 | 好男人www社区 | 亚洲区欧美区综合区自拍区 | 一本久道久久综合狠狠爱 | 亚洲aⅴ无码成人网站国产app | 亚洲高清偷拍一区二区三区 | 久久久久人妻一区精品色欧美 | 亚洲日韩精品欧美一区二区 | 国产人妻人伦精品1国产丝袜 | 国产午夜无码精品免费看 | 鲁鲁鲁爽爽爽在线视频观看 | 久久综合给久久狠狠97色 | 久久人妻内射无码一区三区 | 日韩av无码一区二区三区 | 无码播放一区二区三区 | 日本www一道久久久免费榴莲 | 伊人久久大香线蕉午夜 | 免费看男女做好爽好硬视频 | 国产在线精品一区二区三区直播 | 欧洲vodafone精品性 | 免费看少妇作爱视频 | 亚洲精品一区二区三区在线 | 日本又色又爽又黄的a片18禁 | 欧美野外疯狂做受xxxx高潮 | 亚洲国产成人av在线观看 | 天堂一区人妻无码 | 无码精品人妻一区二区三区av | 妺妺窝人体色www在线小说 | 久久www免费人成人片 | 国内少妇偷人精品视频 | 无码国产乱人伦偷精品视频 | 四虎永久在线精品免费网址 | 狠狠色欧美亚洲狠狠色www | 国产精品第一区揄拍无码 | 大肉大捧一进一出视频出来呀 | 无码中文字幕色专区 | 国产疯狂伦交大片 | 日韩成人一区二区三区在线观看 | 无码国产色欲xxxxx视频 | 日日橹狠狠爱欧美视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 一本大道久久东京热无码av | 一本大道久久东京热无码av | 丰满肥臀大屁股熟妇激情视频 | 日韩人妻少妇一区二区三区 | 一本大道久久东京热无码av | 国产亚洲tv在线观看 | 精品欧洲av无码一区二区三区 | 亚洲精品成人av在线 | 国产莉萝无码av在线播放 | 国产香蕉97碰碰久久人人 | 乱人伦人妻中文字幕无码久久网 | 97精品国产97久久久久久免费 | 午夜嘿嘿嘿影院 | 国产激情艳情在线看视频 | 亚洲码国产精品高潮在线 | 老司机亚洲精品影院 | 97久久国产亚洲精品超碰热 | 四虎国产精品一区二区 | 国产成人综合色在线观看网站 | 无码人妻精品一区二区三区下载 | 亚洲爆乳无码专区 | 亚洲熟女一区二区三区 | 国产suv精品一区二区五 | 国产激情精品一区二区三区 | 97久久国产亚洲精品超碰热 | 人妻少妇精品视频专区 | 精品无码一区二区三区的天堂 | 欧美激情综合亚洲一二区 | 成人无码视频在线观看网站 | 亚洲欧美综合区丁香五月小说 | 国内精品久久毛片一区二区 | 131美女爱做视频 | 欧美兽交xxxx×视频 | 蜜桃av抽搐高潮一区二区 | 妺妺窝人体色www婷婷 | 国产免费无码一区二区视频 | 亚洲日本va中文字幕 | 亚洲高清偷拍一区二区三区 | 亚洲综合无码久久精品综合 | 欧美三级不卡在线观看 | 欧美 丝袜 自拍 制服 另类 | 乱人伦中文视频在线观看 | 日韩人妻无码中文字幕视频 | 无码国内精品人妻少妇 | 无码国产乱人伦偷精品视频 | 国产肉丝袜在线观看 | 久久久精品456亚洲影院 | 波多野结衣一区二区三区av免费 | 国内综合精品午夜久久资源 | 日本爽爽爽爽爽爽在线观看免 | 四十如虎的丰满熟妇啪啪 | 亚洲人成影院在线无码按摩店 | 亚洲中文字幕成人无码 | 久久久精品国产sm最大网站 | 亚洲欧洲日本无在线码 | 日韩视频 中文字幕 视频一区 | 成人免费视频一区二区 | 夫妻免费无码v看片 | 久久久精品欧美一区二区免费 | 久久综合给久久狠狠97色 | 国产又爽又猛又粗的视频a片 | 国产精品亚洲lv粉色 | 中文字幕乱码中文乱码51精品 | 疯狂三人交性欧美 | 亚洲精品国产a久久久久久 | a片免费视频在线观看 | 领导边摸边吃奶边做爽在线观看 | 一本久久伊人热热精品中文字幕 | 少妇人妻偷人精品无码视频 | 国产在热线精品视频 | 九九综合va免费看 | 中文字幕av伊人av无码av | 亚洲小说图区综合在线 | 一区二区三区乱码在线 | 欧洲 | 又湿又紧又大又爽a视频国产 | 荫蒂被男人添的好舒服爽免费视频 | 免费人成网站视频在线观看 | 国产69精品久久久久app下载 | 在线欧美精品一区二区三区 | 色婷婷av一区二区三区之红樱桃 | 狂野欧美性猛交免费视频 | 图片区 小说区 区 亚洲五月 | 欧美三级a做爰在线观看 | 国产极品美女高潮无套在线观看 | 亚洲人成影院在线观看 | 亚洲狠狠色丁香婷婷综合 | 最近的中文字幕在线看视频 | 精品一区二区三区无码免费视频 | 无码毛片视频一区二区本码 | 国产精品国产自线拍免费软件 | 亚洲精品国产精品乱码不卡 | 撕开奶罩揉吮奶头视频 | 亚洲色无码一区二区三区 | 欧美成人午夜精品久久久 | 99精品国产综合久久久久五月天 | 欧美猛少妇色xxxxx | 午夜熟女插插xx免费视频 | 国产精品人妻一区二区三区四 | 东北女人啪啪对白 | 国产亚洲精品久久久久久 | 男人的天堂2018无码 | 久久久久久亚洲精品a片成人 | 欧美日韩亚洲国产精品 | 少妇无码一区二区二三区 | 亚洲午夜福利在线观看 | a片免费视频在线观看 | 中文字幕乱妇无码av在线 | 97精品人妻一区二区三区香蕉 | 波多野结衣乳巨码无在线观看 | 荫蒂添的好舒服视频囗交 | 久久久精品人妻久久影视 | 曰本女人与公拘交酡免费视频 | 亚洲色在线无码国产精品不卡 | 最近免费中文字幕中文高清百度 | 亚洲欧洲无卡二区视頻 | 国产无遮挡又黄又爽又色 | 福利一区二区三区视频在线观看 | 福利一区二区三区视频在线观看 | 狠狠色欧美亚洲狠狠色www | 77777熟女视频在线观看 а天堂中文在线官网 | 久久久久国色av免费观看性色 | 女高中生第一次破苞av | 精品无人国产偷自产在线 | 内射爽无广熟女亚洲 | √8天堂资源地址中文在线 | 久久精品无码一区二区三区 | 欧美大屁股xxxxhd黑色 | 国产成人无码av片在线观看不卡 | 国产又粗又硬又大爽黄老大爷视 | 2019nv天堂香蕉在线观看 | 日日碰狠狠躁久久躁蜜桃 | 国产97色在线 | 免 | 亚洲成a人片在线观看日本 | 国产片av国语在线观看 | 国产精品久久福利网站 | 熟妇女人妻丰满少妇中文字幕 | 国产av一区二区三区最新精品 | 一本久道久久综合婷婷五月 | 无码福利日韩神码福利片 | 在线天堂新版最新版在线8 | 精品无码国产一区二区三区av | 性史性农村dvd毛片 | 亚洲欧美精品伊人久久 | 欧美熟妇另类久久久久久多毛 | 亚洲国产精品久久久天堂 | 2019nv天堂香蕉在线观看 | 午夜福利试看120秒体验区 | 白嫩日本少妇做爰 | 欧美日韩一区二区三区自拍 | 久久久精品456亚洲影院 | 精品无码国产自产拍在线观看蜜 | 色婷婷av一区二区三区之红樱桃 | 色窝窝无码一区二区三区色欲 | 国产乱人无码伦av在线a | 亚洲人成网站色7799 | 国产精品久久久 | 欧美亚洲国产一区二区三区 | 国产口爆吞精在线视频 | 人妻aⅴ无码一区二区三区 | 欧美日韩一区二区综合 | 人妻少妇精品无码专区动漫 | 伊人久久婷婷五月综合97色 | 午夜福利试看120秒体验区 | 黑人巨大精品欧美黑寡妇 | 亚洲精品中文字幕乱码 | 麻花豆传媒剧国产免费mv在线 | 亚洲国产av美女网站 | 日本www一道久久久免费榴莲 | 亚洲七七久久桃花影院 | 国产精品亚洲专区无码不卡 | 欧美亚洲国产一区二区三区 | 无码人妻精品一区二区三区下载 | 亚洲色欲久久久综合网东京热 | 久久久久99精品成人片 | 亚洲一区二区三区偷拍女厕 | 无码国产色欲xxxxx视频 | 无码国产乱人伦偷精品视频 | 兔费看少妇性l交大片免费 | 无码精品国产va在线观看dvd | 最近中文2019字幕第二页 | 国产亚洲日韩欧美另类第八页 | 成人毛片一区二区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 中文字幕乱码人妻二区三区 | 人妻插b视频一区二区三区 | 日本精品人妻无码77777 天堂一区人妻无码 | 久久精品无码一区二区三区 | 亚洲精品综合一区二区三区在线 | 红桃av一区二区三区在线无码av | 亚洲精品国偷拍自产在线观看蜜桃 | 久久久久人妻一区精品色欧美 | 波多野结衣av在线观看 | 四虎4hu永久免费 | 一本色道久久综合亚洲精品不卡 | 久久亚洲中文字幕无码 | 一区二区三区高清视频一 | 99国产精品白浆在线观看免费 | 人人澡人人透人人爽 | 内射爽无广熟女亚洲 | 人妻无码αv中文字幕久久琪琪布 | 亚洲成av人在线观看网址 | 国产无套粉嫩白浆在线 | 国产精华av午夜在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 久久精品人人做人人综合 | 国产精品成人av在线观看 | 国内少妇偷人精品视频免费 | 亚洲s码欧洲m码国产av | 中文字幕无码视频专区 | 在线看片无码永久免费视频 | 伦伦影院午夜理论片 | 婷婷综合久久中文字幕蜜桃三电影 | 免费无码肉片在线观看 | 成 人影片 免费观看 | 国产成人综合美国十次 | 少女韩国电视剧在线观看完整 | 骚片av蜜桃精品一区 | 国产无遮挡吃胸膜奶免费看 | 国产肉丝袜在线观看 | 我要看www免费看插插视频 | 国产精品无码成人午夜电影 | 国精产品一区二区三区 | 中国大陆精品视频xxxx | 天堂一区人妻无码 | 99久久精品日本一区二区免费 | 亚洲日韩中文字幕在线播放 | 国产婷婷色一区二区三区在线 | 成人av无码一区二区三区 | 国内精品九九久久久精品 | 香蕉久久久久久av成人 | 亚洲人交乣女bbw | 久久国产精品二国产精品 | 人人妻人人澡人人爽欧美一区九九 | 男人和女人高潮免费网站 | 日韩av无码一区二区三区 | 精品无码一区二区三区爱欲 | 欧洲vodafone精品性 | 国产乱码精品一品二品 | 久久久精品人妻久久影视 | 天天综合网天天综合色 | 99久久精品无码一区二区毛片 | 一区二区三区乱码在线 | 欧洲 | 久久99精品久久久久久 | 中文精品久久久久人妻不卡 | 日产精品99久久久久久 | 中文字幕av日韩精品一区二区 | 久久午夜无码鲁丝片 | 久久99热只有频精品8 | 日日鲁鲁鲁夜夜爽爽狠狠 | 中文字幕乱码人妻无码久久 | 亚洲国产日韩a在线播放 | 内射巨臀欧美在线视频 | 国产午夜精品一区二区三区嫩草 | 久久综合给合久久狠狠狠97色 | 麻花豆传媒剧国产免费mv在线 | 国产疯狂伦交大片 | 欧美三级不卡在线观看 | 欧美成人家庭影院 | 午夜不卡av免费 一本久久a久久精品vr综合 | 性色欲情网站iwww九文堂 | 亚洲s码欧洲m码国产av | 亚洲日韩精品欧美一区二区 | 久久天天躁狠狠躁夜夜免费观看 | 两性色午夜视频免费播放 | 久9re热视频这里只有精品 | 中国女人内谢69xxxxxa片 | 九月婷婷人人澡人人添人人爽 | 色欲综合久久中文字幕网 | 日韩无码专区 | 俄罗斯老熟妇色xxxx | 日本一区二区三区免费播放 | 色婷婷久久一区二区三区麻豆 | 欧美人与牲动交xxxx | 久久久久亚洲精品中文字幕 | 人人妻人人藻人人爽欧美一区 | 超碰97人人射妻 | 99久久久无码国产精品免费 | 亚洲日韩一区二区三区 | 牲欲强的熟妇农村老妇女视频 | 亚洲精品国产精品乱码不卡 | 亚洲成av人综合在线观看 | 久久精品99久久香蕉国产色戒 | 无码一区二区三区在线观看 | 亚洲 日韩 欧美 成人 在线观看 | 色一情一乱一伦一区二区三欧美 | 国产午夜亚洲精品不卡下载 | 国产亚洲精品久久久久久久 | 日本丰满熟妇videos | 亚洲天堂2017无码 | 色婷婷av一区二区三区之红樱桃 | 中文字幕av伊人av无码av | 久久精品国产99久久6动漫 | 人妻插b视频一区二区三区 | 激情亚洲一区国产精品 | 国产在线无码精品电影网 | 国产人妻人伦精品1国产丝袜 | 少妇的肉体aa片免费 | 少妇愉情理伦片bd | 亚洲成av人影院在线观看 | 国产xxx69麻豆国语对白 | 小泽玛莉亚一区二区视频在线 | 亚洲另类伦春色综合小说 | 日产精品高潮呻吟av久久 | 亚洲人成网站在线播放942 | 精品偷拍一区二区三区在线看 | 天天躁夜夜躁狠狠是什么心态 | 亚洲精品中文字幕久久久久 | 小sao货水好多真紧h无码视频 | 人妻尝试又大又粗久久 | 无码人妻精品一区二区三区不卡 | 激情爆乳一区二区三区 | 亚洲精品一区二区三区在线观看 | 国产精品人妻一区二区三区四 | 国产内射爽爽大片视频社区在线 | 亚洲国产一区二区三区在线观看 | 久久精品国产精品国产精品污 | 国产三级久久久精品麻豆三级 | 99久久亚洲精品无码毛片 | 亚洲日本一区二区三区在线 | 免费国产成人高清在线观看网站 | 波多野结衣av在线观看 | 亚洲国产日韩a在线播放 | 中文字幕无码日韩欧毛 | 国产尤物精品视频 | 欧美变态另类xxxx | 中文字幕人成乱码熟女app | 少妇高潮一区二区三区99 | 久久亚洲国产成人精品性色 | 亚洲国产欧美在线成人 | 国产精品福利视频导航 | 亚洲精品综合五月久久小说 | 国产精品无套呻吟在线 | 国产一区二区三区精品视频 | 国产成人人人97超碰超爽8 | 人人澡人人妻人人爽人人蜜桃 | 精品无人区无码乱码毛片国产 | 无码国产激情在线观看 | 国内精品一区二区三区不卡 | 樱花草在线社区www | 中文字幕乱码人妻二区三区 | 成人精品一区二区三区中文字幕 | 国产在线精品一区二区三区直播 | 最近中文2019字幕第二页 | 亚洲一区二区三区 | 西西人体www44rt大胆高清 | 精品久久久中文字幕人妻 | 人妻少妇被猛烈进入中文字幕 | 午夜精品久久久内射近拍高清 | 亚洲一区av无码专区在线观看 | 国精品人妻无码一区二区三区蜜柚 | 国产乡下妇女做爰 | 98国产精品综合一区二区三区 | 国产成人一区二区三区别 | 国产精品va在线观看无码 | 蜜桃臀无码内射一区二区三区 | 中文字幕人妻无码一区二区三区 | 麻豆精品国产精华精华液好用吗 | 97se亚洲精品一区 | 欧美日韩色另类综合 | 女人和拘做爰正片视频 | 我要看www免费看插插视频 | 2020久久超碰国产精品最新 | 欧美精品一区二区精品久久 | 日本一卡二卡不卡视频查询 | 亚洲国产av美女网站 | 国产精品18久久久久久麻辣 | 国精品人妻无码一区二区三区蜜柚 | 九九热爱视频精品 | 一二三四社区在线中文视频 | 中文字幕中文有码在线 | 欧美性黑人极品hd | 久久久久成人片免费观看蜜芽 | 国精产品一区二区三区 | 亚洲综合无码久久精品综合 | 亚洲欧美日韩国产精品一区二区 | 精品一二三区久久aaa片 | 久久久精品456亚洲影院 | 天堂а√在线地址中文在线 | 成人影院yy111111在线观看 | 久精品国产欧美亚洲色aⅴ大片 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲精品一区二区三区大桥未久 | 亚洲熟妇色xxxxx亚洲 | 中文字幕无码av波多野吉衣 | 亚洲国产av美女网站 | 色窝窝无码一区二区三区色欲 | 亚洲天堂2017无码中文 | 亚洲精品一区二区三区大桥未久 | 丰满人妻一区二区三区免费视频 | 青春草在线视频免费观看 | 欧美人与禽zoz0性伦交 | 亚洲gv猛男gv无码男同 | 无码人中文字幕 | 色欲久久久天天天综合网精品 | 国产两女互慰高潮视频在线观看 | 人人妻人人藻人人爽欧美一区 | 天堂а√在线地址中文在线 | 日本饥渴人妻欲求不满 | 97夜夜澡人人双人人人喊 | 亚洲精品国产第一综合99久久 | 丰满少妇人妻久久久久久 | 少妇无套内谢久久久久 | 欧洲美熟女乱又伦 | 澳门永久av免费网站 | 久久久久久久人妻无码中文字幕爆 | 欧美丰满少妇xxxx性 | 中文字幕日韩精品一区二区三区 | 成人一在线视频日韩国产 | 成熟妇人a片免费看网站 | 天堂а√在线地址中文在线 | 亚洲精品国产精品乱码不卡 | 久久99国产综合精品 | 亚洲国产欧美日韩精品一区二区三区 | 男女性色大片免费网站 | 亚洲综合无码久久精品综合 | 久久久久久亚洲精品a片成人 | 日韩人妻系列无码专区 | 国产一区二区三区精品视频 | 少妇太爽了在线观看 | 亚洲色大成网站www国产 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲精品久久久久avwww潮水 | 俺去俺来也在线www色官网 | 国产精品美女久久久 | 香港三级日本三级妇三级 | 国产亚洲tv在线观看 | 精品久久久久久亚洲精品 | 国产成人一区二区三区别 | 精品国精品国产自在久国产87 | 亚洲码国产精品高潮在线 | 人人澡人人透人人爽 | 中文字幕无码免费久久99 | 无码av免费一区二区三区试看 | 亚洲国产精品毛片av不卡在线 | 国产三级精品三级男人的天堂 | 日韩亚洲欧美精品综合 | 一个人看的www免费视频在线观看 | 欧美人与禽猛交狂配 | 成 人 免费观看网站 | 久久伊人色av天堂九九小黄鸭 | 宝宝好涨水快流出来免费视频 | 狂野欧美性猛交免费视频 | 大地资源网第二页免费观看 | 97久久精品无码一区二区 | 国产一区二区三区四区五区加勒比 | 久久亚洲国产成人精品性色 | 亚拍精品一区二区三区探花 | 久久久久人妻一区精品色欧美 | 国语精品一区二区三区 | 亚洲日韩一区二区 | 一本色道婷婷久久欧美 | 伊人久久大香线蕉av一区二区 | 蜜桃无码一区二区三区 | 亚洲va中文字幕无码久久不卡 | 网友自拍区视频精品 | 国产熟妇高潮叫床视频播放 | 国产成人精品久久亚洲高清不卡 | 少妇性l交大片欧洲热妇乱xxx | 成人女人看片免费视频放人 | 亚洲欧美综合区丁香五月小说 | 久久99精品国产麻豆蜜芽 | 熟妇人妻无乱码中文字幕 | 天堂亚洲免费视频 | 成人试看120秒体验区 | 亚洲综合无码一区二区三区 | 高潮毛片无遮挡高清免费视频 | 国产成人精品必看 | 午夜丰满少妇性开放视频 | 波多野42部无码喷潮在线 | 久久五月精品中文字幕 | 亚洲色无码一区二区三区 | 色综合久久久无码中文字幕 | 奇米影视888欧美在线观看 | 亚洲成av人综合在线观看 | 噜噜噜亚洲色成人网站 | 欧美变态另类xxxx | 欧洲熟妇色 欧美 | 无码人妻精品一区二区三区下载 | 久久精品国产日本波多野结衣 | 性做久久久久久久免费看 | 青青青手机频在线观看 | 欧美日韩一区二区免费视频 | 大乳丰满人妻中文字幕日本 | 丰满少妇熟乱xxxxx视频 | 永久免费观看国产裸体美女 | 色综合视频一区二区三区 | 国产午夜亚洲精品不卡下载 | 人人妻人人澡人人爽人人精品浪潮 | 午夜精品久久久久久久久 | 久久久久成人精品免费播放动漫 | 亚洲区小说区激情区图片区 | 亚洲午夜无码久久 | 老太婆性杂交欧美肥老太 | 丰满岳乱妇在线观看中字无码 | 男人扒开女人内裤强吻桶进去 | 日本熟妇人妻xxxxx人hd | 亚洲欧美色中文字幕在线 | 老司机亚洲精品影院无码 | 久久久国产一区二区三区 | 国产精品无码mv在线观看 | 1000部夫妻午夜免费 | 色婷婷综合中文久久一本 | 亚洲爆乳大丰满无码专区 | 国产精品爱久久久久久久 | 内射巨臀欧美在线视频 | 亚洲 欧美 激情 小说 另类 | 久久久久国色av免费观看性色 | 亚洲国产av美女网站 | 日欧一片内射va在线影院 | 人妻插b视频一区二区三区 | 宝宝好涨水快流出来免费视频 | 性做久久久久久久免费看 | 人人妻人人澡人人爽精品欧美 | 波多野结衣一区二区三区av免费 | 午夜性刺激在线视频免费 | 日本一卡2卡3卡四卡精品网站 | 国产香蕉尹人视频在线 | 无码播放一区二区三区 | 熟妇人妻无乱码中文字幕 | 亲嘴扒胸摸屁股激烈网站 | 久久午夜无码鲁丝片午夜精品 | √天堂资源地址中文在线 | 午夜性刺激在线视频免费 | 欧美丰满熟妇xxxx性ppx人交 | 六十路熟妇乱子伦 | 成人试看120秒体验区 | 欧美肥老太牲交大战 | 亚洲精品欧美二区三区中文字幕 | 亚洲精品一区三区三区在线观看 | 久久久久免费看成人影片 | 精品亚洲韩国一区二区三区 | 欧美人妻一区二区三区 | 午夜精品一区二区三区在线观看 | 免费人成网站视频在线观看 | 亚洲精品一区二区三区婷婷月 | 久久精品国产亚洲精品 | 蜜桃av抽搐高潮一区二区 | 西西人体www44rt大胆高清 | 精品 日韩 国产 欧美 视频 | 亚洲va中文字幕无码久久不卡 | 中文字幕日产无线码一区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 高潮毛片无遮挡高清免费 | 久久 国产 尿 小便 嘘嘘 | 无码毛片视频一区二区本码 | 久久精品国产大片免费观看 | 熟妇激情内射com | 又紧又大又爽精品一区二区 | 国产97在线 | 亚洲 | 无遮挡国产高潮视频免费观看 |