JavaScript Hoisting(提升)
JavaScript Execution Context & Execution Stack
JavaScript Algorithms and Data Structures 源码分析(15) -- 芬威克树/Fenwick Tree
JavaScript Algorithms and Data Structures 源码分析(14) -- 线段树 segment-tree
线段树
线段树(Segment Tree),也称为统计树,是一种用于存储关于区间或段的信息的树数据结构。它允许查询哪些存储的段包含给定的点。它原则上是一个静态结构,也就是说,一旦构建完成就不能修改。类似的数据结构是区间树。
线段树是一棵二叉树。树的根表示整个数组。根节点的两个子节点表示数组的第一半和第二半。同样,每个节点的子节点对应于与节点对应的数组的两半。
我们从底部向上构建树,每个节点的值是其子节点值的“最小值”(或任何其他函数)。这将花费 O(n log n)的时间。执行的操作数是树的高度,即 O(log n)。为了进行范围查询,每个节点将查询分成两个子查询,一个子查询对应于每个子节点。如果查询包含节点的整个子数组,我们可以使用节点上预计算的值。利用这种优化,我们可以证明只有 O(log n)次最小操作。
JavaScript Algorithms and Data Structures 源码分析(13) -- 红黑树 red-black-tree
红黑树
红黑树是一种自平衡的二叉搜索树,在计算机科学中使用。二叉树的每个节点都有一个额外的位,这个位通常被解释为节点的颜色(红色或黑色)。这些颜色位用于在插入和删除过程中保持树的大致平衡。
通过以一种满足特定属性的方式将树的每个节点标记为两种颜色之一,可以保持树的平衡,这些属性共同限制了树在最坏情况下可能变得不平衡的程度。当修改树时,新的树会被重新排列和重新标记以恢复颜色属性。这些属性的设计使得这种重新排列和重新标记可以高效地进行。
树的平衡并不完美,但足够好,可以确保在 O(log n)的时间内进行搜索,其中 n 是树中的元素总数。插入和删除操作以及树的重新排列和重新标记也可以在 O(log n)的时间内完成。
红黑树的一个示例:
JavaScript Algorithms and Data Structures 源码分析(12) -- AVL 树 avl-tree
JavaScript Algorithms and Data Structures 源码分析(11) -- 二叉搜索树 binary-search-tree
二叉搜索树
二叉搜索树(Binary Search Tree,简称 BST)是计算机科学中一种特定类型的容器,有时也被称为有序二叉树或排序二叉树。它们用于在内存中存储“项”(如数字、名称等),可以快速进行查找、添加和删除操作。它们可以用于实现动态集合或查找表,以便通过键来查找项(例如,通过姓名查找人的电话号码)。
二叉搜索树将其键按照排序顺序存储,以便查找和其他操作可以使用二分查找的原理:在树中查找键(或查找要插入新键的位置)时,从根到叶子遍历树,与树节点中存储的键进行比较,并根据比较结果决定是继续在左子树还是右子树中搜索。平均而言,这意味着每次比较都可以跳过树的约一半,因此每次查找、插入或删除操作的时间与树中存储的项数的对数成比例。这比在(未排序的)数组中按键查找项所需的线性时间要好得多,但比哈希表上的相应操作要慢。
下图是一个大小为 9、深度为 3 的二叉搜索树示例,根节点为 8。叶子节点未绘制。
JavaScript Algorithms and Data Structures 源码分析(10) -- 树 Tree
树
- 二叉搜索树
- AVL 树
- 红黑树
- 线段树 - with min/max/sum range queries examples
- 芬威克树/Fenwick Tree (Binary Indexed Tree)
在计算机科学中, 树(tree) 是一种广泛使用的抽象数据类型(ADT)— 或实现此 ADT 的数据结构 — 模拟分层树结构, 具有根节点和有父节点的子树,表示为一组链接节点。
树可以被(本地地)递归定义为一个(始于一个根节点的)节点集, 每个节点都是一个包含了值的数据结构, 除了值,还有该节点的节点引用列表(子节点)一起。
树的节点之间没有引用重复的约束。
一棵简单的无序树; 在下图中:
标记为 7 的节点具有两个子节点, 标记为 2 和 6;
一个父节点,标记为 2,作为根节点, 在顶部,没有父节点。