https://www.shuxuele.com/algebra/logarithms.html
https://juejin.im/entry/593f56528d6d810058a355f4
在最簡單的層面,對數解答以下問題:
多少個既定的數相乘會等於另一個數?
例子:多少個 2 相乘會等於 8?
答案:2 × 2 × 2 = 8,所以需要把 3 個 2 相乘來得到 8
所以對數是 3
怎樣寫
我們這樣寫"3個2相乘的積為8":
log2(8) = 3
所以這兩個是相同的:
![]() |
相乘的數叫 "底",而對數的符號是 "log",所以我們可以說:
- "8的以2為底的對數是 3"
- 或 "8的log(以2為底)是 3"
- 或 "8以2為底的log是 3"
請留意,這牽涉到三個數:
- 底:相乘的數(在以上的例子的 "2")
- 多少個底相乘(3個,這就是 對數)
- 相乘起來的積(在以上的例子的 "8")
更多例子
例子: log5(625) 是多少?
問題是 "需要多少個 5 相乘,來得到 625?"
5 × 5 × 5 × 5 = 625,所以需要4 個 5
答案:log5(625) = 4
例子:log2(64) 是多少?
問題是 "需要多少個 2 相乘,來得到 64?"
2 × 2 × 2 × 2 × 2 × 2 = 64,所以需要 6 個 2
答案:log2(64) = 6
指數
指數與對數是有關聯的。我們來看看。。。。。。
![]() |
指數的意思是用多少個數和自己相乘。 在這例子里:23 = 2 × 2 × 2 = 8 (3 個 2 乘在一起的積是 8) |
所以對數解答這樣的問題:
這樣去解答:
對數告訴我們指數是多少!
在這例子, "底" 是 2, "指數" 是 3:
故此,對數解答這問題:
需要什么指數
(把一個數變成另一個數)?
一般的情形是:
例子:log10(100) 是多少?
102 = 100
指數需要等於 2,方可把 10變成 100,所以:
log10(100) = 2
例子:log3(81) 是多少?
34 = 81
指數需要等於 4,方可把 3 變成 81,所以:
log3(81) = 4
常用對數:底為 10
有時候寫對數時,底是不寫的:
log(100)
通常這代表底是 10。
這叫 "常用對數"。工程師時常用常用對數。
在計算器上是 "log" 鍵。
意思是需要多少個 10 相乘來得到一個數。
例子:log(1000) = log10(1000) = 3
自然對數: 底為 "e"
另一個時常用的底是 e(歐拉數),大約的值是 2.71828。
這叫 "自然對數"。數學家時常用自然對數。
在計算器上是 "ln" 鍵。
意思是需要多少個 "e" 相乘來得到一個數。
例子:ln(7.389) = loge(7.389) ≈ 2
因為 2.718282 ≈ 7.389
可是,有時會引起混淆。。。。。。!
數學家用 "log" (而不是 "ln")來代表自然對數。這便會引起混淆:
例子 | 工程師演繹 | 數學家演繹 | |
---|---|---|---|
log(50) | log10(50) | loge(50) | 混淆 |
ln(50) | loge(50) | loge(50) | 沒混淆 |
log10(50) | log10(50) | log10(50) | 沒混淆 |
所以當你看見 "log" 時,必須找出底是多少!
對數可以是小數
以上的例子里的對數全是整數(像2或3),但對數可以是小數,像 2.5 或 6.081等等
例子:log10(26)是多少?
![]() |
把 26 打進計算器,按 log鍵 答案是: 1.41497。。。。。。 |
這對數的意思是 101.41497。。。。。。 = 26
(10 的指數為 1.41497。。。。。。 等於 26)
在圖上像這樣: 很漂亮的圖,對不? |
![]() |
去對數可以是小數了解更多。
負對數
− | 負?對數是基於乘法。 那么,乘的相反是什么?除! |
負對數的意思是需要除以一個數多少次。
可以只除一次:
例子:log8(0.125)是多少?
1 ÷ 8 = 0.125,
所以 log8(0.125) = −1
也可以除很多次:
例子:log5(0.008)是多少?
1 ÷ 5 ÷ 5 ÷ 5 = 5−3,
所以 log5(0.008) = −3
這是合情合理的
乘和除是屬於同一個簡單的規律。
我們來看看一些以10為底的對數:
數 | 多少個 10 | 對數(以10為底) | ||
---|---|---|---|---|
![]() |
。。。等等。。。 | |||
1000 | 1 × 10 × 10 × 10 | log10(1000) | = 3 | |
100 | 1 × 10 × 10 | log10(100) | = 2 | |
10 | 1 × 10 | log10(10) | = 1 | |
1 | 1 | log10(1) | = 0 | |
0.1 | 1 ÷ 10 | log10(0.1) | = −1 | |
0.01 | 1 ÷ 10 ÷ 10 | log10(0.01) | = −2 | |
0.001 | 1 ÷ 10 ÷ 10 ÷ 10 | log10(0.001) | = −3 | |
。。。等等。。。 |
留心看這列表,注意到正、零和負對數全都是屬於同一個(相當簡單的)規律。
英語 "Logarithm"
對數的英語 "Logarithm" 為蘇格蘭數學家約翰·奈皮爾(公元1550-1617)所創,源自希臘字 logos,意思是"比例或字";而 arithmos 的意思是 "數"。。。。。。合成一個字就是 "比例數"!
預先知道算法的復雜度是一回事,了解其后的原理是另一件事情。
不管你是計算機科班出身還是想有效解決最優化問題,如果想要用自己的知識解決實際問題,你都必須理解時間復雜度。
先從簡單直觀的 O(1) 和 O(n) 復雜度說起。O(1) 表示一次操作即可直接取得目標元素(比如字典或哈希表),O(n) 意味着先要檢查 n 個元素來搜索目標,但是 O(log n) 是什么意思呢?
你第一次聽說 O(log n) 時間復雜度可能是在學二分搜索算法的時候。二分搜索一定有某種行為使其時間復雜度為 log n。我們來看看是二分搜索是如何實現的。
因為在最好情況下二分搜索的時間復雜度是 O(1),最壞情況(平均情況)下 O(log n),我們直接來看最壞情況下的例子。已知有 16 個元素的有序數組。
舉個最壞情況的例子,比如我們要找的是數字 13。
十六個元素的有序數組
選中間的元素作為中心點(長度的一半)
13 小於中心點,所以不用考慮數組的后一半
重復這個過程,每次都尋找子數組的中間元素
每次和中間元素比較都會使搜索范圍減半。
所以為了從 16 個元素中找到目標元素,我們需要把數組平均分割 4 次,也就是說,
簡化后的公式
類似的,如果有 n 個元素,
歸納一下
分子和分母代入指數
等式兩邊同時乘以 2^k
最終結果
現在來看看「對數」的定義:
為使某數(底數)等於一給定數而必須取的乘冪的冪指數。
也就是說可以寫成這種形式
對數形式
所以 log n 的確是有意義的,不是嗎?沒有其他什么可以表示這種行為。
就這樣吧,我希望我講得這些你都搞懂了。在從事計算機科學相關的工作時,了解這類知識總是有用的(而且很有趣)。說不定就因為你知道算法的原理,你成了小組里能找出問題的最優解的人呢,誰知道呢。祝好運!
問題:
最近有好幾學生問我,無論是計算機算法概論、還是數據結構書中,
關於算法的時間復雜度很多都用包含O(logN)這樣的描述,但是卻沒有明確說logN的底數究竟是多少。
解答:
算法中log級別的時間復雜度都是由於使用了分治思想,這個底數直接由分治的復雜度決定。
如果采用二分法,那么就會以2為底數,三分法就會以3為底數,其他亦然。
不過無論底數是什么,log級別的漸進意義是一樣的。
也就是說該算法的時間復雜度的增長與處理數據多少的增長的關系是一樣的。
我們先考慮O(logx(n))和O(logy(n)),x!=y,我們是在考慮n趨於無窮的情況。
求當n趨於無窮大時logx(n)/logy(n)的極限可以發現,極限等於lny/lnx,也就是一個常數,
也就是說,在n趨於無窮大的時候,這兩個東西僅差一個常數。
所以從研究算法的角度log的底數不重要。
最后,結合上面,我也說一下關於大O的定義(算法導論28頁的定義),
注意把這個定義和高等數學中的極限部分做比較,
顯然可以發現,這里的定義正是體現了一個極限的思想,
假設我們將n0取一個非常大的數字,
顯然,當n大於n0的時候,我們可以發現任意底數的一個對數函數其實都相差一個常數倍而已。
所以書上說寫的O(logn)已經可以表達所有底數的對數了,就像O(n^2)一樣。
沒有非常嚴格的證明,不過我覺得這樣說比較好理解,如果有興趣證明,完全可以參照高數上對極限趨於無窮的證明。
由於平時接觸算法比較少,今天看資料看到了o(1),都不知道是什么意思,百度之后才知道是什么意思。
描述算法復雜度時,常用o(1), o(n), o(logn), o(nlogn)表示對應算法的時間復雜度,是算法的時空復雜度的表示。不僅僅用於表示時間復雜度,也用於表示空間復雜度。
O后面的括號中有一個函數,指明某個算法的耗時/耗空間與數據增長量之間的關系。其中的n代表輸入數據的量。
比如時間復雜度為O(n),就代表數據量增大幾倍,耗時也增大幾倍。比如常見的遍歷算法。
再比如時間復雜度O(n^2),就代表數據量增大n倍時,耗時增大n的平方倍,這是比線性更高的時間復雜度。比如冒泡排序,就是典型的O(n^2)的算法,對n個數排序,需要掃描n×n次。
再比如O(logn),當數據增大n倍時,耗時增大logn倍(這里的log是以2為底的,比如,當數據增大256倍時,耗時只增大8倍,是比線性還要低的時間復雜度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256個數據中查找只要找8次就可以找到目標。
O(nlogn)同理,就是n乘以logn,當數據增大256倍時,耗時增大256*8=2048倍。這個復雜度高於線性低於平方。歸並排序就是O(nlogn)的時間復雜度。
O(1)就是最低的時空復雜度了,也就是耗時/耗空間與輸入數據大小無關,無論輸入數據增大多少倍,耗時/耗空間都不變。 哈希算法就是典型的O(1)時間復雜度,無論數據規模多大,都可以在一次計算后找到目標(不考慮沖突的話)
本篇文章整理自:https://www.cnblogs.com/my_life/articles/11510146.html