随笔分类 -  算法

摘要:/* Author:cavehubiao Mail:cavehubiao@qq.com MyBlog:http//www.cnblogs.com/cavehubiao*/#include#include#include#include#include#include#include... 阅读全文
posted @ 2014-04-21 19:44 cavehubiao 阅读(221) 评论(0) 推荐(0)
摘要:常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。Hash函数数据1数据2数据3数据4数据1得分数据2得分数据3得分数据4得分平均分BKDRHash20477448196.5510090.9582.0592.64APHash23475 阅读全文
posted @ 2013-11-07 15:40 cavehubiao 阅读(3193) 评论(0) 推荐(0)
摘要:防鄙视系列二分求幂int pow2(int a,int b){ int base=a,int r=1; while(b!=0) { if(b%2) r*=base; base*=base; b/=2; } return r;}二分改位运算,一样的意思,位操作快点int pow3(int a,int b){ int base=a,int r=1; while(b!=0) { if(b&1) r*=base; base*=base; b>>=1; }} 阅读全文
posted @ 2013-10-09 18:38 cavehubiao 阅读(132) 评论(0) 推荐(0)
摘要:看编程之美上这题,感觉状态方程写的好别扭,我感觉应该是用一个数组s[i]表示用到ary[i]时最大数组和所以s[i]=max(s[i-1]+ary[i],ary[i]) 意为:要得到,用到ary[i](表示必须包含ary[i])构成的最大数组和,要么是用了包括ary[i-1]的最大数组和s[i-1]要么完全没用到s[i-1],即直接是ary[i]。、但是这最后的s[lengt-1]只是一个必须用到ary[i]的最大数组和,有可能是不是最大的,所有还需要一个变量gmax,gmax=(gmax,s[i])应为最大子数组肯定出现在数组s[i] i=0-n-1内某个位置#includeusing na 阅读全文
posted @ 2013-09-28 13:06 cavehubiao 阅读(246) 评论(0) 推荐(0)
摘要:01背包要求是每个物品最多只能选择一次完全背包要求是每个物品可无限次选取01背包的状态方程为 f[i][j]=max(f[i-1][j-w(j)]+value[i],f[i-1][j]);完全背包的状态方程为f[i][j]=max(f[i-1][j-w(j)*c]+value[i]*c,f[i-1][j]);01背包二维存储 如f[i][j] i表示在前i个选 j表示总容量注意第4行循环是 0->w1 for i:=0 to w do2 f[0,i]:=0;3 for i:=1 to m do4 for j:=0 to w do begin5 f[i,j]:=f[i-1,j];6 if 阅读全文
posted @ 2013-09-23 12:35 cavehubiao 阅读(219) 评论(0) 推荐(1)
摘要:防鄙视系列,以前挖的坑,早晚要自己填下.大学荒废了4年,混了个研究生,才发现压力更大,不多说了,都是泪(ab)‘=b'a' ,'表示逆矩阵,这是矩阵乘法的性质 1 void reverse(int m,int n,int*buf); 2 void rswap(int ms,int me,int ns,int ne,int* buf); 3 int main() 4 { 5 int buf[]={1,2,3,4,5,6,7}; 6 reverse(0,sizeof(buf)/4,buf); 7 8 return 0; 9 10 }11 12 void rever... 阅读全文
posted @ 2013-09-12 21:03 cavehubiao 阅读(487) 评论(0) 推荐(0)
摘要:防鄙视系列 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 void norecursion_QuickSort(int*,int); 8 int partition(int*,int,int); 9 int main()10 {11 int buf[]={112,332,1,200,123,-1,23214};12 norecursion_QuickSort(buf,sizeof(buf)/4);13 int m;14 return 0;15 }16 17 void norecur... 阅读全文
posted @ 2013-09-10 20:31 cavehubiao 阅读(249) 评论(0) 推荐(0)
摘要:写个防笔试 1 #include 2 3 struct node 4 { 5 node* pnext; 6 int value; 7 node():pnext(NULL){} 8 }; 9 10 node* ListMerge(node*,node*);11 int main()12 {13 node* head1,*head2;14 head1=new node();15 head1->value=1;16 head1->pnext=new node();17 head1->pnext->value=3;18 head... 阅读全文
posted @ 2013-09-10 18:55 cavehubiao 阅读(314) 评论(0) 推荐(0)
摘要:题目:给定一个数N,求出1-N之间的数字有多少个1,例如N=11时结果为4(只有1,10,11含1)经典问题。参照编程之美分析编程之美上的一道题目,原文分析的方法十分简单,并且很容易程序实现。分析:若x = abcde,我们来看百位为1出现的次数,这里分3种情况讨论:1. 百位为0时,假设x = 45021,可以算出百位为1出现情况: 100~199 1100~1199 ... 44100~44199 总共是45*100个12. 百位为1时,假设x = 45121,可以算出百位为1出现情况: 100~199 1100~1199 ... 44100~44199 45100~451... 阅读全文
posted @ 2013-09-09 10:14 cavehubiao 阅读(457) 评论(0) 推荐(0)