摘要:
18.6 设计一个算法,给定10亿个数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。解法:方法1:排序按升序排序所有的元素,然后取出前100万个数,时间复杂度为O(nlog(n))方法2:大顶堆我们可以使用大顶堆来解题。首先,为前100万个数字创建一个大顶堆然后,遍历整个数列... 阅读全文
摘要:
18.5 有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(也即相隔几个单词)。有办法在O(1)时间里完成搜索操作吗?解法的空间复杂度如何?解法1:我们假设单词word1和word2谁在前谁在后无关紧要。要解决此题,我们需要遍历一次这个文件。在遍历期间,我们会记下最... 阅读全文
摘要:
18.2 编写一个方法,洗一副牌。要求做到完美洗牌,换言之,这幅牌52!种排列组合出现的概率相同。假设给定一个完美的随机发生器。解法:假定有个数组,含有n个元素,类似如下:[1][2][3][4][5]利用简单构造法,我们不妨先问自己,假定有个方法shuffle(...)对n-1个元素有效,我们可以... 阅读全文
摘要:
18.1 编写一个函数,将两个数字相加,不得使用+或其他算术运算符。int add(int a,int b){ if(b==0) return a; int sum=a^b; int carry=a&b)<<1; return add(sum,carry);} 阅读全文