该文被密码保护。
随笔分类 - data structure
摘要:大根堆: 根节点value不小于子节点的value,满足这条性质的二叉树即为大根堆。小根堆:根节点value不大于子节点的value,满足这条性质的二叉树即为小根堆。从大根堆的定义可知:在大根堆里要得到最大值只需o(1)的时间。所以很明显,大根堆可以求最大值和维护前k小的数。注意是前k小的数,不是前k大的数,因为当前要插入到堆里的数可以直接和堆里最大值考虑,如果比堆里最大的都还要小,那就那这个值放到堆里,这样就维护了前k小的数。如果k很大的话,要划分为很多个堆。小根堆和大根堆相反。堆的操作主要有:bool isEmpty(int *a); // 判断堆是否为空bool isFull(int *
阅读全文
摘要:归并排序: 归并排序是每次都把有序的区间合并起来构成一个新的有序序列。初始时区间长度是1;模拟求解时: 区间段数是n。每次最后那段都合并到前一段上。 递归求解: 只要注意边界就好了,left>=right就递归结束返回程序上一层。总的时间复杂度为0(nlogn),空间复杂度为0(n);代码一:模拟合并区间View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6
阅读全文
摘要:插入排序: 算法和字面意思是一样的,对于当前元素a[now],在a[1]到a[now]的位置中找一个位置给a[now].因为a[1]到a[now-1]的数据是有序的,所以在插入a[now]后,序列仍是有序的。算法时间复杂度为 o(Σ(i))=o(n*n) (1<i<=n),这是最坏情况下的时间复杂度; 空间复杂度为o(1); 实现很简单,当表中数据很少时,这会是一个不错的选择。代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include
阅读全文