大O表示法的理解

2022-06-04 19:09:13 字數 2064 閱讀 5835

一. 背景

在現實生活中,解決乙個問題可以有多種方法,其中有好的方法,也有較為一般的方法。評判標準雖有不同,但總體思想是:用最小的代價獲得最多的收益。

這裡所說代價並不僅指金錢開銷,有時也包括時間,所耗費資源等。

電腦程式也是為了解決問題而編寫的。同理可知,程式有好的,也有一般的,評判標準主要有兩方面:時間與空間。

人們都希望事情解決的越快越好,所以程式解決問題花費的時間一定要少。計算機資源是有限的,所以程式也要盡可能的少消耗資源。

不過很多時候不能兩全其美,此時應該抓主要矛盾。在程式設計時,很多場合會用空間消耗的增加來換取執行時間的減少。畢竟對於我們來說,時間一般會更加重要。

二. 引入

那麼應該怎麼比較不同演算法之間的優劣呢?答:應該從時間與空間兩方面入手。

打個比方:

你的書架上有100本書,它們是任意放置的,沒有先後次序。你想在其中找到《演算法導論》,那麼你需要從頭找到尾,運氣好的話,第一本就是,運氣不好的話,你就要找到最後。

但是有一天你突發奇想,為每本書編號並且記住了,那麼運用二分查詢,最多隻需要找7次。

忽然有一天,你買了1000本書,還是沒有先後次序地都放在書架上,並且又想找到《演算法導論》,這次情況就會比較複雜,運氣好的話,第一本就是,運氣不好的話,你要找遍這1000本書。

但是你發現編號的方法比較好找,於是再次編號並運用二分查詢,最多只要10次。

三. 大o記號

我們將按照書籍一一查詢的方法,叫做方法一;將二分查詢叫做方法二。

顯然,方法一的查詢次數跟書籍的書量相關,你有1萬本書的時候,最壞情況就要找1萬次。而方法二則快的多。

方法一的演算法叫做線性查詢,當你有 n 本書的時候,最多需要 n 次查詢。線性的意思是演算法所需要的時間跟資料的量成正比。

方法二(二分查詢)所需要的時間也跟資料量相關,但是並不會隨著資料量的增長而劇烈增加。

可以發現,演算法的執行時間是與資料量有關的。

在方法一中,從 n 本書中找到一本書,最壞情況下需要找 n 次,我們將這種最壞情況下需要的時間記為 o( n )。最好情況只需要找一次,即第一本書就是,我們將這種情況記為 ω (1)。

我們用大o表示最壞情況下需要的時間時間,用大 ω 表示最好情況下需要的時間。不過最好情況並不總會發生,所以它的意義不大。

一般討論的都是最壞情況下需要的時間,它給了人們一種保證,即最壞情況下所用的時間是多少。

四. 時間還是次數?

1. 回到上面的例子中,你有 n 本書時,最壞情況需要的時間是 o( n ),那有 2n 本書時呢?答:也應該表示為 o ( n ),而不是 o ( 2n )。

我們關注的是演算法所花時間隨著資料量增長的量級,應該拋去其中不重要的項,只留下起決定性因素的項,而不是具體的函式。

這裡又會有乙個新的問題。

假設乙個成年人從100本書中找一本,最多需要100次,花費1小時;乙個小孩從100本書中找一本,最多需要100次,花費10小時。

100次是相同的次數,而1小時和10小時卻不一樣。不同的人按照同一種工序執行一種操作,操作相同,但花費時間不同。

同樣乙個程式,在不同的計算機上執行,最後花費的時間必然不一樣,由此可見,具體的時間並不能用來衡量演算法的優劣。

我們發現,兩個人都用了100次,說明不管是誰來操作,都需要花費100次,這裡是同乙個演算法在不同平台上的比較。

而不同演算法之間的橫向比較,也需要通過次數來進行。

線性查詢在a計算機上執行100次,花費1小時;在b計算機上執行100次,花費10小時。

二分查詢在a計算機上執行7次,花費1分鐘;在b計算機上執行7次,花費10分鐘。

顯然,二分查詢不論哪種情況,都要比線性查快,哪怕是兩台計算機的執行時間不一樣。

我們關注的就是這種增長率,而不是具體的時間。通過分析的手法,能夠提前估算演算法需要的時間,而不是分別執行兩個演算法再統計時間。

2. 在程式中,計算時間複雜度時,是按照語句的執行次數來計算的。

前面說過,同樣的程式,在不同計算機上的執行時間不同,不同的演算法在不同的計算機上執行時間也不一樣,所以不應該用時間作為統一的衡量標準。

但是乙個演算法,在處理相同資料量時,語句執行的次數是一樣的,並且我們假設每條語句的執行時間相同(具體時間是多少無關緊要),為乙個確定的數值,那麼演算法的時間複雜度用大o表示法來表示。

大O表示法

用另乙個 通常更簡單的 函式來描述乙個函式數量級的漸近上界。大o表示法 稱乙個函式g n 是o f n 當且僅當存在常數c 0和n0 1對一切n n0均有 g n c f n 成立,也稱函式g n 以f n 為界或者稱g n 受限於f n 記作g n o f n 定義 如果乙個問題的規模是n,解這一...

大O表示法

大o表示法 汽交按尺寸被分為若干類 微型 小型 中型等等。在不提及具體尺寸的情況下,這些分類可以為我們所涉及到車的大小提供乙個大致慨念。我們同樣也需要一種快捷的方法來評價計算機演算法的效率,在電腦科學中,這種粗略的度量方法被稱作 大o 表示法。在比較演算法時似乎應該說一些類似 演算法a比演算法b快兩...

大o表示法

下面是一些常用的時間複雜度以及簡單的定義 o 1 常量時間 o 1 表示該演算法的執行時間 或執行時占用空間 總是為乙個常量,不論輸入的資料集是大是小。bool isfirstelementnull ilistelements o n o n 表示乙個演算法的效能會隨著輸入資料的大小變化而線性變化。...