成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

算法時間復雜度分析:大O表示法

開發 前端 算法
在開發的時候,我們如何評估一個算法的好壞,如何描述一個算法運行效率的高低呢?通俗一點的表達方法就是程序執行快或慢,但是這只是一種較為寬泛的描述,我們如何直觀科學的用的描述它呢?

[[354643]]

在開發的時候,我們如何評估一個算法的好壞,如何描述一個算法運行效率的高低呢?通俗一點的表達方法就是程序執行快或慢,但是這只是一種較為寬泛的描述,我們如何直觀科學的用的描述它呢?

有同學可能會說,用其運行時間不就可以很好很直觀的描述它了。不過,不同的語言,不同的編譯器,不同的CPU來說,對程序的處理的時間是不同的,我們無法單單用運行時間來描述某個算法執行效率。另外,當需要處理的數據增長時,算法的基本操作要重復執行的次數也會增長,對于不同的算法的增長的速度也不一樣。

數學果然是個不錯的工具,為了描述算法的運行時間的增長情況,我們可以用不同數學公式來分析。在計算機科學上,我們是有專門的術語來表征算法的效率,就是今天要和大家一起學習的大O表示法。大O并不是表示算法運行需要多長時間,它表示的是算法運行時間的增速,即算法的運行時間以不同的速度增加,也叫漸進時間復雜度。

我們可以用下面的表達式來表示:

通常主要有以下幾種表達式來描述時間復雜度:

  • O(1):常量時間
  • O(n):線性時間
  • O(log n):對數時間
  • O(n^2):二次方時間
  • O(2^n):指數時間
  • O(n!):階乘時間

每種時間復雜度有所不同,下面我們一起來詳細了解這幾種時間復雜度。

大O復雜度

 

O(1)

O(1)表示常量時間復雜度,當給定大小為n的輸入,無論n為何值,最后算法執行的時間是個常量。舉個例子:

  1. int func(int n) 
  2.     n++; 
  3.     return n*2; 

上面的程序中,無論輸入n的值如何變化,程序執行時間始終是個常量。我們簡化處理一下,假如函數中每行語句的執行時間是1,則執行時間的數學表達式:

無論n為多大,最后的執行時間都是2這個固定值。雖然是運行時間為2,但是這里我們也用O(1)來表示,這里的1代表是一個常數。

O(n)

O(n)表示線性時間復雜度,算法的執行時間隨著輸入n的大小成線性變化。

  1. int func(int n) 
  2.     int sum = 0; 
  3.     for(int i=0; i<n; i++) 
  4.     { 
  5.         sum = sum + i; 
  6.     } 
  7.  
  8.     return sum

上面的這個程序中,函數的執行時間隨著n的變化成線性的關系。

對于這種可以用線性表達式表示的情況,我們用O(n)來表示。

為什么可以省略掉表達式中的其他系數呢?主要是當n趨近于無窮大時,系數相對于無窮大的n來說可以忽略不計。

O(n^2 )

O(n^2)表示二次方時間復雜度,一個算法的時間將會隨著輸入數據n的增長而呈現出二次關系增加。

  1. int func(int n) 
  2.     int sum = 0; 
  3.     for(int i=0; i<n; i++) 
  4.     { 
  5.         for(int j=0; j<n; j++) 
  6.         { 
  7.             sum = sum + i + j; 
  8.         } 
  9.     } 
  10.  
  11.     return sum

上面的程序中,是個兩層循環的程序,函數的執行時間和n是二次方的關系:

對于這種類型的程序,我們可以用O(n^2)表示。不過,循環嵌套除了這種兩層循環之外,還會有三層、四層...n層循環,對應的其復雜度就是O(n^3) 、O(n^4)...O(n^n)。

O(2^n)

O(2^n)表示指數復雜度,隨著n的增加,算法的執行時間成倍增加,它是一種爆炸式增長的情況。

  1. int func(int n) 
  2.     if(n==0) return 1; 
  3.  
  4.     return func(n) + func(n-1) 

上面的代碼中,有兩次遞歸調用,函數的執行時間就會和輸入n成指數的關系。

因此,這里我們可以用O(2^n)表示。

O(log n)

O(log n)表示對數時間復雜度,算法執行時間和n是一種對數關系。這種類型的算法會在執行的過程中,隨著程序的執行其完成某個功能的操作步驟越來越少。其中,我們所熟知的二分查找法就是一個很好的例子。比如,下面這個代碼在一個有序列表中查找某個值的位置,我們通過二分法進行查找。

  1. int func(int a[], int sizeint num) 
  2.     int left = 0; 
  3.     int right = size-1; 
  4.  
  5.     while(left <= right
  6.     { 
  7.         int mid = (left + right)/2; 
  8.  
  9.         if(a[mid] > num) 
  10.         { 
  11.             right = mid - 1; 
  12.         } 
  13.         else if (a[mid] < num) 
  14.         { 
  15.             left = mid + 1; 
  16.         } 
  17.         else 
  18.         { 
  19.             return num; 
  20.         } 
  21.     } 
  22.  
  23.     return -1; 

在最糟糕的情況下,我們通過二分法拆分x次后,最后一個元素就是我們要找的元素。我們可以得到下面的等式:

函數運行時間可以表示為:

因此,這里我們可以用O(log n)表示。

O(n!)

對于階乘關系的復雜度,最典型的例子就是旅行商問題。

假設有一個旅行商人要拜訪n+1個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最后要回到原來出發的城市。路徑的選擇目標是要求得的路徑長度為所有路徑之中的最小值。

 

這個問題最簡單的方法是通過窮舉法列出所有的排列組合。如果有n+1個城市,根據我們數學中學過的排列組合計算方法,可以算出所有組合數為n!,所以這種窮舉法對應的時間復雜度也就是O(n!)了。

本文轉載自微信公眾號「Will的大食堂」,可以通過以下二維碼關注。轉載本文請聯系Will的大食堂公眾號。

 

責任編輯:武曉燕 來源: Will的大食堂
相關推薦

2024-04-25 08:33:25

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

2021-01-05 10:41:42

算法時間空間

2019-11-18 12:41:35

算法Python計算復雜性理論

2022-02-13 20:04:04

鏈表節點代碼

2021-06-28 06:15:14

算法Algorithm時間空間復雜度

2018-12-18 10:11:37

軟件復雜度軟件系統軟件開發

2020-02-06 13:59:48

javascript算法復雜度

2020-12-30 05:35:56

數據結構算法

2021-04-25 14:29:02

數據結構動態數組時間復雜度

2021-09-17 10:44:50

算法復雜度空間

2009-07-09 10:45:16

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

2019-02-21 09:55:39

單鏈表存儲C結點

2021-07-29 11:30:54

遞歸算法

2020-09-08 15:40:58

算法快速排序堆排序

2021-10-15 09:43:12

希爾排序復雜度

2024-05-20 09:04:29

時間復雜度代碼

2023-10-30 01:08:35

微信紅包高性能架構

2014-12-10 09:23:14

2015-10-13 09:43:43

復雜度核心

2019-12-24 09:46:00

Linux設置密碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区不卡视频 | 蜜桃av一区二区三区 | 亚洲综合一区二区三区 | 福利久久| 欧美综合在线视频 | 日韩成人av在线 | 九九色综合 | 欧美亚州综合 | 久久69精品久久久久久久电影好 | av在线免费观看不卡 | 欧区一欧区二欧区三免费 | 午夜视频在线观看一区二区 | 国产激情片在线观看 | 99亚洲国产精品 | 羞羞网站在线观看 | 亚洲黄色av| 超碰精品在线 | 亚洲精品福利视频 | 日韩国产一区二区三区 | 99视频免费 | 亚洲精品68久久久一区 | 一区二区三区久久 | 在线a视频网站 | 91传媒在线观看 | 依人成人| 国产精品久久久久久久一区二区 | 九九久久这里只有精品 | 亚洲精品一二三 | 国产精品一区二区福利视频 | 伊人在线 | 亚洲精品性视频 | 中文字幕国 | 日韩播放| 国产精品高潮呻吟久久 | 欧美中文一区 | 日韩中文字幕在线观看 | 国产精品高清一区二区三区 | 真人毛片| 国产精品久久久久久久久久久久久 | 精品1区2区3区4区 | 久久久久久久久久久一区二区 |