08 2011 档案
摘要:heap-sort基本操作a, push_heap,将新元素加入heap中。做法是先将元素加至序列最后,然后逐渐向上交换,直到到达合适位置,即所谓sift-up操作。基本操作b, pop_heap,从堆中删除根元素。做法是先将根元素交换至最后(待删除位置),然后调整新的根到合适位置,即所谓sift-down操作。基本操作c,make_heap,调整一个随机序列使其满足堆结构。以上三个基本操作STL中就有提供,用这三个基本操作,可以直接搞出heap-sort了。实际上,heap-sort只需要make_heap和pop_heap即可。push_heap在实现类似priority_queue的时候
阅读全文
摘要:1,实现random_shuffle:random_shuffle是STL中的一个模板算法,作用是随机重排列一对random access iterator之间的元素。基本思想是:假设序列有n个元素,先从所有元素中选一个放到位置1(即与位置1的元素交换),然后再从剩下的n-1个元素中选择一个放到位置2,以此类推。2,qsort:partition之后双向递归。qsort的实现:View Code 1 #include <string.h> /* memcpy */ 2 3 #define SWAP_ELEM(pl, pr, size) do {\ 4 char temp[size]
阅读全文
摘要:1,一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。最直接也最清晰的做法就是排序然后两边往中间同步走,O(nlogn) + O(n)。不过既然相同数值不重复出现,还对空间没啥说的,那就bitmap吧。。。可以做到O(n)。太无聊了,还要揣摩出题人的思路。2,一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。注意:- 5个数值允许是乱序的。比如:
阅读全文
摘要:老题目了,带有min函数的stack。基本思想是,按照进栈顺序来扫一遍的话,min值并不是一直在变化的,可能连着过了好多个元素,min并没有变。形式化地说,若令f(j) = min(arr[1..j]),那么f(j)的图像由若干条阶跃相连的水平线段组成。因此f(j)可以将每一条线段压缩到一个元素。基本操作是:用两个栈,除了正常的stack之外,附加一个min-stack,保存当前的最小值。数据栈压入元素时,如果小于min-stack最小值,则表明f(j)出现了一个阶跃(从左向右开始了一根新的水平线),要记录下来;否则只压到数据栈即可。数据弹出的时候,检查是不是min-stack的栈顶元素,如果
阅读全文
摘要:How to systematically generate all the permutations of a given sequence?seehttp://en.wikipedia.org/wiki/Next_permutation1, Find the largest index k such that a[k] < a[k + 1]. If no such index exists, the permutation is the last permutation.2, Find the largest index l such that a[k] < a[l]. Sin
阅读全文
浙公网安备 33010602011771号