算法复杂度分为时间复杂度和空间复杂度。

其作用:

时间复杂度是指执行算法所需要的计算工作量;

而空间复杂度是指执行这个算法所需要的内存空间。

(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。

简单来说,

时间复杂度指的是语句执行次数

空间复杂度指的是算法所占的存储空间

时间复杂度

执行算法所需的计算工作量。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做T(n)=O(f(n));

常见时间复杂度有:常数阶、线性阶、平方阶、立方阶、对数阶、nlog2n阶、指数阶

效率:O(1) > O(log2n)> o(n)> o(nlog2n) > o(n^2) > o(n^3) > o(2^n) > o(n!) > o(n^n)

其他概念

最坏情况:最坏情况时的运行时间,一种保证。如果没有特别说明,说的时间复杂度即为最坏情况的时间复杂度

时间复杂度计算方式

举例:计算1+2+3+....+n的和

$sum=0

for($i=1;$i<=$n;$i++){

$sum+=$i

}

可以看到循环了n次,所以时间复杂度就是O(n), 时间复杂度就是程序计算次数

其他说明

1.用常数1来取代所有时间中的所有加法常数

比如上面的例子中,不管n为多少,计算次数都是3,那么时间复杂度为O(1),而不是O(3)

2.在修改后的运行次数函数中,只保留最高阶项

比如运算的次数为n^2+1,那么为时间复杂度为o(n^2)

3.如果最高阶存在且不是1,则去除与这个项相乘的常数

2n^2+3n+1 ->n^2

为什么会去掉这些值,看下图

当计算量随着次数原来越大的时候,n和1的区别不是太大,而n2曲线变得越来越大,所以这也是2n2+3n+1 ->n2最后会估量成n2的原因,因为3n+1随着计算次数变大,基本可以忽略不计,其他都类似

常数阶 O(1)

function test($n){

echo $n;

echo $n;

echo $n;

}

不管$n是多少,只运行3次,那么时间复杂度就是O(3),取为O(1)

线性阶 O(n)

for($i=1;$i<=$n;$i++){

$sum+=$i

}

平(立)方阶:o(n2)/o(n3)

$sum=0;

for($i=1;$i<=$n;$i++){

for($j=1;$j

$sum+=$j

}

}

两次循环,里面循环执行了n次,外层循环也执行了n次,所以时间复杂度为O(n^2),立方阶一样

特殊平方阶:O(n2/2+n/2)->O(n2)

for(){

for(){

..... ----------->n^2

}

}

+

for(){

------------> n

}

+

echo $a+$b --------------> 1

所以整体上计算次数为n^2+n+1,我们算时间复杂度为O(n^2)

对数阶:O(log2n)

如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数(logarithm),记作x=logaN。其中,a叫做对数的底数,N叫做真数。 [1]

while($n>=1){

$n=$n/2;

}

n 执行次数

1 1

2 2

3 2

规律:

第一次 第二次 第三次 第四次 第五次

20--------->10---------->5-------->2.5------->1

n n/2 n/2/2 n/2/2/2 n/2/2/...

所有规律:n/(2^m)=1;我们需要算出m, 转换成n=2^m,得出m=log2n,所以时间复杂度为O(logn)或者O(log2n)

空间复杂度

算法需要消耗的内存空间。即为S(n)=O(f(n));包括程序代码所占用的空间,输入数据所占用的空间和辅助变量所占用的空间这三个方面。计算和表达方式与时间复杂度类似,一般用复杂度的渐近性来表示

关于O(1)的问题, O(1)是说数据规模和临时变量数目无关,并不是说仅仅定义一个临时变量。举例:无论数据规模多大,我都定义100个变量,这就叫做数据规模和临时变量数目无关。就是说空间复杂度是O(1)。

空间复杂度计算方式

举例:冒泡排序的元素交换,空间复杂度O(1)

冒泡排序就是两两交换,中间设置临时变量存储交换的值,不管要交换的数据多大,临时变量始终为固定数量

冒泡排序:把$arr=[1,3,2,4,6,5]排序出来

原理:两两相邻的数进行比较,如果反序就交换,否则不交换

1 3 2 4 6 5

首先1和3比较,不动

1 3 2 4 6 5

再次3和2比较,交换

1 2 3 4 6 5

再次3和4比较,不动

1 2 3 4 6 5

再次4和6比较,不动

1 2 3 4 6 5

再次6和5比较,交换

1 2 3 4 5 6

for($i=0;$i<=$n;$i++){

for($j=0;$j<=$n;$j++){

if($arr[$j]>$arr[$j+1]){

$tmp=$arr[$j];

$arr[$j]=$arr[$j+1];

$arr[$j+1]=$tmp;

}

}

}

所以时间复杂度为O(n^2),空间复杂度为O(1)

常见排序算法

冒泡排序、直接插入排序、希尔排序、选择排序、快速排序、对排序、归并排序

常见查找算法

二分查找、顺序查找

扩展:函数的渐进增长

标签:arr,复杂度,算法,时间,空间,n2,php

来源: https://www.cnblogs.com/djwhome/p/12554474.html

PHP复杂度,php 算法复杂度 时间复杂度 空间复杂度相关推荐

  1. 算法-时间频度 时间复杂度 空间复杂度

    Temporal Frequency& Time Complexity& Space Complexity 计算算法执行时间 时间复杂度(Time Complexity) 常数阶O(1 ...

  2. [算法][算法复杂度]常用算法复杂度速查表

    复杂度通常会使用大 -O记号来表示,比如快速排序的平均时间复杂度是 O(nlog(n)).虽然我们应该做「理解派」,但是即使每个算法/数据结构都理解了,不时仍有可能忘记具体某个算法/数据结构的复杂度( ...

  3. 算法:算法概述【时间复杂度、空间复杂度】

    一.算法定义 算法:为了实现业务目的的各种方法和思路就是算法.同样的数据,同样的目的, 不同的算法,不同的方法和思路,效率就会不同 算法是一种独立的存在 , 它并不依附于代码 , 代码只是实现算法思想 ...

  4. 算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述

    细化时间复杂度分析 代码千千万,有些代码逻辑会很复杂,所以为了更细化的分析算法的复杂度,再复杂度分析方面引入了4个知识点: 1.最好情况时间复杂度(best case time complexity) ...

  5. 【牛客网】:数据结构——时间复杂度,算法复杂度

    目录 一.时间复杂度 二.算法复杂度 一.时间复杂度  先看一张图: (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机 ...

  6. 时间复杂度o(n^0.5)_算法基础1.1:算法复杂度计算(二)

    1.什么是算法 2.好算法的标准 3.算法复杂度计算方法 例1: 1 int sum = 0;//运行1次2 int total = 0;//运行1次3 for (int i = 1; i <= ...

  7. 算法复杂度:算法时间复杂度和空间复杂度表示法

    文章地址:http://lzw.me/a/algorithm-complexity.html 算法复杂度分为时间复杂度和空间复杂度. 时间复杂度用于度量算法执行的时间长短:而空间复杂度则是用于度量算法 ...

  8. 数据结构——时间复杂度和算法复杂度

    目录 时间复杂度 计算下列函数的时间复杂度 冒泡排序时间复杂度 大O的渐进表示法 旋转数组 空间复杂度 时间复杂度 时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数(带未知数的函数表达式) ...

  9. 算法复杂度的表示法_用简单的英语算法:时间复杂度和Big-O表示法

    算法复杂度的表示法 by Michael Olorunnisola 通过Michael Olorunnisola 用简单的英语算法:时间复杂度和Big-O表示法 (Algorithms in plai ...

最新文章

  1. BiGAN-QP:简单清晰的编码 生成模型
  2. Memcached----2-3
  3. 数据仓库和数据集市 专业术语解释
  4. elasticsearch 的查询 /_nodes/stats 各字段意思
  5. wordpress js 运行短代码_7个WordPress常用代码段(Code Snippets)
  6. 哆啦A梦的神奇口袋 - 这全是宝藏 https://baozangku.com/
  7. 作为一个iOS攻城狮不得不了解的网络知识
  8. 阿里云网盘内测_阿里一口气推出两款网盘,不限速!
  9. 计算机启动显示不正确的分区表,分区表无效怎么办_一开机就显示分区表无效怎么解决...
  10. NPDP第七章:产品生命周期管理
  11. fast-lio 卡尔曼滤波
  12. Matplotlib画折线图
  13. Confluence 6 修改空间名字和标识
  14. 《如梦令·常记溪亭日暮》【宋】李清照
  15. 爱立信联手日本软银在东京进行5G测试
  16. win7创建ftp服务器及FlashFxp的使用
  17. 来自卡内基梅隆计算机科学系主任的回复
  18. 2021-12-22 WPF上位机 116-三菱PLC协议
  19. 2021年11月-火狐浏览器添加自定义搜索引擎之办法
  20. 终于入手绘图板了!!!

热门文章

  1. ubuntu下安装c++检测工具perf
  2. 802.1AE保护局域网安全
  3. python开源人脸识别库识别率达99_Python的开源人脸识别库:离线识别率高达99.38%...
  4. php 数据钻取,多层钻取 - 海致BDP帮助中心、帮助文档
  5. Java集合面试题?看这篇就够了!
  6. python matplotlib画折线图_python使用matplotlib绘制折线图教程
  7. HTML中如何写for循环全选,利用html:multibox 循环遍历checkbox 并且全选全解除
  8. mysql 工具图形学_[计算机图形学]贝塞尔曲线
  9. 腐蚀rust电脑分辨率调多少_腐蚀RUST提高FPS教程 腐蚀RUST如何提高FPS
  10. 汽车销售系统javaweb代码_有什么代驾系统能远离销售套路_搜狐汽车