一道笔试题(欢迎大家讨论)

liuxuejin 2010-10-27 12:21:24
题目:假如有一个1TB大小的文件,每行的格式如下(用Java实现):
323828328,李武,男,广州市323232332,小四,女,三藩市.....
(1)请编写一个程序(假设名字是不重复的),得到一个索引文件,并且要保证这个索引文件尽量小,可以提上搜索的效率,前提是内存只有1G的大小。
(2)请利用你的所得到的索引的文件,根据名字(假设名字是不重复的)搜索出该名字所对应的信息





大家讨论一下,希望高手能贴出代码,光懂皮毛随便说说的就算了!
...全文
451 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqfddqr 2010-10-28
  • 打赏
  • 举报
回复
1TB....................................
liuxuejin 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 clariones 的回复:]
这不过是个体力活,lz好好在网上找找就能看到很多成熟的算法。 为啥要人贴代码呢?
贴代码拷贝下来,你就懂了么? 还是看算法,自己写代码比较好
[/Quote]真的找不到代码!如果能找到的话我就找到了!已经研究了好几天了。
liuxuejin 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zbo 的回复:]
大家讨论一下,希望高手能贴出代码,光懂皮毛随便说说的就算了!
===============================
虽然我是个菜鸟,我一样鄙视你。
什么态度?能给你个思路的就不错了。
即使你再傲慢,发帖求人时也该谦虚点吧?
[/Quote]这不是求助,这是技术讨论!你去je上乱说一下,可以封你ID,我们要的是质量回复,乱回复不经大脑的那些就免回了。
Fiok 2010-10-28
  • 打赏
  • 举报
回复
用空间换时间吧
nbmvcd 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cenhuineng 的回复:]

给定的内存大小和程序有关系吗?
[/Quote]
跟搜索速度有关系……
liuxuejin 2010-10-27
  • 打赏
  • 举报
回复
是的!内存就是一般的机子!算256M吧!
wnx_u 2010-10-27
  • 打赏
  • 举报
回复
只能创建一个索引文件吗,数据文件有没有排过序
qingtianliuyun 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 liuxuejin 的回复:]
大家讨论一下,希望高手能贴出代码,光懂皮毛随便说说的就算了!
[/Quote]
看来我只能打酱油路过!
凉岑玉 2010-10-27
  • 打赏
  • 举报
回复
给定的内存大小和程序有关系吗?
btpka3 2010-10-27
  • 打赏
  • 举报
回复
哈哈,不懂,但偶也要厚着脸皮瞎扯扯:

1TB = 1024^4 字节
你给出的记录格式大约每条记录在 26 个字节左右
所以 大概 有 1024^4 / 26 = 422 8890 8761 条记录(百亿条记录了呢)。

想了个烂方法:
建立索引文件的时候,使用某个索引空间较小的hash算法,比如 32位(4个字节),如果太大(比如128位,就截取前4个字节)
假设使用的hash算法的冲突几率是5%(100个不同的字符串,可能有5个放在同一个索引下)
每个索引下至少得留 (1024/26)*(1+5%)= 41 条记录的空间,假设定为64

则,索引文件的大小为 longlong的字节数 * 2^32*64 = 1T 呢


每次查找记录都,先计算出32为的hash值,并将该值转换为无符号整数n(0 ~ 2^32-1),
然后到索引文件中 64*n 处,读取64条记录的偏移量(内存中只保存64条记录的偏移量),
再然后到数据文件中读取64次,至多第64次查询到需要的数据。

误人莫怪啦,瞎扯淡滴
涅槃 2010-10-27
  • 打赏
  • 举报
回复
看来我也只能打酱油路过!
chho123 2010-10-27
  • 打赏
  • 举报
回复
旁观中……
贪睡的兔子 2010-10-27
  • 打赏
  • 举报
回复
名字转化为Unicode码-转化为,建立两棵二叉树,一棵插入名字Unicode,排序,另一棵根据前面那棵树插入1,2,3,...
收索时转化为Unicode,检索二叉树,找到该名字,对应另一棵二叉树,得到该名字位置
进入文件 ,得到该信息
clariones 2010-10-27
  • 打赏
  • 举报
回复
这不过是个体力活,lz好好在网上找找就能看到很多成熟的算法。 为啥要人贴代码呢?
贴代码拷贝下来,你就懂了么? 还是看算法,自己写代码比较好
zbo 2010-10-27
  • 打赏
  • 举报
回复
大家讨论一下,希望高手能贴出代码,光懂皮毛随便说说的就算了!
===============================
虽然我是个菜鸟,我一样鄙视你。
什么态度?能给你个思路的就不错了。
即使你再傲慢,发帖求人时也该谦虚点吧?

Miracle1216 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wnx_u 的回复:]
创建复合文档
创建一个段
对数据文件分块
将每块的磁道信息写入该段
创建一个段
写入复合索引结构体信息
对数据文件各块排序
写入对每一块排序后的索引并与第一段关连
创建一个段
保存主键在第二段的分段索引信息和游标信息
创建一个段
创建一个HASH表,写入该段
对第三个段中的索引进行分段索引


搜索条信息
计算该条信息的主键的HASH值
找出该主键所在的索引段
……
[/Quote]
牛逼啊。。。操作系统?
thegodofwar 2010-10-27
  • 打赏
  • 举报
回复
什么建索引呀,效率呀
接触少呀...
wnx_u 2010-10-27
  • 打赏
  • 举报
回复
创建复合文档
创建一个段
对数据文件分块
将每块的磁道信息写入该段
创建一个段
写入复合索引结构体信息
对数据文件各块排序
写入对每一块排序后的索引并与第一段关连
创建一个段
保存主键在第二段的分段索引信息和游标信息
创建一个段
创建一个HASH表,写入该段
对第三个段中的索引进行分段索引


搜索条信息
计算该条信息的主键的HASH值
找出该主键所在的索引段
在所在索引段中查询出所对应的数据块
根据该数据块的查询所对应的磁道信息
在对应的磁道中读取数据



本人是做C的,JAVA做的不多,怎样用JAVA操作磁盘还真不知道
liuxuejin 2010-10-27
  • 打赏
  • 举报
回复
这道笔试题已经存在很久,网上也没有解决方法。我也正在研究!我不是学算法的,但是我很感兴趣!
chenmingbo_2010 2010-10-27
  • 打赏
  • 举报
回复
同求解。 
加载更多回复(8)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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