有一千万行重复的短信,以文本文件的形式保存,一行一条,有重复。如何找出重复次数最多的10条?
可以用哈希表的方法对1千万条分成若干组进行边扫描边建散列表。第一次扫描,取首字节,尾字节,中间随便两字节作为Hash Code,插入到hash table中。并记录其地址和信息长度和重复次数,1千万条信息,记录这几个信息还放得下。同Hash Code且等长就疑似相同,比较一下。相同记录只加1次进hash table,但将重复次数加1。一次扫描以后,已经记录各自的重复次数,进行第二次hash table的处理。用线性时间选择可在O(n)的级别上完成前10条的寻找。分组后每份中的top10必须保证各不相同,可hash来保证,也可直接按hash值的大小来分类。
线性时间选择:
http://www.ezloo.com/2008/04/randomizedselect.html
什么是Trie树?
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html
各排序算法的对比?
排序算法的稳定性?
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
Shell排序:http://www.cnblogs.com/kkun/archive/2011/11/23/2260288.html
归并排序:http://blog.csdn.net/morewindows/article/details/6678165
有20个数组,每个数组里面有500个数组,降序排列,每个数字是32位的unit,求出这10000个数字中最大的500个。
从20个数组中各取一个数,并记录每个数的来源数组,建立一个含20个元素的大根堆。此时堆顶就是最大的数,取出堆顶元素,并从堆顶元素的来源数组中取下一个数加入堆,再取最大值,一直这样进行500次即可。时间复杂度:500*log2(20)
辗转相除法的原理?时间复杂度?
设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用b除a,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。其最后一个非零除数即为(a,b)。
时间复杂度O(logN)。
String s = "a"+"b"+"c"+"d"+"e";创建了几个对象?
1个。"a"属于常量,只存储字面值。
下列程序的输出结果是多少?
String str = " ABCDEFGH";
System.out.println(str.dubstring(3,5));
答:"DE"
StringBuffer和StringBuilder有什么区别?
新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。
java 中char类型可以赋值为Unicode-16里编码的任何一个代码点,汉字英文特殊符号都可以。