【数据结构篇】时间复杂度

一.数据结构前言

 1.1 数据结构的概念

     数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构, 如:线性表、树、图、哈希等

1.2 算法

    算法(Algorithm):就是定义良好的计算过程,他取⼀个或⼀组的值为输⼊,并产⽣出⼀个或⼀组值作为输出。简单来说算法就是⼀系列的计算步骤,⽤来将输⼊数据转化成输出结果

二.时间复杂度

2.1 复杂度的概念

    算法在编写成可执⾏程序后,运⾏时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好 坏,⼀般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度
    时间复杂度主要衡量 ⼀个算法的运⾏快慢 ,⽽空间复杂度主要衡量 ⼀个算法运⾏所需要的额外空 。在计算机发展的早期,计算机的存储容量很⼩。所以对空间复杂度非常在乎。但是经过计算机⾏业的迅速发展,计算机的存储容量已经达到了很⾼的程度。所以我们如今已经不需要再特别关注⼀个算法 的空间复杂度

2.2 时间复杂度的定义

    在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间(实际上,时间复杂度的本质是,随着输入规模的不断增大,算法运行速度的变化趋势),时间复杂度是描述程序的时间效率,那么为什么不去计算程序的运行时间那?

    1. 因为程序运⾏时间和编译环境和运⾏机器的配置都有关系,⽐如同⼀个算法程序,⽤⼀个⽼编译器进⾏编译和新编译器编译,在同样机器下运⾏时间不同。

    2. 同⼀个算法程序,⽤⼀个⽼低配置机器和新⾼配置机器,运⾏时间也不同。

    3. 并且时间只能程序写好后测试,不能写程序前通过理论思想计算评估

3.3 大O渐进表示法(计算的)

    那么,函数式 T (N) 到底是什么呢?因为算法的运行时间和基本语句执行次数成正比,精确计算执行次数很麻烦,且不同程序代码编译出的指令条数不同,精确计算意义不大,所以我们引入大 O 渐进法,它会去掉影响较小的项。下面具体描述大 O 渐进表示法的计算过程:

 我在简略总结一下:

    常数归一:将运行时间中的加法常数用 1 取代。

    保留高阶:仅保留运行次数函数中的最高阶项。

    去除系数:若最高阶项系数不为 1,去除该系数。

三.时间复杂度计算案例

3.1 示例1

    T(N) = M+N

    由于题目并没有说明M和N的具体大小,所以我们不能去掉其中的任意一项

    时间复杂度O(M+N)

3.2 示例2

    T(N) =  2*N + 10

    先将 +10 变成 +1,由于 +10 为低阶项,去掉 +10 ,高阶项的系数不是1,将系数变为1

    时间复杂度:O(N)    

    看到这我估计有人会想,为啥要去掉系数那,×2不是变化挺大的吗?那你想一想,如果输入规模趋于无穷大,那么给他×多少不是一样的吗

3.3 示例3

    T(n) = 100  

    如果算法的基本操作执行次数是一个与输入规模无关的常数,那么其时间复杂度记为 O(1)

    时间复杂度:O(1)(表示算法的基本执行次数和输入规模无关)

3.4 示例4

(1)若要查找的字符在字符串第⼀个位置,则:
                 T (N) = 1
(2)若要查找的字符在字符串最后的⼀个位置, 则:
                 T (N) = N
(3)若要查找的字符在字符串中间位置,则:
                 T (N) = 2 / N
  因此:strchr的时间复杂度分为:
  最好情况: ( 1 )
  最坏情况: )
  平均情况: N / 2 )

为啥关注算法的最坏情况,你可以这样理解:某一天你和女朋友约好下班后去约会看晚上 20:00 的电影,但是你手头有一项工作要完成,这项工作的任务量和难度是不确定的,所以你也不知道具体几点能结束工作出发去赴约。

现在你有三个时间点可以告诉她你大概能结束工作出发,分别是 17:00、18:00、19:00。考虑到工作可能出现各种意外状况,比如遇到复杂问题需要花费更多时间解决、中途可能有新的任务插入等,为了避免让女朋友等待,保证不会耽误看电影,你肯定会选择告诉她最晚的那个时间点 19:00。

这就如同在算法中,最坏情况代表着在任意输入规模下,算法运行的最大次数(上界)。我们关注最坏情况,是因为它能让我们在设计和评估算法时,知晓算法在最糟糕场景下的性能表现,确保算法在任何情况下都能满足一定的性能要求,就像告诉女朋友最晚时间能保证约会按时进行一样

3.5 示例5

若数组有序,只需要遍历一遍数组,所以他的时间复杂度是:O(N)

若数组有序且是降序,那么他要比较n-1趟,第一次比较n-1次 第二次比较n-2次 以此类推 到1次

所以他是一个等差数列,用等差数列求和公式计算是 :

 首项是1        尾项是n-1       公差是1        一共有n-1项

 用大O计算法进行表示:O(N^2)

3.6 示例6

       

3.7 示例7

 

 我看过不少面经都对时间复杂度的计算进行了考察,这没有捷径,多练,多算,加油吧!!!

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11967.html

    如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    700. 二叉搜索树中的搜索

    二叉搜索树中的搜索 已解答 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,3], v…

    Spring Cloud工程搭建

    目录 工程搭建 搭建父子工程 创建父工程 Spring Cloud版本 创建子项目-订单服务 声明项⽬依赖 和 项⽬构建插件 创建子项目-商品服务 声明项⽬依赖 和 项⽬构建插件 工程搭建 因为拆分成了微服务,所以要拆分出多个项目,但是IDEA只能一个窗口有一…

    Rust中使用ORM框架diesel报错问题

    1 起初环境没有问题:在Rust开发的时候起初使用的是mingw64平台加stable-x86_64-pc-windows-gnu编译链,当使用到diesel时会报错,如下: x86_64-w64-mingw32/bin/ld.exe: cannot find -lmysql具体信息很长这是主要信息是rust找不到链…

    【C++】P1765 手机

    博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯问题描述题目内容示例: 键盘布局 💯我的做法思路问题与优化我的代码实现分析与问题 💯老师的做法思路老师的代码实现分析优点 &#x1f…

    本地快速部署DeepSeek-R1模型——2025新年贺岁

    一晃年初六了,春节长假余额马上归零了。今天下午在我的电脑上成功部署了DeepSeek-R1模型,抽个时间和大家简单分享一下过程: 概述 DeepSeek模型 是一家由中国知名量化私募巨头幻方量化创立的人工智能公司,致力于开发高效、高性能…

    3 卷积神经网络CNN

    1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron,可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…

    QT交叉编译环境搭建(Cmake和qmake)

    介绍一共有两种方法(基于qmake和cmake): 1.直接调用虚拟机中的交叉编译工具编译 2.在QT中新建编译套件kits camke和qmake的区别:CMake 和 qmake 都是自动化构建工具,用于简化构建过程,管理编译设置&…

    STM32 对射式红外传感器配置

    这次用的是STM32F103的开发板(这里面的exti.c文件没有how to use this driver 配置说明) 对射式红外传感器 由一个红外发光二极管和NPN光电三极管组成,M3固定安装孔,有输出状态指示灯,输出高电平灯灭,输出…

    SQL优化

    1.插入数据 (1)insert优化 批量插入:insert into tb_test values(1,tom),(2,cat),(3.jerry); 手动提交事务: start transaction; insert into tb_test values(1,tom),(2,cat),(3.jerry); insert into tb_test values(12,tom),(22…

    BFS(广度优先搜索)——搜索算法

    BFS,也就是广度(宽度)优先搜索,二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS(深度优先搜索)。从字面意思也很好理解,DFS就是一条路走到黑,BFS则是一层一层地展开。…

    单调队列 滑动窗口(题目分析+C++完整代码)

    滑动窗口/单调队列 原题链接 AcWing 154. 滑动窗口 题目描述 给定一个数组。 有一个大小为 k的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7…

    爬虫基础(四)线程 和 进程 及相关知识点

    目录 一、线程和进程 (1)进程 (2)线程 (3)区别 二、串行、并发、并行 (1)串行 (2)并行 (3)并发 三、爬虫中的线程和进程 &am…

    【C++】B2120 单词的长度

    博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯我的做法代码实现:思路解析: 💯老师的第一种做法代码实现:思路解析: 💯老师的…

    nvm的安装和使用

    打开地址下载 https://github.com/coreybutler/nvm-windows/releases 推荐下载,nvm-setup.zip 这个。可能有的教程会让下载nvm-noinstall.zip 。noinstall确实下载之后不用安装,但是要自己配置setting.txt文件,以及环境变量 。 安装nvm 在电…

    嵌入式知识点总结 操作系统 专题提升(四)-上下文

    针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.上下文有哪些?怎么理解? 2.为什么会有上下文这种概念? 3.什么情况下进行用户态到内核态的切换? 4.中断上下文代码中有哪些注意事项? 5.请问线程需要保存哪些…

    Python在线编辑器

    from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…

    web-SQL注入-CTFHub

    前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…

    力扣动态规划-19【算法学习day.113】

    前言 ###我做这类文章一个重要的目的还是记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!! 习题 1.矩形中移动的最大次数 题目链接…

    js笔记(黑马程序员)

    js(day2) 一、运算符 1.赋值运算符 运算符作用加法赋值-减法赋值*乘法复制/除法赋值%取余赋值 2.一元运算符 符号作用说明自增变量自身的值加1,如X--自减变量自身的值减1,如X-- 3.比较运算符 运算符作用>左边是否大于右…

    使用Pygame制作“青蛙过河”游戏

    本篇博客将演示如何使用 Python Pygame 从零开始编写一款 Frogger 风格的小游戏。Frogger 是一款早期街机经典,玩家需要帮助青蛙穿越车水马龙的马路到达对岸。本示例提供了一个精简原型,包含角色移动、汽车生成与移动、碰撞检测、胜利条件等关键点。希望…