摘要:
由于项目需要在.net下将pdf转换为普通图像格式,在网上搜了好久终于找到一个解决方案,于是采用拿来主义直接用。来源见代码中注释,感谢原作者。using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Collections;/**Convert PDF to Image Format(JPEG) using Ghostscript API convert a pdf to jpeg using ghostscript comm 阅读全文
摘要:
堆排序需先建立堆,然后对堆进行操作,每次取根节点值,将它与数组右边位置(即叶子节点)的值交换,交换后完全二叉树的叶子节点数减1,由于此时可能破坏堆的性质,需要向下将新的根节点与它的后代节点交换,直到叶子节点。首先建立堆的过程可以采用Floyd算法(heapify):完全二叉树(complete binary tree)和二叉堆都可以用一维数组表示用层序(level order)遍历的结果。Floyd算法将数组表示的任意一颗完全二叉树转换为堆,它无需开辟额外的空间,直接在数组中交换数据(即in-place做法),转换成堆结构,它的时间复杂度只有O(n),而不是预想的O(nlogn)。具体做法是自 阅读全文
摘要:
伸展树(splay tree)是一种能自我调整的二叉搜索树(BST)。虽然某一次的访问操作所花费的时间比较长,但是平摊(amortized) 之后的访问操作(例如旋转)时间能达到O(logn)的复杂度。对于某一个被访问的节点,在接下来的一段时间内再次频繁访问它(90%的情况下是这样的,即符合90-10规则,类似于CPU内或磁盘的cache设计原理)的应用模式来说,伸展树是一种很理想的数据结构。这是因为最近被访问的节点一直位于根节点的附近,从而再次被访问时的搜索路径长度比较小。这点与平衡的二叉树(比如AVL树和红黑树)不一样。另外一点与其他平衡二叉树的区别是,伸展树不需要存储任何像AVL树中平衡 阅读全文
摘要:
插入排序的基本思想是每次取右边的第一个元素,将它与左边已经排好序的元素一一比较,如果该元素比第j个元素大,就将该元素插入到第j和第j+1个元素之间。最坏的情况下(比如输入序列是个逆序),每个元素都需要跟左边已经排好序的所有元素比较,总的比较次数为:1+2+...+(n-2)=(n-1)(n-2)/2 ~ O(n^2); 插入操作需要将插入位置右边的元素平移一个位置,总得移动操作次数也为O(n^2)。插入排序是稳定的(stable),这与选择排序不同(选择排序用的是交换非相邻元素位置,所以不稳定),并且如果原序列基本上排好序的情况下,比较和移动操作的次数可以大大降低,因为它只需比较一部分元素,在 阅读全文
摘要:
冒泡排序的基本思想是每次在左边未排好序元素序列中依次挨个比较大小,如果相邻两个元素不是正确顺序(正确顺序为左边元素小于右边元素),交换该两个元素。直到左边未排好序的元素中最大的元素进入(冒泡)右边已经排好序的元素中,并作为最小元素落在已经排好序的元素序列的最左端。总的比较操作次数为:(n-1) + (n-2) + ... + (1)=n(n-1)/2; 最坏的情况总的交换次数等于总的比较操作次数, 比如输入的元素为从大到小顺序,需要每次比较(if(A[j-1]>A[j]))完之后做一次交换。在下面的实现,考虑到每一次外层循环中,如果内层循环中没有发生任何交换(exchanged = fa 阅读全文
摘要:
选择排序的基本思想是每次从右边未排好序的元素中找出最小的元素,然后将该元素和左边已经排好序的元素中最大的元素(它位于左边元素序列的最右端)交换,这样每次交换都将一个元素排好序。 总的比较操作次数为(n-1) + (n-2) + ... + (1)=n(n-1)/2;总的交换操作为n-1(所以相对其他的排序算法,它的交换操作次数比较少)。注意选择排序的一个缺点是,它是不稳定的(unstable),比如对序列(a,b,c,d),设a=b,d = min(b,c,d),那么第一次选择到最小元素d之后需要交换:a<->d,得到的结果为(d,b,c,a),因为a=b,原来a和b的位置(a.. 阅读全文
摘要:
爬楼梯问题:一段楼梯共n级台阶,每次只能走一级、两级或三级台阶,问共有多少种走法?列出n=10时的所有走法。分析:首先考虑第一步的走法:第一步可以跨1级台阶,也可以跨2级和3级台阶。设S(n)表示走n级台阶的走法数量。如果第一步跨1级台阶,剩下的台阶数为n-1, 也就是说这种情况下(即第一步跨1级台阶的)走法相当于S(n-1);如果第一步跨2级台阶,剩下的台阶数为n-2,也就是说如果第一步跨2级台阶的走法相当于S(n-2);如果第一步跨3级台阶,剩下的台阶数为n-3,也就是说如果第一步跨3级台阶的走法相当于S(n-3)。从而得到递推关系式:*************************** 阅读全文
摘要:
参考原文(原文作者:Timothy J. Rolfe):http://penguin.ewu.edu/~trolfe/DSWpaper/DSW算法用于平衡BST(二叉查找树),而且平衡后的二叉树是一颗完全二叉树(complete binary tree-即叶子节点顶多位于最后两层,而且从左到右排列)。该算法的优点是:无须开辟额外的空间用于存储节点,时间复杂度线性O(n)。该算法分两个阶段进行:首先将任意一颗二叉树通过一序列右旋转(right rotations)转换成一个单链结构(称作vine,即每个非叶子节点只有右孩子,没有左孩子);然后在第二阶段中对单链结构通过几个批次左旋转(left r 阅读全文
摘要:
AC解 - 用动态规划解决一道排列组合计数问题(序关系计算)原题如下:http://acm.nankai.edu.cn/problem.php?problem=1134[同时请参考网友pandm发的帖子:http://topic.csdn.net/u/20110525/01/adf4d0b0-2b8e-4c0a-b8da-07b27f1711cc.html?seed=589816236&r=73524109#r_73524109]There are 13 possible orderings for three numbers, if we sort them with the rel 阅读全文
摘要:
不使用递归遍历二叉树有几种方法:迭代,线索二叉树和Morris算法(通过临时转换二叉树变成一个类似链表的结构)。下面是迭代方法和递归的对比,后面单独列出Morris算法的实现。迭代方法和递归的对比实现:import java.util.Stack;/** * * Using recursive & iterative(ie. non-recursive) methods to traverse binary tree in * inorder, preorder and postorder * * @author ljs * 2011-05-25 * * */public class 阅读全文