常见数据结构简介

常见数据结构有八个,分别是:数组,链表,队列,栈,树,散列表(Hash表),堆,图。

下面简单讨论一下。

数组

数组是一种可以在内存中连续存储多个元素的结构,在内存中的分配的空间也是连续的。

数组中的元素通过数组下标来访问,下标从0开始。

优点:查询方便,速度快。

缺点:数组大小固定后就无法改变了,只能存储一种类型的元素,增删操作慢。

适用场景:查询频繁,增删操作比较少。

链表

链表是在物理存储单元上非连续、非顺序的结构。链表的元素除了数据域,还有指针域。

单向链表有一个数据域和一个指针域,数据域存储数据,指针域指向下一个节点的地址。

双向链表有一个数据域和两个指针域,数据域存储数据,一个指针域指向上一个节点的地址,另一个指针域指向下一个节点的地址。

优点:不需要初始容量,增删操作方便快捷。

缺点:占用空间大,查找慢。

适用场景:数据量小,增删频繁。

队列

队列是一种线性表,可以在一端添加元素,在另一端取出元素,是一种先进先出的结构。

添加元素的操作称为入队,取出元素的操作称为出队。

适用场景:适用于先进先出的场景,比如多线程阻塞,任务队列等。

栈也是一种线性表,不过和队列不同的是,栈是一种先进后出(或者后进先出)的结构,也就是在一端添加元素,在同一端取出元素。

添加元素的操作称为入栈,取出元素的操作称为出栈。

适用场景:适用于先进后出的场景,比如递归。

树是一种树形结构,因其结构像一棵倒挂的树而得名。

树具有以下特点:

  • 每个节点有零个或多个子节点;
  • 没有父节点的节点称为根节点;
  • 每个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树。

树有许多结构,最常用的一种是二叉树

散列表

散列表,又称为哈希表(Hash表),是一种key和value的数据结构。

key是关键码,记录存储位置;value是实际的数据。

散列表是基于数组衍生出来的,其数据索引就是一个数组。

散列表有一个哈希函数,这个函数用来确定数据存储的索引位置。散列表把key通过哈希函数转换成一个整型数字,然后将该数字对数组长度进行取余,取余结果就当作数组下标,将value存储在该下标的数组空间里,这样就有了数组查询速度快的优势。

散列表的数组存储空间存储的可以是一个链表,也可以是一个树,或者其他。基于这种结构,散列表可以比数组更易增删,比单纯的链表查找更快。

堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。

(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),满足前者的表达式的成为小根堆,满足后者表达式的为大根堆。

堆其实是用数组实现的一个二叉树,所以里面没有父指针或者子指针。

既然没有指针,那么堆是怎么确定节点的父子关系呢?这就要说到堆节点关系的公式了。

假设 i 是节点的索引,那么下面的公式就给出了它的父节点和子节点在数组中的位置:

parent(i) = floor((i - 1)/2)
left(i)   = 2i + 1
right(i)  = 2i + 2

目前对堆的了解还不多,以后再补充。

图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。

按照定点指向的方向,可分为无向图和有向图。最常见的是有向无环图,也就是DAG。

了解不多,以后再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值