题目
有一千万个记录,重复比较多,去除重复后不超过3百万个。
重复度越高,说明越热门。
请统计最热门的10个查询串,要求使用的内存不能超过1G。
背景知识
什么是哈希表?
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
这个映射函数叫做散列函数,存放记录的数组叫做散列表。
哈希表hashtable(key,value) 的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。
当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。、
解决办法
- 统计频次
维护一个字典,键为记录字符串,值为出现的次数。(也就是Hash Table法)
时间复杂度:O(n)
- 找出Top 10
数据结构可以这样:(查询串,频次)
维护一个大小为10的小根堆。遍历所有记录,分别与根元素的频次比较,更新堆。
最小堆动画:http://www.benfrederickson.com/heap-visualization/
更新堆的算法复杂度是 O(logk),这里k是10。所有元素遍历一遍是O(n)。
这个过程算法复杂度:O(nlogk)