[一篇读懂]C语言八讲:数据结构概述

news2024/10/6 8:39:22

[一篇读懂]C语言八讲:数据结构概述

  • 1. 与408关联解析及本节内容介绍
    • 1 与408关联解析
    • 2 本节内容介绍
  • 2. 逻辑结构与存储结构
    • 1 逻辑结构
    • 2 存储结构
      • 顺序存储
      • 链式存储
    • 3 顺序存储与链式存储分析
      • 顺序存储优缺点
      • 链式存储优缺点
  • 3. 时间复杂度与空间复杂度
    • 1 算法定义
    • 2 时间复杂度
      • 【示例程序1】
      • 【示例程序2】
      • 【示例程序3】
      • 【示例程序4】
      • 【示例程序5】
      • 【示例程序6】
      • 【思考题】
    • 3 空间复杂度
  • 总结
    • 2
    • 2.2
    • 2.3
    • 3.1
    • 3.2
    • 3.3


1. 与408关联解析及本节内容介绍

1 与408关联解析

【2009年真题单选第一题】

  1. 为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是______。
    A.栈
    B.队列
    C.树
    D.图

【2014年真题单选第一题】

  1. 下列程序段的时间复杂度是_____。
count = 0;
for(k = 1; k <= n; k *= 2)
	for(j = 1; j <= n; j++)
		count++;

A. O ( log ⁡ 2 n ) O\left( \log _2n \right) O(log2n)
B. O ( n ) O\left( n \right) O(n)
C. O ( n log ⁡ 2 n ) O\left(n\log _2n \right) O(nlog2n)
D. O ( n 2 ) O\left( n^2 \right) O(n2)

【2017年真题单选第一题】

  1. 下列函数的时间复杂度是
int func(int n)
{
	int i = 0, sum = 0;
	while(sum < n) sum += ++i;
	return i;
}

A. O ( log ⁡ n ) O\left( \log n \right) O(logn)
B. O ( n 1 / 2 ) O\left( n^{1/2} \right) O(n1/2)
C. O ( n ) O\left(n \right) O(n)
D. O ( n log ⁡ n ) O\left( n\log n \right) O(nlogn)

【2019年真题单选第一题】

  1. 设n是描述问题规模的非负整数,下列程序段的时间复杂度是
x=0;
while(n >= (x + 1) * (x + 1))
	x = x + 1;

A. O ( log ⁡ n ) O\left( \log n \right) O(logn)
B. O ( n 1 / 2 ) O\left( n^{1/2} \right) O(n1/2)
C. O ( n ) O\left(n \right) O(n)
D. O ( n 2 ) O\left( n^2 \right) O(n2)

以及综合应用题也要求说明设计的算法的时间复杂度,或者空间复杂度。

2 本节内容介绍

本节分为两小节讲解。

  • 第一小节主要讲解什么是逻辑结构,逻辑结构有哪些,什么是存储结构,存储结构有哪些逻辑结构和存储结构之间有什么关系。
  • 第二小节主要讲解什么是时间复杂度,时间复杂度如何计算,各种例子实战时间复杂度的计算,什么是空间复杂度。

2. 逻辑结构与存储结构

两者对比:

  • 逻辑结构:数据元素之间的逻辑关系 - 抽象的
    对人友好
  • 存储结构:数据结构在计算机中的表示 - 具体的
    对计算机友好

1 逻辑结构

1

2 存储结构

1

  • 计算机中任何逻辑结构,都能由顺序存储和链式存储来实现。

顺序存储

  • 典型的顺序存储 - 数组
    0

C语言实现:

int Array[6]={ l,2,3,4,5,6};//定义数组并初始化
printf ("%d\n", Array[3])//随机访问第4个元素
  • 可以任意访问某个地址,时间复杂度相等

链式存储

0

  • 每个元素不连续,通过指针指向下一个节点。

C语言实现:

Typdef struct Lnode
{
	ElemType data;
	struct Lnode *next;
}Lnode,*LinkList;
Lnode *L;
L = (LinkList)malloc(sizeof(Lnode));
A -> next = B; B -> next = C

3 顺序存储与链式存储分析

顺序存储优缺点

优点:

  1. 可以实现随机存取。
  2. 每个元素占用最少的空间。

缺点:

  1. 只能使用整块的存储单元,会产出较多的碎片。

链式存储优缺点

优点:

  1. 充分利用所有存储单元,不会出现碎片现象。

缺点:

  1. 需要额外的存储空间用来存放下一结点的指针。
  2. 只能实现顺序存取。

3. 时间复杂度与空间复杂度

1 算法定义

  • 算法的定义:对特定问题求解步骤的描述。
  • 算法的特性:有穷;确定;可行;输入;输出。

2 时间复杂度

  • 时间复杂度指算法中所有语句的频度(执行次数)之和。
  • 记为: T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
    其中, n n n是问题的规模; f ( n ) f(n) f(n)是问题规模 n n n的某个函数。

表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。

  • 常见的时间复杂度:
    O ( 1 ) < O ( log ⁡ 2 n ) < O ( n ) < O ( n log ⁡ 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) O\left( 1 \right) <O\left( \log _2n \right) <O\left( n \right) <O\left( n\log _2n \right) <O\left( n^2 \right) <O\left( n^3 \right) <O\left( 2^n \right) <O\left( n! \right) O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)

最高阶数越小,说明算法的时间性能越好。

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

【示例程序1】

int sum = 0; //执行一次
sum = n *(n+1)/2; //执行一次
printf("%d", sum); //执行一次

算法的执行次数等于3。
时间复杂度为 T ( n ) = O ( 1 ) T(n)=O(1) T(n)=O(1)
表示不会随n的增长而增长。

并没有循环,程序只执行了一次。
执行次数是固定的。
不存在O(2)、O(3)等等。

【示例程序2】

【2011年计算机联考真题】

int x = 2; 
while(x < n / 2)
	x = 2 * x;

执行频率最高的语句为“x=2*x”。
设该语句共执行了t次,则 2 t + 1 < n / 2 2^{t+1}<n/2 2t+1<n/2,故 t = l o g 2 ( n / 2 ) − 1 = l o g 2 n − 2 t=log_2(n/2)-1=log_2n-2 t=log2(n/2)1=log2n2
时间复杂度 T ( n ) = O ( l o g 2 n ) T(n)=O(log_2n) T(n)=O(log2n)

x的值为2、4、8、16……,即2的幂次增长。
运行t次,x为 2 t + 1 2^{t+1} 2t+1 < n / 2 <n/2 <n/2,两边同时取对数。
得到t。

【示例程序3】

int sum = 0, i = 1; 
while(i < n)
{
	sum = sum + i;
	i++;
}
printf("%d",sum);

执行频率最高的语句是while循环体中的代码。
一共执行n-1次。
时间复杂度 T ( n ) = O ( n ) T(n)=O(n) T(n)=O(n)

【示例程序4】

int i, x = 2; 
for(i = 0; i < n; i++)
{
	x = 0;
	while(x < n / 2)
		x = 2 * x;
}

执行频率最高的语句为“x=2*x”。
设该语句内层循环执行了 l o g 2 n 次 log_2n次 log2n,外层执行了n次,因此总计执行次数为 n l o g 2 n nlog_2n nlog2n次。
时间复杂度 T ( n ) = O ( n l o g 2 n ) T(n)=O(nlog_2n) T(n)=O(nlog2n)

【示例程序5】

int i, j; 
for(i = 0; i < n; i++)
{
	for(j = 0; j < m; j++)
		sum = sum + 1;
}

对于外层循环,相当于内部时间复杂度为O(m)的语句再循环n次。
所以时间复杂度 T ( n ) = O ( m × n ) T(n)=O(m×n) T(n)=O(m×n)
如果m=n,则时间复杂度 T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2)

时间复杂度的乘法规则

【示例程序6】

int sum1 = 0, sum2 = 0, i, j; 
for(i = 0; i < n; i++)
	sum1 = sum1 + i;
for(j = 0; j < m; j++)
	sum2 = sum2 + j;
printf("%d, %d", sum1, sum2);
}

两个循环没有嵌套,串行执行。
所以时间复杂度 T ( n ) = O ( n ) + O ( m ) T(n)=O(n)+O(m) T(n)=O(n)+O(m)
取最大的,即时间复杂度 T ( n ) = m a x ( O ( n ) , O ( m ) ) T(n)=max(O(n),O(m)) T(n)=max(O(n),O(m))

时间复杂度的加法规则

【思考题】

如果一个算法的执行次数为 3 n 3 + 5 n 3n^3+5n 3n3+5n,那么该算法的时间复杂度为多少?

答案是 O ( n 3 ) O(n^3) O(n3)

  • 时间复杂度计算忽略高阶项系数和低阶项。

3 空间复杂度

  • 空间复杂度S(n)指算法运行过程中所使用的辅助空间的大小。

  • 记为:
    S ( n ) = O ( f ( n ) ) S(n)=O(f(n)) S(n)=O(f(n))

  • 除了需要存储算法本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。

  • 若输入数据所占空间只取决于问题本身,和算法无关,这样只需分析该算法在实现时所需的辅助单元即可。

  • 算法原地工作是指算法所需的辅助空间是常量,即 O ( 1 ) O(1) O(1)

空间复杂度 O ( 1 ) O(1) O(1)
例如,n个元素数组排序,不使用额外的空间(随着n的增长而增长的空间),空间复杂度就是 O ( 1 ) O(1) O(1)


总结

2

  • 逻辑结构:数据元素之间的逻辑关系 - 抽象的
    对人友好
  • 存储结构:数据结构在计算机中的表示 - 具体的
    对计算机友好

2.2

  • 计算机中任何逻辑结构,都能由顺序存储和链式存储来实现。

2.3

顺序存储优缺点:
优点:

  1. 可以实现随机存取。
  2. 每个元素占用最少的空间。

缺点:

  1. 只能使用整块的存储单元,会产出较多的碎片。

链式存储优缺点:
优点:

  1. 充分利用所有存储单元,不会出现碎片现象。

缺点:

  1. 需要额外的存储空间用来存放下一结点的指针。
  2. 只能实现顺序存取。

3.1

  • 算法的定义:对特定问题求解步骤的描述。
  • 算法的特性:有穷;确定;可行;输入;输出。

3.2

  • 时间复杂度指算法中所有语句的频度(执行次数)之和。
  • 记为: T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
    其中, n n n是问题的规模; f ( n ) f(n) f(n)是问题规模 n n n的某个函数。

表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。

  • 常见的时间复杂度:
    O ( 1 ) < O ( log ⁡ 2 n ) < O ( n ) < O ( n log ⁡ 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) O\left( 1 \right) <O\left( \log _2n \right) <O\left( n \right) <O\left( n\log _2n \right) <O\left( n^2 \right) <O\left( n^3 \right) <O\left( 2^n \right) <O\left( n! \right) O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)

最高阶数越小,说明算法的时间性能越好。

  • 时间复杂度计算忽略高阶项系数和低阶项。

3.3

  • 空间复杂度S(n)指算法运行过程中所使用的辅助空间的大小。

  • 记为:
    S ( n ) = O ( f ( n ) ) S(n)=O(f(n)) S(n)=O(f(n))

  • 除了需要存储算法本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。

  • 若输入数据所占空间只取决于问题本身,和算法无关,这样只需分析该算法在实现时所需的辅助单元即可。

  • 算法原地工作是指算法所需的辅助空间是常量,即 O ( 1 ) O(1) O(1)

空间复杂度 O ( 1 ) O(1) O(1)
例如,n个元素数组排序,不使用额外的空间(随着n的增长而增长的空间),空间复杂度就是 O ( 1 ) O(1) O(1)

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

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

相关文章

攻防世界1-misc

1-misc 题目描述&#xff1a;无 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87094807 打开压缩包&#xff0c;提示密码是出题人生日。 使用archpr爆破压缩包。 得到密码&#xff1a;20001228 解压压缩包&#xff0c;得到两个文件&#xff0c;一个图片…

[附源码]java毕业设计网吧购物系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【CSDN|每日一练】代写匿名信

目录 运行结果题目描述输入描述:输出描述:示例代码结语运行结果 题目描述 小Q想要匿名举报XX领导不务正业! 小Q害怕别人认出他的字迹。 他选择从报纸上剪裁下来英文字母组成自己的举报信。 现在小Q找来了报纸,和自己的举报信的Txt, 你能帮他确定一下是否能够完成匿名信…

6242. 二叉搜索树最近节点查询

目录题目关键词代码题目 给你一个 二叉搜索树 的根节点 root &#xff0c;和一个由正整数组成、长度为 n 的数组 queries 。 请你找出一个长度为 n 的 二维 答案数组 answer &#xff0c;其中 answer[i] [mini, maxi] &#xff1a; mini 是树中小于等于 queries[i] 的 最大值…

Vue-Router学习记录

目录 一.使用路由 1.1配置路由 1.2采用路由 二.路由懒加载 三.路由重定向 四.嵌套路由 五.路由跳转 1.1标签式 1.2编程式 1.3路由的query参数 1.4命名路由 前言: vue 属于单页面应用&#xff0c;所谓的路由&#xff0c;就是根据浏览器路径不同&#xff0c;用不同的…

常见Lidar点云数据处理及可视化软件汇总

常见的点云处理及可视化软件有&#xff1a; CloudCompare、Globalmapper、Pix4d、ArcGIS&#xff08;Pro&#xff09;、Lidar 360、PCL等等。 文章目录1. CloudCompare2. Globalmapper3. Pix4d4. ArcGIS&#xff08;Pro&#xff09;5. Lidar 3606. PCL1. CloudCompare CloudCo…

2022年11月20日 15点 纳指正在走到一个黄金分割点附近,是否会真的按照自然规则做调整,可以看看数据的威力。

行情核心源头: 纳斯达克指数&#xff0c; 是否会符合大数据规则&#xff0c;走黄金分割线规则 [数据说话] 第一波下跌3820&#xff0c; 反弹2299点&#xff0c;反弹了60%&#xff0c;接近61.8%第二波下跌4159&#xff0c;反弹2612&#xff0c;反弹了62.8%&#xff0c;接近61.…

借助第三方工具网站完成消息自动推送

文章目录前言pushplus是什么pushplus测试使用代码发送注意的问题总结前言 寻找消息推送的起因是之前买过一台云服务器&#xff0c;用于开发环境搭建和学习&#xff0c;最近想用它进行一些数据分析&#xff0c;而数据分析的结果如果每次都需要登录服务器来看就有点“太老土”了…

今天解决了一个主从延迟导致超发的问题

主从同步过程 MySQL主从同步由主节点dump线程、从节点 I/O 线程、从节点SQL线程三个线程配合完成。 1、从节点上的 I/O 进程主从去连接主节点&#xff0c;并带上同步的开始位置即指定日志文件的位置之后的日志内容 2、主节点接收到来自从节点的 I/O 请求后&#xff0c;通过主…

c风格字符串,数组,string ,vector

c风格字符串&#xff0c;数组&#xff0c;string &#xff0c;vector 数组 数组下标 数组下标通常定义为 size_t type arrayName [ arraySize ][arraySize1]; arraySize必须是一个大于等于零的整数常量。 1因为sizeof的计算值是个常量&#xff0c;所以sizeof的计算值和字…

深度学习基础-2

文章目录0 前言1 全连接神经网络2 激活函数2.1 Sigmoid2.2 Tanh2.3 ReLU2.4 Leaky ReLU3 交叉熵损失4 计算图与反向传播4.1 计算图4.2 梯度消失与梯度爆炸4.3 动量法5 权重初始化5.1 全零初始化5.2 标准随机初始化5.3 Xavier初始化5.4 Kaming初始化6 批归一化7 参考资料0 前言 …

腾讯云轻量应用服务器内网连接互通有什么限制?

腾讯云轻量应用服务器内网连接互通有什么限制&#xff1f;腾讯云轻量应用服务器可以通过内网访问同地域下的云数据库、云服务器CVM或负载均衡等实例吗&#xff1f;不可以&#xff0c;只能通过公网连接互通&#xff0c;主机教程网来详细说下腾讯云轻量应用服务器内网互通限制说明…

快速MOCK数据并插入数据表中(MySQL)

问题描述&#xff1a;在学习使用SQL语句操作数据库的时候&#xff0c;添加十几二十条数据总感觉不够直观&#xff0c;如何快速批量制造相对真实的假数据&#xff0c;以供测试使用&#xff1f; 一、操作步骤 1.准备一张表 CREATE TABLE IF NOT EXISTS products (id INT PRIMA…

关于qt中label挡住了dockwidget的窗体边缘

关于qt中label挡住了dockwidget的窗体标题 1.问题描述&#xff1a; dock_Image new QDockWidget(tr("图像"), this);setCentralWidget(dock_Image);imgLabel new QLabel(dock_Image);imgLabel->setScaledContents(true); // 设置QLabel自动适应图像大小//dock…

win下载安装不同java版本教程

不同版本jdk下载与安装 1. 下载 最全java版本官方下载地址https://www.oracle.com/java/technologies/downloads 下载.exe安装文件即可 2.安装 下载后双击exe程序即可安装&#xff0c;在第二布时要特别注意&#xff1a;安装路径不要有中文或含有空格 3.检查java是否安装成…

你在编程过程中养成了哪些好习惯?

写工作日志。 我一直有大量写笔记的习惯。编程的时候&#xff0c;也经常遇到一些麻烦的问题&#xff0c;思路转瞬即逝&#xff0c;于是把所有这些思路记录下来&#xff0c;会在以后的搜索中成为重要的灵感来源。 我的工作日志里通常以项目为单位&#xff0c;包含四个重要的章…

[Linux/初学者]Vim文本编译器的模式切换及其常用指令

前言 Linux 系统中所有的内容都以文件的形式进行存储&#xff0c;当在命令行下更改文件内容时&#xff0c;常会用到文本编辑器。 Vi编辑器是Unix及Linux系统下的标准编辑器&#xff0c;同时也是Linux中最基本的文本编辑器&#xff0c; Vim编译器则是Vi编译器的升级版本&…

ActionVLAD算法详解

文章地址&#xff1a;https://rohitgirdhar.github.io/ActionVLAD/ 代码地址&#xff1a;https://github.com/rohitgirdhar/ActionVLAD/ 该文章由CMU、Adobe、法国国立计算机及自动化研究院联合提出&#xff0c;被CVPR2017收录。 该文章的创新点在于将vlad使用到动作分类任务…

化工原理 --- 热量传递(补充)

一.管外作强制对流的对流传热系数 1.管外作强制流动一般分为两种形式 ---- 分别是直列流动和错列流动 上图是两种流动方式下的传热系数计算公式 二.管外作强制对流 --- 换热器管间流动 在管内的强制对流传热分为两种形式&#xff0c;分别是圆缺形挡板和圆盘形挡板 1.圆缺形挡板…

计算机毕业设计之java+ssm社会保险养老系统

项目介绍 自“金保工程”在全国实施以来&#xff0c;促进了劳动和社会保障工作处理方法全面完善&#xff0c;可以把社会保险注册、登记、申请、审核、收取、给付、核查、资金账户、社保管理以及劳动力市场相结合&#xff0c;实现劳动就业、择业、创业和社会保险管理品台的共享…