
算法
文章平均质量分 59
sumoyu
这个作者很懒,什么都没留下…
展开
-
求序列的最大子序列
看《编程珠玑》一书,讲解求序列的最大子序列。问题: 给定一个实数序列x1,x2,…,xn(不必是正数),寻找一个连续的子序列xi,x(i+1),…,xj,使得其数值之和在所有连续子序列数值之和中是最大的。 算法1思路:比较所有连续序列数值的和,找到最大的。1. maxsofar=0;2. for i=[0,n)3. sum=0;4. for j=[i,n)原创 2012-01-07 21:54:46 · 1113 阅读 · 0 评论 -
对2-3-4树的简单想法
2-3树插入时,我们首先从根节点开始,从上到下找到待插入的叶节点;然后再从叶节点开始从下到上,执行插入操作。 而2-3-4树插入时,同样首先我们也从根节点开始,从上到下找待插入的叶节点但是与2-3树插入不同的是,在这个寻找过程中遇到4-node,我们就把可以把4-node分裂成2个2-node,重新链接到其父节点。这个操作不会改变2-3-4树的任何性质。最后找到待插入的叶节点时,这个叶原创 2012-12-11 11:28:14 · 2317 阅读 · 0 评论 -
2-3树删除和插入操作的小结
学习2-3的操作后,感觉插入和删除的思想都不是特别复杂,但就是比较啰嗦。特别是删除,要处理很多种情况,本质上删除就是“合并”和“调整关键字的分布”,但不同情况编程的细节上有点差别。用图小结几个典型的情况。(一)2-3树的插入空树的插入最简单,创建一个节点即可。 对于非空树,首先查找到一个叶节点,沿着这个叶节点向上执行插入操作。1.叶节点是2-node,直接把值插入到原创 2012-12-10 13:27:41 · 11777 阅读 · 1 评论 -
学习UKK后缀树构造算法
学习了UKK构建后缀树的算法,挺不好理解。努力写下自己的理解。I 基本思想构建后缀树的基本思想:假设 T[0..i-1] 的后缀树已经建好了,那么在 T[0..i-1] 的每个后缀 T[0..i-1], T[1..i-1] .. T[j..i-1] .. T[i-1..i-1],””(空字符串),的后面加上字符 T[i] 就可以得到 T[0..i] 的后缀树了。注意,有一个底节点“bott原创 2012-07-12 16:52:29 · 5444 阅读 · 1 评论 -
火车运煤问题
网上有一道火车运煤的问题。题目:你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市? 开始看到题目觉得没有解,火车运1000吨,到终点后,什么也没有了,都在路上消耗原创 2012-06-18 16:37:26 · 3575 阅读 · 3 评论 -
调皮的宏
《编程珠玑》第九章一道题目:n是数组最大尺寸的正整数,下面的递归C函数返回数组x[0...n-1]中的最大值:float arrmax(int n){ if(n==1){ return x[0]; }else{ return max(x[n-1],arrmax(n-1)); }} max是一个宏:#de原创 2012-02-28 13:04:11 · 520 阅读 · 0 评论 -
二分法找元素第一次出现位置
常见的二分法找一个元素出现的位置(随机的)是://x[0...n-1]是升序排列。找到元素t出现的一个位置(不一定是第一次出现的位置)l=0;u=n-1;loop if l>u p = -1; break; m = (l+u)/2; case x[m] x[m] ==t: p=m; break原创 2012-02-26 21:17:33 · 1200 阅读 · 0 评论 -
参数++
<!--table.MsoNormalTable {font-size:10.5pt; font-family:"Calibri","sans-serif"}-->STL 有一段代码template typename list::iteratorlist::erase(iterator __first,原创 2011-02-16 17:17:00 · 460 阅读 · 0 评论 -
QuickSort
Read Hoar's article "quicksort" published in "the computer journal". Try to understand quicksort algorithm further.I.Stratgy:The quicksort is based on the principle of resolving a problem into t原创 2010-12-25 19:56:00 · 601 阅读 · 0 评论 -
取一个集合的前n个最大或最小值
《编程珠玑》第十四章的一个问题是:在具有10亿个数值的文件中找出最大的100万个数组。 使用堆解决这个问题的思路1. 取10亿个数值中的最初的100万个,放到一个堆中,初始化这个堆为小顶堆。2. 依次取剩下的每个数值,用取出的这个值和小顶堆的最小值比较: 如果大于最小值,用这个值替换小顶堆的最小值,调整堆使得它还是小顶堆。 如果小于或者等于最小值,则继续取下一个原创 2011-12-29 17:44:24 · 3276 阅读 · 0 评论 -
Counting 1-bits
练习统计正整数中1的个数。两个经典的算法 int OneNum_MnsOne(unsigned int aInt){ int num=0; while(aInt != 0){ num++; aInt = aInt & (aInt - 1); } return num;}int OneNum_DvdC原创 2010-12-18 22:31:00 · 454 阅读 · 0 评论 -
外排序时间估计和趟数计算的理解
学习一个算法题过程中涉及到外排序,就把外排序的知识复习一遍。复习中对趟数计算,我似乎觉得应该很好理解,但又好像不能透彻的理解,就问自己能不能给出一个清晰的证明。尝试了进一步的理解。I估计外排序的时间。某文件共10000个记录,设每个物理块可以容纳200个记录,内存缓冲区可以容纳5个物理块1)经过10次内排序后得到10个初始归并段R1~R102)采用两路归并,需四趟可以得到排好序原创 2011-11-20 16:53:34 · 1582 阅读 · 0 评论 -
练习-打印正整数的二进制
看程序时,碰到一个问题,解决之余想起练习打印正整数的二进制。 //Convert an integer (>0) to a binary and print.void prn(char *p){ while(*p=='0') p++; while(*p != '/0'){ printf("%c ",*p); ++p;原创 2010-12-14 21:42:00 · 651 阅读 · 0 评论 -
理解堆排序
复习外排序算法时,设计到败者树,而这个又和堆排序相关。刚好忙完一个项目,有时间复习一下堆排序,加深理解。堆就是满足下列条件的一个数组,一个数组A[n],A[i]=A[2i+1],A[i]>=[2i+2],0=1),A[j]=1),A[j]>=A[i],1根据堆的定义,第一个元素一定是最大或者最小的。将一个数组A[0...n-1]调整为堆,把第一个元素和最后一个元素调换,A[n-1]是最原创 2011-12-05 17:11:39 · 771 阅读 · 0 评论 -
演示2-3树删除时为什么空节点只有一个子节点
演示删除时,为什么空节点下都只有一个子节点?自己好像是能想明白,但隔一段时间,再看时,又有点迷茫。所以尝试着下来,加深理解。1. 初始空节点的产生 要删除的关键字要么就是在叶节点;要么交换中序排列中后一个关键字后到了叶节点。总之最终要删除的关键字都会落到叶节点中。 如果叶节点是3-node,删除这个关键字,3-node变为2-node,就没有空节点。 如果叶节点是2-n原创 2012-12-13 16:41:37 · 1541 阅读 · 0 评论