算法
算法是一种将有限计算资源发挥到极致的武器,当计算资源很富余时算法没大用,但一旦到了效率瓶颈,算法绝对是开山第一刀(因为算法不要钱嘛!)。
存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地\"进行的,是节省存储的算法,有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况
算法复杂度
算法复杂度分为时间复杂度和空间复杂度。其意义: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。
时间复杂度
常数阶O(1),对数阶O(log2n),线性阶O(n),
线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),...,
k次方阶O(nk),指数阶O(2n).随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低.
简单理解:就是变量为n的时候,算法需要对变量操作次数的量级。
比如:要找到一个数组里面最大的一个数,你要把n个变量都扫描一遍,操作次数为n,那么算法复杂度是O(n).用冒泡排序排一个数组,对于n个变量的数组,需要交换变量位置次,那么算法复杂度就是.有时候,如果对变量操作的次数是个多项式比如n4+n2+n, 就取数量级最大的那个,O(n4)
1、O(1) 一次计算 常数
$x = 1;
2、O(n) n次计算 线性 $y=$x*2;
for($i=0; $i<$n; $i++) {
echo $i;
}
3、O() log2n是数学中的对数,是以2为底n的对数为多少,也就是2的多少次方是N
$n = 8;
$count = 0;
for($i=2; $i<=$n; $i *= 2) {
$count++;
}
echo $count;
4、 平方
$n = 8;
$count = 0;;
for($i=1; $i<=$n; $i++) {
for($j=1; $j<=$n; $j++) {
$count++;
}
}
echo $count;
5、 线性对数阶 2的多少次方是N,求n和多少次方的线性关系
$n = 8;
$count = 0;;
for($i=2; $i<=$n; $i *= 2) {
for($j=1; $j<=$n; $j++) {
$count++;
}
}
echo $count;
空间复杂度
与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量,记做S(n)=O(f(n))。
1、O(1)
//交换两个变量x和y
$x=1;
$y=2;
$temp = $x;
$x = $y;
$y = $temp;
一个临时变量temp,所以空间复杂度为O(1)。