当前位置: 首页 > 后端技术 > PHP

PHP实现的各种算法集合

时间:2023-03-29 21:05:16 PHP

项目地址https://github.com/m9rco/algo...滥用简单结构├──包│├──Sort排序文章│├──BubbleSort.php冒泡排序││├──HeapSort.php堆排序大根堆│├──MBaseSort.php基数排序MSD││├──LBaseSort.php基数排序LSD││├──QuickSort.php快速排序││├──ShellSort.php壳牌排序││├──MergeSort.php归并排序││├──InsertSort.php插入排序││└──SelectSort.php选择排序│││├──查询搜索文章││├──BinaryQuery.php二分搜索││├──InseertQuery.php插入搜索││├──FibonacciQuery.phpFibonacciQuery.phpNaqi搜索││└──QuickQuery.php快速搜索││├──Structure数据结构││├──StackExample.phpStackFirstInLastOutLIFO(后进先出)││├──LinearChain.php线性表链式存储││└──LinearOrder.php线性表订单入库│││├──工具小工具集││└──SystemSwitch.php堆栈转换│││└──其他│├──MonkeyKing.php约瑟夫环│├──DynamicProgramming.php动态规划│├──Fibonacci.php斐波那契数列│├──StealingApples.php偷苹果过剩│├──HanoiGames.php河内塔游戏│├──BidirectionalQueue.php双向队列│├──ColorBricks.php彩砖│├──GetCattle.php牛年│├──OnlyNumbers.php查找唯一数字│├──PokerGames.php洗牌│└──BigSmallReplace.phpHelloWorld输出OllehDlrow│├──LICENSE└──README.md做什么把理解算法和数据结构的过程记录下来,尽量简单、全面、详细,方便算法的学习和灵活运用,加油(???_??)?当然用PHP傻了实现算法并替换官方函数。但这并不意味着思考算法就没有意义。每一个算法都是思想的结晶。学习优秀的想法并扩展您的思维。什么是算法?直截了当地说,算法是任何定义明确的计算过程,它采用一些值或设置作为输入并产生一些值或设置作为输出。因此,算法是将输入转换为输出的一系列计算过程。资料来源:ThomasH.Cormen、ChalesE.Leiserson(2009),《算法导论第三版》。简而言之,我们可以说算法是用于解决特定任务的一系列步骤(是的,不仅计算机使用算法,人类也使用算法)。目前,一个高效的算法应该具有三个重要的属性:它必须是有限的:如果你设计一个算法,不断地尝试解决一个问题,它是没有用的。它必须有明确的指令:算法的每一步都必须精确定义,任何场景下的指令都不能有歧义。它必须是高效的:设计一个算法来解决一个问题,那么它应该能够解决这个问题,并且可以证明该算法仅使用笔和纸就可以收敛。对数log10100相当于问“有多少个10乘以100”,答案当然是2,所以log10100=2,即对数运算是幂运算的逆运算leftright23=8log28=324=16log216=425=32log232=5战斗吧!Teenageruntime以二分查找为例,使用它可以节省多少时间?简单的查诸葛查数,如果列表有100个数,你最多需要猜100次。换句话说,需要的最大猜测次数与列表的长度相同,称为线性时间,而二分查找则不同。如果列表包含100个元素,则最多需要7次。如果列表包含40亿个数字,最多需要32次猜测,子搜索以对数时间运行O(log)大O表示法大O表示法是一种特殊的表示法,表示算法有多快。有个屌丝,其实你经常要抄别人的代码。在这种情况下,知道这些算法快和慢算法运行时间以不同的速率增加,例如简单搜索和二进制搜索之间的差异元素简单搜索二进制搜索100个元素100ms7ms10000个元素10s14ms1000000000个元素11每天30毫秒大O表示算法有多快是。例如,一个列表包含n个元素。一个简单的查找需要检查每一个元素,所以需要进行n次操作。使用大O表示运行时间为O(n),二分查找需要进行logn次操作,使用大O表示O(logn)一些常见的大O运行时间为O(logn),也叫对数时间,比如算法包括二进制算法O(n),也称为线性时间,此类算法包括简单搜索。O(n*logn)快速排序O(n2),选择性排序O(n!)这里是阶乘时间是这里的重点。算法的速度不是指时间,而是指操作数的速度。在讲算法的速度时,我们是说它的运行时间随着输入的增加会增加多快,后者越快,越是写程序解决实际问题的过程如何用数据的形式来描述问题,也就是把问题抽象成一个数学模型问题涉及的数据的大小以及数据之间的关系如何在计算机中存储数据并反映数据之间的关系在处理数据时,程序的性能需要在数据上执行好。数据(Data)是客观事物的符号表示。在计算机科学中,它是指所有可以输入计算机并由计算机程序处理的东西。符号的总称。数据元素(DataElement):是数据的基本单位,在程序中通常作为一个整体来考虑和处理。一个数据元素可以由多个数据项(DataItem)组成。数据项(DataItem):是不可分割的最小数据单位。数据项是对客观事物某一方面的数据描述。数据对象(DataObject):是具有相同性质的数据元素的集合,是数据的子集。如字符集C={‘A’,’B’,’C,…}。数据结构:相互之间具有一定关系的数据元素的集合。数据的逻辑结构:数据元素之间的相互关系称为逻辑结构。数据操作:对数据进行的操作数据类型:是指对一组值和定义在该值集上的一组操作的总称。数据的逻辑结构中有四种基本的集合类型:结构中的数据元素之间除了“属于同一个集合”之外没有其他关系。线性结构:结构中的数据元素之间存在一对一的关系树结构:结构中的数据元素之间存在一对多的关系网络或图结构:结构中的数据元素之间存在多对多的关系对多关系。数据结构的存储方式是通过数据元素之间的关系,在计算机中用两种不同的表示法来表示的。Method——顺序表示和非顺序表示,由此衍生出两种存储方式,顺序存储结构和链式存储结构。),数据元素中存储的地址是一个连续的链式存储结构:在每个数据元素中添加一个指针(pointer)来存储另一个元素的地址,并用这个指针来表示数据元素之间的逻辑结构(关系),数据元素中存储的地址是否连续并不要求数据的逻辑结构和物理结构是密不可分的两个方面。算法的设计依赖于选择的逻辑结构,算法的实现依赖于采用的存储结构算法(Algorithm)是对具体问题求解方法(步骤)的描述,是一个有限的指令序列,其中每一个代表一个或多个操作。算法具有以下五个有限性性质:一个算法总是在执行完有限步后结束,并且每一步都在有限的时间内完成只有一个入口和一个出口。可行性:一个算法是可行的,即算法所描述的操作可以执行有限次数来实现输入:一个算法有零个或多个输入,这些输入取自一组特定的对象。输出:一种算法有一个或多个输出,这些输出是与输入有某种特定关系的量。算法和程序是两个不同的概念。计算机程序是一种算法,是用编程语言具体实现的。算法必须终止这一事实意味着并非所有计算机程序都是算法。评价一个好的算法有几个标准。正确性:算法应该满足特定问题的需要。可读性:算法应该易于人们阅读和交流。可读性好的算法对算法有帮助。理解和修改鲁棒性(Robustness):算法应该有容错处理。当输入非法或错误的数据时,算法应该能够做出适当的响应或处理,而不会产生莫名其妙的输出结果。Generality:算法应该是通用的,即算法的处理结果能够满足一般数据集的效率和存储要求:效率是指算法的执行时间;存储要求是指算法执行过程中需要的最大存储空间,一般来说,两者与问题的规模有关。算法的时间复杂度。算法中基本操作的重复执行次数是问题规模n的函数,其时间度量记为T(n)=O(f(n)),称为算法的渐近时间复杂度(Asymptotic时间复杂度),简称时间复杂度。算法的空间复杂度是指算法写入程序后,在计算机中运行所需存储空间的度量,记为:S(n)=O(f(n)),其中n是递归和循环在问题规模上的简单比较:从程序的角度来看,递归表现为调用自身,而循环则没有这种形式。递归从问题的最终目标出发,逐步将复杂问题转化为简单问题,简单问题的解法与复杂问题相同。同时有一个baseline的情况,最终可以得到这个问题,就是逆向的。循环从一个简单的问题开始,一步步发展,最终解决问题,这是积极的。任何循环都可以用递归来表示,但是如果要用循环来实现递归(单向递归和尾递归除外),就必须引入栈结构来进行入栈和出栈。通常,非递归比递归更有效。而且递归函数调用是有开销的,递归次数受栈大小限制。一起学习Fork我的项目,提交你的ideaPullRequestMerge纠错如果发现不对可以发起issue或者pullrequest,我会及时改正补充:pullrequest的commitmessage请参考文章Commitmessage和Changelog编写指南致谢感谢以下朋友的issue或pullrequest:hailwoodzhangxuanruifreesecopensetLicenseMIT