代码改变世界

阅读排行榜

二项堆学习笔记(未完成)

2013-12-31 17:11 by 凝月流风, 235 阅读, 收藏,
摘要: 二项堆: 1.二项堆是由一些二项树连接而成,每一棵二项树都遵循最小堆性质(即关键字的节点大于等于其父亲几点) 2.对任意的度数k,一个二项堆至多有一棵二项树的根度数为k (说明一个二项堆最多只有lgn+1棵二项树, 将n写成二进制,每一个值为1的位对应一棵二项树); 二项堆中的各二项树的根被组织成一个链表,称为根表,且各根的度数是严格递增的操作: 1.建堆操作:Make-Heap 时间复杂度: O(1) 2.返回最小元素: Minumum lgn 过程:扫描一遍根表即可找出最小值,每棵二项树的最小值都在根节点处; 3.合并两个二项堆: Union lgn 合并过程:先... 阅读全文

强连通分量2-Tarjan算法 POJ1236

2013-07-29 14:14 by 凝月流风, 234 阅读, 收藏,
摘要: 这两天学习了一下求强连通分量的另一个算法Tarjan算法,相比于之前的Kosaraju算法,Tarjan算法只需要进行一次深搜即可,两个算法的时间复杂度都是O(n+m); 算法基本思路是:从任一顶点开始进行深搜,强连通分量是一棵搜索子树,在搜索是将每一个未处理的点弹入栈中,然后在回溯时判断以该节点为根的搜索子树是否为一个强连通分量,若是,则将栈顶至该节点的元素弹出,这些元素即构成一个强连通分支,然后继续回溯,遇到强连通分量则弹出,最终便可获得有强连通分量。 算法的关键在于如何判断以u为根的搜索子树是否为一个强连通分量,算法用一个DFN[u]记录节点u在深搜时的次序,并用一个Low[u]记录u. 阅读全文

杭电ACMstep 3.2.1

2013-11-30 12:49 by 凝月流风, 215 阅读, 收藏,
摘要: 题目是最大子序列和问题,跟以往的不同是和可以是负数,所以只需要改一下求最大子序列和的代码即可,依然是O(n)的时间复杂度 思路是从左向右不断地找出每一个有可能成为最大和的子序列,用submax保存,每一次将它与Max进行比较更新Max submax的寻找方法是当前面序列a[i] ~a[j] 段的submax为负数时,将前面这段抛弃,另起炉灶,使submax = a[j+1],因为前面的负数部分只会 使submax减小,所以将其抛弃(需要注意的是题目可能有多种情况,找出第一种,所以submax=0时还得保留) 另外编程珠玑上面讲这个问题的几种解决方式讲的很详细,递归虽然要O(n*logn)的复. 阅读全文

Chapter11 线程

2014-08-21 20:17 by 凝月流风, 212 阅读, 收藏,
摘要: 1. void 和void* 的使用 void 意思是无类型,void* 意思是无类型指针,可以指向所有数据类型。 (1) void 主要用于对函数参数和返回值的限定,加上void 限定则表明该函数不接受参数或者无返回值(因为在C语言中,即使函数声明时无参数,在函数调用时传进参数是不会报错的,即使函... 阅读全文

ZOJ1117 第一次写赫夫曼编码

2013-05-19 13:57 by 凝月流风, 212 阅读, 收藏,
摘要: 1 #include <stdio.h> 2 #include <queue> 3 #include <iostream> 4 using namespace std; 5 struct Node { 6 int f; 7 // int height; 8 int parent; 9 bool visited;10 }node[100];11 12 int num, r;13 void getSmallestTwo (int &t1, int &t2){14 int i, min = 99999999;15 for (i = 0; i < 阅读全文