数据结构
- 数据的结构性
对象
-
用关键字获取
-
键值对
-
散状结构,无法获取上下关系
-
key只能是字符串或symbol
-
没有长度
-
插入查找速度快
-
强类型数据,数据不会因为数据被消除而自动被销毁,
var obj={ 张三:{数学:12,语文:13,英语:45}, 李四:{数学:42,语文:33,英语:45}, 王五:{数学:62,语文:63,英语:85}, } obj["张三"]["语文"]
set
- 存储不重复的数据,
- 仅仅存储数据,无法通过上下关系直接获取上下的数据,
- 插入速度快,仅能插入在尾部,
- 查找速度一般,
- 属于非顺序性存储,数据不重复
weakset
- 存储多个同样对象,引用地址不一样的对应
- 销毁引用对象时,该对象也被销毁
- 弱引用类型列表
map
-
有长度
-
使用key,value类型来完成存储
-
可以使用地址引用作为key来完成数据的存储
-
和对象一样,查找,插入速度快,没有上下级关系
-
尽量使用map减少使用对象作为数据的存储
var o1={value:2} var o= {value:1,next:o1} // var obj={a:1,b:2}; // obj["a"]=1; var div=document.createElement("div"); var obj={ [div]:10, }
WeakMap
- 弱引用对象类型,作为key来存储数据
- 当对象被销毁时,对应的key和value也会被销毁
- 类似于hashmap
集set WeakSet
-
不重复
-
可以放多重集
-
散列,元素之间没有关系
-
顺序遍历
-
插入、删除速度快,遍历查找速度一般,比数组快
let set=new Set([1,2,3,5,6]); let set1=new Set([2,3,4,5]); let set2=new Set([set,set1]); // 1 2 3 4 5
数组
-
普通数组类型
- 注意创建时给入长度,数组的内容数据类型相同
- 尽量向尾部插入,不在前面或中间插入
-
二维数组类型
-
多用于二维表格类型数据
var arr1=["数学","语文","英语"]; var arr2=["张三","李四","王五"] arr=[ [12,13,45], [42,33,45], [62,63,85], ] var inedx=arr2.indexOf("张三"); var i=arr1.indexOf("语文"); arr[index][i]; index++; arr[index][i]; index++; arr[index][i];
-
散列表 map hashmap
- 查找速度快
- key是引用地址
- 有长度size
- 无法查找上下级关系
树
-
二叉树
class BinaryTreeNode { constructor(key, value) { // 指向父节点 this.p = null; // 左节点 this.left = null; // 右节点 this.right = null; // 键 this.key = key; // 值 this.value = value; } }
-
二叉树查找
class BinaryTree { constructor() { this.root = null; } static createNode(key, value) { return new BinaryTreeNode(key, value); } search(key) { let p = this.root; if (!p) { return; } while (p && p.key !== key) { if (p.key < key) { p = p.right; } else { p = p.left; } } return p; }
-
二叉树插入
insert(node) { // 尾指针的父节点指针 let p = this.root; // 尾指针 let tail = this.root; while (tail) { p = tail; if (node.key < tail.key) { tail = tail.left; } else { tail = tail.right; } } if (!p) { this.root = node; return; } // 插入 console.log(p.key,node.key) if (p.key < node.key) { p.right = node; } else { p.left = node; } node.p = p; } transverse() { return this.__transverse(this.root); } *__transverse(node) { if (!node) { return; } yield*this.__transverse(node.left); yield node; yield*this.__transverse(node.right); } }
-
-
红黑树
- 1.每个结点要么是红的要么是黑的。(红或黑)
- 2.根结点是黑的。 (根黑)
- 3.每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 (叶黑)
- 4.如果一个结点是红的,那么它的两个儿子都是黑的。 (红子黑)
- 5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)
-
平衡二叉树
- 当且仅当任何节点的两棵子树的高度差不大于1的二叉树
-
二叉查找树
- 1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 2.若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 3.任意节点的左、右子树也分别为二叉查找树;
- 4.没有键值相等的节点。
- 二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。
-
B+树
- B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+树元素自底向上插入。
- 每个结点至多有m个子女
- 除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女
- 有k个子女的结点必有k个关键字。
- 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息);
- B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+树元素自底向上插入。
-
B树
- B树是一种平衡的多分树
- 每个节点最多只有m个子节点。
- 每个非叶子节点(除了根)具有至少⌈ m/2⌉子节点。
- 如果根不是叶节点,则根至少有两个子节点。
- 具有k个子节点的非叶节点包含k -1个键。
- 所有叶子都出现在同一水平,没有任何信息(高度一致)。
- B树是一种平衡的多分树
-
搜索
- 深度优先搜索DFS
- 广度优先搜索BFS
-
遍历
- 先序遍历:左根右
- 中序遍历:根左右
- 后序遍历:左右根
链表
- 单向链表
- 双向链表
堆栈
-
栈
- 先进后出
-
队
- 先进先出