数据结构-时间复杂度

2023-11-08

一、常数操作:

常见固定时间的操作

1、常见算术运算+、-、*、/、

2、位运算 >>、>>>、 << 、 | 、 & 、^等

3、赋值、比较、自增、自减

4、数组寻址(可以通过计算偏移量直接获取第N位置的内容)

​ 对比链表寻址(是没有办法直接计算得到第N位置的内容,所以它不是一个常数操作)

二、时间复杂度的概念

假设数据量为N的样本中,执行完整个流程,描述常数操作的数量关系。通常由O()表示,是一种渐进时间复杂度。

若存在函数 f(n),使得当n趋近于无穷大时,T(n)/ f(n)的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。

记作 T(n)= O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

T(n)为常数操作执行次数

简单理解,时间复杂度就是把T(n)简化为一个数量级,这个数量级可能为 n,n^2…

时间复杂度的推导

1.分解算法流程中的每一步直至常数操作,并进行T(n)的计算

2.只保留时间函数的最高阶项

下面利用简单选择排序进行说明:

选择排序流程:

  1. 0 ~ N-1 中,选择最小的数,并与第1位进行交换
  2. 1 ~ N-1 中,选择最小的数,并与第2位进行交换
  3. 直到 N-1位置

分解至常数操作

  1. 0 ~ N-1中,查看 并进行 N-1次比较(1),将最小值放到0位置(1) 此时 进行了 N-1次比较 1次交换
  2. 1 ~ N-1中,查看并进行N-2次比较(1),将最少值放到1位置(1)

我们可以得出总次数 是一个等差数列的求和 (N + N-1 + N-2 … + 1)=> T(n) = aN^2 + bN + C

因此得出简单选择排序时间复杂度为 O(N^2)

算法实现:

public static void insertSort(int[] arr){
        if(arr == null || arr.length < 2)
            return;
        for(int i = 0 ; i < arr.length - 1 ; i ++){
            int minIndex = i;
            for(int j = i + 1 ; j <= arr.length - 1; j ++){
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            }
//            if(i != minIndex) {
//                swap(arr, i, minIndex);
//            }
            swap(arr,i,minIndex);
        }
    }

递归函数时间复杂度估计

子规模一致

T(n) = a * T(N/b) + O(N^d)
l o g b a < d = > O ( N d ) logb^a < d => O(N^d) logba<d=>O(Nd)

l o g b a > d = > O ( N l o g b a ) logb^a > d => O(Nlogb^a) logba>d=>O(Nlogba)

l o g b a = d = > ( N d l o g N ) logb^a = d =>(N^dlogN) logba=d=>(NdlogN)

常见的时间复杂度量级有:

  • 常数阶O(1)
  • 对数阶O(logN)
  • 线性阶O(n)
  • 线性对数阶O(nlogN)
  • 平方阶O(n²)
  • 立方阶O(n³)
  • K次方阶O(n^k)
  • 指数阶(2^n)

评估算法优劣:

1.时间复杂度(流程决定)

2.额外空间复杂度(流程决定)

3.常数项时间

三、额外空间复杂度

完成流程,需要的额外空间。

如果是有限几个变量,O(1)

四、常见数据结构

1.单向链表

public class Node{
	public T value;
    public Node Next;
}

在这里插入图片描述

查找需要遍历时间复杂度为O(N)

插入删除某一个节点操作时间复杂度为O(1)

2.双向链表

单向链表无法知道前置节点,双向链表针对这个新增了一个前置节点的指针。

B+树的叶子节点 利用了双向链表的结构,可以方便进行范围查询

public class DoubleNode {
	public T value;
    public DoubleNode pre;
    public DoubleNode next;
}

在这里插入图片描述

在这里插入图片描述

3.栈和队列

是逻辑结构

栈:先进后出

队列:先进先出

可以使用数组/链表实现栈和队列

在这里插入图片描述

如何使用数组完成一个队列结构:

public class Class01_MyListQueue {
    public static class MyListQueue {
        private int[] arr;
        private int pushi;
        private int polli;
        private int size;
        private final int limit;

        public MyListQueue(int limit){
            arr = new int[limit];
            pushi = 0;
            polli = 0;
            size = 0;
            this.limit = limit;
        }

        public void push(int value){
            if( size == limit){
                throw new RuntimeException("队列满了,无法入队");
            }
            size ++;
            arr[pushi] = value;
            pushi = nextIndex(pushi);
        }

        public int polli(){
            if( size == 0){
                throw new RuntimeException("队列为空,无法出对");
            }
            size --;
            int result = arr[polli];
            polli = nextIndex(polli);
            return result;
        }

        public boolean isEmpty(){
            return size == 0;
        }

        public int nextIndex(int index){
            return index < limit - 1?index+1:0;
        }
    }
}

上述过程和Mysql的redolog的设计思想优点类似,一个指针写入(入队),一个指针擦除(出队)。

在这里插入图片描述

4.数组

5.Hash表,有序表

put 时间复杂度 O(1)

删除、查询key对应的value、是否包含key 时间复杂度都为O(1)

// 有序表

可以通过 红黑树、avl树、sb树、跳表实现

Redis中关于跳跃表

6.树

树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

img

7.堆

堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。可以用堆来做TopN的计算

img

8.图

img

https://blog.csdn.net/yjw123456/article/details/90211563

常见数据结构的时间复杂度分析:

preview

https://www.bigocheatsheet.com/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构-时间复杂度 的相关文章

随机推荐

  • Python线程,以及多线程带来的数据错乱和死锁的解决方法

    摘至本人有道云笔记 Python线程 1 python多线程的创建 在Python中 同样可以实现多线程 有两个标准模块thread和threading 不过我们主要使用更高级的threading模块 threading模块提供的类 Thr
  • 日撸 Java 三百行(51-60天,kNN 与 NB)

    目录 总述 01 10天 基本语法 11 20天 线性数据结构 21 30天 树与二叉树 31 40天 图 41 50天 查找与排序 51 60天 kNN 与 NB 61 70天 决策树与集成学习 71 80天 BP 神经网络 81 90天
  • Box2D C++教程6-定制器(Fixtures)

    Box2D C 教程6 定制器 Fixtures 时间 2012 09 01 17 10 24 CSDN博客 原文 http blog csdn net wen294299195 article details 7932770 Box2D
  • Jetbrains IntelliJ IDEA破解方法

    IntelliJ IDEA 一套智慧型的Java整合开发工具 PHPStorm PHP 集成开发工具 PyCharm 智能Python集成开发工具 RubyMine RubyMine 是一个为Ruby 和Rails开发者准备的IDE Web
  • ActivityManagerService新加listener及触发其回调

    ActivityManagerService新加listener及触发其回调 前言 Android mk ActivityManager java ActivityManagerNative java IActivityManager ja
  • 汇编语言rep movsd

    汇编语言rep movsd rep movsd 一般为 mov esi offset s1 mov edi offset s2 mov ecx 数 cld rep movsd 查找了几个资料 都说得不怎么完整 也许是我知道的太少了 所以觉得
  • 区块链学习1:Merkle树(默克尔树)和Merkle根

    前往老猿Python博文目录 一 简介 默克尔树 Merkle tree MT 又翻译为梅克尔树 是一种哈希二叉树 树的根就是Merkle根 关于Merkle树老猿推荐大家阅读 Merkle树 这篇文章 Merkle树和Merkle根在区块
  • 网络数据传输流程

    目录 一 局域网传输流程 1 集线器 2 交换机 3 交换机 路由器 二 广域网数据传输流程 主要过程 一 局域网传输流程 1 集线器 主要过程 源主机 从上到下封装 如果知道目的IP主机的MAC地址就直接封装在数据链路层的以太网帧头中 如
  • 多线程实现大批量数据查询

    优化一个系统中的功能 需要通过判断进行多次的查库 查库的性能是单表 条件有索引 public Map
  • PostgreSQL插件-pg_stat_statements-查找最耗费资源的SQL(Top SQL)

    数据库是较大型的应用 对于繁忙的数据库 需要消耗大量的内存 CPU IO 网络资源 SQL 优化是数据库优化的手段之一 而为了达到 SQL 优化的最佳效果 您首先需要了解最消耗资源的 SQL Top SQL 例如 IO 消耗最高的 SQL
  • leetcode之找出相交链表的交点

    题目 编写一个程序 找到两个单链表相交的起始节点 如果相交只会是y型相交 如果不想交就返回空指针 O 1 空间和O n 时间 分析 直接采取暴力二重循环可以求解 但是超过时间限制 一个思路是先找出两个链表长度相差的值 然后一个链表先走相差的
  • 关于DAG共识的调研

    内容目录 前言 why DAG DAG 是什么 常见共识机制 主链DAG共识 朴素DAG 平行链DAG 问题与挑战 这是自己看的一篇综述 参考里面的分类并对现在的一些DAG共识做的简要理解 后面会对一些共识的论文做学习笔记 若有错误之处还请
  • 公开数据集下载地址

    这里写目录标题 一 目标检测 分割数据集 1 COCO 数据集 COCO2014 COCO2017 2 PASCAL VOC数据集 voc2007数据集 voc 2012数据集 二 自动驾驶数据集 1 BDD100K 数据集 2 Nusce
  • STM32单片机示例:多个定时器同步触发启动

    文章目录 前言 基础说明 关键配置与代码 其它补充 示例链接 前言 多个定时器同步触发启动是一种比较实用的功能 这里将对此做个示例说明 基础说明 该示例演示通过一个TIM使能时同步触发使能另一个TIM 本例中使用TIM1作为主机 使用TIM
  • Linux主机测评

    安全计算环境 一 身份鉴别 a 应对登录的用户进行身份标识和身份鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 此项部分符合 在root权限下查看有关用户的配置文件 1 通过etc password检查身份标识 看是否有没有
  • qq windows版客户端0day复现——远程代码执行(七夕小礼物)

    ps 本文章仅用来分享 请勿将文章内的相关技术用于非法目的 请勿将文章内的相关技术用于非法目的 请勿将文章内的相关技术用于非法目的 如有非法行为与本文章作者无任何关系 一切行为以遵守 中华人民共和国网络安全法 为前提 今天hw貌似爆了挺多劲
  • R语言 集成算法(Bagging算法和Adaboot算法)

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 R版本 3 6 1 adaboost包 提供Bagging函数和Adaboot函数 gt setwd G R语言 大三下半年 数据挖掘 R语言实战 gt data read csv
  • 实现登录功能之拦截器和导航守卫的使用

    需求 本次主要通过SpringSecurity jwt vue实现简易的登录Demo 实现的功能 主要写Demo过程中记录关于拦截器和导航守卫的使用 环境 nodejs v14 16 1 vue 2 9 6 npm 6 14 12 webp
  • 【求助】ERROR: No matching distribution found for python-gssapi==0.6.4怎么解决

    Collecting python gssapi 0 6 4 Using cached https pypi tuna tsinghua edu cn packages a4 9e 648b4e85235097edcee561c986f70
  • 数据结构-时间复杂度

    一 常数操作 常见固定时间的操作 1 常见算术运算 2 位运算 gt gt gt gt gt lt lt 等 3 赋值 比较 自增 自减 4 数组寻址 可以通过计算偏移量直接获取第N位置的内容 对比链表寻址 是没有办法直接计算得到第N位置的