英語
每週最少一次,求出問題,求虐待 每週至少一次,詢問問題和虐待
├──Package │ ├── Sort 排序篇 │ │ ├── BubbleSort.php 冒泡排序 │ │ ├── HeapSort.php 堆排序 大根堆 │ │ ├── MBaseSort.php 基数排序 MSD │ │ ├── LBaseSort.php 基数排序 LSD │ │ ├── QuickSort.php 快速排序 │ │ ├── ShuttleSort.php 飞梭排序 │ │ ├── ShellSort.php 希尔排序 │ │ ├── MergeSort.php 归并排序 │ │ ├── InsertSort.php 插入排序 │ │ └── SelectSort.php 选择排序 │ │ │ ├── Query 查找篇 │ │ ├── BinaryQuery.php 二分查找 │ │ ├── InseertQuery.php 插入查找 │ │ ├── FibonacciQuery.php 斐波那契查找 │ │ ├── BFSQuery.php 广度优先查找 │ ├── Kmp.php 算法导论-KMP算法 │ ├── DijkstraQuery.php 迪克斯特拉算法 │ │ └── QulickQuery.php 快速查找 │ │ │ ├── Structure 数据结构 │ │ ├── StackExample.php 堆栈 先进后出 LIFO (Last In First Out) │ │ ├── LinearChain.php 线性表 单链存储 │ │ └── LinearOrder.php 线性表 顺序存储 │ │ └── BinarySearchTree.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 洗扑克牌 │ ├── Interval.php 抽奖区间算法 │ ├── Maze.php 迷宫寻址算法 │ ├── AntsClimb.php 蚂蚁爬杆算法 │ ├── Encryption.php 对称加密算法 │ ├── ElevatorDispatch.php 编程之美-电梯调度算法 │ ├── PointInTriangle.php 向量叉集计算点是否在三角形中 │ ├── TraversalOfBinary.php 二叉树非递归遍历算法实现 │ ├── Knapsack.php 贪心算法之背包问题实现 │ └── BigSmallReplace.php Hello World 输出 Olleh Dlrow │ └── Solution.php Facebook面试题之岛屿周长算法 │ └── RotationSort.php Facebook面试题之顺时针回旋算法 │ └── Square.php Facebook面试题之判断四个点能否组成正方形算法 │ └── Prim.php Prim算法(最小生成树算法) │ └── CartesianProduct.php 笛卡尔积算法 │ └── Square.php 面试题之平面任意四点能否组成一个矩形 │ └── Judge.php 面试题之扑克牌中任选五张判断是不是顺子 │ └── Factorial.php 面试题之N的阶乘末尾有多少个0 | └── HashTable.php HashTable | └── RotateSort.php 面试题之风车旋转排序算法 │ ├──LICENSE └──README.md
记录自己理解算法,数据结构的过程,尽可能的简单全面以及详细,让算法学习运用灵活自如,加油(ง •̀_•́)ง
用 PHP 实现算法并替代官方提供的函数是愚蠢的事情 .但这决不代表斟酌算法就是件无意义的事 , 每个算法都是一种思想的结晶 , 学习优秀的思想 , 开拓思维
直白地說,演算法就是任何明確定義的計算過程,它接收一些值或集合輸入,並產生一些值或集合作為輸出。 Cormen, Chales E. Leiserson (2009), 《演算法導論第三版》。
那麼,我們可以說演算法就是用來解決一個特定任務的一系列步驟(是的,不只是電腦在使用演算法,人類也同樣如此)。
它一定是有限的:如果你設計的演算法永無止境地嘗試解決問題,那麼它是無用的。
它必須具備明確定義的指令:演算法的每一步都必須準確定義,在任何情況下指令都應該沒有歧義。
它必須是有效的:一個演算法設計能夠解決某個問題,那麼它就應該能解決這個問題,而只需使用紙和筆就可以證明該演算法是收斂的。
log 10 100 間接問“將多少個10相乘的結果為100”,答案當然是2個了 因此log 10 100=2,即對數裝甲是強力轟炸的逆裝甲
左邊 | 正確的 |
---|---|
2 3 = 8 | 對數2 8 = 3 |
2 4 = 16 | 對數2 16 = 4 |
2 5 = 32 | 對數2 32 = 5 |
以二分查找為例,用它可節省多少時間呢?稱為線性時間(線性時間),而二分查找則不同,如果列表包含100個元素最多需要7次,如果列表包含40億個數字,最多需猜測32次,而分查找的運行時間為對數字時間O(log)
大O表示法是一種特殊的表示法,指出了演算法的速度有多快。知道了有快有慢
以不同的速度增加演算法的運行時間
例如簡單替換與二分替換的區別
元素 | 簡單的名稱 | 二分查找 |
---|---|---|
100個元素 | 100毫秒 | 7毫秒 |
10000個元素 | 10秒 | 14毫秒 |
1 000 000 000 個元素 | 11天 | 30毫秒 |
大O
表示法指出了演算法有多快,例如列表包含n
個元素,簡單查找需要檢查每個元素,因此需要執行n
次操作使用大O
表示法這個運行時間為O(n)
,二分查找需要執行log n次操作,以大O
表示為O(log n)
一些常見的大O運行時間
O(log n) ,也稱為對數時間,這樣的演算法包括二分演算法
O(n),也稱為線性時間,這樣的演算法包括簡單查找。
O(n * log n) 快速排序
O(n 2 ),選擇排序
O(n!)即階乘時間
這裡是重點
演算法的速度指的不是時間,操作而是數的原來
在談到演算法的速度時間時,我們說的是隨著輸入的增加,其運行時間將會有什麼樣的速度增加
演算法的運行時間以大O表示法表示
O(log n)比O(n)快,當需要搜尋的元素越多時,開始比黎明快的越多
如何用數據形式描述問題即將到來,問題抽象化為一個數學模型
問題所涉及的資料量的大小及資料之間的關係
如何在電腦中儲存資料及資料表示之間的關係
處理資料時需要對資料執行的操作
編寫的程式性能是否良好
探究事物的符號是表示的,在計算機科學中指所有能輸入到計算機中並被計算機程式處理的符號的總稱。
資料元素(Data Element):是資料考慮的基本單位,在程式中通常以一個整體來進行和處理。
資料項(Data Item):是資料的不可分割的最小單位。
資料物件(Data Object):是性質相同的資料元素的集合,是資料的子集。
資料結構:相互之間具有一定聯繫的資料元素的集合。
資料的邏輯結構:資料元素之間的相互關係稱為邏輯結構。
資料操作:對資料要進行的侵害
資料類型(Data Type):指的是一個值的集合並定義在該值集上的一組操作的總稱。
集合:結構中資料元素之間除了「屬於同一個集合」之外,再也沒有其他的關係
線性結構:結構中的資料元素存在一對一的關係
樹狀結構:結構中的資料元素存在多種關係
網狀或圖狀結構:結構中的資料元素存在多對多的關係
由資料元素之間的關係在電腦中存在兩種不同的表示方法-順序表示和非順序表示,從則導出兩種儲存方式,順序儲存結構和鍊式儲存結構
順序儲存結構:以資料元素在記憶體中的相對位置來表示資料元素之間的邏輯結構(關係),資料元素貨架的位址是連續的
鏈儲存結構:在每個資料元素中增加一個貨架另一個元素位址的指標(指標),用該指標來表示資料元素之間的邏輯結構(關係),資料元素貨架的位址是否連續沒有要求
資料的邏輯結構和物理結構是密不可分的兩個方面,一個演算法的設計取決於所選定的邏輯結構,而演算法的實作依賴於所採用的儲存結構
是對特定問題流程圖(步驟)的一種描述,是指令的有限序列,其中每一條指令表示一個或多個操作。
具有以下五個特性的演算法
有窮性:演算法必須總是在執行有窮步之後結束,且每一步完成都在有窮期限
確定性:演算法中每一條指令必須有目的的意義,不存在二義性,且演算法只有一個入口和一個出口
吸氣:一個演算法是可行的,即演算法描述的操作都可以透過已經實現的基本磨損執行有限次來實現
輸入:一個演算法有零個或多個輸入,這些輸入取自於某個特定的物件集合
輸出:一個演算法有一個或多個輸出,這些輸出是同輸入某些關係特定的量
演算法和程式是兩個不同的概念
一個電腦程式是對一個使用某種程式設計語言的具體實現的演算法。
評價一個好的演算法有以下幾個標準
正確性(Correctness ):演算法滿足具體問題的需求
可執行性(可讀性):演算法應容易供人閱讀和交流,可執行性好的演算法有助於對演算法的理解與交流
健全性(Robustness):演算法應具有容錯,當輸入非法或錯誤資料處理時,演算法應能適當地作出反應或進行處理,而不會產生莫名其妙的結果輸出
通用性(Generality):演算法應具有一般性,即對於一般的資料集都成立時演算法的處理結果
效率與儲存量需求:效率指的是演算法執行的時間;儲存量需求指的是演算法執行過程中所需的最大儲存空間,一般來說,這與問題的規模有關
演算法中基本運算重複執行的次數是問題規模n的某個函數,其時間量度記作T(n)=O(f(n)),稱演算法的漸近時間複雜度(漸近時間複雜度) ,簡單時間複雜度
是指演算法編寫成程式後,在電腦中執行時所需儲存空間大小的關係,記作:S(n)=O(f(n)),其中n為問題規模
從程式上看,遞歸呼叫自己,循環則沒有這樣的形式。
多層是從問題的最終目標出發,逐步將複雜問題化為簡單問題,並且簡單問題的解決思路和復雜問題一樣,同時存在基準情況,可以最終求得問題,是逆向的。的問題出發,一步的向前發展,最終求得的問題,是正向的。
任何循環都可以用電位來表示的,但是想用循環來實現電位(除了單向電位和尾電位),都必須引入棧結構進行壓棧出棧。
,非梯度的效率隨之下降。
分叉我的專案並提交你的idea
請求請求
合併
如果大家發現什麼不對的地方,可以發起一個issue或pull request,我會及時修正
補充:發起pull request的commit message請參考文章Commit message和Change log編寫指南
感謝以下朋友的問題或拉取請求:
海爾伍德
張選茹
自由安全
開集
內羅謝齊
麻省理工學院