项目地址 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