日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最坏情况为线性时间的选择算法

發(fā)布時間:2025/1/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最坏情况为线性时间的选择算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最壞情況為線性時間的選擇算法

  • 參考:【算法】算法導(dǎo)論:https://www.bilibili.com/video/BV1Tb411M7FA?p=6

提出問題:從一個數(shù)組中找到第K個最大數(shù)字,即TOPK問題,這個題目在面試和研究中經(jīng)常遇到,那么,這個題目應(yīng)該怎么解決呢?

  • 理所當(dāng)然的我們會想到排序,我們可以使用排序算法將數(shù)組變得有順序,然后直接選取,使用快速排序,歸并排序,或者是堆排序,都可以使得時間復(fù)雜度是 O(nlgn)
  • 建堆,取出前K個數(shù)字,當(dāng)k 接近于 0,或者是數(shù)組長度的時間,其時間復(fù)雜度幾乎是線性的,但是如果當(dāng)K 趨于中位數(shù)的時候,復(fù)雜度會變?yōu)?nlgn

今天我們要介紹的一種算法,使得選取TOPK的時間復(fù)雜度是O(n),即最壞情況為線性時間的選擇算法(算法導(dǎo)論,YYDS)

1:詳解算法

  • 將數(shù)組劃分為若干個數(shù)組,每個子數(shù)組中包含5個元素。由于數(shù)組的長度不一定是5的整數(shù)倍,所以允許最后一個數(shù)組的長度 小于5
  • 找到每個子數(shù)組的中位數(shù),放在每個子數(shù)組的二號位置上,即所有的中位數(shù)排列成一條直線
  • 將獲得的中位數(shù)遞歸的調(diào)用select,找到中位數(shù)的中位數(shù),即一條直線上的中位數(shù)
  • 將原來的數(shù)組使用類似快拍的方法,分成兩個部分。讓K比劃分的低區(qū)的元素的數(shù)目多一個,因此X 是第K小的元素,并且有 n - k 個元素在劃分的高區(qū)。
  • 如果 i = k,則說明我們找到了
    • 如果 i < k,則在低區(qū)遞歸的調(diào)用來找到第 i 小的元素。
    • 如果 i > k,則在高區(qū)遞歸的調(diào)用查找第 i - k小的元素(k個最小的我們已經(jīng)去掉了,故在后面的數(shù)組中查找第 i - k 小的元素)

2:代碼實現(xiàn)

#include <stdlib.h> #include <stdio.h> #define swap(a,b) (a)^=(b);(b)^=(a);(a)^=(b) #define MAX 1000void sort(int* input, int size){printf ( "sort arry size = %d\n", size );int i,j;for(i = 0; i< size ; i++){for(j = 0; j<size-i-1;j++){if(input[j]<input[j+1]){swap(input[j],input[j+1]);}}} } void output(int * input, int size){for(;size>0 && *input;size--,input++){printf("%d ", *input);}printf("\n");}int partion(int *input, int size, int key){printf ( "--------------Step4---------------\n" );printf("key = %d \n", input[key]);int *head, *tail;head = input;tail = head + size - 1;swap(*head, input[key]);int *k = head;while(head<tail){while(*tail && *k >= *tail){tail--;}if(tail<=head) break;swap(*k,*tail);k = tail;while(*head && *k < *head)head++;if(head>=tail) break;swap(*k,*head);k = head;}output(input, size);printf ( "--------------Step4 done--------------\n" );return k-input+1; }int kselect(int *input, int size, int k){printf ( "start element : %d \n", *input );if(size<=5){sort(input, size);return input[k-1];}int mid[MAX] = {0};int midvalue[MAX] = {0};int groups = size/5;int i;printf ( "-----------------step 1, 2--------------\n" );for(i = 0; i<groups;i++){sort(input+i*5, (i*5+5 > size) ? (size-1):5);printf ( "sorted group %d:\n", i );output(input+i*5, 5);mid[i] = i*5 + 2;midvalue[i] = input[i*5 + 2];}printf ( "-----------------step 1, 2 done--------------\n" );printf ( "---------step3-------------\n" );sort(midvalue, groups);printf ( "---------step3 done-------\n" );int m = -1;for(i = 0; i<5;i++){if(input[mid[i]] == midvalue[groups/2]){m = partion(input, size, mid[i]);}}if(m == k){return input[m-1];}if(k<m){return kselect(input,m,k);}else{return kselect(input+m, size - m, k-m);}return 0xffff; }int main(){int input[] = {1,3,2,10,5,11, 12, 8 ,6, 7};     /*輸出第7大的元素.*/int r = kselect(input,sizeof(input)/sizeof(int), 7);printf("result %d \n", r);return 0; }

3:關(guān)于作者

  • 這個算法是由Blum,Floyd,Pratt,Rivest,Tarjan設(shè)計的。我剛開始看到這個,只認(rèn)識Floyd。我絲毫沒有意識到這里面的水有多深
    • Floyd,唯一熟悉的一個人。學(xué)習(xí)過Floyd算法,該算法可以計算出圖中任意兩個定點的距離,權(quán)重可以為負(fù)數(shù),效率高于dijkstra算法。1978年Turing
    • Blum,在整數(shù)分解中,Blum Blum Shub加密算法中的第二個Blum就是他。 1995年Turing
    • Pratt,KMP算法中的P就是他!嗯?KMP怎么寫來著?
    • Rivest,RSA加密算法的發(fā)現(xiàn)者。RSA是對稱加密還是非對稱加密?他由此2002年獲得了Turing award
    • Tarjan,圖論的研究專家,發(fā)明了LCA(最近公共祖先),強連通分量算法。并且也發(fā)明了斐波拉契堆和splay數(shù)據(jù)結(jié)構(gòu)。并且他分析了并查集,在1986年獲得了Turing
  • 幾乎全員Turing,每一個人都對計算機科學(xué)的發(fā)展做出了相當(dāng)杰出的貢獻!其中Tarjan是Floyd 和knuth的學(xué)生。Knuth是The Art of Computer Programming的作者,tex的發(fā)明者。36歲獲得Turing。

4:小思考

  • 該算法把數(shù)組分成長度為5的小數(shù)組,為什么是5呢?
    • 3可以嗎?
    • 7可以嗎?

總結(jié)

以上是生活随笔為你收集整理的最坏情况为线性时间的选择算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品ww | 欧美精品网址 | 亚洲一级片免费 | 456亚洲视频 | 欧美激情视频在线观看 | 成人网在线视频 | 国产又大又粗又爽的毛片 | 久久久在线观看 | 国产成人三级在线播放 | 91高跟黑色丝袜呻吟在线观看 | 日韩久久一区二区 | 亚洲精品影院 | 激情综合文学 | 久久久久不卡 | 超碰自拍| 亚洲第一精品在线 | 午夜剧场免费观看 | 黄色动漫软件 | 亚洲欧洲日本一区二区三区 | 中文字幕理伦片免费看 | 少妇高潮一区二区三区99 | 超碰中文字幕 | 黄色日b片| 网友自拍第一页 | 综合视频在线观看 | 欧洲成人一区二区三区 | 91视频精品 | 成人毛片基地 | 偷拍网亚洲 | 免费污网站在线观看 | 人人综合网 | 亚洲天堂成人在线观看 | 天天躁日日躁狠狠躁av麻豆 | 青青草华人在线视频 | 六月综合激情 | 国产女人在线 | 国产欧美日韩在线播放 | 一级黄色a级片 | 黄色片在哪看 | 精品久久久久久无码中文野结衣 | 亚洲欧美一区二区三区久久 | 日韩综合av | 男人的天堂成人 | 九九视屏| 国产精品后入内射日本在线观看 | 日日撸夜夜撸 | 国产一区二区中文字幕 | 欧美在线一区二区三区 | 涩涩视频免费观看 | 毛片3| 国产suv精品一区二区33 | 亚洲美女性生活视频 | 亚洲一区国产精品 | 欧美做受高潮1 | 黑白配在线观看免费观看 | 91在线观看成人 | 91国产在线免费观看 | 久国产 | 国产高清亚洲 | 国产女人18水真多18精品一级做 | 国产伦精品一区二区三区网站 | 精品在线不卡 | 日本三级免费看 | 国产伦精品一区二区三区四区免费 | 中文字幕无线码一区 | 欧美激情一二三 | 亚洲成人激情av | 99热这里| 亚洲无限av | 久久女人天堂 | av色成人 | 九色91popny蝌蚪 | 国产一区二区三区在线看 | 四川一级毛毛片 | www成人免费视频 | 在线免费观看国产精品 | 捆绑japanhdxxxxvideos | 欧美特黄一级视频 | 玖草影院| 日日夜夜欧美 | 僵尸叔叔在线观看国语高清免费观看 | 国产深夜视频 | 欧美色视 | 致单身男女免费观看完整版 | 午夜激情免费 | 波多野结衣一区二区三区四区 | 小毛片网站 | 欧洲亚洲国产精品 | 欧美hdse | 欧美在线一区视频 | 老司机午夜剧场 | 日韩在线专区 | eeuss国产一区二区三区黑人 | 精产国品一二三产品蜜桃 | 久色视频在线 | 黄色片视频免费看 | 国产无遮挡aaa片爽爽 | 欧美中文日韩 | 在线只有精品 |