随笔分类 - 数据结构与算法
排序算法 | JS
摘要:冒泡排序: Array.prototype.bubbleSort = function () { for(let i = 0; i < this.length - 1; i++){ for(let j = 0; j < this.length - 1 -i;j++) { if(this[j] > t
最小堆实现 | JS
摘要:堆是一种特殊的完全二叉树,JS中常用数组表示堆,左侧子节点的位置是2*index+1 ,右侧子节点的位置是2*index + 2。 堆可以快速找到最大值和最小值,时间复杂度是O(1),找出第K个最大(最小)元素 如果想要获取第K个最大的元素,可以构建一个最小堆,并将元素依次插入堆中,当堆的容量超过K
图的深度广度优先遍历 | JS
摘要:深度优先:先访问根结点,然后对根结点没访问过的相邻节点挨个进行深度优先遍历 广度优先:新建一个队列,根结点入队,队头出队并且访问,把队头没访问过的相邻节点入队,重复中间步骤直到队列为空。 1 const graph = { 2 0: [1, 2], 3 1: [2], 4 2: [0, 3], 5
94、二叉树的中序遍历 | JS
摘要:给定一个二叉树的根节点 root ,返回它的 中序 遍历。 示例 1: 输入:root = [1,null,2,3]输出:[1,3,2] 示例 2: 输入:root = []输出:[] 示例 3: 输入:root = [1]输出:[1] 示例 4: 输入:root = [1,2]输出:[2,1] 示
102、二叉树的层序遍历 | JS
摘要:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果: [ [3], [9,20], [15,7]] 1 /** 2 * Definiti
二叉树的先中后序遍历-JS非递归实现
摘要:1 const bt = { 2 val: 1, 3 left: { 4 val: 2, 5 left: { 6 val: 4, 7 left: null, 8 right: null, 9 }, 10 right: { 11 val: 5, 12 left: null, 13 right: nul
二叉树的先中后序遍历-JS递归实现
摘要:1 const bt = { 2 val: 1, 3 left: { 4 val: 2, 5 left: { 6 val: 4, 7 left: null, 8 right: null, 9 }, 10 right: { 11 val: 5, 12 left: null, 13 right: nul
深度和广度优先遍历-JS实现
摘要:1 const tree = { 2 val: 'a', 3 children: [ 4 { 5 val: 'b', 6 children: [ 7 { 8 val: 'd', 9 children:[], 10 }, 11 { 12 val: 'e', 13 children:[], 14 } 1
JS里的队列和链表
摘要:队列:先进先出的数据结构,可以用数组来模拟 1 const queue = []; 2 queue.push(1); 3 queue.push(2); 4 const item1 = queue.shift(); 5 const item2 = queue.shift(); 链表:元素存储是不连续的
栈JS实现
摘要:栈是一种后进先出的数据结构,JS中没有栈但是可以使用Array来实现所有栈的功能。 1 const stack = []; 2 stack.push(1); 3 stack.push(2); 4 const item1 = stack.pop(); 5 const item2 = stack.pop
KMP算法
摘要:1、next[ ] 数组 next [ j ]=s 的最长相等前后缀长度加 1 next[1]=0 (规定) next[2]=1 KMP平均时间复杂度为O(n+m) 2、nextval[ ] 数组 nextval数组就是在next数组的基础上,把回溯的一步一步的中间步骤省略,直接写出最终要移动的位置
快速排序的三种分区方法
摘要:转载:https://blog.csdn.net/RUIRUI14/article/details/104304341 快速排序–三种实现方式: 快速排序运用了分治思想 ① 分解:将数组arr[ l…r ]划分为两个子数组arr[ l…p-1 ]和arr[ p+1…r ]。使得arr[ p ]为大小
广义表
摘要:1、广义表 广义表的长度:为表中最上层元素的个数。如广义表C长度为2,注意不是3。 广义表的深度:为表中括号的最大层数。求深度时可以将子表展开,如广义表D 应该展开为((d,e),(b,(c,d))),深度为3。 表头(Head)和表尾(Tail):当广义表非空时,第一个元素为广义表的表头,其余元素
内部排序
摘要:1、直接插入排序 从后面的序列中先把第一个数字提出来,然后拿第二个数字和它比较,如果大则放在右面,如果小则排在左面,排好之后,再把第三个数字排好的数字从右往左依次比较,找到适合的位置插入 平均时间复杂度O(n2),空间复杂度O(1)。 2、折半插入排序 注意! 折半插入是把新的元素插入到一个已经有序
散列表
摘要:a、同义词:指具有相同函数值的关键字。 散列查找法只能用顺序存储。 平均查找长度:受堆积现象直接影响。 查找失败的平均查找长度有两种观点: I、比较到空结点才算失败,所以比较次数等于冲突次数加1。 II、认为只有与关键字的比较才算比较次数。 在散列表中删除一个记录,在拉链法情况下可以物理地删除,但在
B树和B+树
摘要:1、B树 (也有被称作 B- 树,B-树和B树是同一个东西,统称B树)。 B树本质是一种多路平衡查找树,目的在于提高磁盘的效率,二叉树的查找效率已经很高了,但是如果存储大量信息,这个二叉树的深度就会很高,这些不同深度的信息在硬盘上存储的会很分散,在不同的道上,所以降低了查找效率,而B树可以改善这一问
查找(顺序、折半、分块)
摘要:就平均查找长度而言,折半(二分)查找最小,分块查找次之,顺序查找最大。 1、顺序查找 a、基本概念: b、对无序线性表顺序查找,查找失败需要遍历整个线性表。 对有序线性表进行顺序查找,查找失败不需要遍历整个线性表。(因为在中间如果查找失败,剩下的部分就不需要再找了)。 c、平均查找长度ASL: d、
关键路径
摘要:1、 AOV网,顶点表示活动,弧表示活动间的优先关系的有向图。即如果a->b,那么a是b的先决条件。 AOE网,边表示活动,是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间。 可以理解为,你要求拓扑序列就是AOV,求关键路径就是AOE 2、关键路径:
拓扑排序
摘要:1、有向无环图(DAG):有向图中不存在环。 2、AOV网:各结点活动具有先后顺序的有向无环网络(而且边没有权值)。 3、拓扑排序: 拓扑排序可以理解为按活动的顺序排序,比如早上起来我必须先穿裤子再穿鞋,先穿内衣再穿外套,这个顺序不能乱。也可以应用在排课表上,比如我必须先学过C语言的课,才能去学数据