“算法“是什么?(算法与复杂度简介)

本文详细介绍了算法的基本概念,包括其确定性、有穷性和可行性等特征,以及算法的组成要素——运算和操作、控制结构。同时,阐述了算法复杂度的重要性,分别讨论了时间复杂度和空间复杂度,并通过实例展示了如何分析时间单元规律。最后,列举了常见的时间复杂度类别及其关系。想要提升算法能力,可以尝试LeetCode平台进行实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//1.算法简介:

简介

  • 是指一组有穷的指令集,是解题方案的准确而完整的描述。算法不等于程序,也不等于计算方法。

特征

  • 确定性:算法中每一步骤都必须有明确定义,不允许有多义性
  • 有穷性:算法必须能在有限的时间内做完,既能在执行有限个步骤后终止
  • 可行性:算法原则上能够精确的执行
  • 拥有足够的情报

组成要素

  • 一个算法由数据对象的运算和操作以及其控制结构这两部分组成
  • 运算和操作:算术运算,逻辑运算,关系运算,数据传输
  • 控制结构:顺序,选择,循环
  • 设计方法:列举法、归纳法、递推、递归、减半递推技术

//2.算法的复杂度

简介

  • 是算法效率的度量,时间复杂度和空间复杂度并不相关
  • 时间复杂度:指执行算法所需要的计算工作量,包括编译时间和运行时间
  • 空间复杂度:指执行算法所需要的内存空间,包括算法程序,输入的初始数据,和算法执行过程中所需的额外空间

输入数据大小 N

  • 指算法处理的输入数据量;根据不同算法,具有不同定义
  • 排序算法:N 代表需要排序的元素数量
  • 搜索算法:N 代表搜索范围的元素总数,例如数组大小、矩阵大小、二叉树节点数、图节点和边数等

如何看出时间单元规律

  • 例:int n = 100; for (int i=0; i<n; i++) {System.out.println(“Test”)}

  • 花费两个时间单元:int n =100、int i = 0

  • 花费n个时间单元:System.out.println(“Test”)、i++

  • 花费n+1个时间单元:i<n

  • 共花费3n+3个时间单元、程序消耗的时间和n成线性关系

  • 时间复杂度:O(n)。当n非常大时,常数3和n的系数3对结果的影响很小。所以忽略最高次项,并忽略该项的系数,还有低阶项(n和n^2,n是低阶项)

类别:

复杂度描述
O(1)最低复杂度,耗时/耗空间与输入数据大小无关(常数阶)
O(n)数据量增大几倍,耗时也增大几倍
O(n^2)对n个数排序,需要扫描n*n次
O(n^3)对n个数排序,需要扫描n*n*n次
O(log n)当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍)
O(nlog n)就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方
O(2^n)对n个数排序,需要扫描2*2*2…的n次(n个2相乘)
O(n^n)对n个数排序,需要扫描n*n*n…的n次(n个n相乘)
O(m + n)等同于O(n)
O(m * n)等同于O(n^2)
线性函数随着自变量的增大会呈线性增长、如O(n)
对数函数随着自变量的增大,因变量增长的很慢、如O(log n)

比较,从小到大:

  • O(1) < O(log n) < O(n) < O(nlog n) < O(n^2) < O(n^3) < O(2^n) <
    O(n!) < O(n^n)

练习算法,那我肯定要推荐 LeetCode:
https://leetcode-cn.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值