关于数据结构:优秀程序员必须掌握的-8-种通用数据结构

83次阅读

共计 3242 个字符,预计需要花费 9 分钟才能阅读完成。

本文整顿自网络,编辑:逆锋起笔 小编

数据结构是一种非凡的组织和存储数据的形式,能够使咱们能够更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程畛域具备宽泛而多样的用处。

简直所有已开发的程序或软件系统都应用数据结构。此外,数据结构属于计算机科学和软件工程的根底。当波及软件工程面试问题时,这是一个要害主题。因而,作为开发人员,咱们必须对数据结构有充沛的理解。

在本文中,我将简要解释每个程序员必须晓得的 8 种罕用数据结构。

1. 数组

数组是固定大小的构造,能够包容雷同数据类型的我的项目。它能够是整数数组,浮点数数组,字符串数组或什至是数组数组(例如二维数组)。数组已建设索引,这意味着能够进行随机拜访。

数组运算

  • 遍历:遍历所有元素并进行打印。
  • 插入:将一个或多个元素插入数组。
  • 删除:从数组中删除元素
  • 搜寻:在数组中搜寻元素。您能够按元素的值或索引搜寻元素
  • 更新:在给定索引处更新现有元素的值

数组的利用

  • 用作构建其余数据结构的根底,例如数组列表,堆,哈希表,向量和矩阵。
  • 用于不同的排序算法,例如插入排序,疾速排序,冒泡排序和合并排序。

2. 链表

链表是一种程序构造,由互相链接的线性程序我的项目序列组成。因而,您必须程序拜访数据,并且无奈进行随机拜访。链接列表提供了动静集的简略灵便的示意模式。

让咱们思考以下无关链表的术语。您能够通过参考图 2 来取得一个清晰的主见。

  • 链表中的元素称为节点。
  • 每个节点都蕴含一个密钥和一个指向其后继节点 (称为 next) 的指针。
  • 名为 head 的属性指向链接列表的第一个元素。
  • 链表的最初一个元素称为尾。

以下是可用的各种类型的链表。

  • 单链列表—只能沿正向遍历我的项目。
  • 双链表 - 能够在后退和后退方向上遍历我的项目。节点由一个称为上一个的附加指针组成,指向上一个节点。
  • 循环链接列表—链接列表,其中头的上一个指针指向尾部,尾号的下一个指针指向头。

链表操作

  • 搜寻:通过简略的线性搜寻在给定的链表中找到键为 k 的第一个元素,并返回指向该元素的指针
  • 插入:在链接列表中插入一个密钥。插入能够通过 3 种不同的形式实现; 在列表的结尾插入,在列表的开端插入,而后在列表的两头插入。
  • 删除:从给定的链表中删除元素 x。您不能单步删除节点。删除能够通过 3 种不同形式实现; 从列表的结尾删除,从列表的开端删除,而后从列表的两头删除。

链表的利用

  • 用于编译器设计中的符号表治理。
  • 用于在应用 Alt Tab(应用循环链表实现)的程序之间进行切换。

3. 堆栈

堆栈是一种 LIFO(后进先出 - 最初搁置的元素能够首先拜访)构造,该构造通常在许多编程语言中都能够找到。该构造被称为 ” 堆栈 ”,因为它相似于真实世界的堆栈 - 板的堆栈。

堆栈操作

上面给出了能够在堆栈上执行的 2 个基本操作。请参考图 3,以更好地理解堆栈操作。

  • Push 推送:在堆栈顶部插入一个元素。
  • Pop 弹出:删除最下面的元素并返回。

此外,为堆栈提供了以下附加性能,以查看其状态。

  • Peep 窥视:返回堆栈的顶部元素而不删除它。
  • isEmpty:查看堆栈是否为空。
  • isFull:查看堆栈是否已满。

堆栈的利用

  • 用于表达式评估(例如:用于解析和评估数学表达式的调车场算法)。
  • 用于在递归编程中实现函数调用。

4. 队列

队列是一种 FIFO(先进先出 - 首先搁置的元素能够首先拜访)构造,该构造通常在许多编程语言中都能够找到。该构造被称为 ” 队列 ”,因为它相似于事实世界中的队列 - 人们在队列中期待。

队列操作

上面给出了能够在队列上执行的 2 个基本操作。请参考图 4,以更好地理解堆栈操作。

  • 进队:将元素插入队列的开端。
  • 出队:从队列的结尾删除元素。

队列的利用

  • 用于治理多线程中的线程。
  • 用于施行排队零碎(例如:优先级队列)。

5. 哈希表

哈希表是一种数据结构,用于存储具备与每个键相关联的键的值。此外,如果咱们晓得与值关联的键,则它无效地反对查找。因而,无论数据大小如何,插入和搜寻都十分无效。

当存储在表中时,间接寻址应用值和键之间的一对一映射。然而,当存在大量键值对时,此办法存在问题。该表将具备很多记录,并且十分宏大,思考到典型计算机上的可用内存,该表可能不切实际甚至无奈存储。为防止此问题,咱们应用哈希表。

哈希函数

名为哈希函数 (h) 的非凡函数用于克服间接寻址中的上述问题。

在间接拜访中,带有密钥 k 的值存储在插槽 k 中。应用哈希函数,咱们能够计算出每个值都指向的表 (插槽) 的索引。应用给定键的哈希函数计算的值称为哈希值,它示意该值映射到的表的索引。

  • h:哈希函数
  • k:应确定其哈希值的键
  • m:哈希表的大小(可用插槽数)。一个不靠近 2 的准确乘方的素数是 m 的一个不错的抉择。

1→1→1

5→5→5

23→23→3

63→63→3

从下面给出的最初两个示例中,咱们能够看到,当哈希函数为多个键生成雷同的索引时,就会发生冲突。咱们能够通过抉择适合的哈希函数 h 并应用链接和开放式寻址等技术来解决抵触。

哈希表的利用

  • 用于实现数据库索引。
  • 用于实现关联数组。
  • 用于实现 ” 设置 ” 数据结构。

6. 树

树是一种层次结构,其中数据按档次进行组织并链接在一起。此构造与链接列表不同,而在链接列表中,我的项目以线性程序链接。

在过来的几十年中,曾经开发出各种类型的树木,以适宜某些利用并满足某些限度。一些示例是二叉搜寻树,B 树,红黑树,开展树,AVL 树和 n 元树。

二叉搜寻树

顾名思义,二进制搜寻树 (BST) 是一种二进制树,其中数据以分层构造进行组织。此数据结构按排序顺序存储值,咱们将在本课程中具体钻研这些值。

二叉搜寻树中的每个节点都蕴含以下属性。

  • key:存储在节点中的值。
  • left:指向左孩子的指针。
  • 右:指向正确孩子的指针。
  • p:指向父节点的指针。

二叉搜寻树具备独特的属性,可将其与其余树辨别开。此属性称为 binary-search-tree 属性。

令 x 为二叉搜寻树中的一个节点。

  • 如果 y 是 x 左子树中的一个节点,则 y.key≤x.key
  • 如果 y 是 x 的右子树中的节点,则 y.key≥x.key

树的利用

  • 二叉树:用于实现表达式解析器和表达式求解器。
  • 二进制搜寻树:用于许多一直输出和输入数据的搜寻应用程序中。
  • 堆:由 JVM(Java 虚拟机)用来存储 Java 对象。
  • Trap:用于无线网络。

7. 堆

堆是二叉树的一种非凡状况,其中将父节点与其子节点的值进行比拟,并对其进行相应排列。

让咱们看看如何示意堆。堆能够应用树和数组示意。图 7 和 8 显示了咱们如何应用二叉树和数组来示意二叉堆。

堆能够有 2 种类型。

  • 最小堆 - 父项的密钥小于或等于子项的密钥。这称为 min-heap 属性。根将蕴含堆的最小值。
  • 最大堆数 - 父项的密钥大于或等于子项的密钥。这称为 max-heap 属性。根将蕴含堆的最大值。

堆的利用

  • 用于实现优先级队列,因为能够依据堆属性对优先级值进行排序。
  • 能够在 O(log n)工夫内应用堆来实现队列性能。
  • 用于查找给定数组中 k 个最小 (或最大) 的值。
  • 用于堆排序算法。

8. 图

一个图由一组无限的顶点或节点以及一组连贯这些顶点的边组成。

图的程序是图中的顶点数。图的大小是图中的边数。

如果两个节点通过同一边彼此连贯,则称它们为相邻节点。

有向图

如果图形 G 的所有边缘都具备批示什么是起始顶点和什么是终止顶点的方向,则称该图形为有向图。

咱们说 (u,v) 从顶点 u 入射或来到顶点 u,而后入射到或进入顶点 v。

自环:从顶点到本身的边。

无向图

如果图 G 的所有边缘均无方向,则称其为无向图。它能够在两个顶点之间以两种形式流传。

如果顶点未连贯到图中的任何其余节点,则称该顶点为孤立的。

图的利用

  • 用于示意社交媒体网络。每个用户都是一个顶点,并且在用户连贯时会创立一条边。
  • 用于示意搜索引擎的网页和链接。互联网上的网页通过超链接互相链接。每页是一个顶点,两页之间的超链接是一条边。用于 Google 中的页面排名。
  • 用于示意 GPS 中的地位和路线。地位是顶点,连贯地位的路线是边。用于计算两个地位之间的最短门路。

逆锋起笔 是一个专一于程序员圈子的技术平台,你能够播种 最新技术动静 最新内测资格 BAT 等大厂大佬的教训 增长本身 学习材料 职业路线 赚钱思维 ,微信搜寻 逆锋起笔 关注!

正文完
 0