初識算法之美

本篇是學習了《趣學算法(第2版)》 第一章之後總結的。

在這裡插入圖片描述

對算法的理解:

計算機雖然可以高效的進行運算,但是有很多問題拼的不是算力,而是策略。如果沒有策略的去計算,那再強的運算能力也只能稱為「蠻力」。策略就是幫助我們如何用更少的計算步驟、更快的速度去運算出結果。換言之,策略就是你設計算法的思路,目的只有一個就是:快人一步。

計算機不同於人腦,人腦面對問題可以先去「觀察」、「分析」,然後把複雜轉化成簡單問題(跟數學題一樣,算法就是簡便的解題思路)。目前在絕大多數領域計算機還不具備這個功能,離開了人腦,計算機還只是一個人的使用工具罷了。

算法有兩個衡量標準:

  • 時間長短(時間複雜度)
  • 佔用內存大小(空間複雜度)

先展望一下學習歷程:

算法學習是一個循序漸進的過程,經常訓練解題能力,逐步積累解題方法策略,最後內化成自己的知識,靈活運用去應對新的問題。

「初極狹,才通人。復行數十步,豁然開朗。」,挺喜歡這句話😁

算法知識點

  1. 高斯算法(倒序相加)

  2. 數列求和

算法題目

求: $S_n = 1 + 2 + 2^2 + 2^3 + … + 2^{63}=$

該函數屬於爆炸增量函數

做題思路

方法一

公式法

如果還記得高中數學知識,不難發現,這是一個等比數列求和問題,$a_1 = 1,公比q = 2,n = 64$

等比數列求和公式:$$S_n = a_1 * \frac{1 – q^n}{1 – q} ,(q ≠ 1)$$

本文暫不講解公式推導過程

代入公式,上面的式子 = $1 * \frac{1 – 2^{64}}{1 – 2} = 2^{64} – 1 = 18446744073709551615$ ,從而轉化問題,解題

方法二

忘記方法叫什麼名字了,主要原理就是銷項,使問題轉化成第一項和最後一項的差。

根據原式,等號兩邊同時乘以2,得式子②$2S_n = 2 + 2^2 + 2^3 + … + 2^{63} + 2^{64}$

用式子② – 原式 = $S_n = 2^{64} – 1 =18446744073709551615$

據專家統計,每顆麥粒的平均重量約41.9毫克,這些麥粒的總重量為:

$18446744073709551615×41.9$

$=772918576688430212668.5(毫克)$

$≈7729000(億千克)$

全世界人口按77億計算,每人差不多可以分得100000千克(即100噸)!

總結

常見的算法時間複雜度有以下幾類。

  1. 常數階。
    常數階算法的運行次數是一個常數,如5、20、100。常數階算法的時間複雜度通常用O(1)表示。

  2. 多項式階。
    很多算法的時間複雜度是多項式,通常用 0(n)、$O(n2)$、$0(n3)$等表示。

  3. 指數階。
    指數階算法的運行效率極差,程序員往往像躲「惡魔」一樣避開這種算法。指數階算法的時間複雜度通常用$O(2n)$、$O(n!)$、$O(nn)$等表示。

  4. 對數階。
    對數階算法的運行效率較高,通常用$O(logn)$、$O(nlogn)$等表示。
    指數階增量隨着的增加而急劇增加,而對數階增長緩慢。它們之間的關係如下:

$$O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)O(n!)<O(nn)$$

在設計算法時,我們要注意算法複雜度增量的問題,盡量避免爆炸級增量。

通過上面一個算法小例子,又勾起了我對數學的興趣。算法跟數學是息息相關的,平常也要複習一下數學知識,相信也會有所幫助的。


我是 甜點cc

熱愛前端,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚,等待着一個創業機會。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。

希望能和大家一起努力營造一個良好的學習氛圍,為了個人和家庭、為了我國的互聯網物聯網技術、數字化轉型、數字經濟發展做一點點貢獻。數風流人物還看中國、看今朝、看你我。