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

一次搞透,面試中的TopK問題!

開發 開發工具
本文將介紹隨機選擇,分治法,減治法的思想,以及TopK問題優化的來龍去脈,原理與細節,保證有收獲。

面試中,TopK,是問得比較多的幾個問題之一,到底有幾種方法,這些方案里蘊含的優化思路究竟是怎么樣的,今天和大家聊一聊。

畫外音:除非校招,我在面試過程中從不問TopK這個問題。

[[441198]]

問題描述:

從arr[1, n]這n個數中,找出最大的k個數,這就是經典的TopK問題。

栗子:

從arr[1, 12]={5,3,7,1,8,2,9,4,7,2,6,6} 這n=12個數中,找出最大的k=5個。

一、排序

排序是最容易想到的方法,將n個數排序之后,取出最大的k個,即為所得。

偽代碼:

  1. sort(arr, 1, n); 
  2. return arr[1, k]; 

時間復雜度:O(n*lg(n))

分析:明明只需要TopK,卻將全局都排序了,這也是這個方法復雜度非常高的原因。那能不能不全局排序,而只局部排序呢?這就引出了第二個優化方法。

二、局部排序

不再全局排序,只對最大的k個排序。

冒泡是一個很常見的排序方法,每冒一個泡,找出最大值,冒k個泡,就得到TopK。

偽代碼:

  1. for(i=1 to k){ 
  2.          bubble_find_max(arr,i); 
  3. return arr[1, k]; 

時間復雜度:O(n*k)

分析:冒泡,將全局排序優化為了局部排序,非TopK的元素是不需要排序的,節省了計算資源。不少朋友會想到,需求是TopK,是不是這最大的k個元素也不需要排序呢?這就引出了第三個優化方法。

三、堆

思路:只找到TopK,不排序TopK。

先用前k個元素生成一個小頂堆,這個小頂堆用于存儲,當前最大的k個元素。

接著,從第k+1個元素開始掃描,和堆頂(堆中最小的元素)比較,如果被掃描的元素大于堆頂,則替換堆頂的元素,并調整堆,以保證堆內的k個元素,總是當前最大的k個元素。

直到,掃描完所有n-k個元素,最終堆中的k個元素,就是猥瑣求的TopK。 偽代碼:

  1. heap[k] = make_heap(arr[1, k]); 
  2. for(i=k+1 to n){ 
  3.          adjust_heap(heep[k],arr[i]); 
  4. return heap[k]; 

時間復雜度:O(n*lg(k))

畫外音:n個元素掃一遍,假設運氣很差,每次都入堆調整,調整時間復雜度為堆的高度,即lg(k),故整體時間復雜度是n*lg(k)。

分析:堆,將冒泡的TopK排序優化為了TopK不排序,節省了計算資源。堆,是求TopK的經典算法,那還有沒有更快的方案呢?

四、隨機選擇

隨機選擇算在是《算法導論》中一個經典的算法,其時間復雜度為O(n),是一個線性復雜度的方法。

這個方法并不是所有同學都知道,為了將算法講透,先聊一些前序知識,一個所有程序員都應該爛熟于胸的經典算法:快速排序。

畫外音:

  • 如果有朋友說,“不知道快速排序,也不妨礙我寫業務代碼呀”…額...
  • 除非校招,我在面試過程中從不問快速排序,默認所有工程師都知道;

其偽代碼是:

  1. void quick_sort(int[]arr, int low, inthigh){ 
  2.          if(low== high) return; 
  3.          int i = partition(arr, low, high); 
  4.          quick_sort(arr, low, i-1); 
  5.          quick_sort(arr, i+1, high); 

其核心算法思想是,分治法。

分治法(Divide&Conquer),把一個大的問題,轉化為若干個子問題(Divide),每個子問題“都”解決,大的問題便隨之解決(Conquer)。這里的關鍵詞是“都”。從偽代碼里可以看到,快速排序遞歸時,先通過partition把數組分隔為兩個部分,兩個部分“都”要再次遞歸。

分治法有一個特例,叫減治法。

減治法(Reduce&Conquer),把一個大的問題,轉化為若干個子問題(Reduce),這些子問題中“只”解決一個,大的問題便隨之解決(Conquer)。這里的關鍵詞是“只”。

二分查找binary_search,BS,是一個典型的運用減治法思想的算法,其偽代碼是:

  1. int BS(int[]arr, int low, inthigh, int target){ 
  2.          if(low> high) return -1; 
  3.          mid= (low+high)/2; 
  4.          if(arr[mid]== target) return mid; 
  5.          if(arr[mid]> target) 
  6.                    return BS(arr, low, mid-1, target); 
  7.          else 
  8.                    return BS(arr, mid+1, high, target); 

從偽代碼可以看到,二分查找,一個大的問題,可以用一個mid元素,分成左半區,右半區兩個子問題。而左右兩個子問題,只需要解決其中一個,遞歸一次,就能夠解決二分查找全局的問題。

通過分治法與減治法的描述,可以發現,分治法的復雜度一般來說是大于減治法的:

  • 快速排序:O(n*lg(n))
  • 二分查找:O(lg(n))

話題收回來,快速排序的核心是:

  1. i = partition(arr, low, high); 

這個partition是干嘛的呢?

顧名思義,partition會把整體分為兩個部分。

更具體的,會用數組arr中的一個元素(默認是第一個元素t=arr[low])為劃分依據,將數據arr[low, high]劃分成左右兩個子數組:

  • 左半部分,都比t大;
  • 右半部分,都比t小;
  • 中間位置i是劃分元素;

以上述TopK的數組為例,先用第一個元素t=arr[low]為劃分依據,掃描一遍數組,把數組分成了兩個半區:

  • 左半區比t大;
  • 右半區比t小;
  • 中間是t;partition返回的是t最終的位置i。

很容易知道,partition的時間復雜度是O(n)。

畫外音:把整個數組掃一遍,比t大的放左邊,比t小的放右邊,最后t放在中間N[i]。

partition和TopK問題有什么關系呢?

TopK是希望求出arr[1,n]中最大的k個數,那如果找到了第k大的數,做一次partition,不就一次性找到最大的k個數了么?

畫外音:即partition后左半區的k個數。

問題變成了arr[1, n]中找到第k大的數。

再回過頭來看看第一次partition,劃分之后:

  1. i = partition(arr, 1, n); 
  • 如果i大于k,則說明arr[i]左邊的元素都大于k,于是只遞歸arr[1, i-1]里第k大的元素即可;
  • 如果i小于k,則說明說明第k大的元素在arr[i]的右邊,于是只遞歸arr[i+1, n]里第k-i大的元素即可;

畫外音:這一段非常重要,多讀幾遍。 

這就是隨機選擇算法randomized_select,RS,其偽代碼如下:

  1. int RS(arr, low, high, k){ 
  2.   if(low== high) return arr[low]; 
  3.   ipartition(arr, low, high); 
  4.   t = i-low; //數組前半部分元素個數 
  5.   if(t>=k) 
  6.       return RS(arr, low, i-1, k); //求前半部分第k大 
  7.   else 
  8.       return RS(arr, i+1, high, k-t); //求后半部分第k-t大 

這是一個典型的減治算法,遞歸內的兩個分支,最終只會執行一個,它的時間復雜度是O(n)。

再次強調一下:

  • 分治法,大問題分解為小問題,小問題都要遞歸各個分支,例如:快速排序;
  • 減治法,大問題分解為小問題,小問題只要遞歸一個分支,例如:二分查找,隨機選擇;

通過隨機選擇(randomized_select),找到arr[1, n]中第k大的數,再進行一次partition,就能得到TopK的結果。

五、總結

TopK,不難;其思路優化過程,不簡單:

  • 全局排序,O(n*lg(n));
  • 局部排序,只排序TopK個數,O(n*k);
  • 堆,TopK個數也不排序了,O(n*lg(k));
  • 分治法,每個分支“都要”遞歸,例如:快速排序,O(n*lg(n));
  • 減治法,“只要”遞歸一個分支,例如:二分查找O(lg(n)),隨機選擇O(n);
  • TopK的另一個解法:隨機選擇+partition; 知其然,知其所以然。思路比結論重要。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文 

 

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2021-12-31 09:40:06

TopK排序代碼

2022-09-15 14:05:02

ES開源

2024-03-11 08:47:30

CRDT數據類型協同編輯

2024-05-15 10:14:00

CRDT數據類型協同編輯

2020-03-10 07:51:35

面試諷刺標準

2024-10-09 12:05:27

2025-04-09 10:36:32

2022-11-24 17:34:04

TCC分布式

2024-11-08 14:00:29

關鍵字Animal編程

2021-05-13 08:51:20

GC問題排查

2020-09-28 14:41:24

Event Loop

2011-06-28 10:41:50

DBA

2024-05-20 00:00:00

代碼主線程

2012-07-12 14:35:31

面試經歷

2023-04-06 07:53:56

Redis連接問題K8s

2024-03-18 09:10:00

死鎖日志binlog

2022-11-03 16:10:29

groovyfullGC

2020-05-12 11:05:54

MySQL索引數據庫

2020-10-24 13:50:59

Python編程語言

2021-12-27 10:08:16

Python編程語言
點贊
收藏

51CTO技術棧公眾號

久久都是精品| 成a人片在线观看| 亚洲精品欧洲| 日韩成人中文字幕| 国产精品50p| a天堂在线观看视频| 亚洲激情五月| 亚洲成人网久久久| 国产性xxxx18免费观看视频| 国产69久久| 久久成人免费网站| 欧美高清视频一区二区| 亚洲视频在线播放免费| 手机看片久久| 一区二区三区在线高清| 国产三区二区一区久久| 极品国产91在线网站| 日韩欧美一区二区三区在线视频| 欧美精品亚洲二区| 欧美一级欧美一级| 精华区一区二区三区| 久久精品免费看| 欧美高清视频在线观看| 欧美bbbbb性bbbbb视频| 国产精品麻豆成人av电影艾秋| 中文字幕一区视频| 国产一区二区高清视频| 毛片在线免费视频| 欧美freesextv| 亚洲国产欧美自拍| 夜夜夜夜夜夜操| 丁香花电影在线观看完整版| 国产欧美在线观看一区| 高清免费日韩| 国模私拍一区二区| 亚洲欧洲一区| 久久久www成人免费精品张筱雨| www日本在线观看| 性欧美hd调教| 亚洲女与黑人做爰| 日本午夜精品一区二区| www男人的天堂| 99精品视频免费全部在线| 日韩视频在线观看免费| 在线观看av中文字幕| 无遮挡爽大片在线观看视频| 成人免费在线视频观看| 欧美一区二区三区精美影视| 精品黑人一区二区三区在线观看| 视频在线观看91| 久久资源免费视频| 少妇精品无码一区二区免费视频| 一区二区三区亚洲变态调教大结局| 午夜亚洲福利老司机| 一区二区三区四区| 国产高清一区在线观看| www.爱久久.com| 91丨九色丨国产| 国产又粗又猛又爽又黄的视频一| 久久久久中文| 78色国产精品| 日韩久久久久久久久| 欧美xxx在线观看| 久久久精品国产网站| 日韩精品电影一区二区三区| 免费看成人吃奶视频在线| 亚洲黄色av女优在线观看| 在线免费黄色小视频| 亚洲国产91视频| 欧美日韩久久一区二区| 日韩中文字幕三区| 欧美裸体视频| 一本大道av一区二区在线播放| 每日在线更新av| 台湾佬中文娱乐网欧美电影| 夜夜精品视频一区二区| 九一免费在线观看| 性xxxxfjsxxxxx欧美| 亚洲欧美成aⅴ人在线观看| 中文字幕日韩一区二区三区 | 亚洲看片一区| 久久久噜噜噜久噜久久| 久久精品一区二区三| 影音先锋久久精品| 欧美老少做受xxxx高潮| 精品在线观看一区| 99精品网站| 久久天天躁日日躁| 人妻无码一区二区三区免费| 区一区二视频| 久久精品国亚洲| 日韩精品一区二区亚洲av性色| 999久久久精品国产| 精品国产拍在线观看| 很污很黄的网站| 99热国内精品永久免费观看| 精品久久国产精品| 久久久久亚洲AV成人| 极品少妇一区二区三区| 91av在线国产| wwwwww国产| 日本伊人色综合网| 91精品在线看| 全国男人的天堂网| 91农村精品一区二区在线| 久久精品ww人人做人人爽| 你懂的在线网址| 国产欧美日韩亚州综合| 中文字幕中文字幕在线中一区高清| 97超碰在线公开在线看免费| 亚洲成av人片在www色猫咪| 国内外成人免费激情视频| 99re久久| 精品国产免费一区二区三区四区| 玖玖爱在线精品视频| 精品久久久久中文字幕小说 | 亚洲成人av电影| av免费中文字幕| 欧美天堂一区| 亚洲精品一区二区精华| 六月婷婷七月丁香| 亚洲成人精选| 国产91精品青草社区| 一级久久久久久久| av资源网一区| 亚洲成人a**址| av岛国在线| 欧美日韩不卡一区| 五月婷婷综合在线观看| 亚洲欧美综合久久久| 欧美中文在线视频| 国产99对白在线播放| 久久久一区二区| 老司机激情视频| 澳门av一区二区三区| 日韩精品中文字幕在线不卡尤物| 亚洲黄色小说视频| 亚洲第一伊人| 成人久久一区二区三区| 黄色在线播放| 亚洲成av人片在www色猫咪| 天天影视色综合| 亚洲人成网站77777在线观看| 久久在精品线影院精品国产| 无码人妻丰满熟妇区五十路| 国产999精品久久| 五月天色婷婷综合| 国产69精品久久久久9999人| 亚洲精品国产拍免费91在线| 免费一级片在线观看| 日韩成人av影视| www国产精品视频| 特级西西www444人体聚色 | 免费一级淫片aaa片毛片a级| 秋霞国产精品| 日韩久久午夜影院| 九九热精品在线观看| 国产乱人伦精品一区二区在线观看 | 国产福利一区在线| 日本女人高潮视频| 国产精品久久久久久av公交车 | bl视频在线免费观看| 精品伦理精品一区| 国产在线观看免费av| eeuss影院一区二区三区| 日本中文字幕亚洲| 免费观看久久av| 国产欧美一区二区三区四区| 日本在线观看视频| 日韩天堂在线观看| 日韩在线观看第一页| 国产日本一区二区| 视色视频在线观看| 中文精品电影| 国产精品三区四区| 桃色一区二区| 久久精品人人爽| 懂色av一区二区三区四区| 五月综合激情网| 先锋影音av在线| 国产九色精品成人porny| 日韩一级片免费视频| 妖精视频一区二区三区| 国产精品久久久久久网站 | 91成人国产在线观看| 免费理论片在线观看播放老| 欧美色精品天天在线观看视频| 天天色影综合网| 成人av影院在线| 国产一级不卡毛片| 亚洲女同中文字幕| 久久资源亚洲| 国产精品一站二站| 欧美在线国产精品| 国产美女福利在线| 亚洲精品久久在线| 国产精品无码免费播放| 都市激情亚洲色图| 欧美日韩色视频| 2欧美一区二区三区在线观看视频| 亚洲一级免费观看| 日韩午夜免费视频| 日本特级黄色大片| 女厕嘘嘘一区二区在线播放 | 国产亚洲综合性久久久影院| 日本精品一区在线| 国产精品永久| 成人毛片100部免费看| 久久av电影| 超碰97在线人人| 欧美成人家庭影院| 欧美一区二区三区……| 丝袜综合欧美| 日韩在线观看免费网站| 亚洲区小说区图片区| 91精品婷婷国产综合久久竹菊| 亚洲日本视频在线观看| 亚洲精品乱码久久久久久久久| 97伦伦午夜电影理伦片| 成人激情免费网站| 天天综合天天添夜夜添狠狠添| 亚洲欧美日韩视频二区| 97免费视频观看| 婷婷另类小说| 亚洲二区三区四区| 最新精品国偷自产在线| 精品欧美一区二区精品久久| 香蕉免费一区二区三区在线观看| 国产欧美日韩精品专区| 国产超碰精品| 欧美在线激情网| 国产一二三在线| 欧美黄色性视频| 精品国产99久久久久久| 这里只有精品视频在线| 国产高清一区在线观看| 亚洲欧美日韩爽爽影院| 亚洲aⅴ乱码精品成人区| 91精品国产欧美一区二区| 国产乱码在线观看| 欧美日韩中文字幕在线视频| 亚洲精品国产精品乱码| 夜夜揉揉日日人人青青一国产精品| 九九热视频在线免费观看| 国产色爱av资源综合区| 成人片黄网站色大片免费毛片| 久久久综合精品| 免费a在线观看播放| 97se亚洲国产综合自在线观| 成人免费无码大片a毛片| 99免费精品视频| 精品国产人妻一区二区三区| 99这里都是精品| av网站有哪些| 久久久精品蜜桃| 亚洲精品一区二区三区影院忠贞| 国产亚洲精品免费| 亚洲色图欧美色| 自拍av一区二区三区| 在线免费日韩av| 亚洲一级在线观看| 91视频免费网址| 欧美在线看片a免费观看| 波多野结衣mp4| 欧美剧情片在线观看| 国产欧美久久久精品免费| 欧美一级爆毛片| 狠狠综合久久av一区二区| 亚洲精品久久久久久久久| 欧美挠脚心网站| 中文有码一区| 日韩av手机在线| 韩国精品视频在线观看| 成人福利网站在线观看| 亚洲国产视频二区| 久久久一本精品99久久精品| 国产午夜一区| 亚洲第一精品区| 黄色日韩精品| 能在线观看的av| 久久精品99国产国产精| 麻豆av免费看| 久久精品一区二区三区不卡牛牛| 国内毛片毛片毛片毛片毛片| 亚洲激情成人在线| 亚洲欧美综合自拍| 欧美精品久久99| 欧美 日韩 国产 成人 在线| 亚洲男人的天堂在线播放| 日本在线看片免费人成视1000| 欧美裸身视频免费观看| 成年女人在线看片| 国产精品免费在线免费| 亚洲成人黄色| 日本黄网免费一区二区精品| 91国语精品自产拍| 已婚少妇美妙人妻系列| 国产成人亚洲综合a∨猫咪| 中文字幕人妻一区二区| 一区二区三区视频在线观看| 黄色污污网站在线观看| 欧美mv和日韩mv的网站| 999国产在线视频| 久久久久亚洲精品成人网小说| 欧美三级网站| 亚洲伊人久久综合| 免费精品国产| 日本中文字幕在线视频观看| 免费国产亚洲视频| 欧美精品欧美极品欧美激情| 亚洲欧美综合色| 国产精品无码一区| 日韩大片在线观看视频| www.欧美日本韩国| 国产精品成人av性教育| 成人av地址| 最新av网址在线观看| 日韩精品五月天| 成人性生活免费看| 亚洲精品国产精品乱码不99| 日本黄色中文字幕| 亚洲精品www久久久| 四季久久免费一区二区三区四区| 国产免费亚洲高清| 西野翔中文久久精品国产| 无码熟妇人妻av在线电影| 精品系列免费在线观看| 欧美黄色高清视频| 日韩欧美亚洲范冰冰与中字| 六月婷婷综合网| 欧美日本啪啪无遮挡网站| **国产精品| 日韩中文字幕一区二区| 久久福利毛片| 亚洲精品视频大全| 精品成人av一区| 欧美性猛交 xxxx| 久久不射电影网| 未满十八勿进黄网站一区不卡| 神马影院我不卡| 日本欧美韩国一区三区| 蜜桃传媒一区二区亚洲| 一本大道av伊人久久综合| 日本韩国一区| 欧美整片在线观看| 综合亚洲自拍| 青青青在线播放| 久久精品人人做| 国产一级片一区二区| 伊人久久免费视频| 欧美free嫩15| 亚洲最大免费| 国产一区视频导航| 国产一级二级三级| 精品国产精品网麻豆系列| 91资源在线观看| 久久精品二区| 丝袜美腿亚洲综合| 人妻无码一区二区三区免费| 欧美另类久久久品| 91亚洲天堂| 精品国产aⅴ麻豆| 久久五月激情| 日韩黄色中文字幕| 欧美一区二区三区的| 男人天堂亚洲| 久久久久免费网| 日本欧洲一区二区| 特一级黄色录像| 精品国产一区二区精华| 亚洲精品**中文毛片| 日韩欧美一区二区三区四区| 久久成人久久爱| 国产小视频在线看| 日韩精品在线观看视频| 99久久婷婷国产综合精品首页| 中文字幕欧美日韩一区二区| 国产a区久久久| 伊人手机在线视频| 丝袜情趣国产精品| 北条麻妃一区二区三区在线观看| 男女猛烈激情xx00免费视频| 久久九九久久九九| 国产夫妻自拍av| 欧美性视频网站| 亚洲精品极品少妇16p| 日本人添下边视频免费| 欧美亚洲国产怡红院影院| 1stkiss在线漫画| 秋霞在线观看一区二区三区| 国产揄拍国内精品对白| www.日本精品| 日韩中文字幕视频| 日韩深夜影院| 在线播放黄色av| 色婷婷综合久久久久中文一区二区| 欧美午夜电影一区二区三区| 国产手机精品在线| 久久99精品一区二区三区| 久久久久久久久久免费视频|