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