Coursera算法part1课程学习记录和回顾。
第五周的课程介绍平衡二叉树,讲解了2-3搜索树,以及由其引入红黑树,和平衡二叉树的几何应用。
本周课程是算法I部分中最难的章节,建议多按照书中的2-3搜索树引入的过程,以及红黑树的引入过程来仔细理解。由2-3搜索树来引入红黑树,对红黑树的理解有极大帮助。
1. 2-3 Tree (2-3节点树)
- 每一个节点可能包含1个key,对应2个子节点,或者2个key,对应3个子节点
并且父子节点的键值保持相对有序(1个key,2个子节点时,左节点小于父节点,右节点大于父节点;2个key 3个子节点时,左节点小于父节点左key,右节点大于父节点右key,中间子节点在父节点两个key之间)
Perfect balance. Every path from root to null link has same length.- image.png
-
平衡有序的维护
- 插入 需要生成新的2-node,找到插入节点的位置,是单key的子节点位置,为了保持平衡性,将父节点变成双key节点
image.png - 插入 插入到原2-key,3-node节点 生成临时的3-key,4-node节点,然后拆分成1-key 2-node
image.png -
在上面的变化情形下,可能会遇到上一层是存在父节点的,可能是1-key / 2-key,这时要继续在新的父节点上面两种情形类似的变换处理,如此递归至到仍旧保持2-3node tree的平衡有序性
下面是书中可能情形的实例
image.png
image.png
image.png
- 插入 需要生成新的2-node,找到插入节点的位置,是单key的子节点位置,为了保持平衡性,将父节点变成双key节点
2. Red-Black Tree 红黑树
在2-3 Tree的基础上,将2-key 3-node的父节点的两个key中间增加标记成红色的链接,其他node key之间的链接都标记成黑色,且红色链接始终在节点的左侧
image.png
-
image.png
image.png
插入操作时的左旋右旋变换以及节点颜色反转的情景类似于2-3 Tree插入时的变换情景,并保持红黑树的红链接始终在左侧(红色子节点在左侧,且红色节点的子节点都是黑色节点)
个人也没有很熟悉透彻理解,细节相对复杂,说明暂略,建议看原书章节或者参考其他人博客讲解
这两种数据结构的优点是元素的增删改查的速度都非常快
image.png
3. 本周的作业是从给定的一组点集合中,找出最近的点
要求用暴力解法和2d-Tree两种方式分别来解,2d-Tree是根据点坐标的x y值交替划线来分割二维平面,分割成小的矩形区域,判断点到矩形区域的距离来解。做的一般,花了很久的时间,实现还是有些问题存在。
Correctness: 31/35 tests passed
Memory: 16/16 tests passed
Timing: 34/42 tests passed
Aggregate score: 89.33%
[Compilation: 5%, API: 5%, SpotBugs: 0%, PMD: 0%, Checkstyle: 0%, Correctness: 60%, Memory: 10%, Timing: 20%]
- image.png
网友评论