数据结构与算法回顾——开篇

41 阅读3分钟

什么是数据结构

我认为数据结构是按照特定逻辑方式组织的数据集合,主要还是体现在描述数据的逻辑关系,不同的逻辑关系适合不同的算法。

为什么会产生数据结构

数据结构产生的背景源自计算机科学的发展和计算机技术的进步,随着计算机发展,越来越多的数据需要被处理,当传统的数据处理方法不能满足当前需求时,为了更好的组织管理数据,就产生了数据结构这门学科,不同的结构有各自对应的算法提升效率,所以,通常数据结构往往伴随着算法一起讲。

常见的几种数据结构

咱们按照逻辑结构来划分可以概括为线性结构与非线性结构, 如果按照存储结构划分,可以分为线性存储与链式存储

线性存储

线性存储首先想到的代表就是大名鼎鼎的数组了,好多数据结构都可以依托数组来实现,如栈、队列、堆等。
那么为什么需要数组呢? 可能有些朋友不会想这些问题,数组就数组呗,教给我们记住就好,但我觉得不尽然,在技术方面,最好还是要知其所以然! 对此我有以下浅显的理解,权当抛砖引玉: 数组能够产生的物理土壤,是人类数学与计算机方面的发展,当需要处理多个数据时,这些数据可能是同一种类型、具有相同的性质结构,可以进行相似的操作。从程序的角度来讲同种类型的数据如果需要很多变量来存储,会非常的麻烦且灾难性的难以维护。使用数组将多个相同类型元素组织在一起,通过数组下标来访问,无疑会方便快捷很多。
从物理机器上来看,数组是由一段连续的内存空间组成,操作系统会给这段空间一个起始地址,程序可以通过起始地址来访问数组中的任何元素,当然这段地址是操作系统管理的虚拟地址,通过维护的页表来映射真实物理地址,一般情况下我们并不会绕过操作系统操纵真实物理地址,这是出于系统安全性上的考虑。

线性存储中另外一名大佬就当属链表了,同数组最大的不同就在于它的物理存储结构是不一定相邻的,通过指针来寻找彼此。 链表又分单向链表、双向链表、循环链表,此处不一一展开,后文会详细介绍。
那么为什么会产生链式结构呢?因为是为了解决计算机程序中动态存储程序的问题,有时候我们一开始不知道要存储多少数据,可能会频繁的增删,如果采用数组,由于多数语言中的数组一经初始化后就不能改变大小,频繁的增删可能会多次创建新的数组,显然,基于指针的链表对频繁的增删操作游刃有余。

非线性存储

非线性存储结构有树、图、二叉堆等。
树与图的应用,数不胜数,如数据库中的B+树,面试老折磨人的红黑树,地图应用中的图算法(深度、广度优先搜索、狄克斯特拉算法等等)。 后文中将一一详细展开,不过我还是先从线性表的相关结构开始......