Skip to content
master
Go to file
Code

README.md

? 用 PHP 的方式实现的?类算法??集 ?

php

English 

每周最少一更,求出?,求?待 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为问?规模

递归和循环的简单比?:

  1. 从程序上看,递归表现为自己?用自己,循环?没有这样的形式。
  2. 递归?从问?的最?目标出发,??将复杂问?化为简单问?,并且简单的问?的解决思路和复杂问?一样,?时?在基准?况,就?最?求得问?,?逆?的。而循环?从简单问?出发,一步步的?前发展,最?求得问?,?正?的。
  3. 任意循环??可以用递归来表示的,但??用循环来实现递归?除了单?递归和尾递归),?必须引入?结构进行压?出?。
  4. 一?来说,非递归的?率?于递归。而且递归函数?用?有开销的,递归的次数受堆?大小的??。

一起进步学习

  1. Fork ?的项目并?交你的 idea
  2. Pull Request
  3. Merge

纠错

如果大家发现有什?不对的地方,可以发起一个issue?者pull request,?会及时纠正

补充:发起pull request的commit message请参?文章Commit message 和 Change log 编写指南

致谢

感谢以下朋友的issue?pull request:

MIT

You can’t perform that action at this time.