最后50分,请教一个算法

pwtitle 2006-08-03 12:56:13
一个文本文件记录的格式如下:
1 5
6 10
11 11
15 15
17 25
m n
.....
规律为前一个数字m<=后一个数字n,该数据量非常大,估计有100W条。
现在的情况是有一个任意数字x,要求判断他落在第几个m,n区间,并返回文件所在行数。
该应用为web应用,且同时请求量非常大,假设为同时1000次查询。(每次x都不一样)。那么请问各位高手,有什么算法或方法来解决这个问题呢?
...全文
118 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
颓废的老猫 2006-08-03
  • 打赏
  • 举报
回复
学习

不过我觉得用数据库可能更方便一点
laochake 2006-08-03
  • 打赏
  • 举报
回复
是否有当前行的m大于等于前一行的n,如果成立的话,可以考虑分割成多个文件存储
chszs 2006-08-03
  • 打赏
  • 举报
回复
笔误,“32块,”见上面。
chszs 2006-08-03
  • 打赏
  • 举报
回复
顺序查找和二分查找都不好,因为“同时请求量非常大”,我觉得可以采用分块查找。
把m分成34块,因为你“假设为同时1000次查询”32*32=1024,只需要两级的查找,每级又可采用二分查找,这样速度就会很快了。
zeroleonhart 2006-08-03
  • 打赏
  • 举报
回复
I feel db is faster than file, too.
ckc 2006-08-03
  • 打赏
  • 举报
回复
数据有问题吧,16怎么判断啊
楼上的说的对,你应该把它放到数据库中
直接一条语句就查出来了
select count(*) from table where 开始区间<数据
表中只需要一个字段就可以了,结果就是序号
有了索引的话速度很快的
xuzuning 2006-08-03
  • 打赏
  • 举报
回复
1、处理这类问题首先考虑的是建立索引文件。因为顺序查找的平均查找次数是n/2,最坏的情况下是n
而二分查找的平均查找次数是log2(n),但是二分查找需要先对数据排序。因此,建立索引文件就有必要了
2、如何建立索引文件?
假定数据文件已存在并且只读,并且已经是排序过的。旧和楼主示例的那样。
那么只要用fgets函数遍历一次数据文件并记录每次fgets前的位置(用ftell),并以定长方式保存到索引文件即可。检索时先读取索引中的数据文件偏移,再根据偏移读取数据项,根据判断结果决定如何取下一个索引
假定数据文件非只读或未经排序,那么就稍微麻烦点。一般用树结构组织索引。但是要注意,当向排序数添加已排序数据时,会造成数不均衡。最坏的情况将变为顺序查找。所以需要提供使数均衡的算法
keaizhong 2006-08-03
  • 打赏
  • 举报
回复
文本文件?那有点儿夸张哟。。每次都要打开这个文件,势必会损耗很多的资源。
不如导入MYSQL里,再加上索引,查寻的时候会压力小点。而且语句也简单,方便维护。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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