随笔分类 -  算法导论学习笔记

红黑树(二):删除
摘要:红黑树的删除操作,较之插入更为复杂,因为红黑树也是二叉搜索树,所以红黑树的删除流程跟二叉搜索树一样,先找到要删除的目标节点T,如果T没有子节点,则将T直接删除,如果T有一个子节点,则将此子节点替换到T的位置,然后删除T,否则如果有两个子节点,则在T的子树中寻找后继节点X,然后将X的值覆盖到T结点,然 阅读全文

posted @ 2018-05-12 21:49 凄夜 阅读(841) 评论(0) 推荐(0)

红黑树(一):插入
摘要:红黑树跟AVL树一样,也是平衡二叉树,其查找、增加、删除效率为O(lgN),红黑树使用非常广泛,C++STL里面的map,set都是用红黑树实现的。 以下就是一棵红黑树: 《算法导论》上定义红黑树需满足以下五个性质: 1.每个结点是黑色或是红色。 2.根结点是黑色。 3.所有叶子节点是黑色(也就是上 阅读全文

posted @ 2018-05-12 00:45 凄夜 阅读(562) 评论(0) 推荐(0)

AVL树
摘要:二叉查找树在极端情况下,会退化为链表,比如一个排好序的数组,构建成二叉树后,就是一颗全部左倾或右倾的树,这时候查找的时间为O(N),AVL树是带有平衡条件的二叉查找树,它的每个节点左子树和右子树的高度最多相差1,它会保证树的高度为O(logN),所以在查找时,能保证最坏情况下时间为O(logN),A 阅读全文

posted @ 2018-05-04 22:39 凄夜 阅读(255) 评论(0) 推荐(0)

二叉查找树
摘要:二叉树的定义是一棵树的每个节点最多只有两个儿子,使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中的关键字比X中的小,而它的右子树则比X中的关键字大。 二叉树节点可以定义成如下形式: 二叉树非常简单,下面再介绍几个基本的操作。 一、插入 插入一个关键字Key从根节点开始,如果Key比 阅读全文

posted @ 2018-05-03 22:17 凄夜 阅读(166) 评论(0) 推荐(0)

堆排序
摘要:先介绍下堆这种结构,堆就是一颗完全二叉树,除了树的最底层,该树是完全充满的。堆这种结构用数组来实现,二叉树中的每一个节点,都对应数组中的一个元素,一个父节点可以根据自身节点在数组中的索引,直接算出子节点在数组中的索引,要注意在访问子节点的时候要判断子节点的索引是否越界。 (图片截取自《算法导论》) 阅读全文

posted @ 2018-04-28 14:30 凄夜 阅读(264) 评论(0) 推荐(0)

快速排序的几个变化形式
摘要:快速排序最简单的区间切分形式已经在前面的博文中介绍过了,是单向处理的,下面介绍快速排序的另几种形式,都是双向处理,即处理模式是,比Pivot小的往左移,比Pivot大的往右移,当两个方向相交后,把Pivot移动到相交位置往后的一个位置,最后形成三段,分别为比Pivot大,等于Pivot,大于Pivo 阅读全文

posted @ 2018-04-28 00:55 凄夜 阅读(417) 评论(0) 推荐(0)

归并排序
摘要:先介绍下分治法,分治法就是将原问题分解为几个规模较小但在形式上跟原问题一样的子问题,递归地求解这些子问题,然后再合并这些子问题的解,来建立原问题的解。归并排序就是典型的遵循分治法思想的算法,归并排序的每一步,都将原问题分解为左右两部分,处理完这两部分后,将此两部分合并,再往上递归,最后就是整个问题的 阅读全文

posted @ 2018-04-07 21:53 凄夜 阅读(216) 评论(0) 推荐(0)

插入排序与循环不变式
摘要:插入排序的做法是在循环遍历整个待排序序列时,每遍历一个元素,就会将此元素插入到一个已排好序的列表中,待整个序列遍历完毕,则已排好序的列表就是排序的结果,另外已排好序的列表并不需要额外的存储空间,也就是可以进行原址排序。 具体做法如下: 有一序列长度为8 4 6 1 3 9 5 8 2 从第一个元素i 阅读全文

posted @ 2018-04-07 12:52 凄夜 阅读(280) 评论(0) 推荐(0)

快速排序
摘要:快速排序也是分治算法,先选择一个元素Pivot作为主元,将此主元放到数组的最右边,然后从最左边开始扫描,当扫描到一个元素比Pivot小,则将此元素往左边置换。一次扫描过后,会把整个数组分成两个部分,比Pivot大的元素在右边,比Pivot小的元素在左边。然后递归这个过程 考虑以下数组: 13 6 1 阅读全文

posted @ 2018-04-07 11:38 凄夜 阅读(180) 评论(0) 推荐(0)

导航