項目地址 https://github.com/m9rco/algo...php
每週最少一更,求出題,求虐待 At least once a week, ask for problems and abuse
├──Package │ ├── Sort 排序篇 │ │ ├── BubbleSort.php 冒泡排序 │ │ ├── HeapSort.php 堆排序 大根堆 │ │ ├── MBaseSort.php 基數排序 MSD │ │ ├── LBaseSort.php 基數排序 LSD │ │ ├── QuickSort.php 快速排序 │ │ ├── ShellSort.php 希爾排序 │ │ ├── MergeSort.php 歸併排序 │ │ ├── InsertSort.php 插入排序 │ │ └── SelectSort.php 選擇排序 │ │ │ ├── Query 查找篇 │ │ ├── BinaryQuery.php 二分查找 │ │ ├── InseertQuery.php 插入查找 │ │ ├── FibonacciQuery.php 斐波那契查找 │ │ └── QulickQuery.php 快速查找 │ │ │ ├── Structure 數據結構 │ │ ├── StackExample.php 堆棧 先進後出 LIFO (Last In First Out) │ │ ├── LinearChain.php 線性表 單鏈存儲 │ │ └── LinearOrder.php 線性表 順序存儲 │ │ │ ├── Tools 小工具集 │ │ └── SystemSwitch.php 堆棧實現進制轉換 │ │ │ └── Other 其餘 │ ├── MonkeyKing.php 約瑟夫環 │ ├── DynamicProgramming.php 動態規劃 │ ├── Fibonacci.php 斐波那契數列 │ ├── StealingApples.php 偷蘋果求餘 │ ├── HanoiGames.php 漢諾塔遊戲 │ ├── BidirectionalQueue.php 雙向隊列 │ ├── ColorBricks.php 彩色磚塊 │ ├── GetCattle.php 牛年求牛 │ ├── OnlyNumbers.php 求惟一數 │ ├── PokerGames.php 洗撲克牌 │ └── BigSmallReplace.php Hello World 輸出 Olleh Dlrow │ ├──LICENSE └──README.md
記錄本身理解算法,數據結構的過程,儘量的簡單全面以及詳細,讓算法學習運用靈活自如,加油(ง •̀_•́)ง
用 PHP 實現算法並替代官方提供的函數是愚蠢的事情 .但這覺不表明斟酌算法就是件無心義的事 , 每一個算法都是一種思想的結晶 , 學習優秀的思想 , 開拓思惟
直白地說,算法就是任何明肯定義的計算過程,它接收一些值或集合做爲輸入,併產生一些值或集合做爲輸出。這樣,算法就是將輸入轉換爲輸出的一系列計算過程。來源:Thomas H. Cormen, Chales E. Leiserson (2009), 《算法導論第三版》。html
簡而言之,咱們能夠說算法就是用來解決一個特定任務的一系列步驟(是的,不止計算機在使用算法,人類也一樣如此)。目前,一個有效的算法應該含有三個重要特性:git
log10100 至關於問"降多少個10相乘的結果爲100",答案固然是2個了
所以log10100=2,即對數運算是冪運算的逆運算github
left | right |
---|---|
23 = 8 | log28 = 3 |
24 = 16 | log216 = 4 |
25 = 32 | log232 = 5 |
戰鬥吧!少年算法
以二分查找爲例,使用它可節省多少時間呢?簡單查找諸葛地檢查數字,若是列表包含100個數字,最多須要猜100次。
換而言之最多須要猜想的次數與列表長度相同,這被稱爲線性時間(linear time),而二分查找則不一樣,若是列表包含100個元素
最多須要7次,若是列表包含40億個數字,最多需猜32次,而分查找的運行時間爲對數時間 O(log)
數據結構
大O表示法是一種特殊的表示法 ,指出了算法的速度有多快。有個屌用啊,實際上,你常常要去複製別人的代碼。
在這種狀況下,知道這些算法的速度有快有慢ide
算法的運行時間以不一樣的速度增長函數
元素 | 簡單查找 | 二分查找 |
---|---|---|
100個元素 | 100ms | 7ms |
10000個元素 | 10s | 14ms |
1 000 000 000 個元素 | 11天 | 30ms |
O
表示髮指出了算法有多快,例如列表包含n
個元素,簡單查找須要檢查每一個元素,所以須要執行n
次操做O
表示發這個運行時間爲O(n)
,二分查找須要執行logn次操做,使用大O
表示爲O(log n)
一些常見的大O運行時間工具
這裏是重點性能
由數據元素之間的關係在計算機中有兩種不一樣的表示方法——順序表示和非順序表示,從則導出兩種儲存方式,順序儲存結構和鏈式儲存結構
數據的邏輯結構和物理結構是密不可分的兩個方面,一個算法的設計取決於所選定的邏輯結構,而算法的實現依賴於所採用的存儲結構
是對特定問題求解方法(步驟)的一種描述,是指令的有限序列,其中每一條指令表示一個或多個操做。
算法具備如下五個特性
算法和程序是兩個不一樣的概念
一個計算機程序是對一個算法使用某種程序設計語言的具體實現。算法必須可終止意味着不是全部的計算機程序都是算法。
評價一個好的算法有如下幾個標準
效率與存儲量需求: 效率指的是算法執行的時間;存儲量需求指算法執行過程當中所須要的最大存儲空間,通常地,這二者與問題的規模有關
算法中基本操做重複執行的次數是問題規模n的某個函數,其時間量度記做T(n)=O(f(n)),稱做算法的漸近時間複雜度(Asymptotic Time complexity),簡稱時間複雜度
是指算法編寫成程序後,在計算機中運行時所需存儲空間大小的度量,記做:S(n)=O(f(n)),其中n爲問題規模
idea
若是你們發現有什麼不對的地方,能夠發起一個issue或者pull request,我會及時糾正
補充:發起pull request的commit message請參考文章 Commit message 和 Change log 編寫指南
感謝如下朋友的issue或pull request:
MIT