【C语言督学训练营 第九天】C语言与408关联之数据结构概述

前言

C语言与数据结构是密不可分的,而数据结构又作为408计算机专业课的重中之重,通过C语言的结构体与指针可以轻松而又形象的实现数据结构中的逻辑存储,今天这篇博客将会初步介绍数据结构中逻辑结构与存储结构、时间复杂度与空间复杂度。虽然二者都是基础概念,但也是常考的考点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时间复杂度几乎是每一年大题必考内容!

一、逻辑结构与存储结构

可以从下图看出,逻辑结构是抽象的(也就是人为按照一定规则定义的),存储结构是具体的(是什么就是什么)
在这里插入图片描述
下面是几个常见的逻辑结构,在存储逻辑上正如下图所示,但是在实际的计算机中存储时还是采用的malloc动态内存申请等方法使用链式存储实现。

在这里插入图片描述
下图是几种存储结构,其中顺序存储与链式存储是我们以后最常用的两种方式。
在这里插入图片描述
顺序存储的实现方式如下图所示:在内存上,各个节点相互衔接,可以通过下标快速索引。
在这里插入图片描述
链式存储的方式如下图所示:节点实际内存地址不一定相邻,节点记录着与之相关的节点的地址。只能顺序索引,不可以快速索引。
在这里插入图片描述
总的来说可以将逻辑结构与存储结构归结为下图:
在这里插入图片描述
两者差异如下图所示:
在这里插入图片描述

这里再说一下索引存储与散列存储的概念,二者在后面数据结构课程中会详细的介绍,目前只作为了解即可。

  • 索引存储,分别存放数据元素和元素间关系的存储方式。 所有的存储结点存放在一个区域。 另设置一个索引区域存储结点之间的关系。 索引区由若干索引项组成。 若每个存储结点在索引表中都有一个索引项,则该索引表称“稠密索引”;若一组存储结点在索引表中只对应于一个索引项,则该索引表称“稀疏索引”。
  • 散列存储:散列存储,又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。 散列法存储的基本思想是: 由节点的关键码值决定节点的存储地址。 散列技术除了可以用于查找外,还可以用于存储。 散列是数组存储方式的一种发展,相比数组,散列的数据访问速度要高于数组,因为可以依据存储数据的部分内容找到数据在数组中的存储位置,进而能够快速实现数据的访问,理想的散列访问速度是非常迅速的,而不像在数组中的遍历过程,采用存储数组中内容的部分元素作为映射函数的输入,映射函数的输出就是存储数据的位置,这样的访问速度就省去了遍历数组的实现,因此时间复杂度可以认为为O (1),而数组遍历的时间复杂度为O (n)。

通常散列存储的结构如下图所示:
在这里插入图片描述

下面是有关散列存储的一道真题。在散列表中寻找元素时,只需要根据散列函数计算然后根据散列表的特性进行寻找即可,速度上远远快过在数组中查找元素。
在这里插入图片描述

二、时间复杂度

时间复杂度与空间复杂度常常作为考验算法优良与否最重要的标准之一。
在这里插入图片描述
时间复杂度基本概念:

在这里插入图片描述
时间复杂度,效率对比曲线图
在这里插入图片描述
下面几种为常见的几种时间复杂度的出现场景。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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


答:是o (n3),因为时间复杂度计算忽略高阶项系数和低阶项

三、空间复杂度

空间复杂度S(n)指算法运行过程中所使用的辅助空间的大小。记为:
s(n)=O(f(n))

  • 除了需要存储算法本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。
  • 若输入数据所占空间只取决于问题本身,和算法无关,这样只需分析该算法在实现时所需的辅助单元即可。
  • 算法原地工作是指算法所需的辅助空间是常量,即O(1)。
    后面会结合具体代码探索什么是空间复杂度,什么是时间复杂度。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/apple_51931783/article/details/129893812