[数据结构与算法 03] 最好、最坏、平均、均摊 时间复杂度

由来

  • /****
        在一个无序的数组(array)中
        查找变量 x 第一次出现的位置。如果没有找到,就返回 -1
    ****/
    
    // n 表示数组array的长度
    int find(int[] array, int n, int x) {
        int i = 0;
        int pos = -1;
        for (; i < n; ++i) {
            if (array[i] == x) pos = i;
        }
        return pos;
    }

分析出此函数的时间复杂度为 O(n)

  • 在数组中查找一个数据,并不需要每次都把整个数组都遍历一遍,
  • 因为有可能中途找到就可以提前结束循环了。

所以我们可以这样优化一下这段查找代码

  • /****
        在一个无序的数组(array)中
        查找变量 x 第一次出现的位置。如果没有找到,就返回 -1
    ****/
    
    // n 表示数组array的长度
    int find(int[] array, int n, int x) {
        int i = 0;
        int pos = -1;
        for (; i < n; ++i) {
            if (array[i] == x) {
                pos = i;
                break; // 已经找到了,就不必继续找了
            }
        }
        return pos;
    }

那么问题来了,如此优化以后,时间复杂度还是 O(n) 吗???

  • 可能第一次就找到了,只循环了一次,那时间复杂度就是 O(1)
  • 可能最后一次才找到,循环了 n 次,时间复杂度就成了 O(n)

所以,不同的情况下,这段代码的时间复杂度是不一样的

因此,为了表示代码在不同情况下的不同时间复杂度,我们需要引入三个概念

  • 最好情况时间复杂度
  • 最坏情况时间复杂度
  • 平均情况时间复杂度

2

2

2

2

2

2

2

2

一、最好情况 时间复杂度(best case time complexity)

在最理想的情况下,执行这段代码的时间复杂度

"只循环一次就找到了"

二、最坏情况 时间复杂度(worst case time complexity)

在最糟糕的情况下,执行这段代码的时间复杂度

"循环了 n 次才找到"

三、平均情况 时间复杂度(average case time complexity)

最好情况时间复杂度 和 最坏情况时间复杂度 对应的都是极端情况下的代码复杂度,发生的概率其实并不大。

为了更好地表示平均情况下的复杂度,我们需要引入另一个概念:平均情况时间复杂度,后面我简称为平均时间复杂度

1

1

1

1

四、均摊 时间复杂度(amortized time complexity)

1

1

1

1

1

原文地址:https://www.cnblogs.com/tianxiaxuange/p/12285954.html

时间: 2024-10-03 12:46:20

[数据结构与算法 03] 最好、最坏、平均、均摊 时间复杂度的相关文章

Chapter4 复杂度分析(下):浅析最好,最坏,平均,均摊时间复杂度

四个复杂度分析: 1:最好情况时间复杂度(best case time complexity) 2:最坏情况时间复杂度(worst case time complexity) 3:平均情况时间复杂度(average case time complexity) 4:均摊时间复杂度(amortized time complexity) for (; i < n; ++i) { if (array[i] == x) { pos = i; break; } } 分析:1:最好情况时间复杂度:O(1) 2

最好、最坏、平均、均摊时间复杂度

关注公众号 MageByte,设置星标点「在看」是我们创造好文的动力.后台回复 "加群" 进入技术交流群获更多技术成长. 本文来自 MageByte-青叶编写 上次我们说过 时间复杂度与空间复度,列举了一些分析技巧以及一些常见的复杂度分析比如 O(1).O(logn).O(n).O(nlogn),今天会继续细化时间复杂度. 1. 最好情况时间复杂度(best case time complexity) 2.最坏情况时间复杂度(worst case time complexity) 3.

复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

时间复杂度分析有哪些? 最好情况时间复杂度(best case time complexity) 最坏情况时间复杂度(worst case time complexity) 平均情况时间复杂度(average case time complexity) 均摊时间复杂度(amortized time complexity) 最好.最坏情况时间复杂度 最好情况时间复杂度就是在最理想的情况下,执行这段代码的时间复杂度. 最好情况时间复杂度就是在最糟糕的情况下,执行这段代码的时间复杂度. 来看看下面这段

【数据结构与算法 03】直接插入排序

算法思想(从小到大排序) 将待排序数组看左右两个序列,左序列有序,有序列无序. 假设第一个数array[0]为有序列,那么array[1,N-1]为无序列.循环遍历无序列,找出array[i]在有序列中应该插入的位置,插入. 例如一个乱序数组为{1,3,2,4 , 假如有序列为 { 1,3 } 无序列循环到2时 ,那么2在有序列中的位置应该是1 - 3 中间 , 所以 [ 3. . .2 ) 之间的所有数据右移 , 即3右移的2的位置 , 腾出了3原先所在的位置 , 由2替代 博客地址:http

最好,最坏,平均,均摊时间复杂度

// n 表示数组 array 的长度int find(int[] array, int n, int x) {  int i = 0;  int pos = -1;  for (; i < n; ++i) {    if (array[i] == x) pos = i;  }  return pos;} 时间复杂度是O(n) // n 表示数组 array 的长度int find(int[] array, int n, int x) {  int i = 0;  int pos = -1; 

研磨数据结构与算法-03栈与队列

一,栈 public class MyStack { //底层实现是一个数组 private long[] arr; private int top; /** * 默认的构造方法 */ public MyStack() { arr = new long[10]; top = -1; } /** * 带参数构造方法,参数为数组初始化大小 */ public MyStack(int maxsize) { arr = new long[maxsize]; top = -1; } /** * 添加数据

学好数据结构和算法 —— 复杂度分析

复杂度也称为渐进复杂度,包括渐进时间复杂度和渐进空间复杂度,描述算法随数据规模变化而逐渐变化的趋势.复杂度分析是评估算法好坏的基础理论方法,所以掌握好复杂度分析方法是很有必要的. 时间复杂度 首先,学习数据结构是为了解决“快”和“省”的问题,那么如何去评估算法的速度快和省空间呢?这就需要掌握时间和空间复杂度分析.同一段代码运行在不同环境.不同配置机器.处理不同量级数据…效率肯定不会相同.时间复杂度和空间复杂度是不运行代码,从理论上粗略估计算法执行效率的方法.时间复杂度一般用O来表示,如下例子:计

数据结构和算法一(基础知识)

一.数据结构与算法基础知识 从广义上讲,数据结构就是指一组数据的存储结构.算法就是操作数据的一组方法. 从狭义上讲,就是指某些著名的数据结构和算法,比如队列.栈.堆.二分查找.动态规划等. 数据结构和算法是相辅相成的,数据结构为算法服务,算法要作用在特定的数据结构之上. 数据结构思维导图 基础数据结构:数组.链表.栈.队列.散列表.二叉树.堆.跳表.图.Trie树 基础算法:地柜.排序.二分查找.搜索.哈希算法.贪心算法.分治算法.回溯算法.动态规划.字符串匹配算法 二.时间复杂度和空间复杂度

十分钟弄懂:数据结构与算法之美 - 时间和空间复杂度

复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半了. 1. 什么是复杂度分析 ? 数据结构和算法解决是 "如何让计算机更快时间.更省空间的解决问题". 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系. 2. 为什么要进行复杂度分析 ? 和性能测试相比,复杂度分析有不依赖执行环境.成本低.效率高.易操作.