/* 百度面试: 1.用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,使用 x 次天平, 最多可以从 y 个小球中找出较轻的那个,求 y 与 x 的关系式。 2.有一个很大很大的输入流,大到没有存储器可以将其存储下来, 而且只输入一次,如何从这个输入流中随机取得 m 个记录。 3.大量的 URL 字符串,如何从中去除重复的,优化时间空间复杂度 */ /* 1.记住是唯一较轻的,只有一个 每次分三份,a,b,c 称ab;如果a=b,则轻的在c中,否则在ab小的那堆中 所以y=3^x 2. 所有的个数N,N<m,保存所以的, N>m: 用一个N,rand的随机数,R=rand(N),如果R在[0,m]区间,置换,否则丢弃不管 ; 或者 用大小为m的数组arr[0:m-1]来保存随机抽取的元素 arr[0:m-1]逐步初始化为输入流的前m个元素的一个随机排列。 对于输入流中的第k (k>m)个元素,后面元素,随机生成一个[0,k-1]区间内的整数i, 如果此随机整数i小于等于m,那么就用第k个元素覆盖掉arr[i-1], 否则,丢弃第k个元素。 3.用hash 1. 内存够用,非常大,将URL存入hash链表,每个URL读入到hash链表中,遇到重复的就舍弃, 否则加入到链表里面,最后遍历得到所有不重复的URL。 空间复杂度M,时间复杂度为O(N+N/M),M为不重复的URL,N为总URL数 2. 为了解决内存可能不足的问题,需要把hash链表变化成普通的hash表, 每个hash表元素指向一个文件, 这个文件记录了所有该hash值对应的无重复的URL, 那么在加入URL的时候就遍历对应文件中的URL,没有重复则加入到文件中。 但是每次都要读写文件,消耗的时间应该是上一种方式的三倍(依赖于io速度), 而对内存的要求比较小。一个改进是加入URL的时候进行排序,这样能减少比对的次数。 */