编程珠玑习题
文章平均质量分 78
nandawys
这个作者很懒,什么都没留下…
展开
-
编程珠玑习题 - 第一章
shuffle函数,打乱vector中元素顺序。 这里要注意rand()产生的随机数最大值为RAND_MAX,在我的系统上是3万多,因为要打乱1千万个数字,所以得将产生的随机数放大到1千万数量级。 void shuffle(vector &v){ srand((unsigned)time(NULL)); int len = v.size(); int factor = len/RA原创 2013-07-30 16:22:57 · 293 阅读 · 0 评论 -
编程珠玑习题 - 第二章
第二题: 题目说找出43亿个32位数字中至少出现两次的数字。因为32位无符号整数大概42.9亿多个,所以一定有重复元素。 大概思想是折中查找,比如第一次从2^31为基准,记录43亿个数字中位于[0, 2^31) 内的数字个数和[2^31, 2^32)内的数字个数。 如果其中某个区间的数字个数大于2^31个,则说明至少有一个数字重复出现。递归从这个区间开始折半查找。 原书后面的习题答原创 2013-07-31 22:38:44 · 273 阅读 · 1 评论 -
编程珠玑习题 - 第八章
第八题: 要求改进分治算法,使其复杂度为O(N)。 既然是分治法,一共有logN层,既然要求复杂度为O(N),那显然程序最后的复杂度应该是O(logN)+O(N)。用动态规划的思想,我们需要花O(N)时间建立两个数组, before[]和after[]。before[i]表示以第i个元素结尾的最大序列和,after[i]表示以第i个元素开始的最大序列和。建完这个表之后,原来分治法中需要O(N原创 2013-08-02 01:37:39 · 359 阅读 · 0 评论