一些常见算法复杂度总结

本文介绍了完全二叉树的概念及性质,详细讨论了不同查找方法的特点与适用场景,并对比了几种常见排序算法的性能差异及其适用性。

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

若设二叉树的高度为h,除第 h 层外,其它各层 (1h-1) 的结点数都达到最大个数,第 h 层所有的节点都连续集中在最左边,这就是完全二叉树。


 

性质:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
性质四具有n个结点的完全二叉树的深度为「log2n+1

 

查找:

1.       顺序查找

         a)         算法简单,适应面广,稳定算法

         b)        平均查找长度比较大,当n比较大时,查找效率会很低,时间复杂度为O(n)

2.       折半查找法

         a)         针对有序的序列表,不稳定算法

         b)        查找速度快,时间复杂度是O(log2n)

3         分块查找

         a)         也是针对有序表,不稳定算法

         b)        查找速度介于顺序查找和折半查找之间

 

树表查找:

1.    二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。

2.    平衡二叉树:棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,查找时间的时间复杂度为O(log2n)

 

排序:

 

排序分类     平均时间       时间复杂度       辅助存储空间

简单排序     O(n2)           O(n2)            O(1)

快速排序     O(nlog2n)       O(nlog2n)         O(nlog2n)

堆排序       O(nlog2n)       O(nlog2n)         O(1)

归并排序     O(nlog2n)       O(nlog2n)         O(n)

 

从平均时间来讲,快速排序是最快的,但是在最坏的情况下,它的时间复杂度(为O(n2))就不如堆排序和归并排序,归并排序所需时间比堆排序省,但是它需要辅助空间,从方法的稳定性来讲,归并排序是一种稳定排序,快速排序和堆排序都是不稳定的。

### ACM竞赛中常见算法时间复杂度总结 #### 1. 排序算法时间复杂度 在ACM竞赛中,排序是一个常见的操作。以下是几种常用的排序算法及其时间复杂度: - **插入排序** - 时间复杂度:$O(n)$ (当输入数组已经有序时)[^2]。 - 时间复杂度:$O(n^2)$ (当输入数组完全逆序时)。 - **合并排序** - 时间复杂度:$O(n \log n)$。 - 时间复杂度:$O(n \log n)$。 - **堆排序** - 时间复杂度:$O(n \log n)$。 - 时间复杂度:$O(n \log n)$。 - **快速排序** - 时间复杂度:$O(n^2)$ (极端情况下,每次划分都极不平衡)[^2]。 - 时间复杂度:$O(n \log n)$ (通常情况下)。 #### 2. 图论算法时间复杂度 图论问题是ACM竞赛中的重要部分,涉及多种经典算法。以下是一些常用图论算法时间复杂度: - **Dijkstra算法** - 如果采用朴素实现,在稠密图上的时间复杂度为 $O(n^2)$[^3]。 - 使用优先队列优化后,在稀疏图上的时间复杂度为 $O(m \log n)$,其中 $m$ 是边的数量,$n$ 是顶点数量。 - **SPFA算法** - 平均时间复杂度为 $O(km)$,其中 $k$ 是一个小于等于 2 的常数。 - SPFA适用于处理带负权边的情况,但在网格图或非常稠密的图上表现较差。 #### 3. 动态规划与递归算法时间复杂度 动态规划和递归也是ACM竞赛的核心内容之一。它们的时间复杂度取决于状态转移方程的设计和问题规模。 - **斐波那契数列计算** - 迭代方法的时间复杂度为 $O(n)$[^5]。 - 矩阵快速幂方法可以将时间复杂度降低至 $O(\log n)$。 - **背包问题** - 对于0/1背包问题,如果物品数量为$n$,容量为$c$,则其时间复杂度为 $O(nc)$。 #### 4. 其他基础算法时间复杂度 除了上述类别外,还有一些基本算法也经常用于ACM竞赛中: - **二分查找** - 时间复杂度为 $O(\log n)$,前提是数据结构支持随机访问且已排序。 - **暴力枚举** - 枚举所有可能解的空间大小决定了时间复杂度。例如对于长度为$n$的序列全排列,时间复杂度为 $O(n!)$。 ```python def factorial_recursive(n): if n == 0 or n == 1: return 1 else: return n * factorial_recursive(n - 1) print(factorial_recursive(5)) # 输出120 ``` 以上代码展示了通过递归方式求解阶乘函数的一个例子,该过程具有指数级增长特性即 $O(n!)$。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值