當“人工智能”、“AlphaGo”、“無人駕駛”、“智能投顧”等詞語不斷在人們視野中出現的時候,意味著我們正步入一個算法的時代。計算機通過提供給人類每天要面臨的各種選擇的最優解,從而讓我們能更加高效的生活在這個信息爆炸的時代。
而對於大多數非算法專業領域的程序員來說,也逐漸意識到了算法的重要性。學習算法,從而更好的應用算法,通過算法去優化代碼,提高程序效率。
什麼是算法
必須知道的十大程序員開發用到的基本算法
- 快速排序算法
- 最排序算法
- 歸併排序
- 二分查找算法
- BFPRT(線性查找算法)
- DFS(深度優化算法)
- BFS(過度優化搜索)
- Dijkstra算法
- 動態規劃算法
- 樸素貝葉斯分類算法
經典排序算法總結--冒泡、快排、插入、希爾、歸併、選擇
算法學習之算法思想
算法的英文名稱是Algorithm,這個詞在1957年之前在Webster's New World Dictionary(《韋氏新世界詞典》)中還未出現,只能找到帶有它的古代涵義的較老形式的“Algorism”(算術),是指用阿拉伯數字進行算術運算的過程。在中世紀時,珠算家用算盤進行計算,而算術家用算術進行計算。
根據經驗和發展結論得出,算法應該具有如下五個重要的特徵。
- 有窮性:保證執行有限步驟之後結束;
- 確切性:每一步驟都有確切的定義;
- 輸入:每個算法有零個或多個輸入,以刻畫運算對象的初始情況,所謂零個輸入是指算法本身定除了初始條件;
- 輸出:每個算法有一個或多個輸出,顯示對輸入數據加工後的結果。沒有輸出的算法是毫無意義的;
- 可行性:在原則上算法能夠精確地運行,進行有限次運算後即可完成一種運算。
時間複雜度和空間複雜度詳解
算法的時間複雜度和空間複雜度合稱為算法的複雜度。
一般情況下,算法中基本操作重複執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間複雜度,簡稱時間複雜度。
一個程序的空間複雜度是指運行完一個程序所需內存的大小。利用程序的空間複雜度,可以對程序的運行所需要的內存多少有個預先估計。
白話解釋 對稱加密算法 VS 非對稱加密算法
對稱加密算法 (Symmetric-key algorithm) 和非對稱加密算法 (asymmetric key encryption algorithm) 只不過就是密碼學 (encryption) 中的兩種解密算法罷了,什麼是算法,你就可以理解成為是一種規則吧,這種規則可以將信息從一種形式轉變成另一種形式
《算法新解》作者劉新宇:我只是想打開那些黑盒子,告訴人們裡面有什麼。
他七年磨一劍,筆耕不輟,寫成《算法新解》一書。
《算法新解》總共分4部分——樹、堆、隊列和序列、排列和搜索,用函數式和傳統方法介紹主要的基本算法和數據結構,數據結構部分包括二叉樹、紅黑樹、AVL樹、Trie、Patricia、後綴樹、B樹、二叉堆、二項式堆、斐波那契堆、配對堆、隊列、序列等;基本算法部分包括各種排序算法、序列搜索算法、字符串匹配算法(KMP等)、深度優先與廣度優先搜索算法、貪心算法以及動態規劃。
算法與數據結構
數據結構和算法開篇
如果說,熟練掌握編程語言是外功,那麼數據結構可謂是內功心法了
- 抽象數據類型(ADT)的物理實現
- “數據結構”是計算機中存儲,組織數據的方式。
- “數據結構是數據對象”以及存在於該對象的實例和組成實例的數據元素之間的各種聯繫
- 解決問題方法的效率跟數據的組織方式、空間的利用效率和算法的巧妙程度有關
數據結構與算法——常用數據結構及其Java實現
本系列將採用Java語言來進行描述。亦即總結常見的的數據結構,以及在Java中相應的實現方法,務求理論與實踐一步總結到位。
學習數據結構與算法之鏈表
鏈表一種常見的數據結構,可以存儲有序的元素集合。不同於數組,鏈表中元素在內存中不是連續放置,同時每一個鏈表元素中除了本身的節點還保存了指向下一個元素的引用,這些特點使得鏈表元素在動態增加和刪除時不必移動其他元素,但是訪問鏈表元素時必須從起點開始迭代列表直到找到目標元素。
單鏈表操作(面試必看)
單鏈表經常為公司面試所提及,先不貶其過於簡單,因為單鏈表確實是數據結構中最簡單的一部分,但往往最簡單的,人們越無法把握其細節。
本文一共總結了單鏈表常被提及的各種操作,如下:
- 逆序構造單鏈表;
- 鏈表反轉;
- 鏈表排序;
- 合併兩個有序鏈表;
- 求出鏈表倒數第k個值;
- 判斷鏈表是否有環,有環返回相遇節點;
- 在一個有環鏈表中找到環的入口;
- 刪除當前節點;
- 找出鏈表的中間節點。
飛龍的程序員書單 – 數據結構、算法
算法學習
算法學習筆記
算法虐我千百遍,我待算法如初戀。這裡的內容是我學習算法過程的一些記錄,希望能一直堅持下去。
學習方法
- 把所有經典算法寫一遍
- 看算法有關源碼
- 加入算法學習社區,相互鼓勵學習
- 看經典書籍
- 刷題
算法導論-學習筆記與進度
算法深入研究
神經網絡——後向傳播算法詳解
所謂神經網絡是一組連接的輸入/輸出單元,類似於人腦中的神經細胞,其中每個連接都與一個權重相關聯。學習階段通過輸入元組,不斷的調整權重參數,使得它能夠預測輸入元組的正確類標號。
所謂類標號,是某種類別的標號。
筆記:散列算法的使用場景
MD5 和 SHA 系列算法都屬於同一類——我還沒給這類算法找到一個足夠貼切的名字。首先在大的分類上,它們都是散列算法。
散列是怎麼個定義呢?典型的散列算法可以是任何一個:具有無限的定義域,且具有有限的值域的函數。甚至,寬鬆的廣義散列算法可以是任何一個(數學意義上的)函數,因為函數本身的概念就是將一個或多個值映射到一個唯一的值。
紅黑樹插入算法實現原理分析
紅黑樹是在實際工程中被廣泛應用的一種數據結構,比如Linux中的線程調度就是使用的紅黑樹來管理進程控制塊,而Nginx中也是使用紅黑樹來管理的timer,Java中的TreeMap和TreeSet也是基於紅黑樹來實現的。
紅黑樹相比普通二叉查找樹的一個優勢就是它的樹高為~lgN,所以不管是查找/插入/刪除操作它均能保證能夠在對數時間之內完成。本文我們就先來了解一下紅黑樹插入算法的實現。
二叉查找樹實現原理分析
二叉查找樹是一種能將鏈表插入的靈活性和有序數組查找的高效性結合起來的一種重要的數據結構,它是我們後面學習紅黑樹和AVL樹的基礎,本文我們就先來看一下二叉查找樹的實現原理。
【算法】遞歸算法之n階矩陣行列式求解
設計算法時使用遞歸的思想是一個程序員的基本素質,遞歸可以把一個很龐大的問題轉化為規模縮小了的同類問題的子問題,通過這一思想,我們編程時運用遞歸可以使用很少的代碼來處理很大的問題。這篇文章將會講到遞歸算法的運用。
今年過年微信紅包成了全民焦點,雖然大多數的紅包就一塊八角的樣子,還是搞得大家樂此不彼地,蛋爺我年三十晚什麼都沒幹就守在手機旁邊不是搖手機紅包就是搶群紅包。作為一名程序猿,自然會想了解下紅包的實現細節。我在網上谷歌了下,微信目前是沒有公佈紅包的實現細節的,所以這裡就提出一個自己的方案。
算法第四版4.1-無向圖詳解
四種重要的圖模型:
- 無向圖(簡單連接)
- 有向圖(連接有方向性)
- 加權圖(連接帶有權值)
- 加權有向圖(連接既有方向性又帶有權值)
一致性哈希算法 CARP 原理解析, 附 Golang 實現
在後端服務開發的過程中, 遇到了這樣一個問題: 需要在 mysql 前面部署 redis 做一層緩存,要求 redis 是集群部署, 並且每臺 redis 節點只緩存總數據量的 1/N, N 為 redis 的個數。
最優化問題的解法 - 動態規劃
動態規劃常用於最優化問題。可能存在多個取最優解的值,希望找到其中一個最優解。 動態規劃的設計分為以下四個步驟:
- 描述最優解結構
- 遞歸定義最優解的值
- 按自底向上的方式計算最優解的值
- 由計算出的結果構造一個最優解
機器學習中的算法
[乾貨]什麼是機器學習?基礎機器學習算法
哲學要回答的基本問題是從哪裡來、我是誰、到哪裡去,尋找答案的過程或許可以借鑑機器學習的套路:組織數據->挖掘知識->預測未來。組織數據即為設計特徵,生成滿足特定格式要求的樣本,挖掘知識即建模,而預測未來就是對模型的應用。
機器學習算法經驗總結
整體上看,機器學習就是模仿人識別事物的過程,即:學習、提取特徵、識別、分類。由於機器不能跟人類思維一樣根據事物特徵自然而然的選擇分類方法,所以機器學習方法的選擇依然還需要人工選擇。
機器學習方法非常多,也很成熟。
- SVM
- KNN
- Naive Bayes
- 迴歸
- 決策樹
JavaScript機器學習之KNN算法
KNN是k-Nearest-Neighbours的縮寫,它是一種監督學習算法。KNN算法可以用來做分類,也可以用來解決迴歸問題。
簡單地說,KNN算法由那離自己最近的K個點來投票決定待分類數據歸為哪一類。
機器學習從入門到放棄之KNN算法
利用KNN的具體步驟:
-計算上述圖中所有點到達待測點的歐式距離(勾股定理計算)。 -選出離待測點最近的K個點,k由用戶指定。 -計算在這k個點中,各個類型的個數 -將個數最多的類型作為預測點的類型。
機器學習:基於網格的聚類算法
在機器學習中,聚類算法是一種無監督分類算法。聚類算法很多,包括基於劃分的聚類算法(如:kmeans),基於層次的聚類算法(如:BIRCH),基於密度的聚類算法(如:DBScan),基於網格的聚類算法等等。
基於劃分和層次聚類方法都無法發現非凸面形狀的簇,真正能有效發現任意形狀簇的算法是基於密度的算法,但基於密度的算法一般時間複雜度較高,1996年到2000年間,研究數據挖掘的學者們提出了大量基於網格的聚類算法,網格方法可以有效減少算法的計算複雜度,且同樣對密度參數敏感。
算法與加密
常見的安全算法
本文整理了常見的安全算法,包括MD5、SHA、DES、AES、RSA等,並寫了完整的工具類(Java 版),工具類包含測試。
Java 加密算法
JAVA加密算法(1)- 密碼學概述及BASE64算法使用
密碼學基本功能:機密性、鑑別、報文完整性、不可否認性
JAVA加密算法(2)- 消息摘要算法(MD5、SHA、HMAC)
對消息通過一個單向Hash算法進行計算,得到一個唯一的結果。每個消息對應一個唯一結果,所有結果的長度固定。
JAVA加密算法(3)- 對稱加密算法(DES、3DES、AES)
對稱加密算法概念:加密密鑰和解密密鑰相同,大部分算法加密揭秘過程互逆。
- 特點:算法公開、(相比非對稱加密)計算量小、加密速度快、效率高。
- 弱點:雙方都使用同樣的密鑰,安全性得不到保證。
JAVA加密算法(4)- 非對稱加密算法(DH,RSA)
發送者使用接收者的公鑰加密,接收者使用自己的私鑰解密。需要兩個密鑰進行加密或解密,分為公鑰和私鑰
- 特點:安全性高,速度慢
JAVA加密算法(5)- 數字簽名算法(RSA、DSA)
常用簽名算法
- RSASignature
- DSASignature
- ECDSASignature(需Bouncy Castle)
前端也要學算法
為什麼我認為數據結構與算法對前端開發很重要?
目前為止我參加過幾次前端開發方面的面試,確實有不少面試官會問道一些算法。通常會涉及的,是鏈表、樹、字符串、數組相關的知識。前端面試對算法要求不高,似乎已經是業內的一種共識了。雖說算法好的前端面試肯定會加分,但是僅憑常見的面試題,而不去聯繫需求,很難讓人覺得,算法對於前端真的很重要。
關於Web開發中“程序=數據結構+算法”的思考
輸入輸出思想
- 相對於前端程序來說,前端用戶的操作為輸入,然後經過邏輯處理後,把數據輸出到後端;
- 相對於後端程序來說,從數據庫取數據算做輸入,然後經過處理後,輸出到前端展示;
- 相對於數據庫來說,對於數據的操作指令為輸入,操作後產生的輸出結果為輸出(如刪除成功返回值,寫入成功後返回值等)
我接觸過的前端數據結構與算法
綜合以上,本篇討論了幾個話題:
- 遞歸和查DOM
- Set/Map的實現
- 數組去重的幾種方法比較
- 棧和堆
- 節流
- 圖像處理
本篇從前端的角度對一些算法做一些分析和總結,只列了一些我認為比較重要,其它的還有很多沒有提及。算法和數據結構是一個永恆的話題,它的目的是用最小的時間和最小的空間解決問題。但是有時候不用太拘泥於一定要最優的答案,能夠合適地解決問題就是好方法,而且對於不同的應用場景可能要採取不同的策略。反之,如果你的代碼裡面動不動就是三四重循環,還有嵌套了很多if-else,你可能要考慮下采用合適的數據結構和算法去優化你的代碼。
覺得本文對你有幫助?請分享給更多人。
閱讀更多 BigOffer 的文章