? 用 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 快速排序
│ │ ├── 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 实现算法并替代?方?供的函数?愚蠢的事? .但这决不代表斟酌算法就?件无意义的事 , 每个算法??一种思?的结晶 , 学习?秀的思? , 开拓思维
什??算法?
直白地说,算法就?任何?确定义的计算过程,?接收一些值?集??作为输入,并产生一些值?集??作为输出。这样,算法就?将输入转换为输出的一系?计算过程。来?:Thomas H. Cormen, Chales E. Leiserson (2009), 《算法导论第三?》。
简而言之,?们可以说算法就?用来解决一个特定任务的一系?步骤??的,不止计算机在使用算法,人类也?样如此)。目前,一个有?的算法应该?有三个重?特性:
- ?必须?有?的:如果你设计的算法永无休止地尝试解决问?,那???无用的。
- ?必须具备?确定义的指令:算法的每一步?必须准确定义,在任何场景下指令?应当没有歧义。
- ?必须?有?的:一个算法被设计用以解决?个问?,那??就应当?解决这个问?,并且仅仅使用纸和笔就???该算法?收敛的。
对数
log10100 相当于问"将多少个10相?的结果为100",答?当然?2个了 因此log10100=2,即对数?算?幂?算的逆?算
| 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表示法
大O表示法?一种特殊的表示法 ,指出了算法的速度有多快。有个屌用啊,实际上,你经常?去复??人的代?。 在这种?况下,知?这些算法的速度有快有慢
- 算法的?行时间以不?的速度增加
- 例如简单查找与二?查找的区?
| ?素 | 简单查找 | 二?查找 |
|---|---|---|
| 100个?素 | 100ms | 7ms |
| 10000个?素 | 10s | 14ms |
| 1 000 000 000 个?素 | 11天 | 30ms |
- 大
O表示法指出了算法有多快,例如?表包?n个?素,简单查找需?检查每个?素,因此需?执行n次操作 使用大O表示法这个?行时间为O(n),二?查找需?执行logn次操作,使用大O表示为O(log n)- 一些常?的大O?行时间
- O(log n) ,也叫对数时间,这样的算法包括二?算法
- O(n),也叫线性时间,这样的算法包括简单查找。
- O(n * log n) 快速排序
- O(n2),选择排序
- O(n!) 即??时间
- 这里?重点
- 算法的速度指的并非时间,而?操作数的增速
- ?论算法的速度时间时,?们说的?随着输入的增加,其?行时间将以什?样的速度增加
- 算法的?行时间用大O表示法表示
- O(log n)比O(n)快,当需??索的?素越多时,前者比?者快的越多
编写解决实际问?的程序过程
- 如何用数据形式描述问?,即将问?抽象为一个数学模型
- 问?所涉及?的数据量的大小及数据之间的关系
- 如何在计算机中储?数据及体现数据之间的关系
- 处?数据时需?对数据执行的操作
- 编写的程序的性???良好
数据(Data)
- ?客观事物的符号表示,在计算机科学中指的?所有?输入?计算机中并被计算机程序处?的符号的总称。
- 数据?素(Data Element) :?数据的基本单位,在程序中通常作为一个整体来进行?虑和处?。一个数据?素可由若干个数据项(Data Item)组??。
- 数据项(Data Item) : ?数据的不可?割的最小单位。数据项?对客观事物?一方面特性的数据描述。
- 数据对象(Data Object) :?性质相?的数据?素的集??,?数据的一个?集。如字符集??C={?A’,’B’,’C,…} 。
- 数据结构 :相互之间具有一定?系的数据?素的集??。
- 数据的逻辑结构 : 数据?素之间的相互关系称为逻辑结构。
- 数据操作 : 对数据?进行的?算
- 数据类型(Data Type):指的?一个值的集??和定义在该值集上的一组操作的总称。
数据的逻辑结构有四种基本类型
- 集??:结构中数据?素之间除了“属于?一个集??"外,再也没有其他的关系
- 线性结构:结构中的数据?素?在一对一的关系
- 树形结构:结构中的数据?素?在一对多的关系
- 网状?者图状结构:结构中的数据?素?在多对多的关系
数据结构的储?方式
由数据?素之间的关系在计算机中有两种不?的表示方法——顺序表示和非顺序表示,从?导出两种储?方式,顺序储?结构和链式储?结构
- 顺序?储结构:用数据?素在?储器中的相对位置来表示数据?素之间的逻辑结构(关系),数据?素?放的地址?连续的
- 链式?储结构:在每一个数据?素中增加一个?放另一个?素地址的指?(pointer),用该指?来表示数据?素之间的逻辑结构(关系),数据?素?放的地址??连续没有?求
数据的逻辑结构和物?结构?密不可?的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的?储结构
算法(Algorithm)
?对特定问?求解方法(步骤)的一种描述,?指令的有?序?,其中每一条指令表示一个?多个操作。
算法具有以下五个特性
- 有穷性: 一个算法必须总?在执行有穷步之?结束,且每一步?在有穷时间内完??
- 确定性:算法中每一条指令必须有确?的?义,不?在二义性,且算法只有一个入口和一个出口
- 可行性: 一个算法??行的,即算法描述的操作?可以通过已经实现的基本?算执行有?次来实现
- 输入: 一个算法有零个?多个输入,这些输入取自于?个特定的对象集??
- 输出: 一个算法有一个?多个输出,这些输出??输入有着?些特定关系的量
算法和程序?两个不?的概念
一个计算机程序?对一个算法使用?种程序设计语言的具体实现。算法必须可?止意味着不?所有的计算机程序??算法。
评价一个好的算法有以下几个标准
- 正确性(Correctness ): 算法应满足具体问?的需
- 可读性(Readability): 算法应容?供人?读和交?,可读性好的算法有助于对算法的?解和修改
- ?壮性(Robustness): 算法应具有容错处?,当输入非法?错误数据时,算法应?适当地作出反应?进行处?,而不会产生莫?其妙的输出结果
- 通用性(Generality): 算法应具有一?性 ,即算法的处?结果对于一?的数据集?????立
?率与?储量需求: ?率指的?算法执行的时间;?储量需求指算法执行过程中所需?的最大?储空间,一?地,这两者与问?的规模有关
算法的时间复杂度
算法中基本操作重复执行的次数?问?规模n的?个函数,其时间量度记作T(n)=O(f(n)),称作算法的?近时间复杂度(Asymptotic Time complexity),简称时间复杂度
算法的空间复杂度
?指算法编写??程序?,在计算机中?行时所需?储空间大小的度量,记作:S(n)=O(f(n)),其中n为问?规模
递归和循环的简单比?:
- 从程序上看,递归表现为自己?用自己,循环?没有这样的形式。
- 递归?从问?的最?目标出发,??将复杂问?化为简单问?,并且简单的问?的解决思路和复杂问?一样,?时?在基准?况,就?最?求得问?,?逆?的。而循环?从简单问?出发,一步步的?前发展,最?求得问?,?正?的。
- 任意循环??可以用递归来表示的,但??用循环来实现递归?除了单?递归和尾递归),?必须引入?结构进行压?出?。
- 一?来说,非递归的?率?于递归。而且递归函数?用?有开销的,递归的次数受堆?大小的??。
一起进步学习
- Fork ?的项目并?交你的
idea - Pull Request
- Merge
纠错
如果大家发现有什?不对的地方,可以发起一个issue?者pull request,?会及时纠正
补充:发起pull request的commit message请参?文章Commit message 和 Change log 编写指南
致谢
感谢以下朋友的issue?pull request:
-
License
MIT