MoonBit月兔编程语言 现代编程思想 第五课 数据类型:树、二叉树、二叉搜索树、AVL树
为了避免这种情况的发⽣,我们采⽤平衡树:任意节点的⼦树的⾼度相差⽆⼏ 平衡树⾼度约为 ⼆叉平衡树有AVL Tree、⼆三树、红⿊树等多种实现 24 ⼆叉平衡树 AVL Tree 当树发⽣不平衡的时候,需要进⾏旋转来再次获得平衡 根据⼦树⾼度进⾏重新排列,使⾼度更⾼的⼦树处在较浅的位置 AVL树在每次插⼊、删除后都进⾏调整,维持树的平衡 插⼊、删除操作类似于标准⼆叉搜索树 为⽅便维护,在节点中添加⾼度属性 left: AVLTree, right: AVLTree) -> AVLTree 6. fn height(tree: AVLTree) -> Int 25 ⼆叉平衡树 AVL Tree 26 ⼆叉平衡树 AVL Tree 我们对⼀棵树进⾏再平衡操作 1. fn balance(left: AVLTree, z: Int, right: AVLTree) -> AVLTree { 2 Empty => ... 7. } 8. } 28 总结 本章节我们学习了树这⼀数据结构,包括 树的定义及相关术语 ⼆叉树的定义以及遍历 ⼆叉搜索树的定义以及增删操作 ⼆叉平衡树AVL树的再平衡操作 拓展阅读 《算法导论》第12、13章 290 码力 | 29 页 | 1015.26 KB | 1 年前3Hello 算法 1.0.0b1 Java版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 7.5. 小结 局限性,包括: ‧ 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多次探测”来解决哈希冲突。根据探测方法的不同,主要分为 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 186 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 Swift版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 7.5. 小结 局限性,包括: ‧ 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6. 散列表 hello‑algo.com 91 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 190 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 Python版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 7.5. 小结 局限性,包括: ‧ 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多次探测”来解决哈希冲突。根据探测方法的不同,主要分为 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 178 页 | 14.67 MB | 1 年前3Hello 算法 1.0.0b1 C++版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 7.5. 小结 局限性,包括: ‧ 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6. 散列表 hello‑algo.com 89 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 187 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 Golang版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 7.5. 小结 局限性,包括: ‧ 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6. 散列表 hello‑algo.com 87 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 190 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b1 JavaScript版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 7.5. 小结 局限性,包括: ‧ 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多次探测”来解决哈希冲突。根据探测方法的不同,主要分为 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 185 页 | 14.70 MB | 1 年前3Hello 算法 1.0.0b1 TypeScript 版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 7.5. 小结 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; 6. 散列表 hello‑algo.com 87 ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多次探测”来解决哈希冲突。根据探测方法的不同,主要分为 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 186 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b2 Java版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 7.5. 小结 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 6. 散列表 hello‑algo.com 90 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多次探测”来解决哈希冲突。根据探测方法的不同,主要分为 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 197 页 | 15.72 MB | 1 年前3Hello 算法 1.0.0b2 Swift版
3. 二叉搜索树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 7.4. AVL 树 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 7.5. 小结 局限性,包括: ‧ 占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间; ‧ 查询效率降低,因为需要线性遍历链表来查找对应元素; 为了提升操作效率,可以把「链表」转化为「AVL 树」或「红黑树」,将查询操作的时间复杂度优化至 ?(log ?) 。 6.2.3. 开放寻址 「开放寻址」不引入额外数据结构,而是通过“多次探测”来解决哈希冲突。根据探测方法的不同,主要分为 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中,从而解决哈希冲突。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算0 码力 | 199 页 | 15.72 MB | 1 年前3
共 89 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9