Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4752444
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-13 20:05:21

搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,
请描述思想,写出算法(c语言),空间和时间复杂度
 
首先我们计算下看内存是不是够用,其实想都不用想如果够用的话,题中就不用说内存了^_^
 
 300*256w > 100000w
 
再说你的结构体,就算是链表也是
typedef struct  list
{
  char str[256];
  int frequency;
  struct  list* next;
}LIST;
当然也可以使用结构体数组...
typedef struct  array
{
  char str[256];
  int frequency;
}ARRAY;
 
1.假设内存够用,用数组吧
   ARRAY  array[300w];实际是<300w的有重复的....
  
  接下来的方法就是10亿个数中取大的10个数了,你可以二叉堆,也可以快排的思想.
 
2.这里内存不够用,就只有先把这些数丢在磁盘了。
  input.txt  //原始文件  输入信息(有重复)
  num.txt    //输入信息加次数(无重复)
 
  那么如何由input.txt到num.txt呢
 
  先从input.txt中读取记录,先hash_find如果没找到再hash_add
 
3.得到这个之后就是上面说的 二叉堆 or 快排只取一边的理论上的O(N)的做法了
当然这里内存也是不够快排思想的,我这里这是说说这种思路而已
 
 
最后
 1.先利用hash得到num.txt
//其实你真要算,这里还可以说是外排,不过外排太麻烦,也没什么效率,只是可行性
 2.再二叉堆
 
 第一次不上代码,直接这么分析,也不知道效果如何,每次都写代码太累了...就想还有人在我blog抱怨malloc的mem,  没有free!!!!
  oh my god!!!你爱看不看,分不清主次的人。多说不宜,显得我的愤青!!!什么时候网络的愚民们能不以批判的眼光看人,多些宽容,此真乃国家之幸也。
阅读(1514) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~