Code前端首页关于Code前端联系我们

PHP实现的不同算法集合

terry 2年前 (2023-09-25) 阅读数 47 #后端开发

项目地址github.com/PuShaoWei/....

每周至少一次提问和滥用。每周至少询问一次问题和虐待

简单的结构

├──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)、《算法导论第三版》。

简而言之,算法是用于解决特定任务的一系列步骤(是的,算法不仅由计算机使用,而且也由人类使用)。目前,一个高效的算法应该具有三个重要的属性:

  • 它必须是有限的:如果你设计的算法试图无休止地解决问题,那么它是无用的。
  • 必须有明确定义的指令:算法的每一步都必须明确定义,并且指令在每个场景中都必须明确。
  • 这必须是有效的:一个算法是为了解决一个问题而设计的,那么它应该能够解决这个问题,并且能够证明该算法仅使用纸和铅笔就能收敛。

对数

log10100 相当于“100 乘以多少个 10”的问题。答案当然是 2
所以 log10100=2,即对数。16 = 4

25 = 32 logloglog22 =52s!未成年人

运行时间

以二分查找为例。使用它可以节省多少时间?查一下诸葛狄就知道了。如果列表中有 100 个数字,您最多需要猜测 100 次。
也就是说,需要猜测的最大次数与列表的长度相同,称为线性时间。二分查找则不同。如果列表包含 100 个元素,则
最多需要 7 次猜测。如果列表包含 40 亿个数字,则最多需要 32 次猜测,并且分割搜索的运行时间是对数时间 O(log)

Big O 表示法

Big O 是表示速度有多快的特殊表示法算法是。有一个技巧,实际上你经常需要复制别人的代码。在这种情况下,知道这些算法快或慢

  • 算法的运行时间以不同的速率增加
    • 例如简单搜索和二分搜索之间的区别
元素简单搜索二分搜索
100 个元素 100ms7 ms
10,000 个元素 10 s0 10 s 10 s 40 ms 0, 000 个元素11 天30 毫秒
    • Large 表示算法的速度。例如,列表 n 包含一个元素。简单搜索必须检查每个元素,因此它必须执行n次操作
      O

    O

O意味着(n)。二分查找必须运行logn运算,使用大 O表示为正常工作

  • O (log n ) ,也称为对数时间此类算法包括分裂算法
  • O(n),也称为线性时间,此类算法包括简单搜索。 † 算法指的不是时间,而是操作数的增长率
  • 当谈论算法的速度和时间时,我们谈论的是当输入增加时其工作时间增加的速率
  • 工作时间算法的大小用大O表示。该表达式意味着
  • O(log n) 比 O(n) 更快。如果要搜索的元素较多,则第一个比第二个更快。模型
  • 与问题相关的数据量以及数据之间的关系
  • 如何在计算机中存储数据并反映数据之间的关系
  • 数据处理要执行的操作数据
  • 是写出来的程序的性能好

数据

  • 是客观事物的符号表示。在计算机科学中,它指的是任何可以输入计算机并由计算机程序处理的东西。已处理符号的通用名称。
  • 数据元素:这是数据的基本单位,通常在程序中作为一个整体来对待和处理。一个数据元素可以由多个数据单元(Data Unit)组成。
  • 数据单位:数据的最小不可分割单位。数据项是对客观事物某一方面的数据描述。
  • 数据对象:具有相同特征的数据元素的集合,是数据的子集。例如,字符集C={'A','B','C,...}。
  • 数据结构:数据元素之间具有一定关系的集合。
  • 数据的逻辑结构:数据元素之间的关系称为逻辑结构。
  • 数据操作:对数据进行的操作
  • 数据类型(Data Type):指一组值以及对一组值定义的一组操作。

数据的逻辑结构主要有四种类型

  • 集合:该结构的数据元素之间除了“属于同一集合”之外没有其他关系
  • 线性结构:该结构的数据元素具有一对一关系
  • 树结构:该结构的数据元素具有一对多关系
  • 网络或图结构:该结构的数据元素具有多对多关系关系

数据结构存储方式

数据元素之间的关系在计算机中有两种不同的表示方法——顺序表示和非顺序表示。由此衍生出两种存储方式,顺序存储结构和链式存储结构

  • 顺序存储结构:利用数据元素在内存中的相对位置来表示数据元素之间的逻辑结构(关系)。存储数据元素的地址是连续的
  • 链式存储结构:向每个数据元素添加一个指针,用于存储另一个元素的地址。该指针用于表示数据元素之间的逻辑结构(关系)。不要求数据元素中存储的地址是否连续

数据的逻辑结构和物理结构密不可分 算法的设计取决于所选的逻辑结构和算法的实现在所使用的存储结构上

算法(Algoritm)

是解决特定问题的方法(步骤),描述是有限的命令序列,每个命令代表一个或多个操作。

算法具有以下五个特征

  • 有限性:算法必须始终在完成最后步骤后终止,并且每一步都在有限的时间内完成
  • 确定性:算法中的每个命令都必须有一个精确的意义。不存在二义性,算法只有一个入口和一个出口
  • 可行性:算法可行,意味着通过实现基本动作,算法中描述的动作可以执行有限次数。实现
  • 输入:该算法具有从一组给定对象中获取的零个或多个输入
  • 输出:该算法具有一个或多个与输入相同的输出。关系量

算法和程序是两个不同的概念

计算机程序是使用某种编程语言对算法的具体实现。算法必须是可终止的这一事实意味着并非所有计算机程序都是算法。

评估好的算法有几个标准 更改算法

  • 耐用性:算法应该是防错的。当输入非法或错误的数据时,算法应该能够做出正确的反应或处理,而不会产生无法解释的输出结果
  • 通用:算法应该是通用的,即算法的处理结果适用于通用数据集
  • 效率和存储要求:效率是指算法执行时间;存储需求是指算法执行过程中所需的最大存储空间。一般来说,这两者与任务范围相关

    算法时间复杂度

    算法中基本操作的重复次数就是问题规模n特定函数的时间度量记为T(n) =O(f(n)),称为算法的渐近时间复杂度(Asymptotic Time Complexity),简称时间复杂度

    算法空间复杂度

    指的是所需存储空间的衡量当编写算法程序并在计算机上运行它时。记为:S(n)=O(f(n)),其中n为任务大小

    递归与循环简单对比:

    1. 从程序的角度来看,递归通过如下方式调用自身来表达,而 while 循环没有这种形式。
    2. 递归从问题的最终目标出发,逐步将复杂问题转化为简单问题。简单任务的解决方案与复杂问题的解决方案相同。如果同时有一个基线,问题就能一劳永逸地解决。事实恰恰相反。循环从一个简单的问题开始,一步步进行,最后解决问题,这是积极的。
    3. 递归可以代表任何循环,但如果想用循环实现递归(单向递归和尾递归除外),就必须引入栈结构来进栈和跳栈。
    4. 一般来说,非递归比递归效率更高。而且,递归函数调用有开销,并且递归次数受到堆栈大小的限制。

    共同进步、共同学习。

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门