精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品国产馆在线真实露脸 | 一区二区三区日韩| 麻豆精品久久久久久久99蜜桃| 久久伊人精品天天| 日韩av午夜在线观看| 91国内在线播放| 中文字幕一区二区5566日韩| 日本免费在线观看视频| 国产精品va在线播放我和闺蜜| av资源网站在线观看| 98精品国产高清在线xxxx天堂| 少妇av在线| www.av毛片| blacked蜜桃精品一区| 亚洲伊人成综合成人网| 日韩在线中文字幕视频| 美女视频黄久久| 国语精品免费视频| 日韩毛片精品高清免费| 黄色激情在线播放| 无码人妻精品一区二区三区温州| 欧美激情在线一区| 成人午夜精品在线| 午夜影视一区二区三区| 三级男人添奶爽爽爽视频| 51精品国产黑色丝袜高跟鞋| 国产精品一级在线| 国产精品suv一区| 亚洲97在线观看| 紧缚捆绑精品一区二区| 国产在线观看精品一区| 亚洲欧美日韩一级| 久久久久久国产精品| 成人免费av资源| 欧美日韩五码| 亚洲精品午夜久久久久久久| 欧美一区二区在线| 日韩欧美国产高清| 首页国产欧美久久| 国产在线高清视频| 久久无码人妻精品一区二区三区| 国产精品成人在线| 亚洲自拍偷拍九九九| 日韩久久视频| 午夜在线视频免费| 女同性αv亚洲女同志| 国产成人精品国内自产拍免费看 | 日本午夜精品理论片a级appf发布| 久久久精品国产免大香伊| 久久精品免视看国产成人| www.欧美色| 91黄色小网站| 国模极品一区二区三区| 亚洲欧美综合另类在线卡通| 嫩草一区二区三区| 日本免费网站在线观看| 尤物网站在线看| 91精品在线观看视频| 在线亚洲一区观看| 亚洲欧美日韩国产一区二区| 亚洲小说区图片| 免费在线观看a级片| 一本久道久久综合| 中文字幕精品一区久久久久| 欧美国产精品一区| 精品产国自在拍| www,av在线| 成人xvideos免费视频| 91国产精品成人| 蜜臀99久久精品久久久久久软件| 亚洲欧洲美洲av| 国产91精品看黄网站在线观看| 丁香花在线影院观看在线播放| 久久人人爽国产| 懂色av一区二区三区| 久久精品女人天堂| 精品国产美女a久久9999| 91麻豆一区二区| 天天躁日日躁狠狠躁av| 欧美1o一11sex性hdhd| 中文字幕精品久久久久| 亚洲欧美电影院| 香蕉成人久久| 国产精品亚洲一区二区在线观看| 99国产精品99| 亚洲熟女一区二区| 一区二区日本| 欧美最猛性xxxx| 91精品国产色综合久久ai换脸| 国产一区二区三区在线观看免费视频| 国产精品自在| 免费av毛片在线看| 日日夜夜综合网| 人妻少妇偷人精品久久久任期| 国内精品二区| 亚洲第一成人在线| 婷婷久久一区| 日韩大片欧美大片| 亚洲精品18在线观看| 男女男精品视频网站| 成人毛片一区二区| 97av自拍| 欧美国产第一页| 337p亚洲精品色噜噜狠狠| 久久婷婷久久一区二区三区| 欧美三级网页| 九九九九九九精品任你躁| 国产尤物视频在线| 亚洲欧美一二三区| 制服丝袜第二页| 成年人午夜免费视频| 99九九电视剧免费观看| 久久69精品久久久久久国产越南| 在线欧美一区二区| 国产色一区二区| 久久先锋资源| 不卡av一区二区| 国产亚洲欧美日韩精品一区二区三区| 日韩a在线观看| 国产精品免费无遮挡无码永久视频| av无码一区二区三区| 欧美 日韩精品| 日韩中文一区二区三区| 国产精品美女免费| 中日韩午夜理伦电影免费| 欧美日韩亚洲综合在线| 国产精品卡一卡二| 国产麻豆日韩欧美久久| 亚洲美女色禁图| 怕怕欧美视频免费大全| 青青国产精品| 黄色美女视频在线观看| 视频国产在线观看| 一级特黄色大片| 日韩欧美视频在线免费观看| 国产精品无码久久久久久| 在线黄色免费观看| 久久亚洲精品无码va白人极品| 明星裸体视频一区二区| 91精品在线观看视频| 日韩免费精品视频| 欧美第一黄色网| 在线播放精品一区二区三区 | 亚洲欧洲三级电影| 99精品在线观看视频| 国产一区二区三区av电影| 99热免费精品在线观看| 天天操夜夜操国产精品| 深爱激情久久| 精品国产午夜肉伦伦影院| 成人免费91| 色8久久久久| 99久久久国产精品免费调教网站| 678在线观看视频| av电影高清在线观看| 69av在线| 色哟哟免费在线观看| 国产精品四虎| www.亚洲视频| 在线看的av网站| 精品美女www爽爽爽视频| 乐播av一区二区三区| 18深夜在线观看免费视频| 永久免费网站视频在线观看| 五月天国产一区| 国产剧情久久久久久| 久久久av电影| 亚洲国产97在线精品一区| 色av综合在线| 欧美性xxxxx极品| 精品久久久中文| 欧美午夜无遮挡| 色综合久久99| 欧美日韩国产在线播放网站| 欧美精品久久99久久在免费线| 欧美色综合影院| 欧美一区午夜视频在线观看| 久久亚洲春色中文字幕久久久| 免费人成精品欧美精品| 精品无码三级在线观看视频| 精品一区二区三区蜜桃| 国产99久久久国产精品免费看| 不卡视频在线观看| 中文成人综合网| 一区二区视频在线看| 亚洲国产精品一区二区尤物区| 精品成人国产在线观看男人呻吟| 日本精品视频一区二区三区| 91精品国产一区二区| 亚洲欧洲视频在线| 欧美日韩成人黄色| 国产精品久久久久久久久久尿| 91在线免费看网站| 日韩av电影免费观看| 久久精品xxx| 亚洲一区二区偷拍| 国产毛片久久久久久久| 国产在线视频二区| 在线观看亚洲国产| 欧美视频综合| 波多野结衣在线观看| 亚洲狼人在线| 国产一区二区三区探花| 亚洲黄色精品| 粉嫩av一区二区三区粉嫩| 中文字幕在线观看一区| 欧亚一区二区三区| 亚洲美女在线观看| 国产+成+人+亚洲欧洲| 99在线热播| 久久亚洲国产成人精品无码区 | 国产.欧美.日韩| 亚洲视频一区二区在线| 欧美日韩激情一区| www.日韩系列| 成人黄在线观看| 男人天堂成人网| 蜜桃视频无码区在线观看| 日韩视频中文字幕在线观看| 国产按摩一区二区三区| 91高清在线观看视频| 国产厕拍一区| 毛片一区二区| 国产欧美一二三区| 欧美一区二区三区四区高清 | 中文字幕第六页| 久久久久黄色片| 日本ー区在线视频| 国产毛片精品久久| 精品9999| 国产精品免费人成网站| 精品久久久久久久久久久久久久久| 午夜精品久久久久久久白皮肤| 欧美日韩高清免费| 色啦啦av综合| 在线免费观看毛片| 日本在线视频网| 一区二区美女| 国产精品1024| 欧美性一二三区| 久久久亚洲网站| 艳母动漫在线免费观看| 波多野结衣一本| 午夜精品久久久久久久99| 日韩一区二区三区在线免费观看| 欧美99久久| 亚洲国产高清在线观看视频| 精品久久久久99| www.久久爱.cn| 国产aⅴ爽av久久久久| 久久久久久无码精品大片| www在线观看黄色| 国产综合视频| 亚洲成人激情av| 久久久久久久一区二区| 影音先锋成人资源网站| 精品国产视频一区二区三区| 香蕉视频免费在线播放| 国内黄色精品| 国产精品久久夜| 久久天天躁狠狠躁夜夜av| 亚洲一区二区三区精品动漫| 欧美福利第一页| av在线播放网站| 日韩免费视频| 国产精品日日摸夜夜摸av| 色婷婷久久av| 国产精品日韩三级| 精品一级少妇久久久久久久| 色呦呦在线视频| 久久国产欧美| 欧美麻豆精品久久久久久| 成人久久一区二区| 99riav国产精品视频| 黄色片在线看| 99精品视频在线观看播放| 亚洲精品五月天| 69av在线视频| 天天操,天天操| 亚洲精品一区二区口爆| 亚瑟一区二区三区四区| 中文字幕中文乱码欧美一区二区| 久久成人这里只有精品| 欧洲黄色一级视频| 97在线公开视频| 伊甸园亚洲一区| 亚洲精品久久久蜜桃| 日韩av观看网址| 五月天丁香社区| 老司机精品视频在线观看6| 亚洲精选91| 日韩欧美专区在线| 亚洲区一区二区三区| 日韩欧美中文字幕一区二区| 日韩一级特黄| 久久免费电影网| 久久久久日韩精品久久久男男| 91人人澡人人爽人人精品| 四虎精品成人影院观看地址| 亚洲视屏一区| 欧美变态tickling挠脚心| 91香蕉视频网址| 一区二区视频免费观看| 国产精品羞羞答答在线观看 | 成人免费黄色大片| 精品中文字幕在线观看| 国产欧美一区二| 蜜芽在线免费观看| 麻豆一区二区99久久久久| 国产亚洲综合久久| 天天干天天爽天天射| 午夜在线观看视频| 久久国产精品一区二区| www国产精品视频| 17c国产在线| 成人在线影视| 丁香五精品蜜臀久久久久99网站| 欧美日韩爱爱视频| 亚洲熟女乱综合一区二区三区 | 26uuu另类欧美亚洲曰本| 青草青草久热精品视频在线网站| 亚洲一级av无码毛片精品| 最新日韩精品| 国产精品久久久久久久久晋中| 国产中文欧美精品| 免费在线一区二区三区| 婷婷综合福利| 制服丝袜中文字幕一区| 男同互操gay射视频在线看| 老牛影视av牛牛影视av| 日韩一区欧美二区| 欧美大成色www永久网站婷| 性欧美18—19sex性高清| 国产精品高清乱码在线观看| 中文字幕一区二区在线观看| 国产伦精品一区二区三区视频免费| 亚洲熟女综合色一区二区三区| 欧美3p在线观看| 亚洲精品成人久久| 亚洲免费999| wwww在线观看免费视频| 综合在线观看色| 日本视频一区在线观看| 亚洲精品综合网| 国产麻豆成人传媒免费观看| 国产91av在线| 日本在线观看天堂男亚洲| 欧美色图亚洲天堂| 久久五月天小说| 亚洲天堂精品在线| 少妇精品一区二区| 亚洲综合色婷婷在线观看| 777久久久精品| 8x8x成人免费视频| 欧美黄色网络| 欧美日韩在线三区| 好男人www社区| 日韩视频网站在线观看| 欧美性xxxxx极品娇小| 无码播放一区二区三区| 国产传媒在线观看| 亚洲国产毛片aaaaa无费看 | 成人一区二区视频| 91影院未满十八岁禁止入内| 99精品国产99久久久久久97| 久久99精品视频| 91久久国产综合久久蜜月精品 | 久久露脸国产精品| 日本熟伦人妇xxxx| 男人天堂欧美日韩| 国产精品亚洲精品| 99久久久久久久| 93久久精品日日躁夜夜躁欧美| 久久五月天婷婷| 婷婷激情在线| 午夜久久久影院| 丰满少妇在线观看| 亚洲资源在线| 日韩成人av网址| 91麻豆免费视频网站| 日韩一级在线| 国产综合在线观看视频| 亚洲av成人精品毛片| 国产精品视频在线看| 分分操这里只有精品| 日韩欧美2区| 亚洲乱码国产乱码精品精| 一本在线免费视频| 亚洲一区二区免费看| 成人av在线亚洲| 毛片在线免费| 午夜欧美一区二区三区在线播放| 91视频这里只有精品| 精品国产一区二区三区四区| 欧美激情女人20p| 国产精品久久久久久久久久久久久久久久 | 中文字幕一区日韩精品欧美| 久久久性生活视频| 91亚洲无吗| 久久久亚洲欧洲日产国码aⅴ|