两道笔试题,大家一起来讨论吧!

bryantd 2007-11-11 03:35:35
再说这两道题目之前,首先允许我发两句牢骚。最近找工作,参加了一些笔试,包括baidu和google的,他们的命题思路很明确,不要求具体语言,只要求程序的效率和可行性,题目大多数是关于海量数据搜索的算法问题,我觉得这个无可非议,人家的实际情况就是要求应聘者具有这样的素质。但是另外一些号称“牛逼”的企业也纷纷效仿,也不管自己企业是做什么的,也不管自己企业招收员工的基本素质要求是什么,就开始东施效颦。比如一家做软件外包的企业,出了一道类似的题目,后来我向在那里工作的师哥打听了一下,在真正的工作中,尤其是外包领域,企业的数据一般达不到那么海量,仅仅考虑如何实现就可以,根本就不用考虑海量数据的情况。Google和baidu这就不用说,人家的数据量在那里摆着呢,可是一个做ERP的,难道真的需要考虑亿以上数量级的情况吗?我看是有点小题大做了。另外对于一个应届毕业生,这么要求是不死有些过分呢?我们在学校怎么可能接触过这方面的实践阿?
废话不讲了,怨天尤人也没用,下面我把遇到的两道题目写出来大家一起想思路吧!

1、有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。

2、有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”着个单词出现的次数,要求效率最高,并写出算法的时间级。
...全文
505 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qdk0901 2008-01-08
  • 打赏
  • 举报
回复
同意楼上的说法
Tiger_Zhao 2007-11-21
  • 打赏
  • 举报
回复
2、直接用CSDN两边加空格后进行字符串查找并计数就可以了,无论查找函数语言自带还是自己实现,都是O(n)时间复杂度。只有在需要多次统计不同单词时才会考虑其它算法,本题简单得没有优化的可能了。
hnsdxujunyi06 2007-11-21
  • 打赏
  • 举报
回复
对于2,我与qzy6认识一致,所以有同疑,请问 ntzhouhao :
“数据无序分布的情况下效率反而不如死做” ?
能否举个简单实例 , 给我们扫盲一下,谢谢。
xhappy 2007-11-18
  • 打赏
  • 举报
回复
我笔试的时候也遇到了这样的问题,哎,做不出来,直接就挂了
ntzhouhao 2007-11-18
  • 打赏
  • 举报
回复
FM大牛惊现
FancyMouse 2007-11-18
  • 打赏
  • 举报
回复
2.kmp或者hash
qzy6 2007-11-18
  • 打赏
  • 举报
回复
不明白 8 楼说的“数据无序分布的情况下效率反而不如死做”
qzy6 2007-11-15
  • 打赏
  • 举报
回复
第一题: 以下这个帖子中已有相当多讨论
http://topic.csdn.net/u/20071105/22/0340a0a4-9b90-4ea1-9048-385ce7d34a2c.html
其中我比较同意15楼的,这也是到现在为止我发现最好的算法,我在18楼做了点改进。
思想是 利用寻找第K个数的线性算法。
总的磁盘I/O为一次,时间复杂度为 O(n),这里n=10^9 ; 空间复杂度为 O(m),这里m=10^4.

第二题: 可以用著名的kmp算法,线性的。
时间复杂度为O(n), n为文章中字符个数。
qzy6 2007-11-15
  • 打赏
  • 举报
回复
第一题: 这个帖子中已有相当多讨论
http://topic.csdn.net/u/20071105/22/0340a0a4-9b90-4ea1-9048-385ce7d34a2c.html
ntzhouhao 2007-11-15
  • 打赏
  • 举报
回复
回LS
kmp算法有很大的局限性,在数据无序分布的情况下效率反而不如死做,第一题堆确实是最好的方法.
还有2楼怎么实现呢
MagiSu 2007-11-13
  • 打赏
  • 举报
回复
都不是什么难题。楼上说的相当对。我差点重复一遍。
oo 2007-11-13
  • 打赏
  • 举报
回复
1,建个10000大小的堆
2,反正是要遍历一次的,可以用状态转移表来做
wangw37 2007-11-11
  • 打赏
  • 举报
回复
2楼兄弟的想法确实很赞~~ ^_^
medie2005 2007-11-11
  • 打赏
  • 举报
回复
第二个问题,其实很简单。
假设不区分大小写,由于英文字母有26个,因此,可以将单词映射为数字。csdn被映射成:
('c'-'a')*32*32*32+('s'-'a')*32*32+('d'-'a')*32+('n'-'a')
即:('c'-'a')*(1<<15)+('s'-'a')*(1<<10)+('d'-'a')*(1<<5)+('n'-'a')

wangw37 2007-11-11
  • 打赏
  • 举报
回复
1、有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。
~~~~~~~~~~~~~
其实占用内存不算大, 可以接受. 呵呵.
既然不可以一次读入内存, 那可以这么试试:
方法1: 读出100w个数据, 找出最大的1w个, 如果这100w数据选择够理想, 那么最小的这1w个数据里面最小的为基准, 可以过滤掉1亿数据里面99%的数据, 最后就再一次在剩下的100w(1%)里面找出最大的1w个咯~~
方法2: 分块, 比如100w一个块, 找出最大1w个, 一次下来就剩下100w数据需要找出1w个了.
对于上面提到的找出100w个数据里面最大的1w个, 说起来比较罗嗦, 还是说说找到第1w个大的数字的方法:
用快速排序的方法, 分2堆, 如果大的那堆个数N大于1w个, 继续对大堆快速排序一次分成2堆, 如果大堆个数N小于1w, 就在小的那堆里面快速排序一次, 找第10000-N大的数字; 递归以上过程, 就可以找到第1w大的数. 据说也是STL的search_n()的方法;
参考上面的找出第1w大数字, 相信楼主就可以类似的方法找出前1w大数字了.

2、有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”着个单词出现的次数,要求效率最高,并写出算法的时间级。
~~~~~~
偶没有什么好的方法, 似乎字串识别有不少高级算法,呵呵, 都没有认真看过. 楼下兄弟们怎么看?

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧