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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

微软编程题:寻找最小的k个值

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

轉載自:http://blog.csdn.net/v_JULY_v/article/details/6370650

尋找最小的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中所有元素+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個數的問題。

? ??思路3準確的時間復雜度表述為:O(k+(n-k)*logk),思路7準確的時間復雜度表述為:O(n+k*logn),也就是如gbb21所述粗略證明:要證原式k+n*logk-n-k*logn>0,等價于證(logk-1)n-k*logn+k>,要證思路3的時間復雜度大于思路7的時間復雜度,等價于要證原式k+n*logk-klogk-n-k*logn>0,即證(logk-1)n - k*logn + k - klogk > 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)也不會減少。

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

[cpp]?view plaincopyprint?
  • //copyright@?泡泡魚??
  • //July、2010.06.02。??
  • ??
  • //@lingyun310:先對元素數組原地建最小堆,O(n)。然后提取K次,但是每次提取時,??
  • //換到頂部的元素只需要下移頂多k次就足夠了,下移次數逐次減少。此種方法的復雜度為O(n+k^2)。??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #define?MAXLEN?123456??
  • #define?K?100??
  • ??
  • //??
  • void?HeapAdjust(int?array[],?int?i,?int?Length)??
  • {??
  • ????int?child,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;??
  • ????}??
  • }??
  • ??
  • void?Swap(int*?a,int*?b)??
  • {??
  • ????*a=*a^*b;??
  • ????*b=*a^*b;??
  • ????*a=*a^*b;??
  • }??
  • ??
  • int?GetMin(int?array[],?int?Length,int?k)??
  • {??
  • ????int?min=array[0];??
  • ????Swap(&array[0],&array[Length-1]);??
  • ??????
  • ????int?child,temp;??
  • ????int?i=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;??
  • ????}??
  • ??????
  • ????return?min;??
  • }??
  • ??
  • void?Kmin(int?array[]?,?int?Length?,?int?k)??
  • {??
  • ????for(int?i=Length/2-1;i>=0;--i)???
  • ????????//初始建堆,時間復雜度為O(n)??
  • ????????HeapAdjust(array,i,Length);??
  • ??????
  • ????int?j=Length;??
  • ????for(i=k;i>0;--i,--j)???
  • ????????//k次循環,每次循環的復雜度最多為k次交換,復雜度為o(k^2)??
  • ????{??
  • ????????int?min=GetMin(array,j,i);??
  • ????????printf("%d,",?min);??
  • ????}??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?array[MAXLEN];??
  • ????for(int?i=MAXLEN;i>0;--i)??
  • ????????array[MAXLEN-i]?=?i;??
  • ??????
  • ????Kmin(array,MAXLEN,K);??
  • ????return?0;??
  • }??
  • ??? 在算法導論第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.?

    并給出了代碼示例:

    [cpp]?view plaincopyprint?
  • //copyright@?mark?allen?weiss??
  • //July、updated,2011.05.05凌晨.??
  • ??
  • //q_select?places?the?kth?smallest?element?in?a[k]??
  • void?q_select(?input_type?a[],?int?k,?int?left,?int?right?)??
  • {??
  • ????int?i,?j;???
  • ????input_type?pivot;????
  • ????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]?);?/*?restore?pivot?*/??????
  • ????????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頁上的源碼貼出來,由大家來評判:

    [cpp]?view plaincopyprint?
  • Kbig(S,?k):??
  • ?????if(k?<=?0):??
  • ??????????return?[]?????//?返回空數組??
  • ?????if(length?S?<=?k):??
  • ??????????return?S??
  • ?????(Sa,?Sb)?=?Partition(S)??
  • ?????return?Kbig(Sa,?k).Append(Kbig(Sb,?k?–?length?Sa)??
  • ??
  • Partition(S):??
  • ?????Sa?=?[]????????????//?初始化為空數組??
  • ?????Sb?=?[]????????//?初始化為空數組??
  • ?????Swap(s[1],?S[Random()%length?S])???//?隨機選擇一個數作為分組標準,以??
  • ????????????????????????//?避免特殊數據下的算法退化,也可??
  • ????????????????????????//?以通過對整個數據進行洗牌預處理??
  • ????????????????????????//?實現這個目的??
  • ?????p?=?S[1]??
  • ?????for?i?in?[2:?length?S]:??
  • ?????????S[i]?>?p???Sa.Append(S[i])?:?Sb.Append(S[i])??
  • ????????????????????????????//?將p加入較小的組,可以避免分組失敗,也使分組??
  • ????????????????????????????//?更均勻,提高效率???
  • length?Sa?<?length?Sb???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) forn?less 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題維護地址,我會隨時追蹤這個帖子。謝謝。

    [cpp]?view plaincopyprint?
  • //求取無序數組中第K個數,本程序樞紐元的選取有問題,不作推薦。????
  • //copyright@?飛羽???
  • //July、yansha,updated,2011.05.18。?????
  • #include?<iostream>????
  • #include?<time.h>???
  • using?namespace?std;?????
  • ??
  • int?kth_elem(int?a[],?int?low,?int?high,?int?k)?????
  • {?????
  • ????int?pivot?=?a[low];????
  • ????//這個程序之所以做不到O(N)的最最重要的原因,就在于這個樞紐元的選取。???????????
  • ????//而這個程序直接選取數組中第一個元素作為樞紐元,是做不到平均時間復雜度為?O(N)的。??
  • ??????
  • ????//要?做到,就必須?把上面選取樞紐元的?代碼改掉,要么是隨機選擇數組中某一元素作為樞紐元,能達到線性期望的時間??
  • ????//要么是選取數組中中位數的中位數作為樞紐元,保證最壞情況下,依然為線性O(N)的平均時間復雜度。??
  • ????int?low_temp?=?low;?????
  • ????int?high_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)??????
  • ????????return?a[low];?????
  • ????else?if(low?>?k?-?1)??????
  • ????????return?kth_elem(a,?low_temp,?low?-?1,?k);?????
  • ????else??????
  • ????????return?kth_elem(a,?low?+?1,?high_temp,?k);?????
  • }?????
  • ??
  • int?main()???//以后盡量不再用隨機產生的數組進行測試,沒多大必要。??
  • {??
  • ????for?(int?num?=?5000;?num?<?50000001;?num?*=?10)??
  • ????{??
  • ????????int?*array?=?new?int[num];??
  • ??????????
  • ????????int?j?=?num?/?10;??
  • ????????int?acc?=?0;??
  • ????????for?(int?k?=?1;?k?<=?num;?k?+=?j)??
  • ????????{??
  • ????????????//?隨機生成數據??
  • ????????????srand(unsigned(time(0)));??
  • ????????????for(int?i?=?0;?i?<?num;?i++)?????
  • ????????????????array[i]?=?rand()?*?RAND_MAX?+?rand();??????
  • ????????????//”如果數組本身就是利用隨機化產生的話,那么選擇其中任何一個元素作為樞軸都可以看作等價于隨機選擇樞軸,??
  • ????????????//(雖然這不叫隨機選擇樞紐)”,這句話,是完全不成立的,是錯誤的。??
  • ??????????????
  • ????????????//“因為你總是選擇?隨機數組中第一個元素?作為樞紐元,不是?隨機選擇樞紐元”??
  • ????????????//相當于把上面這句話中前面的?“隨機”?兩字去掉,就是:??
  • ????????????//因為?你總是選擇數組中第一個元素作為樞紐元,不是?隨機選擇樞紐元。??
  • ????????????//所以,這個程序,始終做不到平均時間復雜度為O(N)。??
  • ??????????????
  • ????????????//隨機數組和給定一個非有序而隨機手動輸入的數組,是一個道理。稍后,還將就程序的運行結果繼續解釋這個問題。??
  • ????????????//July、updated,2011.05.18。??
  • ??????????????
  • ????????????//?計算一次查找所需的時鐘周期數??
  • ????????????clock_t?start?=?clock();??
  • ????????????int?data?=?kth_elem(array,?0,?num?-?1,?k);??
  • ????????????clock_t?end?=?clock();??
  • ????????????acc?+=?(end?-?start);??
  • ????????}??
  • ????????cout?<<?"The?average?time?of?searching?a?date?in?the?array?size?of?"?<<?num?<<?"?is?"?<<?acc?/?10?<<?endl;??
  • ????}??
  • ????return?0;?????
  • }????
  • ?關于上述程序的更多闡述,請參考此文 第三章續、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個數的完整代碼,如下:

    [cpp]?view plaincopyprint?
  • //借助堆,查找最小的k個數??
  • //copyright@?yansha?&&July??
  • //July、updated,2011.04.28。??
  • #include?<iostream>??
  • #include?<assert.h>??
  • using?namespace?std;??
  • void?MaxHeap(int?heap[],?int?i,?int?len);??
  • /*-------------------?
  • BUILD-MIN-HEAP(A)?
  • 1??heap-size[A]?←?length[A]?
  • 2??for?i?←?|_length[A]/2_|?downto?1?
  • 3???????do?MAX-HEAPIFY(A,?i)?
  • */??
  • //?建立大根堆??
  • void?BuildHeap(int?heap[],?int?len)??
  • {??
  • ????if?(heap?==?NULL)??
  • ????????return;??
  • ??????
  • ????int?index?=?len?/?2;??
  • ????for?(int?i?=?index;?i?>=?1;?i--)??
  • ????????MaxHeap(heap,?i,?len);??
  • }??
  • /*----------------------------???
  • PARENT(i)?
  • ???return?|_i/2_|?
  • LEFT(i)?
  • ???return?2i?
  • RIGHT(i)?
  • ???return?2i?+?1?
  • MIN-HEAPIFY(A,?i)?
  • 1?l?←?LEFT(i)?
  • 2?r?←?RIGHT(i)?
  • 3?if?l?≤?heap-size[A]?and?A[l]?<?A[i]?
  • 4????then?smallest?←?l?
  • 5????else?smallest?←?i?
  • 6?if?r?≤?heap-size[A]?and?A[r]?<?A[smallest]?
  • 7????then?smallest?←?r?
  • 8?if?smallest?≠?i?
  • 9????then?exchange?A[i]?<->?A[smallest]?
  • 10?????????MIN-HEAPIFY(A,?smallest)?
  • */??
  • //調整大根堆??
  • void?MaxHeap(int?heap[],?int?i,?int?len)??
  • {??
  • ????int?largeIndex?=?-1;??
  • ????int?left?=?i?*?2;??
  • ????int?right?=?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);??
  • ????}??
  • }??
  • int?main()??
  • {??
  • ????//?定義數組存儲堆元素??
  • ????int?k;??
  • ????cin?>>?k;??
  • ????int?*heap?=?new?int?[k+1];???//注,只需申請存儲k個數的數組??
  • ????FILE?*fp?=?fopen("data.txt",?"r");???//從文件導入海量數據(便于測試,只截取了9M的數據大小)??
  • ????assert(fp);??
  • ??????
  • ????for?(int?i?=?1;?i?<=?k;?i++)??
  • ????????fscanf(fp,?"%d?",?&heap[i]);??
  • ??????
  • ????BuildHeap(heap,?k);??????//建堆??
  • ??????
  • ????int?newData;??
  • ????while?(fscanf(fp,?"%d",?&newData)?!=?EOF)??
  • ????{??
  • ????????if?(newData?<?heap[1])???//如果遇到比堆頂元素kmax更小的,則更新堆??
  • ????????{??
  • ????????????heap[1]?=?newData;??
  • ????????????MaxHeap(heap,?1,?k);???//調整堆??
  • ????????}??
  • ??????????
  • ????}??
  • ??????
  • ????for?(int?j?=?1;?j?<=?k;?j++)??
  • ????????cout?<<?heap[j]?<<?"?";??
  • ????cout?<<?endl;??
  • ??????
  • ????fclose(fp);??
  • ????return?0;??
  • }??
  • ??? 咱們用比較大量的數據文件測試一下,如這個數據文件:

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

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

    ?

    ?

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

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

    [cpp]?view plaincopyprint?
  • //_nth_element(...)的實現??
  • template?<class?RandomAccessIterator,?class?T>??
  • void?__nth_element(RandomAccessIterator?first,?RandomAccessIterator?nth,??
  • ???????????????????RandomAccessIterator?last,?T*)?{??
  • ??while?(last?-?first?>?3)?{??
  • ????RandomAccessIterator?cut?=?__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?<class?RandomAccessIterator,?class?T>??
  • RandomAccessIterator?__unguarded_partition(RandomAccessIterator?first,???
  • ???????????????????????????????????????????RandomAccessIterator?last,???
  • ???????????????????????????????????????????T?pivot)?{??
  • ??while?(true)?{??
  • ????while?(*first?<?pivot)?++first;??
  • ????--last;??
  • ????while?(pivot?<?*last)?--last;??
  • ????if?(!(first?<?last))?return?first;??
  • ????iter_swap(first,?last);??
  • ????++first;??
  • ??}??
  • }????
  • ??
  • //__insertion_sort(first,?last)的實現??
  • template?<class?RandomAccessIterator>??
  • void?__insertion_sort(RandomAccessIterator?first,?RandomAccessIterator?last)?{??
  • ??if?(first?==?last)?return;???
  • ??for?(RandomAccessIterator?i?=?first?+?1;?i?!=?last;?++i)??
  • ????__linear_insert(first,?i,?value_type(first));????//下面追蹤__linear_insert??
  • }??
  • ??
  • //_linear_insert()的實現??
  • template?<class?RandomAccessIterator,?class?T>??
  • inline?void?__linear_insert(RandomAccessIterator?first,???
  • ????????????????????????????RandomAccessIterator?last,?T*)?{??
  • ??T?value?=?*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?<class?RandomAccessIterator,?class?T>??
  • void?__unguarded_linear_insert(RandomAccessIterator?last,?T?value)?{??
  • ??RandomAccessIterator?next?=?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),應該是最優的算法了。并給出了代碼示例:

    [cpp]?view plaincopyprint?
  • //copyright@?stupidcat??
  • //July、updated,2011.05.08??
  • int?Partition(vector<int>?&data,?int?headId,?int?tailId)????
  • //這里,采用的是算法導論上的partition過程方法??
  • {???
  • ????int?posSlow?=?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]);???
  • ????return?posSlow;????//寫的不錯,命名清晰??
  • }???
  • ??
  • void?FindKLeast(vector<int>?&data,?int?headId,?int?tailId,?int?k)????
  • //尋找第k小的元素??
  • {???
  • ????if?(headId?<?tailId)???
  • ????{???
  • ????????int?midId?=?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,遞歸到高區間找??
  • ????????????}???
  • ????????}???
  • ????}???
  • }??
  • ??
  • void?FindKLeastNumbers(vector<int>?&data,?unsigned?int?k)???
  • {???
  • ????int?len?=?data.size();???
  • ????if?(k?>?len)???
  • ????{???
  • ????????throw?new?std::exception("Invalid?argument!");???
  • ????}???
  • ????FindKLeast(data,?0,?len?-?1,?k);???
  • }??
  • ? 看來,這個問題,可能會因此糾纏不清了,近日,在維基百科的英文頁面上,找到有關Selection_algorithm的資料,上面給出的示例代碼為: [cpp]?view plaincopyprint?
  • function?partition(list,?left,?right,?pivotIndex)??
  • ?????pivotValue?:=?list[pivotIndex]??
  • ?????swap?list[pivotIndex]?and?list[right]??//?Move?pivot?to?end??
  • ?????storeIndex?:=?left??
  • ?????for?i?from?left?to?right??
  • ?????????if?list[i]?<?pivotValue??
  • ?????????????swap?list[storeIndex]?and?list[i]??
  • ?????????????increment?storeIndex??
  • ?????swap?list[right]?and?list[storeIndex]??//?Move?pivot?to?its?final?place??
  • ?????return?storeIndex??
  • ??
  • ?function?select(list,?left,?right,?k)??
  • ?????if?left?=?right??
  • ?????????return?list[left]??
  • ?????select?pivotIndex?between?left?and?right??
  • ?????pivotNewIndex?:=?partition(list,?left,?right,?pivotIndex)??
  • ?????pivotDist?:=?pivotNewIndex?-?left?+?1??
  • ?????if?pivotDist?=?k???
  • ?????????return?list[pivotNewIndex]??
  • ?????else?if?k?<?pivotDist???
  • ?????????return?select(list,?left,?pivotNewIndex?-?1,?k)??
  • ?????else??
  • ?????????return?select(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 dividenexactly, 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 ifcis 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?≥ 20a?will 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 choosec?accordingly.) 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節程序。順便大贊此書。July、updated,2011.05.07。


    總結

    以上是生活随笔為你收集整理的微软编程题:寻找最小的k个值的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲人成影院在线无码按摩店 | 久久人人97超碰a片精品 | 国产成人精品久久亚洲高清不卡 | 日本一区二区三区免费高清 | 美女张开腿让人桶 | 性生交大片免费看女人按摩摩 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产亚洲tv在线观看 | 97无码免费人妻超级碰碰夜夜 | 国产偷国产偷精品高清尤物 | 成人aaa片一区国产精品 | 日韩视频 中文字幕 视频一区 | 18无码粉嫩小泬无套在线观看 | 丰满人妻被黑人猛烈进入 | 内射后入在线观看一区 | 初尝人妻少妇中文字幕 | 久久99久久99精品中文字幕 | 欧美兽交xxxx×视频 | 中文字幕无码热在线视频 | 玩弄少妇高潮ⅹxxxyw | 午夜男女很黄的视频 | 国产特级毛片aaaaaaa高清 | 中文字幕无码人妻少妇免费 | 成人av无码一区二区三区 | 欧美人与禽zoz0性伦交 | 老熟女重囗味hdxx69 | 精品人妻av区 | 国产精品沙发午睡系列 | 中文字幕精品av一区二区五区 | 国产一区二区三区影院 | 永久黄网站色视频免费直播 | 亚洲国产av精品一区二区蜜芽 | 国内少妇偷人精品视频免费 | 国产成人精品三级麻豆 | 亚洲 日韩 欧美 成人 在线观看 | 偷窥日本少妇撒尿chinese | 久久久精品欧美一区二区免费 | 黑人巨大精品欧美黑寡妇 | 欧美精品无码一区二区三区 | 日韩精品无码免费一区二区三区 | 国产精品爱久久久久久久 | 中文精品无码中文字幕无码专区 | 久久视频在线观看精品 | 午夜性刺激在线视频免费 | 在线亚洲高清揄拍自拍一品区 | 亚洲天堂2017无码 | 波多野结衣av在线观看 | 伊人久久婷婷五月综合97色 | 国内少妇偷人精品视频免费 | 亚洲综合在线一区二区三区 | 免费播放一区二区三区 | 久久天天躁夜夜躁狠狠 | 丰满少妇高潮惨叫视频 | 欧美自拍另类欧美综合图片区 | 精品久久久无码中文字幕 | 国产99久久精品一区二区 | 久在线观看福利视频 | 亚洲日本va午夜在线电影 | av在线亚洲欧洲日产一区二区 | 亚洲综合无码一区二区三区 | 色婷婷av一区二区三区之红樱桃 | 高潮毛片无遮挡高清免费 | 无码精品国产va在线观看dvd | 东北女人啪啪对白 | 亚洲欧美色中文字幕在线 | 亚洲高清偷拍一区二区三区 | 国产97人人超碰caoprom | 免费中文字幕日韩欧美 | 国产午夜亚洲精品不卡下载 | 日本精品人妻无码免费大全 | 少妇一晚三次一区二区三区 | 久久人人爽人人爽人人片av高清 | 欧美人与禽zoz0性伦交 | 精品久久8x国产免费观看 | 色一情一乱一伦一视频免费看 | 久久久久久a亚洲欧洲av冫 | 亚洲欧美日韩成人高清在线一区 | 久久国语露脸国产精品电影 | 麻豆蜜桃av蜜臀av色欲av | 亚洲第一无码av无码专区 | a片在线免费观看 | 在线播放免费人成毛片乱码 | 国产色在线 | 国产 | 夜夜影院未满十八勿进 | 亚洲自偷精品视频自拍 | 国内揄拍国内精品人妻 | 久久这里只有精品视频9 | 亚洲欧美精品伊人久久 | 东北女人啪啪对白 | 又大又黄又粗又爽的免费视频 | 中文字幕av无码一区二区三区电影 | 亚洲一区二区三区含羞草 | 无码一区二区三区在线观看 | 性史性农村dvd毛片 | 欧美高清在线精品一区 | 久久aⅴ免费观看 | 亚洲欧美综合区丁香五月小说 | 国产高潮视频在线观看 | 国产麻豆精品一区二区三区v视界 | 又紧又大又爽精品一区二区 | 99久久精品国产一区二区蜜芽 | 欧美激情一区二区三区成人 | 久久久久久a亚洲欧洲av冫 | 国产成人精品三级麻豆 | 国产麻豆精品精东影业av网站 | 欧美老熟妇乱xxxxx | 色一情一乱一伦 | 亚洲日韩av片在线观看 | 51国偷自产一区二区三区 | 亚洲熟妇色xxxxx欧美老妇y | 撕开奶罩揉吮奶头视频 | 国产精品人人爽人人做我的可爱 | 国产舌乚八伦偷品w中 | 欧美丰满熟妇xxxx | 丰满人妻一区二区三区免费视频 | 成人av无码一区二区三区 | 欧美精品一区二区精品久久 | 欧美三级a做爰在线观看 | 成熟人妻av无码专区 | 在线看片无码永久免费视频 | 久久国语露脸国产精品电影 | 久久五月精品中文字幕 | 亚洲日本一区二区三区在线 | 精品久久久久香蕉网 | 国内老熟妇对白xxxxhd | 风流少妇按摩来高潮 | 亚洲va中文字幕无码久久不卡 | 国产深夜福利视频在线 | 精品久久久久久亚洲精品 | 狠狠亚洲超碰狼人久久 | 色婷婷av一区二区三区之红樱桃 | 无码人妻少妇伦在线电影 | 国产精品-区区久久久狼 | 日本va欧美va欧美va精品 | 亚洲精品欧美二区三区中文字幕 | 国产一区二区不卡老阿姨 | 人妻熟女一区 | 国产人妻精品一区二区三区不卡 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲欧美综合区丁香五月小说 | 黑人巨大精品欧美黑寡妇 | 无码一区二区三区在线 | 国内精品久久毛片一区二区 | 欧美熟妇另类久久久久久多毛 | 日韩欧美中文字幕在线三区 | 2020久久超碰国产精品最新 | 国产97人人超碰caoprom | 亚洲欧美综合区丁香五月小说 | 自拍偷自拍亚洲精品10p | 国产成人一区二区三区别 | 两性色午夜免费视频 | 无码精品国产va在线观看dvd | 奇米影视7777久久精品 | 熟女少妇人妻中文字幕 | 无码精品国产va在线观看dvd | 无码人妻久久一区二区三区不卡 | 国产精品无套呻吟在线 | 麻豆国产97在线 | 欧洲 | 天天摸天天透天天添 | 水蜜桃亚洲一二三四在线 | 给我免费的视频在线观看 | 成年女人永久免费看片 | 国产香蕉尹人视频在线 | 7777奇米四色成人眼影 | 日韩人妻少妇一区二区三区 | 午夜精品久久久内射近拍高清 | 亚洲区欧美区综合区自拍区 | 亚洲国产精品久久久天堂 | 国产亚洲人成a在线v网站 | 亚洲精品一区二区三区四区五区 | av小次郎收藏 | 国产午夜精品一区二区三区嫩草 | 蜜臀aⅴ国产精品久久久国产老师 | 骚片av蜜桃精品一区 | 88国产精品欧美一区二区三区 | 99精品无人区乱码1区2区3区 | 免费无码av一区二区 | 国产va免费精品观看 | 夜精品a片一区二区三区无码白浆 | 国产乱码精品一品二品 | 国产精品亚洲а∨无码播放麻豆 | 男女爱爱好爽视频免费看 | 麻豆md0077饥渴少妇 | 天干天干啦夜天干天2017 | 成人免费视频在线观看 | 无遮挡国产高潮视频免费观看 | 久久亚洲日韩精品一区二区三区 | 成年美女黄网站色大免费全看 | 欧美变态另类xxxx | 国产精品爱久久久久久久 | 亚洲国产av美女网站 | 国产精品香蕉在线观看 | 国产乱码精品一品二品 | 大地资源中文第3页 | 久久国产精品二国产精品 | 无码国产乱人伦偷精品视频 | 亚洲aⅴ无码成人网站国产app | 国产精品无码一区二区三区不卡 | 久久精品国产精品国产精品污 | 国产两女互慰高潮视频在线观看 | 成人免费视频视频在线观看 免费 | 国产精品成人av在线观看 | 在线看片无码永久免费视频 | 亚洲欧洲日本综合aⅴ在线 | 欧美人与禽猛交狂配 | 久久精品人妻少妇一区二区三区 | 人人澡人人透人人爽 | 久久精品国产99精品亚洲 | 中文字幕无码av激情不卡 | 综合人妻久久一区二区精品 | 中文字幕av伊人av无码av | 在线成人www免费观看视频 | 三上悠亚人妻中文字幕在线 | 在线播放亚洲第一字幕 | √天堂资源地址中文在线 | 亚洲阿v天堂在线 | 国产一区二区三区精品视频 | 国产亚洲精品久久久闺蜜 | 欧美真人作爱免费视频 | 亚洲热妇无码av在线播放 | 欧美放荡的少妇 | 牲欲强的熟妇农村老妇女视频 | 久久久精品成人免费观看 | 午夜无码区在线观看 | 牲欲强的熟妇农村老妇女视频 | 日韩人妻无码一区二区三区久久99 | 国产黑色丝袜在线播放 | 大肉大捧一进一出好爽视频 | 2019午夜福利不卡片在线 | 中文字幕乱码人妻二区三区 | 国产亚洲欧美在线专区 | 97无码免费人妻超级碰碰夜夜 | 88国产精品欧美一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 性史性农村dvd毛片 | 日韩精品a片一区二区三区妖精 | 午夜福利一区二区三区在线观看 | 日本爽爽爽爽爽爽在线观看免 | 装睡被陌生人摸出水好爽 | 日韩欧美群交p片內射中文 | 婷婷丁香六月激情综合啪 | 少妇久久久久久人妻无码 | 欧美成人免费全部网站 | 久久zyz资源站无码中文动漫 | 无码一区二区三区在线观看 | 久久亚洲精品成人无码 | 天海翼激烈高潮到腰振不止 | 午夜精品久久久久久久 | 久久伊人色av天堂九九小黄鸭 | 男人的天堂2018无码 | 久久zyz资源站无码中文动漫 | 又大又紧又粉嫩18p少妇 | 亚洲 另类 在线 欧美 制服 | 领导边摸边吃奶边做爽在线观看 | 亚洲一区二区三区四区 | 国产成人午夜福利在线播放 | 国产sm调教视频在线观看 | 久久精品中文闷骚内射 | 巨爆乳无码视频在线观看 | 久久综合给久久狠狠97色 | 亚洲人交乣女bbw | 亚洲国产成人a精品不卡在线 | 奇米影视7777久久精品人人爽 | 国产亚洲精品久久久久久 | 久久精品中文字幕大胸 | 亚洲一区二区三区四区 | 性史性农村dvd毛片 | 国产亚洲精品久久久久久久 | 好屌草这里只有精品 | 亚洲国产精品无码一区二区三区 | 亚洲爆乳无码专区 | 久久久久久国产精品无码下载 | 少妇性俱乐部纵欲狂欢电影 | 色欲久久久天天天综合网精品 | www一区二区www免费 | 久久精品一区二区三区四区 | 亚洲经典千人经典日产 | 中文无码成人免费视频在线观看 | 亚洲熟妇自偷自拍另类 | 性色欲情网站iwww九文堂 | 亚洲欧洲日本综合aⅴ在线 | 大地资源网第二页免费观看 | 欧美人与动性行为视频 | 亚洲爆乳精品无码一区二区三区 | 中文无码成人免费视频在线观看 | 激情五月综合色婷婷一区二区 | 亚洲狠狠色丁香婷婷综合 | 麻豆av传媒蜜桃天美传媒 | 国产麻豆精品精东影业av网站 | 女人和拘做爰正片视频 | 亚洲性无码av中文字幕 | 亚洲精品成a人在线观看 | 99国产精品白浆在线观看免费 | 国产精品办公室沙发 | 国产精品99久久精品爆乳 | 亚洲国产精品一区二区美利坚 | 国产高清不卡无码视频 | 精品国产乱码久久久久乱码 | 午夜性刺激在线视频免费 | 精品欧美一区二区三区久久久 | 最近的中文字幕在线看视频 | 日韩视频 中文字幕 视频一区 | 俄罗斯老熟妇色xxxx | 国产精品va在线观看无码 | 兔费看少妇性l交大片免费 | 免费乱码人妻系列无码专区 | 粗大的内捧猛烈进出视频 | 欧美国产亚洲日韩在线二区 | 国产精品亚洲а∨无码播放麻豆 | 在线天堂新版最新版在线8 | 亚洲国产精品美女久久久久 | 无码中文字幕色专区 | 丁香花在线影院观看在线播放 | 国产精品99久久精品爆乳 | 无套内谢的新婚少妇国语播放 | 日韩人妻少妇一区二区三区 | 欧美国产日产一区二区 | 一区二区三区乱码在线 | 欧洲 | 国产性生交xxxxx无码 | 亚洲 日韩 欧美 成人 在线观看 | 国产精品亚洲专区无码不卡 | 亚洲精品成人av在线 | 亚洲中文字幕va福利 | 久久国产精品_国产精品 | 老熟妇仑乱视频一区二区 | 亚洲国产av美女网站 | 熟妇女人妻丰满少妇中文字幕 | 欧美xxxx黑人又粗又长 | 国产精品99久久精品爆乳 | 小鲜肉自慰网站xnxx | 两性色午夜视频免费播放 | 免费国产成人高清在线观看网站 | 日韩精品成人一区二区三区 | 精品人妻中文字幕有码在线 | 午夜精品久久久久久久久 | 欧洲欧美人成视频在线 | 久久久精品人妻久久影视 | 大乳丰满人妻中文字幕日本 | 日本大香伊一区二区三区 | 99久久婷婷国产综合精品青草免费 | 国产成人午夜福利在线播放 | 强开小婷嫩苞又嫩又紧视频 | 免费视频欧美无人区码 | 中文精品久久久久人妻不卡 | 特黄特色大片免费播放器图片 | 国产精品久久久一区二区三区 | 亚洲一区二区三区香蕉 | 欧美丰满熟妇xxxx | 精品无人区无码乱码毛片国产 | 婷婷五月综合激情中文字幕 | 九一九色国产 | 在线观看免费人成视频 | 无码一区二区三区在线观看 | 国内少妇偷人精品视频免费 | 天堂а√在线地址中文在线 | 无码播放一区二区三区 | 无码毛片视频一区二区本码 | 日日干夜夜干 | 久久午夜无码鲁丝片秋霞 | 久久视频在线观看精品 | 久久精品丝袜高跟鞋 | 日日摸夜夜摸狠狠摸婷婷 | 天堂а√在线地址中文在线 | 国产精品无码mv在线观看 | 久久人人爽人人人人片 | 国产亚洲日韩欧美另类第八页 | 成年美女黄网站色大免费全看 | 野外少妇愉情中文字幕 | 国产精品亚洲五月天高清 | 久久精品国产一区二区三区 | 大乳丰满人妻中文字幕日本 | av在线亚洲欧洲日产一区二区 | 欧美日韩久久久精品a片 | 又色又爽又黄的美女裸体网站 | 美女极度色诱视频国产 | 国产福利视频一区二区 | 蜜臀aⅴ国产精品久久久国产老师 | 一本久道久久综合婷婷五月 | 丰满人妻一区二区三区免费视频 | 人妻少妇被猛烈进入中文字幕 | 日韩成人一区二区三区在线观看 | 亚洲gv猛男gv无码男同 | 好爽又高潮了毛片免费下载 | 日韩精品无码一区二区中文字幕 | 精品人妻中文字幕有码在线 | 国产亚洲日韩欧美另类第八页 | 国产真实伦对白全集 | 亚洲无人区午夜福利码高清完整版 | 亚洲精品无码国产 | 小sao货水好多真紧h无码视频 | 精品久久久无码人妻字幂 | 成人亚洲精品久久久久 | 乱码av麻豆丝袜熟女系列 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 亚洲欧洲日本综合aⅴ在线 | 又紧又大又爽精品一区二区 | 国产精品a成v人在线播放 | 亚洲日韩av片在线观看 | 西西人体www44rt大胆高清 | 99久久精品无码一区二区毛片 | 免费视频欧美无人区码 | 亚洲欧美日韩成人高清在线一区 | 无码帝国www无码专区色综合 | 亚洲精品中文字幕久久久久 | 人妻互换免费中文字幕 | 国产精品美女久久久网av | 在线欧美精品一区二区三区 | 熟女俱乐部五十路六十路av | 丰满人妻精品国产99aⅴ | 少妇无码av无码专区在线观看 | 国产在线无码精品电影网 | 亚洲国产精品无码一区二区三区 | 亚洲国产一区二区三区在线观看 | 丰满护士巨好爽好大乳 | 日韩精品a片一区二区三区妖精 | 亚洲综合无码久久精品综合 | 成熟女人特级毛片www免费 | 久久综合久久自在自线精品自 | 2020久久超碰国产精品最新 | 97资源共享在线视频 | 妺妺窝人体色www婷婷 | √8天堂资源地址中文在线 | 波多野42部无码喷潮在线 | 久久人人97超碰a片精品 | 东京热男人av天堂 | 77777熟女视频在线观看 а天堂中文在线官网 | 在线天堂新版最新版在线8 | 麻豆国产人妻欲求不满 | 影音先锋中文字幕无码 | 日韩亚洲欧美中文高清在线 | 日本高清一区免费中文视频 | 又色又爽又黄的美女裸体网站 | 久久无码专区国产精品s | 67194成是人免费无码 | а√天堂www在线天堂小说 | 欧美人与牲动交xxxx | 亚洲精品综合一区二区三区在线 | 一二三四社区在线中文视频 | 乱人伦人妻中文字幕无码 | 久久精品中文字幕大胸 | 亚洲区欧美区综合区自拍区 | 377p欧洲日本亚洲大胆 | 精品久久8x国产免费观看 | 377p欧洲日本亚洲大胆 | 天天摸天天透天天添 | 日本丰满熟妇videos | 麻豆蜜桃av蜜臀av色欲av | 大色综合色综合网站 | 欧洲熟妇色 欧美 | 日产精品99久久久久久 | 精品水蜜桃久久久久久久 | 久久精品中文闷骚内射 | 色五月丁香五月综合五月 | 少妇无码吹潮 | 国产精品免费大片 | 国产莉萝无码av在线播放 | 久久久久人妻一区精品色欧美 | 18无码粉嫩小泬无套在线观看 | 波多野结衣aⅴ在线 | 一区二区传媒有限公司 | 国产va免费精品观看 | 在线观看欧美一区二区三区 | 人妻少妇精品视频专区 | 国产精品亚洲五月天高清 | 亚洲精品一区国产 | 久久精品成人欧美大片 | 亚洲一区二区三区无码久久 | 国内综合精品午夜久久资源 | 在线成人www免费观看视频 | 亚洲精品久久久久久一区二区 | 久久久久se色偷偷亚洲精品av | 俺去俺来也www色官网 | 精品无人国产偷自产在线 | 国产人妻久久精品二区三区老狼 | 久久久精品456亚洲影院 | 97精品国产97久久久久久免费 | 欧美人与动性行为视频 | 骚片av蜜桃精品一区 | 亚洲 a v无 码免 费 成 人 a v | 97久久超碰中文字幕 | 国内精品人妻无码久久久影院蜜桃 | 在线亚洲高清揄拍自拍一品区 | 亚洲熟妇色xxxxx欧美老妇 | 十八禁视频网站在线观看 | 98国产精品综合一区二区三区 | 国产精品久久久久9999小说 | 精品久久久久久亚洲精品 | 国产网红无码精品视频 | 亚洲精品中文字幕 | 国产亚洲美女精品久久久2020 | 国产无遮挡吃胸膜奶免费看 | 性欧美牲交xxxxx视频 | 欧美日韩人成综合在线播放 | 国产一区二区三区四区五区加勒比 | 中文字幕人妻无码一夲道 | 久久精品人人做人人综合 | 亚洲精品久久久久久久久久久 | 又大又紧又粉嫩18p少妇 | 国产综合色产在线精品 | 成人精品视频一区二区 | 亚洲精品综合一区二区三区在线 | 鲁大师影院在线观看 | 日韩av激情在线观看 | 成人无码精品1区2区3区免费看 | 亚洲精品无码国产 | 亚洲精品综合五月久久小说 | 久久亚洲国产成人精品性色 | 国产人妻精品一区二区三区不卡 | 人妻有码中文字幕在线 | 亚洲熟妇色xxxxx欧美老妇y | 国产亚洲欧美日韩亚洲中文色 | 日韩视频 中文字幕 视频一区 | 六十路熟妇乱子伦 | 亚洲中文无码av永久不收费 | 国产精品无码一区二区三区不卡 | 99视频精品全部免费免费观看 | 亚洲欧美综合区丁香五月小说 | 久久人人爽人人爽人人片av高清 | 牲交欧美兽交欧美 | 六十路熟妇乱子伦 | 久精品国产欧美亚洲色aⅴ大片 | 亚无码乱人伦一区二区 | 风流少妇按摩来高潮 | 99国产欧美久久久精品 | www成人国产高清内射 | 四虎影视成人永久免费观看视频 | 久久熟妇人妻午夜寂寞影院 | 一本加勒比波多野结衣 | 波多野结衣高清一区二区三区 | 亚洲性无码av中文字幕 | 国产亚洲tv在线观看 | а√资源新版在线天堂 | 久久久久久国产精品无码下载 | 精品无码国产一区二区三区av | 乱码午夜-极国产极内射 | 国产精品无码mv在线观看 | 亚洲日韩av一区二区三区中文 | 亚洲精品中文字幕 | 国产人妻精品午夜福利免费 | 久久人人爽人人爽人人片av高清 | 欧美zoozzooz性欧美 | 色一情一乱一伦 | 色综合久久久久综合一本到桃花网 | 黑人巨大精品欧美一区二区 | 天天爽夜夜爽夜夜爽 | 99久久精品国产一区二区蜜芽 | 色一情一乱一伦一区二区三欧美 | 国产suv精品一区二区五 | 一本久久伊人热热精品中文字幕 | 成人欧美一区二区三区黑人免费 | 精品国偷自产在线视频 | 天下第一社区视频www日本 | 樱花草在线播放免费中文 | 在线播放无码字幕亚洲 | 大肉大捧一进一出好爽视频 | 国产精品亚洲а∨无码播放麻豆 | 久久久久久久女国产乱让韩 | 男女猛烈xx00免费视频试看 | 日韩精品乱码av一区二区 | 色欲久久久天天天综合网精品 | 性色欲网站人妻丰满中文久久不卡 | 99riav国产精品视频 | 国产又爽又猛又粗的视频a片 | 中文字幕人妻丝袜二区 | 色婷婷av一区二区三区之红樱桃 | 中文字幕+乱码+中文字幕一区 | 日韩av无码一区二区三区 | 97久久国产亚洲精品超碰热 | 国产麻豆精品一区二区三区v视界 | 色综合久久中文娱乐网 | 99久久精品日本一区二区免费 | 欧美肥老太牲交大战 | 日本丰满护士爆乳xxxx | 成人免费视频一区二区 | 午夜精品一区二区三区在线观看 | 亚洲综合精品香蕉久久网 | 欧美第一黄网免费网站 | 老司机亚洲精品影院无码 | 欧美日韩色另类综合 | 日韩精品久久久肉伦网站 | 国产午夜手机精彩视频 | 国产一区二区三区日韩精品 | 国产内射爽爽大片视频社区在线 | 亚洲呦女专区 | 久久伊人色av天堂九九小黄鸭 | 国产麻豆精品一区二区三区v视界 | 老子影院午夜伦不卡 | 亚洲国产精品无码久久久久高潮 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 樱花草在线社区www | 一本久久a久久精品vr综合 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲成色在线综合网站 | 欧美自拍另类欧美综合图片区 | 天堂无码人妻精品一区二区三区 | 日韩av无码一区二区三区 | 曰韩无码二三区中文字幕 | 国产片av国语在线观看 | 无码人妻精品一区二区三区不卡 | 久久久精品欧美一区二区免费 | 四虎国产精品一区二区 | 鲁鲁鲁爽爽爽在线视频观看 | 无遮挡国产高潮视频免费观看 | 亚洲中文字幕无码中字 | 麻豆人妻少妇精品无码专区 | 国产亚洲美女精品久久久2020 | 精品无码一区二区三区的天堂 | 色一情一乱一伦一视频免费看 | 中国女人内谢69xxxxxa片 | 精品欧洲av无码一区二区三区 | 午夜精品一区二区三区的区别 | 婷婷丁香五月天综合东京热 | 免费无码肉片在线观看 | 狂野欧美性猛xxxx乱大交 | 亚洲欧美国产精品专区久久 | 桃花色综合影院 | 国产精品高潮呻吟av久久4虎 | 国产精品久久久久久久影院 | 欧美成人午夜精品久久久 | 天下第一社区视频www日本 | 少妇的肉体aa片免费 | 精品无码一区二区三区爱欲 | 初尝人妻少妇中文字幕 | 99久久精品无码一区二区毛片 | 香港三级日本三级妇三级 | 国产成人精品视频ⅴa片软件竹菊 | 未满小14洗澡无码视频网站 | 久久久久久久久888 | 亚洲精品午夜无码电影网 | 亚洲一区二区三区偷拍女厕 | 精品国产青草久久久久福利 | 欧美第一黄网免费网站 | 99精品无人区乱码1区2区3区 | av无码久久久久不卡免费网站 | 小泽玛莉亚一区二区视频在线 | 色欲av亚洲一区无码少妇 | 福利一区二区三区视频在线观看 | 亚洲色成人中文字幕网站 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 撕开奶罩揉吮奶头视频 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲欧美精品aaaaaa片 | 荫蒂被男人添的好舒服爽免费视频 | 国产av人人夜夜澡人人爽麻豆 | 中文字幕无码av激情不卡 | 久久99热只有频精品8 | 综合激情五月综合激情五月激情1 | 国产九九九九九九九a片 | 正在播放东北夫妻内射 | 又大又黄又粗又爽的免费视频 | 特级做a爰片毛片免费69 | 国产精品va在线播放 | 无码人妻少妇伦在线电影 | 日韩精品一区二区av在线 | 国产真实伦对白全集 | 久久99热只有频精品8 | 国产成人综合在线女婷五月99播放 | 亚洲色成人中文字幕网站 | 六十路熟妇乱子伦 | 亚洲精品中文字幕乱码 | 欧美成人午夜精品久久久 | 亚洲中文无码av永久不收费 | 亚洲日韩中文字幕在线播放 | 精品无码成人片一区二区98 | 久久午夜无码鲁丝片午夜精品 | 红桃av一区二区三区在线无码av | 国产精品国产自线拍免费软件 | 日本精品人妻无码免费大全 | 又大又黄又粗又爽的免费视频 | 天堂无码人妻精品一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 高清不卡一区二区三区 | 国产亚洲精品久久久久久 | 亚洲 a v无 码免 费 成 人 a v | 成人一在线视频日韩国产 | 老太婆性杂交欧美肥老太 | 精品一区二区三区波多野结衣 | 久久综合给久久狠狠97色 | 秋霞特色aa大片 | 人人爽人人爽人人片av亚洲 | 色综合久久网 | 国产精品毛多多水多 | 思思久久99热只有频精品66 | 久久精品女人的天堂av | 国产做国产爱免费视频 | 日本熟妇大屁股人妻 | 色欲av亚洲一区无码少妇 | 国产乱子伦视频在线播放 | 久久天天躁狠狠躁夜夜免费观看 | 欧美怡红院免费全部视频 | 国产午夜视频在线观看 | 久久精品国产99精品亚洲 | 婷婷五月综合缴情在线视频 | 亚洲色偷偷偷综合网 | 国语自产偷拍精品视频偷 | 在线观看国产午夜福利片 | 奇米影视7777久久精品人人爽 | 蜜桃视频插满18在线观看 | 欧美成人免费全部网站 | 十八禁视频网站在线观看 | 中文无码伦av中文字幕 | 国产亚洲人成在线播放 | 无码人妻精品一区二区三区不卡 | 人妻尝试又大又粗久久 | 永久免费观看国产裸体美女 | 少妇无套内谢久久久久 | 波多野42部无码喷潮在线 | 亚洲国精产品一二二线 | 一本久道久久综合狠狠爱 | 又大又紧又粉嫩18p少妇 | 国产人妻久久精品二区三区老狼 | 99久久人妻精品免费二区 | 特大黑人娇小亚洲女 | 精品国产av色一区二区深夜久久 | 亚洲乱亚洲乱妇50p | 性史性农村dvd毛片 | 天天做天天爱天天爽综合网 | 国内揄拍国内精品人妻 | 国产猛烈高潮尖叫视频免费 | 夜先锋av资源网站 | 狂野欧美激情性xxxx | 成人精品天堂一区二区三区 | 东京无码熟妇人妻av在线网址 | 日本精品高清一区二区 | 国产精品美女久久久久av爽李琼 | 欧美丰满少妇xxxx性 | 国产舌乚八伦偷品w中 | 捆绑白丝粉色jk震动捧喷白浆 | 99er热精品视频 | 蜜桃视频韩日免费播放 | 性欧美大战久久久久久久 | 亚洲精品成人av在线 | 婷婷六月久久综合丁香 | 亚洲国产精品久久久天堂 | 国产精品久久久一区二区三区 | 久久无码人妻影院 | 欧美日韩视频无码一区二区三 | 67194成是人免费无码 | 亚洲一区二区三区国产精华液 | 精品无码成人片一区二区98 | 亚洲va欧美va天堂v国产综合 | 国产激情一区二区三区 | 精品国产一区二区三区四区在线看 | 在线观看国产午夜福利片 | 88国产精品欧美一区二区三区 | 乌克兰少妇xxxx做受 | 久久午夜夜伦鲁鲁片无码免费 | 美女黄网站人色视频免费国产 | 国产精品高潮呻吟av久久4虎 | 帮老师解开蕾丝奶罩吸乳网站 | 97资源共享在线视频 | 男女猛烈xx00免费视频试看 | av无码久久久久不卡免费网站 | 小鲜肉自慰网站xnxx | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产精品第一区揄拍无码 | 伊人久久大香线蕉亚洲 | 亚洲国产av精品一区二区蜜芽 | 国产黑色丝袜在线播放 | 国产手机在线αⅴ片无码观看 | 国产 浪潮av性色四虎 | 国产suv精品一区二区五 | 又色又爽又黄的美女裸体网站 | 精品无码一区二区三区爱欲 | 亚洲精品国产精品乱码不卡 | 午夜免费福利小电影 | 日日天日日夜日日摸 | 久久久国产精品无码免费专区 | 欧美熟妇另类久久久久久不卡 | 亚洲日本一区二区三区在线 | 久久99精品久久久久婷婷 | 精品欧美一区二区三区久久久 | av无码电影一区二区三区 | 亚洲小说图区综合在线 | 无码午夜成人1000部免费视频 | av人摸人人人澡人人超碰下载 | 久久99久久99精品中文字幕 | 久久99精品国产麻豆蜜芽 | 国产精品理论片在线观看 | 国产av久久久久精东av | 成人欧美一区二区三区黑人 | 亚洲男人av天堂午夜在 | 国产乱子伦视频在线播放 | 精品偷拍一区二区三区在线看 | 免费人成在线视频无码 | 国产乱码精品一品二品 | 丝袜 中出 制服 人妻 美腿 | 性欧美疯狂xxxxbbbb | 亚洲欧美国产精品久久 | 亚洲の无码国产の无码步美 | 国产av一区二区精品久久凹凸 | 国产又爽又黄又刺激的视频 | 日本一区二区三区免费高清 | 久久精品女人天堂av免费观看 | 久久久久国色av免费观看性色 | 亚洲欧洲日本无在线码 | 美女毛片一区二区三区四区 | 亚洲欧美国产精品专区久久 | 亚洲娇小与黑人巨大交 | 久久人妻内射无码一区三区 | 人妻无码αv中文字幕久久琪琪布 | 亚洲精品久久久久久一区二区 | 樱花草在线播放免费中文 | 成人无码精品一区二区三区 | 亚洲成av人综合在线观看 | 欧美日韩久久久精品a片 | 自拍偷自拍亚洲精品被多人伦好爽 | 丰满岳乱妇在线观看中字无码 | 一本久道久久综合婷婷五月 | 国产精品丝袜黑色高跟鞋 | 国产午夜亚洲精品不卡 | 一本久久伊人热热精品中文字幕 | 国产精品igao视频网 | 伊人久久大香线蕉午夜 | 国产精品久久国产精品99 | 99久久精品国产一区二区蜜芽 | 草草网站影院白丝内射 | 日本xxxx色视频在线观看免费 | 人人妻人人澡人人爽欧美一区 | 香蕉久久久久久av成人 | 国产在线无码精品电影网 | 少妇高潮喷潮久久久影院 | 特大黑人娇小亚洲女 | 国产精品无码永久免费888 | 无遮挡啪啪摇乳动态图 | 丰满人妻翻云覆雨呻吟视频 | 精品人人妻人人澡人人爽人人 | 天堂无码人妻精品一区二区三区 | 亚洲无人区一区二区三区 | 欧美乱妇无乱码大黄a片 | 亚洲成色在线综合网站 | 性色欲情网站iwww九文堂 | 亚洲精品成人福利网站 | 久久人人爽人人爽人人片av高清 | 亚洲 a v无 码免 费 成 人 a v | 国产精品二区一区二区aⅴ污介绍 | 亚洲区小说区激情区图片区 | 亚洲 a v无 码免 费 成 人 a v | 人妻插b视频一区二区三区 | 东京热一精品无码av | 国产精品无码久久av | 扒开双腿疯狂进出爽爽爽视频 | 国产成人精品久久亚洲高清不卡 | 亚洲精品国产a久久久久久 | 狠狠cao日日穞夜夜穞av | 亚洲国产午夜精品理论片 | 亚洲人成网站免费播放 | 色婷婷欧美在线播放内射 | 亚洲最大成人网站 | 国产精品亚洲专区无码不卡 | 免费无码av一区二区 | 久久久www成人免费毛片 | 中文字幕无码av激情不卡 | 国产精品亚洲综合色区韩国 | 国产无遮挡又黄又爽免费视频 | 国精产品一品二品国精品69xx | 人人妻人人澡人人爽欧美一区 | 国产一区二区三区影院 | 性史性农村dvd毛片 | 日韩视频 中文字幕 视频一区 | 99精品视频在线观看免费 | 国产成人精品视频ⅴa片软件竹菊 | 精品久久久久久人妻无码中文字幕 | 窝窝午夜理论片影院 | 久久无码人妻影院 | 国产激情无码一区二区app | 亚洲精品国产品国语在线观看 | 性色av无码免费一区二区三区 | 亚洲熟妇色xxxxx欧美老妇 | 精品aⅴ一区二区三区 | 国产农村妇女高潮大叫 | 中文字幕无码乱人伦 | 丰满人妻被黑人猛烈进入 | 国产成人无码av在线影院 | 国产熟女一区二区三区四区五区 | 国产成人精品视频ⅴa片软件竹菊 | 99riav国产精品视频 | 精品国产av色一区二区深夜久久 | a在线亚洲男人的天堂 | 亚洲大尺度无码无码专区 | 国产做国产爱免费视频 | 欧美 丝袜 自拍 制服 另类 | av无码电影一区二区三区 | 永久免费观看美女裸体的网站 | 性史性农村dvd毛片 | 小sao货水好多真紧h无码视频 | 无码精品人妻一区二区三区av | 国产片av国语在线观看 | 色婷婷久久一区二区三区麻豆 | 粉嫩少妇内射浓精videos | 欧美性生交xxxxx久久久 | 中文字幕乱码中文乱码51精品 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产午夜福利100集发布 | 中文字幕无码视频专区 | 久久视频在线观看精品 | 好屌草这里只有精品 | 3d动漫精品啪啪一区二区中 | 在线播放免费人成毛片乱码 | 一个人看的www免费视频在线观看 | 岛国片人妻三上悠亚 | 精品无人区无码乱码毛片国产 | av人摸人人人澡人人超碰下载 | 97久久精品无码一区二区 | 曰本女人与公拘交酡免费视频 | 亚洲精品国偷拍自产在线观看蜜桃 | av无码不卡在线观看免费 | 亚洲中文无码av永久不收费 | 亚洲国产欧美国产综合一区 | 亚洲成a人片在线观看无码3d | 中文字幕无码人妻少妇免费 | 午夜理论片yy44880影院 | 中文字幕乱码亚洲无线三区 | 日本精品高清一区二区 | 亚洲精品欧美二区三区中文字幕 | 人人妻人人澡人人爽欧美精品 | 国产亚洲精品久久久闺蜜 | 国产亚洲精品久久久久久 | 伊在人天堂亚洲香蕉精品区 | 中文字幕人妻无码一夲道 | 国产亚洲精品精品国产亚洲综合 | 亚洲精品一区二区三区在线观看 | 国产麻豆精品精东影业av网站 | 99riav国产精品视频 | 国产乱人偷精品人妻a片 | 国产成人综合在线女婷五月99播放 | 中文字幕久久久久人妻 | 成年美女黄网站色大免费全看 | 久久久久亚洲精品男人的天堂 | 老熟妇乱子伦牲交视频 | 免费中文字幕日韩欧美 | 老司机亚洲精品影院无码 | 中文字幕乱码人妻二区三区 | 欧美刺激性大交 | 亚洲综合另类小说色区 | 久久婷婷五月综合色国产香蕉 | 综合激情五月综合激情五月激情1 | 九九综合va免费看 | 少妇被粗大的猛进出69影院 | 成人影院yy111111在线观看 | 色婷婷欧美在线播放内射 | 日本一本二本三区免费 | 日产国产精品亚洲系列 | 午夜男女很黄的视频 | 国产97人人超碰caoprom | 天干天干啦夜天干天2017 | 九九在线中文字幕无码 | 国产精品成人av在线观看 | 久久无码人妻影院 | 捆绑白丝粉色jk震动捧喷白浆 | 久久午夜夜伦鲁鲁片无码免费 | 麻豆精产国品 | 97久久国产亚洲精品超碰热 | 亚洲成av人在线观看网址 | 中文字幕人妻丝袜二区 | 97久久超碰中文字幕 | 亚洲精品国偷拍自产在线麻豆 | 伊在人天堂亚洲香蕉精品区 | 丰满岳乱妇在线观看中字无码 | 欧美freesex黑人又粗又大 | 国产香蕉97碰碰久久人人 | 精品少妇爆乳无码av无码专区 | 精品无码国产一区二区三区av | 国产精品久久久久久亚洲毛片 | 亚洲成a人片在线观看日本 | 国产精品人妻一区二区三区四 | 亚洲国产精品成人久久蜜臀 | 中文字幕无码日韩专区 | 亚洲va中文字幕无码久久不卡 | 国产办公室秘书无码精品99 | 真人与拘做受免费视频 | 日本一卡二卡不卡视频查询 | 亚洲精品综合五月久久小说 | 久久久久人妻一区精品色欧美 | 久久久久se色偷偷亚洲精品av | 亚洲 欧美 激情 小说 另类 | 国产情侣作爱视频免费观看 | 秋霞特色aa大片 | 欧美国产日韩久久mv | 日韩人妻无码中文字幕视频 | 人妻中文无码久热丝袜 | 国产精品久久久久久亚洲影视内衣 | 人妻有码中文字幕在线 | 日本乱人伦片中文三区 | 极品尤物被啪到呻吟喷水 | 欧美老妇与禽交 | 国産精品久久久久久久 | 最新版天堂资源中文官网 | 东京无码熟妇人妻av在线网址 | 精品国产av色一区二区深夜久久 | 久久亚洲精品中文字幕无男同 | 精品欧洲av无码一区二区三区 | 97色伦图片97综合影院 | 成年美女黄网站色大免费视频 | 亚洲日本va午夜在线电影 | 免费观看又污又黄的网站 | 一本色道久久综合亚洲精品不卡 | 99精品视频在线观看免费 | 国产精品爱久久久久久久 | 久久97精品久久久久久久不卡 | 国内少妇偷人精品视频免费 | 天天做天天爱天天爽综合网 | 成人无码精品一区二区三区 | 亚洲一区二区观看播放 | 精品国产成人一区二区三区 | 丁香花在线影院观看在线播放 | 国产疯狂伦交大片 | 日产精品99久久久久久 | 东京无码熟妇人妻av在线网址 | 色婷婷av一区二区三区之红樱桃 | 国产综合在线观看 | 精品亚洲成av人在线观看 | 国产精品igao视频网 | 精品久久久中文字幕人妻 | 麻豆国产丝袜白领秘书在线观看 | 大肉大捧一进一出好爽视频 | 国产无遮挡又黄又爽免费视频 | 亚洲а∨天堂久久精品2021 | 欧美乱妇无乱码大黄a片 | 最新国产麻豆aⅴ精品无码 | 久久综合给合久久狠狠狠97色 | 久久久国产精品无码免费专区 | 狠狠躁日日躁夜夜躁2020 | 久久午夜夜伦鲁鲁片无码免费 | 天下第一社区视频www日本 | 国产av人人夜夜澡人人爽麻豆 | 国产精品嫩草久久久久 | 人妻体内射精一区二区三四 | 国产av人人夜夜澡人人爽麻豆 | 东京热男人av天堂 | 亚洲毛片av日韩av无码 | 日欧一片内射va在线影院 | 亚洲熟女一区二区三区 | 国产手机在线αⅴ片无码观看 | 亚洲国产精品毛片av不卡在线 | 日本熟妇人妻xxxxx人hd | 人人澡人人妻人人爽人人蜜桃 | 无码任你躁久久久久久久 | 亚洲精品一区二区三区在线 | 久久综合激激的五月天 | 欧美老妇与禽交 | 欧美 亚洲 国产 另类 | 麻豆国产丝袜白领秘书在线观看 | 麻豆蜜桃av蜜臀av色欲av | 人妻aⅴ无码一区二区三区 | 免费无码肉片在线观看 | 中文字幕乱码人妻二区三区 | 日本高清一区免费中文视频 | 国产精品国产自线拍免费软件 | 国产精品久久福利网站 | 精品久久久久久人妻无码中文字幕 | 自拍偷自拍亚洲精品10p | 精品国产一区二区三区四区 | 色综合久久久无码中文字幕 | 性色欲网站人妻丰满中文久久不卡 | 亚洲人成人无码网www国产 | 国产精品国产自线拍免费软件 | 特级做a爰片毛片免费69 | 日本在线高清不卡免费播放 | 国内精品人妻无码久久久影院蜜桃 | 在线天堂新版最新版在线8 | 国产suv精品一区二区五 | 久久天天躁狠狠躁夜夜免费观看 | 强辱丰满人妻hd中文字幕 | 国产成人无码午夜视频在线观看 | 精品无码一区二区三区爱欲 | 亚洲经典千人经典日产 | 97资源共享在线视频 | 欧美人妻一区二区三区 | 欧美日韩在线亚洲综合国产人 | 国产极品视觉盛宴 | 国产精品久久久久7777 | 少妇人妻大乳在线视频 | 少妇高潮喷潮久久久影院 | 未满成年国产在线观看 | 又黄又爽又色的视频 | 人妻中文无码久热丝袜 | 少妇被粗大的猛进出69影院 | 中文字幕人妻无码一区二区三区 | 国产亚洲人成a在线v网站 | 青春草在线视频免费观看 | 青青草原综合久久大伊人精品 | 国产无遮挡又黄又爽免费视频 | √8天堂资源地址中文在线 | 国产精品无码永久免费888 | 欧美激情综合亚洲一二区 | 永久免费观看美女裸体的网站 | 300部国产真实乱 | 狠狠噜狠狠狠狠丁香五月 | 国产精品办公室沙发 | 日韩欧美中文字幕在线三区 | 一二三四在线观看免费视频 | 国产精品香蕉在线观看 | 欧美老熟妇乱xxxxx | 日本精品久久久久中文字幕 | av在线亚洲欧洲日产一区二区 | 狠狠色丁香久久婷婷综合五月 | 骚片av蜜桃精品一区 | 宝宝好涨水快流出来免费视频 | 亚洲精品www久久久 | 无码精品国产va在线观看dvd | 免费国产黄网站在线观看 | 亚洲毛片av日韩av无码 | 国产亚洲tv在线观看 | 国产激情一区二区三区 | 大胆欧美熟妇xx | 国产精品人人妻人人爽 | 在线成人www免费观看视频 | 精品无码国产自产拍在线观看蜜 | 亚洲精品一区二区三区在线观看 | 国产特级毛片aaaaaa高潮流水 | 亚洲欧洲日本无在线码 | 国产成人久久精品流白浆 | 中文字幕 人妻熟女 | 在教室伦流澡到高潮hnp视频 | 国产精品无码mv在线观看 | 国产精品嫩草久久久久 | 国语精品一区二区三区 | 亚洲欧洲中文日韩av乱码 | 在线观看欧美一区二区三区 | 久久精品女人的天堂av | 国产精品99爱免费视频 | 久久久久久a亚洲欧洲av冫 | 国产人妻精品一区二区三区不卡 | 久久久www成人免费毛片 | 野狼第一精品社区 | av小次郎收藏 | 色爱情人网站 | 亚洲熟悉妇女xxx妇女av | 日本熟妇人妻xxxxx人hd | 丰满人妻被黑人猛烈进入 | 亚洲国精产品一二二线 | 超碰97人人做人人爱少妇 | 熟女少妇人妻中文字幕 | 东京热男人av天堂 | 色综合久久久久综合一本到桃花网 | 亚洲精品一区二区三区在线 | 双乳奶水饱满少妇呻吟 | 亚洲人成影院在线观看 | 亚洲s码欧洲m码国产av | 人妻有码中文字幕在线 | 亚洲 另类 在线 欧美 制服 | 日日摸夜夜摸狠狠摸婷婷 | 999久久久国产精品消防器材 | 日日碰狠狠躁久久躁蜜桃 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 免费人成网站视频在线观看 | 亚洲 另类 在线 欧美 制服 | 一本久道久久综合婷婷五月 | av香港经典三级级 在线 | 亚洲国产高清在线观看视频 | 动漫av一区二区在线观看 | 日本一区二区三区免费播放 | 日韩人妻少妇一区二区三区 | 国色天香社区在线视频 | 中文字幕无码av波多野吉衣 | 日本熟妇大屁股人妻 | 日日麻批免费40分钟无码 | 成年女人永久免费看片 | 永久免费观看美女裸体的网站 | 亚洲人亚洲人成电影网站色 | 国产亚洲欧美日韩亚洲中文色 | 在线观看国产午夜福利片 | 欧美xxxx黑人又粗又长 | 国精品人妻无码一区二区三区蜜柚 | 亚洲国产精华液网站w | 日本精品少妇一区二区三区 | 偷窥村妇洗澡毛毛多 | 亚洲自偷自偷在线制服 | 成人亚洲精品久久久久 | 牲欲强的熟妇农村老妇女 | 亚洲日韩中文字幕在线播放 | 无码精品国产va在线观看dvd | 国产两女互慰高潮视频在线观看 | 久久99精品久久久久婷婷 | 真人与拘做受免费视频 | 亚洲精品国产精品乱码不卡 | 亚洲男人av天堂午夜在 | 中文字幕无码av激情不卡 | 秋霞成人午夜鲁丝一区二区三区 | 精品久久久久久亚洲精品 | 欧美第一黄网免费网站 | 国产成人综合在线女婷五月99播放 | 久久国产精品二国产精品 | 免费观看激色视频网站 | 亚洲日韩av一区二区三区四区 | 国产精品无码一区二区三区不卡 | 日本熟妇乱子伦xxxx | 久久综合九色综合97网 | 色诱久久久久综合网ywww | 欧美freesex黑人又粗又大 | 日本大乳高潮视频在线观看 | 国产内射爽爽大片视频社区在线 | 亚洲欧洲中文日韩av乱码 | 国产精品久久久久久久影院 | 欧美人与物videos另类 | 国产精品久久久久久无码 | 丰满少妇人妻久久久久久 | 亚洲精品国产精品乱码视色 | 欧美丰满熟妇xxxx性ppx人交 | 精品水蜜桃久久久久久久 | 4hu四虎永久在线观看 | 欧美成人家庭影院 | 7777奇米四色成人眼影 | 97久久精品无码一区二区 | 国产av一区二区精品久久凹凸 | 国产办公室秘书无码精品99 | 激情五月综合色婷婷一区二区 | 久久精品人人做人人综合试看 | 中文字幕无码av激情不卡 | 四虎国产精品一区二区 | 国产一区二区三区日韩精品 | 亚洲精品国产精品乱码不卡 | 日日摸日日碰夜夜爽av | 99久久久国产精品无码免费 | 亚洲精品国偷拍自产在线麻豆 | 人人超人人超碰超国产 | 婷婷综合久久中文字幕蜜桃三电影 | 黑森林福利视频导航 | 在线播放亚洲第一字幕 | 99久久婷婷国产综合精品青草免费 | 最近免费中文字幕中文高清百度 | 欧美老人巨大xxxx做受 | 一本精品99久久精品77 | 亚洲欧美日韩成人高清在线一区 | 免费无码肉片在线观看 | 大乳丰满人妻中文字幕日本 | 国产一区二区三区精品视频 | 日韩人妻无码中文字幕视频 | 88国产精品欧美一区二区三区 | 又大又紧又粉嫩18p少妇 | 沈阳熟女露脸对白视频 | www国产精品内射老师 | 无码福利日韩神码福利片 | 日本一卡2卡3卡四卡精品网站 | 久久久国产精品无码免费专区 | 亚洲熟妇自偷自拍另类 | 久久视频在线观看精品 | 爆乳一区二区三区无码 | 天天拍夜夜添久久精品 | 国产熟妇另类久久久久 | 久久综合久久自在自线精品自 | 亚洲成av人片天堂网无码】 | 久久久精品欧美一区二区免费 | 亚洲熟妇自偷自拍另类 | 十八禁视频网站在线观看 | 未满小14洗澡无码视频网站 | 欧美性生交xxxxx久久久 | 九月婷婷人人澡人人添人人爽 | 窝窝午夜理论片影院 | 97夜夜澡人人双人人人喊 | 伊人久久大香线蕉av一区二区 | 国产人成高清在线视频99最全资源 | 真人与拘做受免费视频一 | 六十路熟妇乱子伦 | 伦伦影院午夜理论片 | 日韩人妻无码中文字幕视频 | 人妻无码αv中文字幕久久琪琪布 | 在线a亚洲视频播放在线观看 | 国产亚洲美女精品久久久2020 | 亚洲精品午夜国产va久久成人 | 九九在线中文字幕无码 | 欧美老妇与禽交 | 亚洲国产精品久久久久久 | 十八禁真人啪啪免费网站 | 丰满妇女强制高潮18xxxx | 东京热男人av天堂 | 精品欧美一区二区三区久久久 | 精品无码成人片一区二区98 | 美女毛片一区二区三区四区 | 精品久久久久香蕉网 | 午夜不卡av免费 一本久久a久久精品vr综合 | 国内揄拍国内精品少妇国语 | 亚洲第一无码av无码专区 | 国产精品第一区揄拍无码 | 老熟妇乱子伦牲交视频 | 伊人久久大香线蕉亚洲 | 国产人妻人伦精品 | 亚洲国产精品一区二区美利坚 | 无码吃奶揉捏奶头高潮视频 | 精品午夜福利在线观看 | 亚洲中文字幕在线观看 | 久久国产精品精品国产色婷婷 | av人摸人人人澡人人超碰下载 | 国产精品无码久久av | 亚洲成av人在线观看网址 | 国产人妻人伦精品1国产丝袜 | 国产色xx群视频射精 | 狂野欧美性猛xxxx乱大交 | 色诱久久久久综合网ywww | 丰满诱人的人妻3 | 欧美精品一区二区精品久久 | 欧美人与禽猛交狂配 | 少妇被黑人到高潮喷出白浆 | 欧美国产日韩亚洲中文 | 色综合视频一区二区三区 | 国产无遮挡又黄又爽又色 | 精品国产一区二区三区四区 | 国产精品久久久久久亚洲影视内衣 | 熟妇人妻中文av无码 | 久久亚洲精品中文字幕无男同 | 日本精品人妻无码免费大全 | 国产三级精品三级男人的天堂 | 久久久久久亚洲精品a片成人 | 亚洲毛片av日韩av无码 | 最近中文2019字幕第二页 | 国产精品沙发午睡系列 | av在线亚洲欧洲日产一区二区 | 女人被爽到呻吟gif动态图视看 | 日本又色又爽又黄的a片18禁 | 国产成人一区二区三区在线观看 | 国产精品无码mv在线观看 | 性欧美大战久久久久久久 | 成人免费视频在线观看 | 伊人久久婷婷五月综合97色 | av无码电影一区二区三区 | 国产高潮视频在线观看 | 扒开双腿疯狂进出爽爽爽视频 | 日欧一片内射va在线影院 | 日韩少妇内射免费播放 | 欧美肥老太牲交大战 | 日本丰满护士爆乳xxxx | 粗大的内捧猛烈进出视频 | 国产av一区二区三区最新精品 | 亚洲色在线无码国产精品不卡 | 欧美freesex黑人又粗又大 | 成年美女黄网站色大免费全看 | 亚洲中文字幕久久无码 | 亚洲精品综合五月久久小说 | 亚洲国产一区二区三区在线观看 | 国产免费久久精品国产传媒 | 色综合天天综合狠狠爱 | 国产超碰人人爽人人做人人添 | 天天拍夜夜添久久精品 | 99久久精品无码一区二区毛片 | 国产午夜无码精品免费看 | 中文字幕无码免费久久9一区9 | 亚洲国产成人a精品不卡在线 | 欧洲vodafone精品性 | а天堂中文在线官网 | 日产精品99久久久久久 | 色婷婷久久一区二区三区麻豆 | 亚洲国产精华液网站w | 鲁大师影院在线观看 | 欧美性猛交内射兽交老熟妇 | 亚洲精品中文字幕 | 无码国产激情在线观看 | 蜜桃视频插满18在线观看 | 日本精品高清一区二区 | 久久久久se色偷偷亚洲精品av | 国产九九九九九九九a片 | 最新版天堂资源中文官网 | 狠狠躁日日躁夜夜躁2020 | 午夜成人1000部免费视频 | 精品人妻中文字幕有码在线 | 在线成人www免费观看视频 | 久久国产劲爆∧v内射 | 夜先锋av资源网站 | 国产成人亚洲综合无码 | 无套内谢的新婚少妇国语播放 | 久久精品国产日本波多野结衣 | 国产97色在线 | 免 | 亚洲精品国产第一综合99久久 | 小sao货水好多真紧h无码视频 | 久久精品中文闷骚内射 | 国产香蕉尹人视频在线 | 中文无码伦av中文字幕 | 水蜜桃亚洲一二三四在线 | 亚洲色成人中文字幕网站 | 久久久久免费看成人影片 | 亚洲熟妇色xxxxx亚洲 | 亚洲国产精品美女久久久久 | 国产农村乱对白刺激视频 | 亚洲中文字幕在线观看 | 亚洲一区二区三区无码久久 | 中文字幕色婷婷在线视频 | 亚洲s码欧洲m码国产av | 色一情一乱一伦一视频免费看 | 精品国产青草久久久久福利 | 最新国产麻豆aⅴ精品无码 | 久久久精品欧美一区二区免费 | 国产成人久久精品流白浆 | 乱人伦人妻中文字幕无码久久网 | 欧美国产亚洲日韩在线二区 | 中文无码伦av中文字幕 | 性欧美大战久久久久久久 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 欧美精品一区二区精品久久 | 成人无码视频在线观看网站 | 4hu四虎永久在线观看 | 国产99久久精品一区二区 | 两性色午夜视频免费播放 | 亚洲男人av天堂午夜在 | 欧美日韩一区二区三区自拍 | 波多野结衣aⅴ在线 | 牲欲强的熟妇农村老妇女视频 | 久久亚洲国产成人精品性色 | 欧美喷潮久久久xxxxx | 男人扒开女人内裤强吻桶进去 | 中文字幕无码日韩欧毛 | 国产手机在线αⅴ片无码观看 | 老子影院午夜精品无码 | 久精品国产欧美亚洲色aⅴ大片 | 人人澡人人透人人爽 | 少妇无码av无码专区在线观看 | √天堂资源地址中文在线 | 国产亚洲视频中文字幕97精品 | 在线 国产 欧美 亚洲 天堂 | 国产精品爱久久久久久久 | 国产性生交xxxxx无码 | 国内少妇偷人精品视频 | 鲁大师影院在线观看 | 国产成人无码av在线影院 | 人妻插b视频一区二区三区 | 老子影院午夜精品无码 | 亚洲成av人片在线观看无码不卡 | 红桃av一区二区三区在线无码av | 白嫩日本少妇做爰 | 国产精品国产三级国产专播 | 色爱情人网站 | www一区二区www免费 | 人妻互换免费中文字幕 | 亚洲精品久久久久久一区二区 | 丰满人妻被黑人猛烈进入 | 天天av天天av天天透 | 国产精品爱久久久久久久 | 丰满人妻精品国产99aⅴ | 东京无码熟妇人妻av在线网址 | 久久综合久久自在自线精品自 | 亚洲中文字幕无码中字 | 婷婷丁香六月激情综合啪 | 国产精品无码mv在线观看 | 国产精品亚洲а∨无码播放麻豆 | 国产精品怡红院永久免费 | 激情内射日本一区二区三区 | 中国大陆精品视频xxxx | 久久综合给合久久狠狠狠97色 | 亚洲男人av天堂午夜在 | 一本色道久久综合狠狠躁 | 荡女精品导航 | 婷婷色婷婷开心五月四房播播 | 无码人妻精品一区二区三区下载 | 网友自拍区视频精品 | 少妇愉情理伦片bd | 樱花草在线播放免费中文 | 在线 国产 欧美 亚洲 天堂 | 欧美日韩视频无码一区二区三 | 久久久婷婷五月亚洲97号色 | 国产亚洲人成a在线v网站 | 国产亚洲精品久久久久久国模美 | 国产精品亚洲专区无码不卡 | 亚洲精品成人福利网站 | 国产精品毛片一区二区 | 亚洲精品一区二区三区大桥未久 | 5858s亚洲色大成网站www | 亚洲乱亚洲乱妇50p | 亚洲男人av香蕉爽爽爽爽 | 漂亮人妻洗澡被公强 日日躁 | 无码人妻精品一区二区三区下载 | 少妇太爽了在线观看 | 性做久久久久久久免费看 | ass日本丰满熟妇pics | 欧美三级不卡在线观看 | 欧美精品免费观看二区 | 狠狠噜狠狠狠狠丁香五月 | 中文字幕无码日韩欧毛 | 国产在线精品一区二区高清不卡 | 国产成人无码av在线影院 | 婷婷六月久久综合丁香 | 亚洲一区二区三区含羞草 | 国产尤物精品视频 | 巨爆乳无码视频在线观看 | 日韩精品a片一区二区三区妖精 | 少妇高潮一区二区三区99 | 国内揄拍国内精品少妇国语 | 欧美一区二区三区视频在线观看 | 色欲久久久天天天综合网精品 | 欧美放荡的少妇 | 精品国产一区av天美传媒 | 亚洲精品欧美二区三区中文字幕 | 亚洲国产午夜精品理论片 | 日韩 欧美 动漫 国产 制服 | 午夜精品久久久内射近拍高清 | 久久综合香蕉国产蜜臀av | 性史性农村dvd毛片 | 欧美肥老太牲交大战 | 欧美 亚洲 国产 另类 | 国产精品第一区揄拍无码 | 国产偷国产偷精品高清尤物 | 人妻中文无码久热丝袜 | 色婷婷综合中文久久一本 | 成年女人永久免费看片 | 久久久久国色av免费观看性色 | 国产舌乚八伦偷品w中 | 97久久超碰中文字幕 | 乱码av麻豆丝袜熟女系列 | 精品夜夜澡人妻无码av蜜桃 | 国产一区二区三区影院 | 久9re热视频这里只有精品 | 国内综合精品午夜久久资源 | 色婷婷综合中文久久一本 | 成在人线av无码免费 | 激情人妻另类人妻伦 | 欧美 日韩 亚洲 在线 | 日韩人妻系列无码专区 | 久久久久人妻一区精品色欧美 | 国产精品国产三级国产专播 | 骚片av蜜桃精品一区 | 丰满少妇熟乱xxxxx视频 | 人人妻人人澡人人爽精品欧美 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产片av国语在线观看 | 在线看片无码永久免费视频 | 国产精品99爱免费视频 | 国产熟妇另类久久久久 | 久久综合狠狠综合久久综合88 | 国产一区二区三区四区五区加勒比 | 一二三四在线观看免费视频 | 中文精品久久久久人妻不卡 | 人人妻人人澡人人爽欧美精品 | 亚洲成在人网站无码天堂 | 国产精品18久久久久久麻辣 | 亚洲七七久久桃花影院 | 国产绳艺sm调教室论坛 | 国产在线无码精品电影网 | 熟妇人妻无乱码中文字幕 | 97无码免费人妻超级碰碰夜夜 | 亚洲一区二区三区含羞草 | 久久久久免费看成人影片 | 一本精品99久久精品77 | 国产猛烈高潮尖叫视频免费 | 无套内谢的新婚少妇国语播放 | 天堂亚洲2017在线观看 | 国产一区二区三区精品视频 | 日本一区二区更新不卡 | 中文精品无码中文字幕无码专区 | 精品aⅴ一区二区三区 | 久久无码中文字幕免费影院蜜桃 | 97资源共享在线视频 | 免费无码av一区二区 | 欧美xxxx黑人又粗又长 | 88国产精品欧美一区二区三区 | 午夜无码人妻av大片色欲 | 中文字幕乱码人妻二区三区 | 国产精品久久久久7777 | 无套内谢的新婚少妇国语播放 | 亚洲欧美日韩成人高清在线一区 | 人妻少妇精品无码专区动漫 | 日本一卡2卡3卡四卡精品网站 | 最近的中文字幕在线看视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 捆绑白丝粉色jk震动捧喷白浆 | 色狠狠av一区二区三区 | 又大又黄又粗又爽的免费视频 | 天天爽夜夜爽夜夜爽 | 日本欧美一区二区三区乱码 | 丰满少妇弄高潮了www | 久久zyz资源站无码中文动漫 | 中文精品久久久久人妻不卡 | 国产欧美亚洲精品a | 亚洲一区av无码专区在线观看 | 青草视频在线播放 | 激情爆乳一区二区三区 | 日韩在线不卡免费视频一区 | 国产精品高潮呻吟av久久 | 国産精品久久久久久久 | 国产无遮挡又黄又爽免费视频 | 国产精品手机免费 | 最新版天堂资源中文官网 | 蜜桃视频韩日免费播放 | 熟妇人妻激情偷爽文 | 麻豆av传媒蜜桃天美传媒 | 成人亚洲精品久久久久 | 亚洲春色在线视频 | 奇米影视888欧美在线观看 | 麻豆国产丝袜白领秘书在线观看 | 国产精品无码一区二区三区不卡 | 熟女体下毛毛黑森林 | 国产成人精品无码播放 | 高清国产亚洲精品自在久久 | 国产精品丝袜黑色高跟鞋 | 久久精品国产亚洲精品 | 久久久久免费精品国产 | 狠狠色噜噜狠狠狠7777奇米 | 97无码免费人妻超级碰碰夜夜 | 玩弄中年熟妇正在播放 | 精品国产一区av天美传媒 | 亚洲国产精品美女久久久久 | 国产三级久久久精品麻豆三级 | 亚洲色大成网站www国产 | 水蜜桃亚洲一二三四在线 | 性欧美大战久久久久久久 | 色偷偷人人澡人人爽人人模 | 亚洲欧洲日本无在线码 | 国产精品久久久久久久9999 | 帮老师解开蕾丝奶罩吸乳网站 | 国产人妻精品午夜福利免费 | 风流少妇按摩来高潮 | 水蜜桃亚洲一二三四在线 | 免费无码av一区二区 | 激情内射亚州一区二区三区爱妻 | 亚洲s码欧洲m码国产av | 99久久久无码国产aaa精品 | 色婷婷香蕉在线一区二区 | 久久综合狠狠综合久久综合88 | 久久久中文久久久无码 | 高清不卡一区二区三区 | 日本丰满护士爆乳xxxx | 婷婷五月综合激情中文字幕 | 亚洲精品一区二区三区四区五区 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产午夜手机精彩视频 | 亚洲一区二区三区国产精华液 | 免费观看又污又黄的网站 | 成熟妇人a片免费看网站 | 人妻有码中文字幕在线 | 久久久国产精品无码免费专区 | 色一情一乱一伦一区二区三欧美 | 清纯唯美经典一区二区 | 日韩精品无码一区二区中文字幕 | 午夜精品久久久久久久久 | 极品尤物被啪到呻吟喷水 | 国产无遮挡又黄又爽又色 | 国产精品无码成人午夜电影 | 亚洲午夜久久久影院 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 天堂无码人妻精品一区二区三区 | 亚洲精品综合五月久久小说 | 性色欲情网站iwww九文堂 | 国产精品人人爽人人做我的可爱 | 欧美国产日产一区二区 | 日本丰满护士爆乳xxxx | 无码福利日韩神码福利片 | 亚洲热妇无码av在线播放 | 国产精品人人爽人人做我的可爱 | 日本www一道久久久免费榴莲 | 国产黄在线观看免费观看不卡 | 人人妻人人澡人人爽人人精品浪潮 | 久久无码人妻影院 | 精品国产av色一区二区深夜久久 | 欧美日韩综合一区二区三区 | 少妇人妻偷人精品无码视频 | 日日天日日夜日日摸 | 亚洲一区二区观看播放 | 国产乱码精品一品二品 | 国产午夜福利100集发布 | 亚洲精品欧美二区三区中文字幕 | 性欧美牲交在线视频 | 天下第一社区视频www日本 | 国产精品久久久久7777 | 久久亚洲中文字幕精品一区 | 欧美人与牲动交xxxx | 成人欧美一区二区三区黑人 | √8天堂资源地址中文在线 | 久久久精品456亚洲影院 | 国产精品99久久精品爆乳 | 国产色视频一区二区三区 | 东京热男人av天堂 | av无码不卡在线观看免费 | 成人免费无码大片a毛片 | 麻豆果冻传媒2021精品传媒一区下载 | 男女下面进入的视频免费午夜 | 国产精品国产自线拍免费软件 | 亚洲国产成人av在线观看 | 国产无套内射久久久国产 | 蜜臀aⅴ国产精品久久久国产老师 | 狠狠cao日日穞夜夜穞av | 麻豆国产丝袜白领秘书在线观看 | 亚洲国产高清在线观看视频 | 东京无码熟妇人妻av在线网址 | 欧美性生交xxxxx久久久 | 亚洲国产精品成人久久蜜臀 | 久久久www成人免费毛片 | 亚洲色成人中文字幕网站 | 在线看片无码永久免费视频 | 免费观看黄网站 |