深入解析:数据结构初识,与算法复杂度

news/2025/11/23 19:31:55/文章来源:https://www.cnblogs.com/gccbuaa/p/19261313

数据结构初识,与算法复杂度

  • 前言
  • 1、数据结构与算法
  • 2、数据结构与算法的重要性
  • 3、复杂度
    • 3.1、复杂度的概念
    • 3.2、复杂度的重要性
    • 3.3、时间复杂度
      • 3.3.1、大O的渐进表示法
      • 3.3.2、几个例子
    • 3.4、空间复杂度
      • 3.4.1、概念浅析
      • 3.4.2、示例

前言

哎呀,前前后后,里里外外,我拖拖沓沓了快四个月,终于学完了C语言。

我只明白了一件事:学习,一定要多敲代码,一定要找一个安静(最好无人)的地方,一定要排除万难,一切为学习让步。

现在是2025年10月25日,16时6分,不说了,开干。

1、数据结构与算法

数据结构,是计算机存储、组织数据的方式,方式包括数据的增、删、查、改

数据结构,指相互之间存在一种或多种特定关系的数据元素的集合

算法,指的是一系列计算过程,用于将输入的一个(或一组)数据,经这个计算过程,输出一个(或一组)数据(结果)。

2、数据结构与算法的重要性

非常重要!非常重要!非常重要!

所以要好好学。

3、复杂度

3.1、复杂度的概念

我们知道,衡量一个算法的好坏,一般是从时间空间两个维度出发。

时间复杂度,和空间复杂度

时间复杂度空间复杂度
衡量一个算法的运行快慢衡量一个算法所需要的额外空间的多少

3.2、复杂度的重要性

一句话:节约时间、节省空间、降低成本。

对于笔试面试,和实际开发,都有帮助。

3.3、时间复杂度

算法的时间复杂度,是一个函数T(N),用于定量计算算法的运行时间。

那为什么,不直接跑一跑这个算法,然后记录从开始运行,到结束,这个真实时间,并拿来分析呢?有三点原因:

  1. 编译环境(编译器)的更新迭代,会导致同一段代码,实际运行时间不同。
  2. 机器的新旧,会导致同一段代码,实际运行时间不同。
  3. 要知道这个真实时间,必须先运行代码,而不能通过一种理论,来提前判别。

话说回来。我们知道,写出来的代码,被编译为二进制可执行指令,而程序执行的过程,就是CPU执行这些指令。其中,某一条指令可能被执行一次,也可能被执行多次。所以:

程序的执行时间=二进制指令执行时间∗执行次数程序的执行时间=二进制指令执行时间*执行次数 程序的执行时间=二进制指令执行时间执行次数

举个例子:

//计算++count被执行的次数
void Func(int N)
{
int count = 0;
for (int i = 0; i < N; ++i)
{
++count;
}
for (int i = 0; i < 2 * k; ++i)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
}

不难得出:
T(N)=N2+2∗N+10T(N)=N^2+2*N+10 T(N)=N2+2N+10
其中,N^2对==T(N)==的影响最大。

但实际上,如果单单是执行一条简单的指令,那运行时间就微乎其微了。而有些语句,随着输入参数的变化,它们执行的次数也会随之发生相应有规律的变化。因此,我们计算算法复杂度,只是想计算算法程序的增长量级,也就是当N不断变化(一般是增大)时T(N)的差别。

上面的例子中,我们不难看出,低阶项与常数项,对结果的影响很小,所以我们只需计算一个大概的执行次数。这时可以用大O的渐进表示法

3.3.1、大O的渐进表示法

规则:

  1. 时间复杂度函数式T(n)中,保留最高阶项。比如O(N^2)
  2. 去掉最高阶项的常数系数
  3. 如果函数式中只有常数项,为O(1)

3.3.2、几个例子

举几个我觉得不太好理解的例子。

例一:

void Func1(int N, int M)
{
int count = 0;
for (int k = 0; k < M; k++)
{
count++;
}
for (int k = 0; k < N; k++)
{
count++;
}
printf("%d\n", count);
}

在这里:

  1. T(N) = M + N
  2. 时间复杂度:O(M + N)
    • M == N,时间复杂度可以为O(M) O(N)
    • M >> N,时间复杂度O(M)
    • M << N,时间复杂度O(N)

例二:

const char* strchr (const char * str, char char)
{
const char* p_begin = str;
while (*p_begin != char)
{
if (*p_begin == '\0')
return NULL;
p_begin++;
}
return p_begin;
}

在这里:

  1. 当要查找的字符串在第一位,则T(N) = 1
  2. 当要查找的字符串在中间位置,则T(N) = N/2
  3. 当要查找的字符串在末尾,则T(N) = N

所以:

  1. 最好情况(下界):O(1)
  2. 平均情况:O(N)
  3. 最坏情况(上界):O(N)

而大O的渐进表示法,一般关注上界,即最坏情况。

例三:

//冒泡排序
void BubbleSort(int* a, int n)
{
assert(a);
for (size_t end = n; end > 0; --end)
{
int exchange = 0;
for (size_t i = 1; i < end; ++i)
{
if (a[i-1] > a[i])
{
Swap(&a[i-1], &a[i]);
exchange = 1;
}
}
if (exchange == 0)
break;
}
}

现在是2025年10月28日12时59分

在这里:

  1. 当序列升序,O(N) = N
  2. 当序列降序:
n 的取值对应交换操作执行的次数
10
21
32
43
nn - 1

不难得出,执行次数为N(N - 1)/2,时间复杂度为O(N^2)

例四:

void func2(int n)
{
int cnt = 1;
while (cnt < n)
{
cnt *= 2;
}
}

可以看出,

n = 2,执行次数为1
n = 4,执行次数为2
n = 8,执行次数为4
……
所以此时的T(N) = logN (这里底数不重要,可由换底公式换成任意底),时间复杂度为O(logN)

例五:

也就是函数递归算法的复杂度。

递归的复杂度 = 递归的次数 * 每次递归的时间复杂度

3.4、空间复杂度

3.4.1、概念浅析

由于函数运行所需的栈空间,在编译期间就已经开辟好了,所以空间复杂度主要讨论的是函数在运行时,申请的额外内存空间

3.4.2、示例

例一:

void BubbleSort(int* a, int n)
{
assert(a);
for (size_t end = n; end > 0; --end)
{
int exchange = 0;
for (size_t i = 1; i < end; ++i)
{
if (a[i-1] > a[i])
{
Swap(&a[i-1], &a[i]);
exchange = 1;
}
}
if (exchange == 0)
break;
}
}

还是这个冒泡排序。不难看出,使用了常数个空间,空间复杂度为O(1)

例二:

//计算阶乘的递归
long long Fac(int n)
{
if (n == 0)
return 1;
else
return n*Fac(n - 1);
}

函数进行了n次递归,而每次递归申请了常数个空间,所以空间复杂度为O(N)

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

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

相关文章

2025 年上海金蝶软件代理商深度解析:企业选型必看,“上海金蝶哪家好”答案揭晓

在企业数字化转型浪潮中,金蝶软件凭借其强大的 ERP 及云服务能力,成为众多企业升级管理的首选。然而,面对市场上数量众多、良莠不齐的上海金蝶代理商,企业普遍面临一个核心难题:“上海金蝶软件代理哪家好?” 选择…

候选区域

候选区域 = “可能包含物体的矩形框”,也叫 Region Proposal / 候选框。怎么来的早期 Selective Search:在彩色、纹理、边缘上聚类合并超像素,生成 1k~2k 个框。Faster R-CNN:用 RPN(Region Proposal Network)在…

Ai元人文:关于AI与人类价值的思考——我的一点心里话

Ai元人文:关于AI与人类价值的思考——我的一点心里话 大家好,我是岐金兰。 最近,我提出的一些关于AI和人类价值如何共存的思考,引起了一些朋友的关注。很多人问我:“这个理论接下来怎么证明?你打算怎么做实验?”…

任务6 通过网络服务分析DNS

任务6 通过网络服务分析DNSKali1 客户端 17.154 from scapy.all import * pkt1 = IP(dst="192.168.17.154")/UDP(sport=12345, dport=53)/DNS(id=1000, qr=0, rd=1, qd=DNSQR(qname="www.hxl.com"…

2025年广东地区青少年行为矫正机构怎么选?科学专业才能护航成长未来,五大品牌,家长选择指南。

随着青少年心理健康问题日益凸显,专业行为矫正机构成为家庭解决教育难题的重要选择。本榜单基于办学资质、矫正效果、师资力量、安全保障四大核心维度,结合广东省教育厅备案信息及家长真实反馈,深度解析2025年广东地…

数据结构理论知识 - 指南

数据结构理论知识 - 指南2025-11-23 19:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

vim 支持 aosp 代码跳转

推荐一种改动最小,且不影响其他用户的 Vim 跳转 AOSP 代码的方法。我们会使用 ctags 工具,它能生成代码索引,而不需要互联网连接,也不会影响其他用户。 步骤:使用 ctags 生成索引并在 Vim 中跳转 1. 安装 ctags 首…

2025年11月广东青少年素质拓展训练学校五大推荐口碑榜:规范养习惯,护航成长之路

随着青少年心理健康与综合素质教育需求的不断攀升,专业素质拓展训练机构成为教育市场的重要力量。本榜单基于基地规模、资质认证、课程体系、转化效果四大核心维度,结合广东省教育厅备案信息及家长满意度调研数据,权…

大盘风险控制策略分析报告 - 2025年11月21日

大盘风险控制策略分析报告 - 2025年11月21日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

AI赋予NPC记忆能力的双重影响

本文探讨了AI技术在游戏行业的应用演进,从最初的新奇事物发展为不可或缺的力量。文章分析了算法突破为玩家和开发者带来的新可能性与挑战,特别关注了能够记忆的NPC技术实现及其对行业就业的潜在影响。AI能赋予NPC记忆…

uos安装maven

uos安装maven1、通过系统仓库安装目前版本为3.6 命令:sudo apt install mavensudo yum install mavensudo dnf install maven 检测版本:mvn -v安装位置:/usr/share/maven 2、下载最新版本安装为3.9.11 下载地址:h…

人工智能之数据分析 numpy:第十一章 字符串与字节交换

人工智能之数据分析 numpy:第十一章 字符串与字节交换人工智能之数据分析 numpy 第十一章 字符串与字节交换@目录人工智能之数据分析 numpy前言一、NumPy 中的字符串数组1. 创建字符串数组2. 固定长度行为示例3. 字符…

通道数

128128256 的“分辨率”就是 128128 像素(宽 128,高 128)。 分辨率就是一张图里“有多少个像素”,也叫空间分辨率。用“宽 高”表示,单位是像素(pixel)。例:1920 1080 表示宽 1920 个像素、高 1080 个像素,…

前端八股文-高频面试题 - 教程

前端八股文-高频面试题 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

2025西北地区地埋式污水处理设备厂家最新top5推荐,宁夏、新疆、甘肃、陕西四省,污水处理设备品牌选型指南

随着水环境治理需求的不断升级,地埋式污水处理设备以其高效、节能、占地面积小等优势,成为污水处理领域的重要选择。本榜单基于技术先进性、产品性能、应用案例、售后服务四大维度,结合行业调研数据,权威解析2025年…

多尺度特征图

多尺度特征图就是 “同一张输入图,在网络不同深度得到的一组空间分辨率不同、语义级别不同的特征图”。为什么需要它小目标 → 需要高分辨率特征(细节多)大目标 → 需要大感受野、高语义特征(上下文多)单尺度图只…

2024软工K班结对编程任务

https://gitee.com/stone-integrity-universe/rollcall-system https://www.cnblogs.com/scyskh/p/19259789 https://www.bilibili.com/video/BV12TUwBKEas/ 一、结对探索 1.1 队伍基本信息 结对编号:2526;队伍名称:…

基于python大材料技术的医疗数据分析与研究

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

java linux 搭建

搭建一个 Java 环境在 Linux 上是一个常见的任务,下面我将分步骤介绍如何在 Linux 上搭建 Java 开发环境,包括 JDK、JRE、IDE(如 IntelliJ IDEA 或 Eclipse)以及 Maven 的安装。一、安装 Java Development Kit (JD…

实用指南:各种各样的Self-attention学习上(第二十周周报)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …