一文学会算法复杂度分析,面试再也不用愁了。

简介: 一文学会算法复杂度分析,面试再也不用愁了。

1什么是算法复杂度

身为程序员的我们都知道程序=数据结构+算法 算法=逻辑+控制。当我们要解决一个问题的时候,必然会经过以下几个步骤

问题的理解

数据结构设计

算法设计

算法分析

程序实现与测试

所谓时间复杂度就是衡量一个算法效率的手段


2如何比较算法的效率呢?

也就是比较算法的所用时间,但是一个算法所需要的时间和一下3个因素有关,规模 输入 算法本身,举一个例子:现在需要把1-10的乱序扑克牌从小到大排列。

10就是规模 ,输入就是乱序1-10的数字,算法就是看采取什么样的排序算法,就是上面说的算法设计。


抛开软件因素和硬件因素,算法是由一组语句构成,一个算法的效率就是一个语句执行了多少次,次数越少时间越少,算法效率更高。所以一个算法的基本操作次数和规模有一定的函数关系,这里算法的时间复杂度表达式为


3渐进分析

我们计算时间复杂度并不是要一个准确的值,而是一个相对近似的计算,大概知道所耗费的时间就行,所以就得用到渐进分析。

上界符号O

就是存在一个常数n0,n0以后的时间复杂度函数值f(n)都不会大于g(n)。

图像表示如下:

下界符号Ω

这个刚好和上一个概念相反,上一个理解了这个也就理解了,

就是存在一个常数n0,n0以后的时间复杂度函数值f(n)都大于等于g(n)。

也就是上图最右侧部分。

紧渐进符号Θ

这个也很好理解,就是时间复杂度函数值f(n)的值在两个函数之间,也就是上图最左侧部分。

非紧上界封号o

这种情况就是(上界符号O)的情况去掉等于的情况。

非紧下界封号w

这种情况就是(下界符号Ω)的情况去掉等于的情况。

于是我们就可以这样近似记忆


在渐进分析的基础之上,我们会经常遇到以下几种情况。

绘制成图像就是这样。

我们在分析时间复杂度的时候,都是找出循环次数最多的语句。计算出相关表达式,常用的表达式有以下几种。

了解了上面的东西我们来解释如何利用上面的知识进行计算。


求解算法的时间复杂度的具体步骤是:

  ⑴ 找出算法中的基本语句;

  算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

  ⑵ 计算基本语句的执行次数的数量级;

  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

  ⑶ 用大Ο记号表示算法的时间性能。

  将基本语句执行次数的数量级放入大Ο记号中。

  如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。例如:

案例1

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

         x++;

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

       for (j=1; j<=n; j++)

            x++;

 第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。

案例2

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

   {

       y=y+1;         ①  

       for (j=0;j<=(2*n);j++)    

          x++;         ②      

   }          

解:语句1的频度是n-1

         语句2的频度是(n-1)*(2n+1)=2n2-n-1

         f(n)=2n2-n-1+(n-1)=2n2-2;

       又Θ(2n2-2)=n2

Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到      

时间复杂度T(n)=O(n2).  

再来看一个比较常见的log相关的

    i=1;     ①

   while (i<=n)

      i=i*2; ②

解:语句1的频度是1,

         设语句2的频度是f(n),   则:2^f(n)<=n;f(n)<=log2n    

         取最大值f(n)=log2n,

         T(n)=O(log2n )

以上就是算法的时间复杂度了,面试的时候就不用担心被问这个问题了,以后的文章我会分析leetcode等相关算法,每个题目分析时间复杂度,也就相当于是对知识的应用了。

持续分享编程数据结构与算法相关知识。

相关文章
|
3月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
93 4
|
7天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
7天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
22 6
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
63 1
|
3月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
3月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
38 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
3月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
3月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
3月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
3月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
97 2

热门文章

最新文章