Categories-algorithm
J.A.R.V.I.S
Life is not just Live
LSM-Tree
9月 10 · 1 min
堆以及堆排序
什么是堆
堆是一种特殊的树,它满足以下两点:
堆是一个完全二叉树
完全二叉树要求,除最后一层,其他层的节点个数都是满的,最后一次的节点都靠左排列。
堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值
当前节点的值是子树中的最大或最小值。
我们将每个节点的值都大于等于子树中每个节点值的堆,叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”
我们来看一下例子:
在上面的四个实例中,我们根据以上两条规则,可以判断出:
第一个、第二个是大顶堆,第三个是小顶堆,第四个由于不是完全二叉树所以不是堆。
4月 12 · 7 min
二分查找及几种变形
二分查找
前置要求:数组有序
时间复杂度:log(n)
几种常见的问题:
- 数组中查找target
- 数组中有重复,查找第一个target
- 数组中有重复,查找最后一个target
- 查找等于target或第一个小于target的值
- 查找等于target或第一个大于target的值
3月 05 · 6 min
几种排序方式
3月 04 · 17 min
树的几种遍历方式
主要记录一下对于二叉树,进行遍历的几种方式,包括:
- 前序遍历
- 中序遍历
- 后序遍历
- 深度优先遍历
- 广度优先遍历
我们以下面的这个二叉树结构为例,分别描述一下这几种遍历的方式有什么不同,以及给出java实现的代码。
3月 03 · 3 min
树的几种遍历方式
3月 03 · 3 min
二叉树展开为链表
3月 03 · 1 min
二叉树的层序遍历
3月 03 · 2 min
用单链表简单实现LRU算法
什么是LRU算法
Least Recently Used,最近最少使用,当数据超过容量时,淘汰最近最少使用的一个然后再进行添加。
用单链表来进行实现:
维护一个链表,从头插入数据。当新数据插入时将新数据作为头部,指向旧的头结点。
向一个单链表插入数据,首先遍历这个链表,查看数据是否已经存在于链表中。如果存在,则删除原有数据,将新数据插入到头结点。
如果不存在,先看是否已经到达容量,如果没有到达容量则插入到头结点。如果到达容量则删除尾部节点,再进行插入。
在这个过程中,将最近使用过的又重新插入到了头部,在链表尾部的就是最近最少使用的一项,所以从尾部删除。
2月 26 · 3 min
手写红黑树的简单实现
基于《算法》一书的红黑树的插入和删除。看过不同的教材,也有不同的实现方式,但是最终的结果也大致相同,感觉这个比较容易理解,就采用这种的方式来进行简单实现。
定义树节点的实体类型
1 | private static final boolean RED = true; |
这里简单的定义了一下红黑树,并且只有节点,并不是map这样的k-v结构。如果定义k-v结构到时比较的时候比较k即可。
用了泛型,并且要支持比较(继承自Comparable),不然无法比较大小进行插入。
然后定义了一个值,左节点和右节点,然后颜色默认为红色。
再增加一个构造函数即可
12月 24 · 11 min