关于算法的时间复杂度和空间复杂度

0.概述      

       算法是程序世界的灵魂。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别;那么如何衡量不同算法之间的“优劣”或者性能了?一般来说从算法执行所消耗的「时间」和「空间」两个维度去考量:

  • 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。
  • 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。

1.时间复杂度

       一般情况下,使用符号O表示时间复杂度,即:T(n) = O(f(n));其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式的全称是:算法的渐进时间复杂度

        常见的时间复杂度量级有如下,时间复杂度从上到下越来越大,执行的时间也越来越长。

1.1 O(1)

        常数阶复杂度,代码执行时间是一个固定常数值,执行时间并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度

int i=1;
int b=1;

1.2 O(n)

        线性阶复杂度,代码执行时间是根据入参线性增长的;

int sum=0;
for(int i=0;i<n;i++){
   sum=sum+i;
}

1.3 O(logN)

        对数阶复杂度,先观察如下代码:

public static int biSearch(int []array,int a){
        int lo = 0;
        int hi = array.length-1;
        int mid;
        while(lo <= hi) {
            mid = lo + (hi - lo) / 2;
            if(array[mid] == a) {
                return mid;
            }else if(array[mid] < a) {
                lo = mid + 1;
            }else{
                hi = mid - 1;
            }
        }
        return -1;
    }

上面代码的执行时间差不多是这样的:

一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4

m次二分剩下:n/(2^m)

        在最坏情况下排除到只剩下最后一个值之后得到结果,即n/(2^m)=1,换算一下即:2^m=n,意即log2(n)。

1.4 O(nlogN)

       线性对数阶,意即将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

for(m=1; m<n; m++)
{
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}

1.5 O(n²)

       平方阶,相当于O(n) * O(n)=O(),线性阶在嵌套一个线性阶的循环。

for(x=1; i<=n; x++)
{
   for(i=1; i<=n; i++)
    {
       j = i;
       j++;
    }
}

1.6 O(n³)/O(n^k)

       立方阶或者K次方阶,类比平方阶,K次方阶即相当于嵌套循环了k次。

public int calcualte(int n,int k){
    if(k<=0){
      return n;
    }
    int m=0;
    for(int i=0;i<n;i++){
       m=m+i;
    }
    k--;
    calcualte(m,k); 
}

 2. 空间复杂度

       空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。

2.1 O(1)

       常量空间复杂度的算法,所使用的的空间不随被处理数据量n的大小而改变时。

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

2.2 O(n)

       此算法的空间复杂度与n成线性比例关系,如下图所示,执行此算法所使用的的空间在第一行已经确认了,后续的计算都不会扩展空间。

int[] m = new int[n]
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

还有其他复杂度的,欢迎大家来补充。

常用算法的时间和空间复杂度:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: PHP 作为一种编程语言,并没有固定的算法时间复杂度空间复杂度。这些复杂度取决于所编写的算法实现,而不是编程语言本身。 例如,PHP 中的排序算法可能具有不同的时间复杂度空间复杂度,如冒泡排序、选择排序、插入排序、快速排序等。具体算法时间复杂度空间复杂度取决于算法的实现方式。 因此,在使用 PHP 进行算法开发时,需要特别注意算法时间复杂度空间复杂度,选择适合自己需求的算法,以获得更好的性能和效率。 ### 回答2: PHP算法时间复杂度是指算法执行所需的时间与问题规模的增长率之间的关系。常见的时间复杂度有常数时间O(1)、对数时间O(log n)、线性时间O(n)、平方时间O(n^2)等。在PHP中,根据具体的算法实现方式,时间复杂度可以不同。 在PHP中,一般来说,使用循环的算法通常会有较高的时间复杂度。例如,一个遍历数组并求和的算法,其时间复杂度为O(n),其中n是数组的长度。另外,PHP还提供了一些内置函数和数据结构,如排序函数sort()和二分查找函数array_search()等,它们的时间复杂度通常是比较高效的。 PHP算法空间复杂度是指算法所需的额外空间与问题规模的增长率之间的关系。常见的空间复杂度有常数空间O(1)、线性空间O(n)、平方空间O(n^2)等。在PHP中,空间复杂度通常是由变量、数组和函数调用所需的额外空间来衡量的。 在PHP中,空间复杂度较高的算法通常是由于需要创建额外的数据结构或临时变量来存储中间结果。例如,一个需要创建一个与输入规模n相关的数组来存储计算结果的算法,其空间复杂度为O(n)。 综上所述,PHP算法时间复杂度空间复杂度可以根据具体的算法实现方式而有所不同,但通常可以通过分析循环次数、临时变量的数量和额外数据结构的大小来进行评估和比较。在编写PHP算法时,我们应该尽量选择高效的时间复杂度和较低的空间复杂度,以提高算法的性能和效率。 ### 回答3: PHP算法时间复杂度空间复杂度取决于具体使用的算法和数据结构。 时间复杂度是用来表示算法执行所需时间的度量,通常以大O表示。在PHP中,常见的时间复杂度包括O(1)、O(log n)、O(n)、O(n log n)和O(n^2)等。具体的算法实现会决定时间复杂度的大小。 空间复杂度是用来表示算法在执行过程中所需的额外空间的度量,也通常以大O表示。在PHP中,常见的空间复杂度包括O(1)、O(n)、O(n^2)等。具体的算法实现决定了空间复杂度的大小。 例如,对于PHP的数组排序算法,使用快速排序算法时间复杂度为O(n log n),空间复杂度为O(log n)。这是因为快速排序算法的平均时间复杂度为O(n log n),但需要额外的递归调用栈空间。另外,对于PHP的线性查找算法时间复杂度为O(n),空间复杂度为O(1),这是因为在执行过程中不需要额外的空间存储数据。 总而言之,PHP算法时间复杂度空间复杂度是评估算法性能和资源消耗的重要指标,具体取决于所使用的算法和数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值