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

拜托,面試別再問我TopK了

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

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

[[244926]]

畫外音:除非校招,我在面試過程中從不問TopK這個問題,默認大家都知道。

問題描述:從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); 

1. 這個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]。

2. 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.   tempi-low; //數組前半部分元素個數 
  5.   if(temp>=k) 
  6.       return RS(arr, low, i-1, k); //求前半部分第k大 
  7.   else 
  8.       return RS(arr, i+1, high, k-i); //求后半部分第k-i大 

這是一個典型的減治算法,遞歸內的兩個分支,最終只會執行一個,它的時間復雜度是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專欄
相關推薦

2018-11-01 13:49:23

桶排序排序面試

2018-10-28 22:37:00

計數排序排序面試

2020-04-22 11:19:07

貪心算法動態規劃

2018-11-06 11:40:19

時間復雜度面試算法

2021-01-22 10:09:23

簡歷求職者面試

2020-03-30 17:20:54

B+樹SQL索引

2019-04-16 13:30:05

表達式求值數據結構算法

2019-01-08 15:11:50

最大值最小值算法

2020-04-16 08:22:11

HTTPS加解密協議

2020-09-02 08:04:59

多線程互聯網高并發

2022-03-14 10:14:43

底層系統Nacos

2020-12-11 09:24:19

Elasticsear存儲數據

2018-11-09 09:34:05

面試Spring Clou底層

2020-09-24 14:40:55

Python 開發編程語言

2015-02-13 10:42:31

前端工具Dreamweaver

2019-07-10 10:06:24

面試官三次握手四次揮手

2019-08-29 09:49:50

2019-12-17 09:29:02

數據庫架構分庫分表

2020-08-26 08:18:39

數據索引查詢

2019-03-12 14:48:29

路由器XBOXPS4
點贊
收藏

51CTO技術棧公眾號

日韩精品一区二区av| 日韩精品在线播放视频| 亚洲高清精品视频| 极品少妇一区二区三区| 亚洲精品理论电影| 精品免费国产一区二区| 麻豆传媒视频在线| 粉嫩一区二区三区在线看| 97超级碰碰人国产在线观看| 影音先锋制服丝袜| 亚洲国产视频二区| 色综合久久综合| 一区二区av| 色婷婷综合视频| 蜜桃av一区二区| 国产69精品久久久久9| 精品成人无码一区二区三区| 亚洲国产aⅴ精品一区二区| 欧美网站在线观看| 色一情一乱一乱一区91| 精品av中文字幕在线毛片| 狠狠久久亚洲欧美| 国产精品91在线| 国产亚洲欧美精品久久久久久| 精品毛片免费观看| 精品福利一二区| 97超碰成人在线| 涩涩av在线| 亚洲一区二区三区四区在线| 性欧美videosex高清少妇| 亚洲精品国产一区二| 看电视剧不卡顿的网站| 欧美在线视频在线播放完整版免费观看| 免费黄色国产视频| 少妇精品久久久一区二区| 日韩欧美中文一区| 国产精品自在自线| 六十路息与子猛烈交尾| 精品成人av一区二区在线播放| 欧美激情777| 亚洲天堂成人在线| 国产精品无码毛片| 国产伦精品一区二区三区在线播放| 欧美久久久一区| 爱情岛论坛vip永久入口| 欧美办公室脚交xxxx| 亚洲国产精品自拍| 国产视频在线观看网站| 成人影院在线观看| 国产精品免费视频网站| 日本视频一区二区不卡| 日本亚洲欧美| 久久久久久麻豆| 精品无人区一区二区三区竹菊| 黄色福利在线观看| 粉嫩13p一区二区三区| 91在线中文字幕| 国产丰满美女做爰| 国产精品原创巨作av| 91嫩草在线视频| av加勒比在线| 大白屁股一区二区视频| 97碰碰视频| 亚洲国产成人在线观看| 国产成人免费网站| 成人av电影免费| 日韩一级片免费观看| 99久久免费视频.com| 欧美二级三级| 亚洲s色大片| 最新久久zyz资源站| 亚洲国产精品女人| 91福利区在线观看| 色综合天天综合网天天看片| 日本成人在线免费视频| 国产一区二区三区影视| 欧美在线免费视屏| 伊人成人222| 亚洲精品一二三**| 日韩精品视频观看| 欧美日韩中文字幕视频| 91日韩欧美| 欧美激情第三页| 日韩av免费网址| 玖玖在线精品| 亚洲一区中文字幕| 人妻少妇一区二区三区| 久久伊99综合婷婷久久伊| 日韩精品久久久毛片一区二区| 男人和女人做事情在线视频网站免费观看| 亚洲嫩草精品久久| 一卡二卡三卡视频| 色成人免费网站| 日韩视频一区二区三区在线播放| 欧美xxxxx少妇| 在线日本制服中文欧美| 久久精品成人欧美大片古装| 免费中文字幕在线观看| 久久亚洲欧美| 91久久久亚洲精品| 三级黄视频在线观看| 国产精品色呦呦| 国产精品久久久久9999爆乳| 韩国主播福利视频一区二区三区| 欧美性猛交xxxx乱大交退制版 | 综合久久2023| 在线电影一区二区三区| 99re久久精品国产| 97国产精品| 欧美亚洲成人精品| 91黄色在线视频| 2020国产精品自拍| 米仓穗香在线观看| 99亚洲伊人久久精品影院| 日韩美一区二区三区| 成人无码av片在线观看| 精品成人一区| 91精品视频免费观看| 日本在线视频1区| 亚洲在线成人精品| 不用播放器的免费av| 中文字幕av一区二区三区人| 色综合久久中文字幕综合网小说| 香蕉污视频在线观看| 成人一区二区三区视频| 超碰免费在线公开| 蜜桃成人精品| 亚洲精品美女在线观看| 久久久久久久国产视频| 久国产精品韩国三级视频| 欧美连裤袜在线视频| 啊啊啊久久久| 欧美成人国产一区二区| 51精品免费网站| 奇米精品一区二区三区在线观看 | 欧日韩在线视频| 亚洲三级在线观看| 一级黄色特级片| 精品国产91乱码一区二区三区四区| 91精品国产色综合| 欧美特黄一级视频| 亚洲一区二区三区美女| 手机在线观看日韩av| 欧美aaaa视频| 成人欧美一区二区三区黑人孕妇| 成人av毛片| 在线观看日韩高清av| av在线网站观看| 夜夜嗨av一区二区三区网站四季av| 91久久精品www人人做人人爽| 欧美三级电影一区二区三区| 欧美艳星brazzers| 国产精品麻豆免费版现看视频| 日本中文在线一区| 四虎影院一区二区三区| 精品成人免费一区二区在线播放| 亚洲人成在线观看网站高清| youjizz在线视频| 成a人片国产精品| 日韩小视频在线播放| 精品少妇3p| 日本精品一区二区三区在线播放视频| 午夜在线观看视频18| 无吗不卡中文字幕| 久久无码人妻精品一区二区三区| 国产精品五区| 区一区二区三区中文字幕| 成人天堂yy6080亚洲高清| 亚洲一级片在线看| 国产精品久久久国产盗摄| 亚洲人亚洲人成电影网站色| 久久久久久久久久久影视| 欧美日韩亚洲三区| 激情欧美一区二区三区中文字幕| 蜜桃视频在线观看免费视频| 亚洲精品资源美女情侣酒店| 中文字幕91爱爱| 亚洲天堂久久久久久久| 日本一区二区免费视频| 亚洲看片一区| 香蕉久久夜色| 视频一区中文字幕精品| 91av视频在线观看| av电影在线观看一区二区三区| 欧美精品丝袜中出| 精品在线免费观看视频| 久久久美女毛片| wwwwwxxxx日本| 亚洲高清自拍| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 亚洲成人午夜在线| 日韩一区二区三区色| 欧美一区二区.| 麻豆电影在线播放| 日韩电影免费在线观看中文字幕| 正在播放木下凛凛xv99| 亚洲一卡二卡三卡四卡| 九九九视频在线观看| 国产精品一二三| 亚洲国产精品久久久久爰色欲| 97精品视频在线看| 精品国产福利| а天堂中文最新一区二区三区| 97在线观看免费高清| 91官网在线| 亚洲精品短视频| 国产绳艺sm调教室论坛| 色婷婷综合久久久中文字幕| 麻豆成人在线视频| 国产精品丝袜一区| 欧美无人区码suv| 国产精品自拍网站| 久久久久久久久久久久91| 亚洲国产影院| 7777在线视频| 欧美一级精品片在线看| 国产女人水真多18毛片18精品| 深夜福利亚洲| 日韩美女av在线免费观看| 国产精品国精产品一二| 久久精品久久久久久| 黄色片在线免费观看| 精品国产三级电影在线观看| 一起草av在线| 欧美在线视频日韩| 亚洲图片在线视频| 婷婷国产v国产偷v亚洲高清| 国产探花在线播放| 中文字幕日韩一区| 91视频免费看片| 国产亚洲va综合人人澡精品| 成年人在线观看av| av中文字幕在线不卡| av影片在线播放| 国产一区二区中文字幕| 亚洲色图 在线视频| 麻豆精品网站| 国产 福利 在线| 中文在线一区| 日韩欧美一区二| av成人黄色| 啊啊啊一区二区| 99精品国产在热久久下载| 拔插拔插海外华人免费| 国一区二区在线观看| 红桃一区二区三区| 亚洲人成免费网站| 欧美日韩亚洲国产成人| 91精品1区| 丰满人妻一区二区三区53号| 中文无码久久精品| 日韩精品福利片午夜免费观看| 91精品国产乱码久久久久久久| 中国一区二区三区| 午夜精品一区二区三区国产 | 国产精品久久久一区二区三区 | 欧美国产视频在线观看| 亚洲人成精品久久久 | 国产欧美精品va在线观看| 国产a亚洲精品| 国产日韩欧美自拍| 国产精品一区免费在线| 肥熟一91porny丨九色丨| 超碰97成人| 欧美精品一区三区在线观看| 精品久久成人| 日本一级淫片演员| 激情视频一区| 国内外成人免费激情视频| 日韩在线a电影| 婷婷丁香激情网| 狠狠色狠狠色合久久伊人| 人妻激情偷乱视频一区二区三区| 高清在线成人网| 黄色短视频在线观看| 久久久国际精品| 久久久久久视频| 图片区小说区区亚洲影院| 婷婷激情五月综合| 91精品国产麻豆| 三级视频在线看| 国产一区二区三区18| 成人福利在线观看视频| 久久久久亚洲精品成人网小说| 色综合桃花网| 成人精品aaaa网站| 欧美五码在线| 伊人久久av导航| 尤物网精品视频| 五月婷婷狠狠操| 成人夜色视频网站在线观看| 中国美女乱淫免费看视频| 国产精品传媒视频| 日本三级网站在线观看| 在线观看欧美日本| 亚洲国产精品一| 在线电影欧美日韩一区二区私密| 一区二区三区伦理| 国产成人亚洲综合91精品| 免费一区二区三区在线视频| 玖玖玖精品中文字幕| 91精品国产自产在线观看永久∴| 无码中文字幕色专区| 久久国产精品色婷婷| 制服丝袜第一页在线观看| 国产精品免费av| www.日本精品| 日韩欧美国产精品一区| 国产youjizz在线| 午夜精品福利视频| 国产精品亚洲欧美一级在线| 欧美一区二区高清在线观看| 黄色欧美成人| www.色就是色.com| 欧美极品xxx| 91美女免费看| 欧美va在线播放| 四虎久久免费| 国产成人精品一区二区在线| 国产精品巨作av| 青青草免费在线视频观看| 美女视频一区在线观看| 亚洲一区二区观看| 亚洲成人免费在线| 精品国产av一区二区三区| 日韩网站免费观看高清| 国产第一精品| 日本一区二区久久精品| 性欧美精品高清| 国产黑丝一区二区| 亚洲综合网站在线观看| 91福利免费视频| 中文字幕精品—区二区| 欧美特黄aaaaaaaa大片| 蜜桃久久精品乱码一区二区 | 亚洲丝袜自拍清纯另类| 国产精品无码粉嫩小泬| 亚洲男人第一av网站| 男人久久天堂| 久久精品国产一区二区三区日韩 | 好吊操视频这里只有精品| 中文字幕一区二区三区四区| 中文字幕1区2区3区| 一区二区三区美女xx视频| 日韩在线影院| 日韩久久久久久久| 久久午夜影视| 在线观看免费黄色网址| 欧美亚洲一区二区在线| 尤物网在线观看| 国产有码在线一区二区视频| 99精品视频在线观看免费播放 | 99综合电影在线视频| 日本五十路女优| 日韩av资源在线播放| 欧美久久天堂| 欧美日韩一区二区三| 日韩黄色免费网站| 久久久久麻豆v国产| 在线电影国产精品| 污污网站在线观看| 国产日产精品一区二区三区四区| 日韩一级大片| 蜜桃久久精品成人无码av| 欧美婷婷六月丁香综合色| 日本在线天堂| 99电影网电视剧在线观看| 999在线观看精品免费不卡网站| 老司机福利av| 欧美日韩亚洲国产综合| av在线免费网址| 国产高清精品一区二区三区| 亚洲一区成人| 国产又粗又长免费视频| 欧美岛国在线观看| 色综合桃花网| 最新欧美日韩亚洲| 成人久久视频在线观看| 亚洲天堂一区在线| 色视频www在线播放国产成人| 精品入口麻豆88视频| 国产精品久久久久7777| 久久精品一区蜜桃臀影院| 91在线观看喷潮| 69国产精品成人在线播放| 日本黄色精品| 国产精品熟妇一区二区三区四区| 欧美午夜宅男影院在线观看| 五月天婷婷在线视频| 国产精品推荐精品| 日本女优在线视频一区二区| 麻豆国产尤物av尤物在线观看| 精品亚洲一区二区| 99热这里有精品| 精品国产免费av| 亚洲精品日产精品乱码不卡| 青青草免费在线| 亚洲在线视频福利| 久久狠狠一本精品综合网| 91在线播放观看|