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

究竟為什么,快速排序的時間復雜度是n*lg(n)?

開發 開發工具
究竟為什么,快速排序,時間復雜度是O(n*lg(n))呢?今天就和大家聊聊時間復雜度。

最煩面試官問,“為什么XX算法的時間復雜度是OO”,今后,不再懼怕這類問題。

快速排序分為這么幾步:

第一步,先做一次partition;

partition使用第一個元素t=arr[low]為哨兵,把數組分成了兩個半區:

  • 左半區比t大
  • 右半區比t小

第二步,左半區遞歸;

第三步,右半區遞歸;

偽代碼為:

  1. void quick_sort(int[]arr, int low, int high){ 
  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); 

為啥,快速排序,時間復雜度是O(n*lg(n))呢?

今天和大家聊聊時間復雜度。

畫外音:往下看,第三類方法很牛逼。

第一大類,簡單規則

為方便記憶,先總結幾條簡單規則,熱熱身。

規則一:“有限次操作”的時間復雜度往往是O(1)。

例子:交換兩個數a和b的值。

  1. void swap(int& a, int& b){ 
  2.          int t=a
  3.          a=b
  4.          b=t

分析:通過了一個中間變量t,進行了3次操作,交換了a和b的值,swap的時間復雜度是O(1)。

畫外音:這里的有限次操作,是指不隨數據量的增加,操作次數增加。

規則二:“for循環”的時間復雜度往往是O(n)。

例子:n個數中找到最大值。

  1. int max(int[] arr, int n){ 
  2.          int temp = -MAX; 
  3.          for(int i=0;i<n;++i) 
  4.                    if(arr[i]>temp) temp=arr[i]; 
  5.          return temp; 

分析:通過一個for循環,將數據集遍歷,每次遍歷,都只執行“有限次操作”,計算的總次數,和輸入數據量n呈線性關系。

規則三:“樹的高度”的時間復雜度往往是O(lg(n))。

分析:樹的總節點個數是n,則樹的高度是lg(n)。

在一棵包含n個元素二分查找樹上進行二分查找,其時間復雜度是O(lg(n))。

對一個包含n個元素的堆頂元素彈出后,調整成一個新的堆,其時間復雜度也是O(lg(n))。

第二大類:組合規則

通過簡單規則的時間復雜度,來求解組合規則的時間復雜度。

例如:n個數冒泡排序。

  1. void bubble_sort(int[] arr, int n){ 
  2.    for(int i=0;i<n;i++) 
  3.        for(int j=0;j<n-i-1;j++) 
  4.            if(arr[j]>arr[j+1]) 
  5.                 swap(arr[j], arr[j+1]); 

分析:冒泡排序,可以看成三個規則的組合:

  • 外層for循環
  • 內層for循環
  • 最內層的swap

故,冒泡排序的時間復雜度為:

O(n) * O(n) * O(1) = O(n^2)

又例如:TopK問題,通過建立k元素的堆,來從n個數中求解最大的k個數。

先用前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]; 

分析:可以看成三個規則的組合:

  • 新建堆
  • for循環
  • 調整堆

故,用堆求解TopK,時間復雜度為:

O(k) + O(n) * O(lg(k)) = O(n*lg(k))

畫外音:注意哪些地方用加,哪些地方用乘;哪些地方是n,哪些地方是k。

第三大類,遞歸求解

簡單規則和組合規則可以用來求解非遞歸的算法的時間復雜度。對于遞歸的算法,該怎么分析呢?

接下來,通過幾個案例,來說明如何通分析遞歸式,來分析遞歸算法的時間復雜度。

案例一:計算 1到n的和,時間復雜度分析。

如果用非遞歸的算法:

  1. int sum(int n){ 
  2.          int result=0
  3.          for(int i=0;i<n;i++) 
  4.                    result += i; 
  5.          return result; 

根據簡單規則,for循環,sum的時間復雜度是O(n)。

但如果是遞歸算法,就沒有這么直觀了:

  1. int sum(int n){ 
  2.          if (n==1) return 1; 
  3.          return n+sum(n-1); 

如何來進行時間復雜度分析呢?

用f(n)來表示數據量為n時,算法的計算次數,很容易知道:

(1) 當n=1時,sum函數只計算1次

畫外音:if (n==1) return 1;

即:

f(1)=1【式子A】

(2) 不難發現,當n不等于1時:

f(n)的計算次數,等于f(n-1)的計算次數,再加1次計算

畫外音:return n+sum(n-1);

即:

f(n)=f(n-1)+1【式子B】

【式子B】不斷的展開,再配合【式子A】:

畫外音:這一句話,是分析這個算法的關鍵。

  1. f(n)=f(n-1)+1 
  2. f(n-1)=f(n-2)+1 
  3. … 
  4. f(2)=f(1)+1 
  5. f(1)=1 

上面共n個等式,左側和右側分別相加:

  1. f(n)+f(n-1)+…+f(2)+f(1) 
  2. [f(n-1)+1]+[f(n-2)+1]+…+[f(1)+1]+[1] 

即得到:

  1. f(n)=n 

已經有那么點意思了哈,再來個復雜點的算法。

案例二:二分查找binary_search,時間復雜度分析。

  1. int BS(int[] arr, int low, int high, 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); 

二分查找,單純從遞歸算法來分析,怎能知道其時間復雜度是O(lg(n))呢?

仍用f(n)來表示數據量為n時,算法的計算次數,很容易知道:

(1) 當n=1時,bs函數只計算1次

畫外音:不用糾結是1次還是1.5次,還是2.7次,是一個常數次。

即:

f(1)=1【式子A】

(2) 在n很大時,二分會進行一次比較,然后進行左側或者右側的遞歸,以減少一半的數據量:

f(n)的計算次數,等于f(n/2)的計算次數,再加1次計算

畫外音:計算arr[mid]>target,再減少一半數據量迭代

即:

f(n)=f(n/2)+1【式子B】

【式子B】不斷的展開,

  1. f(n)=f(n/2)+1 
  2. f(n/2)=f(n/4)+1 
  3. f(n/4)=f(n/8)+1 
  4. … 
  5. f(n/2^(m-1))=f(n/2^m)+1 

上面共m個等式,左側和右側分別相加:

  1. f(n)+f(n/2)+…+f(n/2^(m-1)) 
  2. [f(n/2)+1]+[f(n/4)+1]+…+[f(n/2^m)]+[1] 

即得到:

f(n)=f(n/2^m)+m

再配合【式子A】:

f(1)=1

即,n/2^m=1時, f(n/2^m)=1, 此時m=lg(n), 這一步,這是分析這個算法的關鍵。

將m=lg(n)帶入,得到:

f(n)=1+lg(n)

神奇不神奇?

最后,大boss,快速排序遞歸算法,時間復雜度的分析過程。

案例三:快速排序quick_sort,時間復雜度分析。

  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); 

仍用f(n)來表示數據量為n時,算法的計算次數,很容易知道:

當n=1時,quick_sort函數只計算1次

f(1)=1【式子A】

在n很大時:

  • 第一步,先做一次partition;
  • 第二步,左半區遞歸;
  • 第三步,右半區遞歸;

即:

f(n)=n+f(n/2)+f(n/2)=n+2*f(n/2)【式子B】

畫外音:

(1)partition本質是一個for,計算次數是n;

(2)二分查找只需要遞歸一個半區,而快速排序左半區和右半區都要遞歸,這一點在分治法與減治法一章節已經詳細講述過;

【式子B】不斷的展開, 

  1. f(n)=n+2*f(n/2) 
  2. f(n/2)=n/2+2*f(n/4) 
  3. f(n/4)=n/4+2*f(n/8) 
  4. … 
  5. f(n/2^(m-1))=n/2^(m-1)+2f(n/2^m) 

上面共m個等式,逐步帶入,于是得到:

  1. f(n)=n+2*f(n/2) 
  2. =n+2*[n/2+2*f(n/4)]=2n+4*f(n/4) 
  3. =2n+4*[n/4+2*f(n/8)]=3n+8f(n/8) 
  4. =… 
  5. =m*n+2^m*f(n/2^m) 

再配合【式子A】:

f(1)=1

即,n/2^m=1時, f(n/2^m)=1, 此時m=lg(n), 這一步,這是分析這個算法的關鍵。

將m=lg(n)帶入,得到:

  1. f(n)=lg(n)*n+2^(lg(n))*f(1)=n*lg(n)+n 

故,快速排序的時間復雜度是n*lg(n)。

wacalei,有點意思哈!

畫外音:額,估計83%的同學沒有仔細看,花5分鐘細思上述過程,一定有收獲。

總結

  • for循環的時間復雜度往往是O(n)
  • 樹的高度的時間復雜度往往是O(lg(n))
  • 二分查找的時間復雜度是O(lg(n)),快速排序的時間復雜度n*(lg(n))
  • 遞歸求解,未來再問時間復雜度,通殺

知其然,知其所以然。思路比結論重要。

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

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

 

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

2020-09-08 15:40:58

算法快速排序堆排序

2021-10-15 09:43:12

希爾排序復雜度

2022-09-16 10:14:41

消息順序性分布式架構

2024-04-25 08:33:25

算法時間復雜度空間復雜度

2018-07-31 09:52:38

機器學習排序算法圖像處理

2019-11-18 12:41:35

算法Python計算復雜性理論

2021-01-05 10:41:42

算法時間空間

2009-07-09 10:45:16

C#基本概念復雜度遞歸與接口

2022-02-22 10:11:01

系統軟件架構

2019-12-26 07:39:36

互聯網架構ip

2017-11-03 11:02:08

數據庫中間件

2024-05-20 09:04:29

時間復雜度代碼

2021-09-17 10:44:50

算法復雜度空間

2017-12-28 11:25:51

2020-12-30 09:20:27

代碼

2015-10-13 09:43:43

復雜度核心

2014-12-10 09:23:14

2022-02-13 20:04:04

鏈表節點代碼

2020-11-30 06:26:31

算法時間表示法

2021-07-20 11:38:55

算法計算機leetcode
點贊
收藏

51CTO技術棧公眾號

69av在线播放| 欧美xxxx老人做受| 一区二区三区在线观看www| 亚洲一区二区影视| 欧美在线黄色| 日韩成人久久久| 亚洲黄色a v| mm1313亚洲国产精品美女| 国产69精品久久久久毛片| 2019国产精品自在线拍国产不卡| 免费污网站在线观看| 91麻豆精品国产91久久久更新资源速度超快| 最好看的中文字幕久久| 国产精成人品localhost| 国产性生活视频| 欧美激情电影| 亚洲黄一区二区| 欧美成人三级在线播放| 久久香蕉av| 日本一区二区三区在线不卡| 亚洲自拍偷拍一区| 久久国产视频一区| 欧美日韩国产一区精品一区| 国产亚洲欧洲高清一区| 99riav国产精品视频| 日本一区免费网站| 亚洲成人中文在线| 色香蕉在线观看| 欧美日韩免费做爰大片| 国产a级毛片一区| 国产精品国语对白| 国产精品自拍99| 欧美激情 亚洲a∨综合| 精品视频一区在线视频| 欧美三级理论片| 国产高清视频色在线www| 最新久久zyz资源站| 日韩.欧美.亚洲| 天堂网av在线播放| 国产成人小视频| 成人在线中文字幕| 中文字幕乱码人妻无码久久| 国产亚洲福利| 久久久久久久一区二区| 欧美黑人性猛交xxx| 亚洲免费成人av在线| 日韩精品中文字幕一区二区三区| 孩娇小videos精品| 丝袜美腿一区| 日韩欧美在线视频日韩欧美在线视频 | 韩国一区二区三区| 国产精品国产亚洲伊人久久 | 亚洲国产专区校园欧美| 欧美精品免费看| 5566中文字幕| 亚洲破处大片| 久久国产精品久久久久| 欧美日韩色视频| 欧美激情理论| 久久夜色精品国产| 少妇人妻丰满做爰xxx| 欧美oldwomenvideos| 在线视频中文亚洲| 纪美影视在线观看电视版使用方法| 国产成人一区| 亚洲人成五月天| 影音先锋制服丝袜| 成人羞羞在线观看网站| xvideos成人免费中文版| 中文字幕第69页| 国产精品99一区二区三区| 精品国产一区二区三区久久久狼| 国产黄a三级三级| 久久久久久久久久久妇女| 不卡毛片在线看| 久久久久久久久99| 在线亚洲激情| 日韩女优人人人人射在线视频| 手机av免费观看| 久色婷婷小香蕉久久| 成人夜晚看av| 日本精品久久久久久| 久久影院午夜片一区| 日韩国产一区久久| 黄色免费在线观看| 亚洲国产wwwccc36天堂| 日韩欧美精品在线观看视频| yw.尤物在线精品视频| 91麻豆精品国产自产在线| 亚洲区 欧美区| 丝袜连裤袜欧美激情日韩| 亚洲网在线观看| 午夜精品一区二区三级视频| 国产精品二区影院| 欧美一级在线亚洲天堂| 在线免费一级片| 国产999精品久久久久久绿帽| 精品不卡一区二区三区| www亚洲人| 一区二区三区中文字幕| 六月丁香婷婷在线| 2020国产精品小视频| 亚洲精品乱码久久久久久金桔影视| 亚洲一区二区自偷自拍| 亚洲欧美综合| 国产精品www网站| 高h震动喷水双性1v1| 国产视频一区在线观看| 日本中文字幕在线视频观看| 国产精品第一| 亚洲国产精品人人爽夜夜爽| 情侣偷拍对白清晰饥渴难耐| 性欧美videos另类喷潮| 亚洲最大成人在线| 国产视频三级在线观看播放| 亚洲午夜久久久| 亚洲综合色在线观看| 精品素人av| 日韩专区在线观看| 一级片在线观看免费| 国产精品亚洲一区二区三区在线| 色播五月综合| 亚洲美女炮图| 日韩精品影音先锋| 麻豆一区在线观看| 首页国产欧美日韩丝袜| 国产麻豆日韩| 呦呦在线视频| 欧美日韩精品一区二区三区| 野花社区视频在线观看| 欧美精品一区二区三区久久久竹菊| 日本精品视频在线播放| 人妻视频一区二区三区| 亚洲精品国产a| www.污污视频| 日韩欧美电影| 国产精品主播视频| 精品av中文字幕在线毛片| 午夜一区二区三区在线观看| 在线成人精品视频| 婷婷精品进入| 91精品视频免费| 欧美猛烈性xbxbxbxb| 欧美在线你懂得| 国产精品久久免费观看| 日韩中文字幕区一区有砖一区 | 亚洲精品视频自拍| 日韩av一卡二卡三卡| 日韩av片子| 国产精品网红直播| 色开心亚洲综合| 欧美色手机在线观看| 丁香激情五月少妇| 日本在线不卡视频一二三区| 日本不卡在线观看| 日本久久免费| 一本色道久久综合狠狠躁篇怎么玩 | 欧美综合一区第一页| 天堂av在线免费| 偷拍日韩校园综合在线| 人妻少妇精品视频一区二区三区 | 久久久久中文字幕2018| 囯产精品久久久久久| 亚洲午夜免费视频| 国产老熟女伦老熟妇露脸| 国产色综合网| 欧美午夜视频在线| 国产成人77亚洲精品www| 日韩中文在线中文网在线观看| 亚洲一区二区色| 亚洲男人的天堂在线观看| 少妇伦子伦精品无吗| 国产精品综合| 日韩精品国内| 国产精品毛片无码| 欧美激情欧美激情在线五月| 午夜视频1000| 欧美三级一区二区| 欧美成人777| www.66久久| 国产一区亚洲二区三区| 91亚洲一区| dy888夜精品国产专区| 国产伦理精品| 视频直播国产精品| 好吊视频一二三区| 91黄视频在线观看| 亚洲国产精品久| 99国产一区二区三精品乱码| 性生交免费视频| 欧美暴力喷水在线| 玛丽玛丽电影原版免费观看1977| 第四色男人最爱上成人网| 精品国产欧美成人夜夜嗨| 黄色av小说在线观看| 日本高清无吗v一区| 国产极品美女在线| 99国内精品久久| 天天av天天操| 久久精品官网| 伊人再见免费在线观看高清版| 久久精品国产亚洲blacked| 国产精品成人av性教育| 日韩激情av| 国产亚洲欧美日韩美女| 动漫av一区二区三区| 欧美色大人视频| 日韩av无码中文字幕| 一区在线中文字幕| 成人免费无遮挡无码黄漫视频| 国产精品12区| 亚洲免费一级视频| 国产亚洲福利| 日本中文字幕在线视频观看| 久久福利影院| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 国产91精品高潮白浆喷水| 成人黄视频在线观看| 亚洲人成网站999久久久综合| 午夜精品久久久久久久爽 | 欧美激情成人网| 好看不卡的中文字幕| 亚洲最大免费| 俺要去色综合狠狠| 鲁片一区二区三区| 久久99偷拍| 99在线热播| 国产不卡精品| 成人久久久久爱| 日韩和的一区二在线| 2025国产精品视频| 99thz桃花论族在线播放| 欧美人在线观看| 久久黄色美女电影| 在线观看国产精品91| 国产永久免费高清在线观看视频| 日韩精品免费在线视频| 性网爆门事件集合av| 日韩亚洲欧美成人一区| 国产精品美女一区| 欧美日韩亚洲综合一区二区三区| 欧美一区二区三区网站| 五月天亚洲精品| 黄色激情视频在线观看| 亚洲无人区一区| 国产在线综合网| 亚洲综合视频在线| 久久精品第一页| 亚洲在线免费播放| 久久免费精彩视频| 亚洲黄色性网站| 波多野结衣爱爱视频| 亚洲免费色视频| 久久久久亚洲天堂| 亚洲成人自拍一区| 国产高潮久久久| 色哟哟国产精品| 人人妻人人爽人人澡人人精品| 日本二三区不卡| 波多野结衣视频在线观看| 欧美影院一区二区| 亚洲无码精品在线播放| 欧美日韩一级二级三级| 国产三级伦理片| 日韩一级片网址| 天堂中文网在线| 亚洲欧美另类在线观看| 国内av一区二区三区| 一区二区三区视频免费| 免费a级在线播放| 久久国产精彩视频| 成人性生交大片免费看在线播放| 97精品伊人久久久大香线蕉 | 亚洲成年人在线观看| 92国产精品观看| 人妻视频一区二区| 国产精品国产精品国产专区不蜜| 99久久久免费精品| 亚洲制服丝袜在线| 国产精品久久久久久人| 欧美日韩国产经典色站一区二区三区| 国产精品毛片一区视频播| 亚洲爱爱爱爱爱| 国产在线超碰| 久热精品视频在线| 老牛影视精品| 国产欧美一区二区| 999精品视频在这里| 欧美三级电影在线播放| 五月开心六月丁香综合色啪| 久草视频国产在线| 久久综合九色| 潘金莲一级淫片aaaaa| 成人禁用看黄a在线| 免费一级黄色录像| 亚洲综合无码一区二区| 中文字幕+乱码+中文字幕明步| 日韩欧美不卡在线观看视频| 蜜桃成人在线视频| 欧美激情视频在线免费观看 欧美视频免费一| 成人免费图片免费观看| 国产色综合天天综合网| 亚洲春色h网| 成年丰满熟妇午夜免费视频| 日韩国产欧美一区二区三区| 日本50路肥熟bbw| 欧美经典一区二区| 免费毛片一区二区三区| 欧美日韩国产精品自在自线| 天堂在线中文字幕| 欧美成年人视频网站欧美| 亚洲精品粉嫩美女一区| 国产精品一区二区三区免费观看| 久久亚洲成人| jizzjizzxxxx| 成人午夜私人影院| 在线免费看av网站| 欧美午夜片在线观看| 视频国产在线观看| 色综合久久悠悠| 成人性片免费| 欧美精品亚洲精品| 国产综合精品一区| 超碰在线免费av| 中文字幕精品一区二区三区精品| 一级片中文字幕| 欧美精品一区在线观看| 成人在线视频亚洲| 国产精品视频免费观看www| 天堂网av成人| 亚洲熟妇无码一区二区三区| 国产高清久久久久| 精品一区在线观看视频| 欧美精选午夜久久久乱码6080| 精品福利视频导航大全| 日产精品99久久久久久| 欧美亚视频在线中文字幕免费| 欧美久久久久久久久久久久久久| 国产一区亚洲一区| 肉色超薄丝袜脚交69xx图片| 欧美私模裸体表演在线观看| 国产三级在线免费观看| 日产精品99久久久久久| 妖精一区二区三区精品视频| 黄网站欧美内射| 成人一区二区三区中文字幕| www.av视频| 精品久久久久久久久久久久久久久久久 | 丝袜亚洲另类欧美重口| 日本午夜免费一区二区| 亚洲日本一区二区三区在线不卡| 日本vs亚洲vs韩国一区三区二区 | 性日韩欧美在线视频| 大伊香蕉精品在线品播放| wwwwww欧美| 成人免费视频播放| 久草国产精品视频| 亚洲人成电影网站| 视频精品导航| 久久免费视频2| 国产精品一区二区免费不卡| 成人免费毛片东京热| 日韩精品最新网址| 白浆视频在线观看| 日本精品一区二区三区不卡无字幕| 日韩中文字幕av电影| 国产中年熟女高潮大集合| 精品视频1区2区| 国内精品不卡| 国产精品夜夜夜一区二区三区尤| 亚洲视频www| 亚洲自拍偷拍图| 91精品在线免费| 久久香蕉一区| 日本黄网免费一区二区精品| 美日韩一区二区| 丰满少妇高潮久久三区| 日韩风俗一区 二区| 精品网站在线| 91大学生片黄在线观看| 99视频精品在线| 欧美另类高清videos的特点| 久久综合伊人77777| 日韩美女毛片| 天天视频天天爽| 亚洲国产日日夜夜| 福利成人在线观看| 91免费版黄色| 视频一区二区三区入口| 国语对白在线播放| 亚洲欧美精品伊人久久| 国产麻豆一区二区三区| 亚洲色欲综合一区二区三区| 亚洲视频中文字幕| 亚洲欧美综合在线观看| 91精品中文在线| 免费一级欧美片在线播放| 青草影院在线观看| 亚洲欧美制服第一页| 免费欧美网站|