随笔分类 - 编程珠玑
摘要:本章讨论了一些字符串处理的算法1,最长重复子串 使用了后缀字符串的技巧#define MAX_TEXT_LEN 2000000#define FORWARD_LEN 2int getMaxCmp(const wchar_t* p1,const wchar_t* p2){ int n=0; while(p1[n]==p2[n])n++; return n;}wstring maxCmpText( const char* file ){ wchar_t* text=new wchar_t[MAX_TEXT_LEN]; wchar_t** textp=new wch...
阅读全文
摘要:本章讨论了堆堆有两个属性1,子节点大于或等于父节点 2,树中没有洞堆的特点是堆始终是平衡树,每个操作的复杂度都是ln(n),根节点总是最小的堆排序的代码:#pragma region heap int siftDown(int* buf,int pos,int len){ while(1) { int left=pos*2+1; int right=pos*2+2; int n; if(left>=len&&right>=len)break; else if(left>=len)n=right; e...
阅读全文
摘要:1,通过不断向intSet插入元素判断是否重复 stl::set使用二叉查找树,在当m=maxval时有最差情况2,增加个bool find(int t)?,想不到怎么再让它更强壮了3,无论是数组,链表,向量,insert要比find快一点点,但是都是同一个数量级的4,减少了函数调用的开销,这是巨大的优化,而且不会栈溢出5,一次分配,重复使用,类似的东西还有对象池,线程池等各种池6,此时数组,链表,位向量,桶会达到最优情况,二叉查找树会达到最差情况7,使用标记元素,插入时删除8,不大理解,怎么"同时在许多位上"进行并行操作?9,使用移位进行除法,这样每个桶都必须装2n个元素
阅读全文
摘要:本章讨论的问题:如何存储一组整数具体内容是:实现一个数据结构,能进行插入和按序输出几种实现:1,c++的set2,有序数组,必须首先知道最大空间,查找的效率是O(ln(n))插入的效率是O(n)3,有序链表,查找效率是O(n),插入为O(1),链表可以使用迭代进行搜索,也可以使用组分配进行优化,即预先分配一大块内存,而不是去申请许多小内存4,二分查找树,快速查找,快速插入,但是最坏情况下效率为O(n)View Code struct BTNode{ int n; BTNode* l; BTNode* r; BTNode(int _a) { l=r=N...
阅读全文
摘要:1 ,rand的返回值最大值是7fff 使用位操作产生大的随机值 View Code int bigRand(){ return rand()<<15&rand();}int rand(int l,int u){ int k=(rand()%3)<<30&(rand()<<15)&rand(); return l+k%(u-l+1);}2,随机选取0-n之间的一个i,取i,i+m-1共m个数,结果取模3,m<n/2时,从n取一个数,在集合中的概率小于1/2,因此取值次数的期望是2这里题目的描述并不严谨4,总共要取m次,集合的大小
阅读全文
摘要:编程珠玑在11章讲了插入排序和快速排序,稍后的章节还讲了堆排序作者写了多个版本的快速排序,并进行了速度测试,但是最后都干不过stl::sort,stl::sort太给力了让我们来分析一下stl::sort的源码首先说明下测试代码#define ASIZE 10000000 int* buf=new int[ASIZE]; srand(10); for (int i=0;i<ASIZE;i++) { buf[i]=ASIZE-i; buf[i]=0; buf[i]=rand()*rand(); buf[i]=ran...
阅读全文


浙公网安备 33010602011771号