夯实基础,常见的数据结构

简介: 数据结构内容很多,早在 1968 年就被作为一门独立的课程在大学中设立。我们引入数据结构的基本介绍,不求面面俱到,旦求要点尽有,可作初学构建印象、或温习梳理体系的用处。

image.png

所谓“巧妇难为无米之炊”,再强大的计算机,也要有“米”下锅才可以干活,否则就是一堆破铜烂铁。这个“米”就是数据,数据是计算机的原始资料。


“米”又可以做成各式各样的美食,比如:米粉、米糕、米饼、米酒、粽子、寿司等等。同理,数据也可以组成各式各类的“数据结构”。噢,明白了,数据结构就是是数据的容器、载体。


数据结构内容很多,早在 1968 年就被作为一门独立的课程在大学中设立。我们引入数据结构的基本介绍,不求面面俱到,旦求要点尽有,可作初学构建印象、或温习梳理体系的用处。


常见数据结构



数据结构中有一些常见的类型,它们是:栈、队列、数组、链表、树、堆、图、散列表。


就这样一眼望过去,肯定是很难记住的,我们将它们作简要归类:

栈、队列、数组、链表都属于线性表一类,什么是线性表?线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。


树、堆都属于“树”这一类,堆是一种特殊的树结构,这个后面在讲。


图和散列表都是单独一类。


我们将上述关系可以画一张思维导图,在数据结构中的常见类型则一目了然。


image.png


栈和队列


我们首先讲一下线性表中“栈”和“队列”的特点,这是数据结构中的重点认知之一。

什么是栈?栈是一种“后进先出”的数据结构。什么是“后进先出”?举个通俗的例子,比如薯片桶,第一片薯片放在桶里最底部,然后再放第二片、第三片,直至放满。当我们要吃的时候,总是会拿最顶层的薯片,这说明越是后来放入薯片桶的薯片将会被优先拿出来。


由于栈的特性,栈这种数据结构主要是“入栈”和“出栈”两种操作。


image.png


什么是队列?队列是一种“先进先出”的数据结构。队列的概念相比栈更容易理解。在现实生活中我们经常排队,先排上队的,能优先出队,进一步处理相关事宜。


队列有“入队”和“出队”两种操作,很明显,入队是在队尾进行操作,出队是在队首进行操作,这就和栈结构中不一样了,对于栈来说,入栈和出栈都是在栈顶进行操作。

思考题:结合栈和队列的两种数据结构特性,如果想遍历拿到一组数据中的其中一个,哪种数据结构会更快?


数组和链表


数组几乎是编程中最重要的一种数据结构,它定义了一个有序的元素序列集合。

你可以把数组想象成一个连续的台阶,如果想要知道哪个台阶上放了什么的东西,只需要知道这个台阶的下标号,直接去这个标号的台阶上取东西就行了,不需要查其它台阶上的标号和东西,也不用一阶一阶的去找。所以数组的查询时间非常快。


链表则表示一组可变数量数据项的有续集,它的元素的存储位置并非是连续的,它的核心原理是通过指针指向来实现有序的。和数组相比,链表更适合插入、删除操作频繁的场景。


树和堆


树是一种抽象数据类型,用来模拟具有树状结构性质的数据集合。它大概是长成这样的:

image.png


从定义上来讲,它是由 n(n>0)个有限节点组成一个具有层次关系的集合。其实它看起来像是一颗倒挂着的树,根节点朝上,而叶子节点朝下。


具体来说,树又分为两大类,二叉树和多叉树。其中二叉树又有很多细分,比如完全二叉树、平衡二叉树、二叉查找树等,平衡二叉树又再细分为 AVL 树、红黑树等,这里不逐一展开讲解了。


着重讲一下平衡二叉树和完全二叉树,这两个树的定义是一定要知道的,很多面试中关于数据结构考点,都会问它们。


什么是平衡二叉树?


从定义上来讲是指:二叉树中任意一个节点的左右子树的高度相差不能大于1。

image.png


什么是完全二叉树?


完全二叉树的定义是:若二叉树的深度为h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

堆数据结构堆通常被看做一棵完全二叉树的数组对象。


树结构算是数据结构中比较复杂的一种结构了,需要长久持续的关注它,才能驾轻就熟、灵活运用。



图就是一些顶点的集合,这些顶点通过一系列边结对连接。顶点用圆圈表示,边就是这些圆圈之间的连线。

image.png


很多现实问题都可以用图数据结构来表示,比如著名的旅行家问题,一位旅行家要旅行n个城市,要求各个城市经历且仅经历一次,然后回到出发城市,并要求所走的路程最短。对于解答有兴趣的朋友可以参加我的这篇文章 《# 改变世界的图算法——Dijkstra》


在图这个数据结构中有 2 个最重要的算法:深度优先搜索(DFS)和广度优先搜索(BFS),是我们一定要花精力重点关注的,后面会再具体展开。


散列表


散列表也叫哈希表或者 Hash 表,是实现字典操作的一种有效数据结构,它其实是数组的一种扩展,由数组演化而来。


散列表记录的是确定的对应关系,每个关键字 key 都能通过确定的对应关系 f(key) 找到存储的值。


散列表的重要性不言而喻,它的现实应用场景遍地都是,比如根据电话号码查找姓名、根据映射IP查找网站、以及很多网站用到的缓存机制都是存储在散列表中。

需要特别提出的是,在散列表中有一个很出名的问题我们需要认识,那就是“散列冲突”,也叫“哈希冲突”或“哈希碰撞”。


什么是“哈希碰撞”?


简而言之,在上述散列表的映射过程中,f(key1) 和 f(key2) 的值是同一个值,则表示发生了“哈希碰撞”。原本的期望是输入和输出逐一对应,现在却有两个输入对应同样的一个输出,这导致无法识别来源。

解决哈希碰撞的有效方法是扩大取值空间,即避免经过哈希运算后得到同样的值。


相关文章
|
存储 算法 Java
数据结构:八大常用数据结构
数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能;常用的数据结构有:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)等;
19022 14
|
3月前
|
缓存
在数据驱动方式中处理复杂的数据结构
【10月更文挑战第13天】 在数据驱动的开发模式中,处理复杂数据结构是一项重要任务。本文从理解特性、数据分解、选择模型、数据绑定、转换预处理、处理嵌套、性能优化、错误处理、数据验证及实际案例等方面,详细阐述了应对这一挑战的方法和策略,强调了持续学习和改进的重要性。
|
3月前
|
消息中间件 存储 Java
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
58 4
|
8月前
|
机器学习/深度学习 算法
数据结构小实践
【4月更文挑战第13天】数据结构小实践
66 1
|
8月前
|
存储 算法 搜索推荐
嵌入式软件中常见的 8 种数据结构详解
嵌入式软件中常见的 8 种数据结构详解
219 0
数据结构之树的概念以及结构
数据结构之树的概念以及结构
|
算法
408王道数据结构强化——算法题(一)
408王道数据结构强化——算法题
398 1
408王道数据结构强化——算法题(一)
|
算法
410王道数据结构强化——算法题(三)
410王道数据结构强化——算法题
171 1
410王道数据结构强化——算法题(三)
|
算法
409王道数据结构强化——算法题(二)
409王道数据结构强化——算法题
142 1
409王道数据结构强化——算法题(二)
|
算法 搜索推荐 大数据
大数据开发基础的数据结构和算法的数据结构的图
在大数据开发中,图是一种重要的数据结构。图可以用来描述各种实体之间的关系,例如社交网络中的用户之间的关系、物流系统中的货物之间的运输路径等等。
110 0

热门文章

最新文章

下一篇
开通oss服务