首页 > 编程语言 >算法性能分析

算法性能分析

时间:2022-08-16 11:57:30浏览次数:50  
标签:分析 return 递归 性能 sample 算法 logn 复杂度

算法性能分析

时间复杂度分析

递归算法的时间复杂度

例题一: 求x的n次方

用一道题目,同样使用递归算法, 有的写出了O(n)的代码,有的写出了O(longn)的代码

时间复杂度为:O(n)

最直观的写法, 一个for循环求出结果,代码如下:

def sample_1(x, n):
    result = 1
    for i in range(n):
        result = result * x

    return result

思考: 有没有效率更好的算法?
有的人一看到递归,就想到了O(logn), 其实并不是这样, 递归算法的时间复杂度本质上是要看-递归的次数 * 每次递归中的操作数
代码如下:

def sample_1_2(x, n):
    if n == 0:
        return 1

    return sample_1_2(x, n)

使用迭代更改之后,时间复杂度为O(n), 每次n-1,递归了n次时间复杂度为O(n), 每次进去了一个乘法的操作,复杂度为O(1),总的时间复杂度为O(n * 1)

再次改进尝试:

def sample_1_3(x n):
    if n == 0:
        return 1
    if n % 2 == 1:
        return sample_1_3(x, n//2) * sample_1_3(x, n//2) * x

    return sample_1_3(x, n//2) * sample_1_3(x, n//2)

上述代码时间复杂度,如何计算?

首先查看递归了多少次?可以将递归抽象成一颗满二叉树来表示,每个节点代表着一次递归并进行了一次乘法的操作,则递归的次数为节点的个数,所有节点的个数为一个公比为2等比数列的求和使用sum = 2^(m + 1) -1表示,x的n次方,需要递归的次数为sum,则递归
次数,将m使用n表示,忽略常数项-1,则m=logn -1, 得到sum = n -1,所以时间复杂度仍然为O(n)。

查看上述代码,去除冗余的部分,我们可以得到下面的代码:

def sample_1_4(x, n):
    if n == 0:
        return 1
    t = sample_1_4(x, n//2)
    if n % 2 == 1:
        return t * t * x
    
    return t * t

可以看到这里仅仅有一个递归调用,且每次都是n/2, 所以这里是log以2为底的对数次。 每次递归都是做了一次乘法操作, 时间复杂度为O(logn).

空间复杂度分析

概念: 是对一个算法在运行过程中占用内存空间大小的量度,记做S(n)=O(f(n)

空间复杂度(Space Complexity)记作S(n) 依然使用大O来表示。利用程序的空间复杂度,可以对程序运行中需要多少内存有个预先估计

常见问题

  1. 口那个键复杂度是否是可执行文件大小?
    空间复杂度是考虑程序运行时占用内存的大小,而不是可执行文件的大小
  2. 空间复杂度是准确算出程序运行时所占内存?
    空间复杂度是预先大体评估程序内存使用的大小。
    空间复杂度是logn的情况确实有些特殊,其实是在递归的时候,会出现空间复杂度为logn的情况。

标签:分析,return,递归,性能,sample,算法,logn,复杂度
From: https://www.cnblogs.com/01black-white/p/16591057.html

相关文章

  • 雪花算法ID重复问题的解决方案
    1、雪花算法生成的Id由:1bit不用+41bit时间戳+10bit工作机器id+12bit序列号,如下图:集群部署的微服务,当随机的机器ID相同,刚好在同一毫秒生成ID,时间戳相同,并且序列号也相......
  • DevEco3.0 Beta4中集成华为分析SDK报错
    ​1、问题描述今天来看一个在鸿蒙中集成华为分析SDK报错的问题,关于问题的描述信息如下:使用的开发工具版本是DevEco3.0Beta4,然后在abilities模块中声明AGCprovider的操......
  • Queue接口分析
    一、Queue是什么该接口时Java集合框架成员Queue:通常(但不一定)队列就是一个先入先出(FIFO)的数据结构,和堆一样(但可以进行转换,比如优先级列队排序,又或者改为栈形式的后进先出......
  • C# 深度复制对象 反序列化方式与复制构造函数方式的效率分析
    先看结果 所以复制构造函数优于序列化和反序列化代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Linq;using......
  • 案例_软件下载分析、案例_代码实现
    案例_软件下载分析文件下载:页面显示超链接点击超链接后弹出下载提示框完成图片文件下载 分析:超链接指向的资源如果能够被浏览器解析,则在浏览器中展......
  • .NET性能优化-快速遍历List集合
    简介System.Collections.Generic.List<T>是.NET中的泛型集合类,可以存储任何类型的数据,因为它的便利和丰富的API,在我们平时会广泛的使用到它,可以说是使用最多的集合类。在......
  • LeetCode 反转链表算法题解 All In One
    LeetCode反转链表算法题解AllInOnejs/ts实现反转链表反转链表原理图解双指针,swap交换//反转双指针//swap:a=b;c=a;b=c;letprev:List......
  • 创建第一个 Cypress 应用后使用命令行 npx Cypress open 报错的原因分析
    大多数测试工具(如Selenium)通过在浏览器外部运行并通过网络执行远程命令来运行。Cypress正好相反。Cypress在与Web应用程序相同的运行循环(runloop)中执行。Cypress......
  • 如何提升性能测试效能
    上周六应邀在天津devops峰会的质量内建专场做了一次分享,主题是《稳定性保障利器:全链路压测》。其中关于全链路压测对质量内建的意义,我做了一个总结,如下图所示。本文基于......
  • 算法总结
    今天放两道刚刷的关于链表的题packagecom.chenghaixiang.jianzhi2.day09;importjava.util.ArrayList;importjava.util.List;/***@author程海翔*@school......