数据结构简记

1、数组


数组是一种最简单最常用的数据结构,栈和堆皆由其衍生而来。每个数组的元素位置以数字编号成为下标或者索引,从0开始计算。

根据数组的维度来区分可以分为一维数组、多维数组。

将多维数组变为一维数组称为数组扁平化,下面列举几种数组扁平化的方式

1.使用reduce

const arrList=[[1,2],[3,4],[[5,6],[7,8]]];
const recur=(arrList)=>{
return arrList.reduce((pre,cur)=>{
    return pre.concat(Array.isArray(cur)?recur(cur):cur)
},[])
}
const result=recur(arrList)

 2.使用map

const arrList=[[1,2],[3,4],[[5,6],[7,8]]];
const recur=(arrList)=>{
return [].concat(...arrList.map(item=>Array.isArray(item)?recur(item):item))
}
const result=recur(arrList)

3.使用flat

const arrList=[[1,2],[3,4],[[5,6],[7,8]]];
const result=arrList.flat(Infinity)//使用 Infinity,可展开任意深度的嵌套数组

4.使用递归

const result=[];
const arrList=[[1,2],[3,4],[[5,6],[7,8]]];
const recur=arrList=>{
    for(let i=0;i<arrList.length;i++){
        if(Array.isArray(arrList[i])) recur(arrList[i])
        else result.push(arrList[i])
    }
}

5.使用apply

const arrList=[[1,2],[3,4],[5,6],[7,8]];
const result=[].concat.apply([],arrList);//弊端:只能用于二维数组,不能用于多维数组

6.通过split

const arrList=[[1,2],[3,4],[5,6],[7,8]];
const result=(arrList+'').split(',');//弊端:只能用于二维,并且转过来的数组元素是字符串

数组拥有很多处理方法,这里就不一一赘述,详情请自行百度

2、栈

定义:栈是一种只能从表一端存取数据且遵循先进后出(LIFO)的原则的线性存储结构

操作:根据栈结构的特点,通常我们对栈的操作只有出栈(向栈中提取指定元素)和入栈(向栈中添加元素)两种

实现方式:顺序栈(采用顺序存储结构模拟栈存储数据的特点从而实现,底层采用数组)和链栈(采用链式存储结构实现,底层采用的是链表)

应用:浏览器的回退,ctrl+z的实现,十进制二进制的转换

3、队列

队列是一种遵循先进先出(FIFO)原则的线性存储结构。但是队列只允许在表的前端进行删除操作,在表的后端进行插入操作。而进行插入操作的称为队尾,删除操作的叫队头

溢出:

(1)下溢:当队列为空时,做出队运算产生的现象。“下溢”是正常现象,常用作程序控制转移的条件

(2)真上溢:当队列满时,做出栈运算产生的现象。

(3)假上溢:由于出队和入队的操作中,头尾指针只增不减导致被删除的空间无法被重复利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作,该现象就叫假上溢。

4、链表

链表也是线性结构,它与数组看起来非常像,但是它们的内存分配方式、内部结构和插入删除操作方式都不一样。

链表是一系列节点组成的链,每一个节点保存了数据以及指向下一个节点的指针。链表头指针指向第一个节点,如果链表为空,则头指针为空或者为 null。

链表分为单向链表和双向链表

链表可以用来实现文件系统、哈希表和邻接表。

5、树

树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。

特性:

1、每个节点可以拥有多个子节点,而该节点是对应子节点的父节点

2、每个树都有一个没有父节点的节点,该节点叫根节点

3、没有子节点的节点叫做叶节点

4、若两个节点拥有相同的父节点,则这两个节点为兄弟节点

5、一个节点的子节点以及子节点的后代称为子树

深度高度:一个树的深度和高度都是从该树的根节点开始计算的。深度从1开始累计,高度从0开始累计

二叉树:二叉树一种是特殊的树。他是每个节点最多拥有两个子树的树结构。通常子树称为左子树和右子树

6、哈希

定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。(百度百科)

7、图

图和散列表、二叉树一样,是一种非线性数据结构。图由一系列顶点以及连接顶点的边构成。由一条边连接在一起的顶点成为相邻顶点,一个顶点相邻顶点的数量叫作度。路径指相邻顶点的一个连续序列,环指首尾顶点相同的路径。如果图中每两个顶点之间都有路径相连,则称该图是连通的。

如果图中的边具有方向,称该图为有向图。如果图中的边是双向的,则该图是强连通的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值