编程挑战:查询

题目

描述

现有数据如下:

K1-1-A-X0001=/common/gom/r00/xml/gom0101.xml
K3-2-B-W4565=/common/gom/r00/xml/gom0404.xml
K4-1-B-K0090=/common/gom/r00/xml/gom0403.xml
K2-3-A-W0004=/common/gom/r00/xml/gom0103.xml
...
...

其中第一列是ID,不重复;第二列是地址。数据供10万条。
请设计数据结构和算法,提供查询服务。比如:输入K4-1-B-K0090得到对应的地址/common/gom/r00/xml/gom0403.xml。

目标

查询最快、占用内存最少。

要求

不使用关系型数据库;使用文件系统进行存储;编程语言不限。

方案及代码

我把所有的代码放在了Github上:
https://github.com/longjingjun/Programming_Challenge_Query
使用Eclipse打开此项目。

方案1

使用Java里的Property文件存储数据,使用Java里的Properties类读取数据。
- FileBuilder.java:用来生成10万条数据
- Finder.java:查询代码实现

方案2

使用Mongo DB存储数据,然后使用Mongo DB的接口查询。
- MongoDBBuilder.java:用来向MongoDB插入10万条数据
- MongoDBFinder.java:查询代码实现。
注:运行此代码需要安装Mongo DB。请从这里下载安装包:
http://www.mongodb.org/

方案3

使用随机文件,第一行放数据的总数,后边按照从小到大的顺序存储数据。查询是使用折半查找算法进行查询。
- RamdomFileBuilder.java:按照设计生成10万条数据并保存到文件中。
- RamdomFinder.java:查询代码实现。

方案4

使用B-Tree,实现查询。这种方案我手头没有代码。

测试和结论

10万条数据,前三种方法的测试结果如下:

实现方案测试轮测试结果 (毫秒)
  12345678
normal prop - 11274265248289295265278218
 2273275270273265286280210
 3265262292270274280247203
normal prop - 21133136135132133139156138
 2145148136135141134135137
 3134136136139129142143139
MongoDB1122随着数据增多,查询的时间随着增长。
 2127       
 3115       
Random File11       
 22       
 31       

专门针对B-Tree实现和随机文件方案进行了另一轮的测试,测试数据为100万条。测试结果如下:

100 万条数据
14710
B-Tree121319353
1252910552
119309649
随机文件1322
2221
1221

根据测试结果,最快的方案是使用随机文件。同时这种方案有一个限制:每一行存储的数据是定长的,如何合理地设计每一行数据大小是一个很重要的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值