编程挑战:查询

题目

描述

现有数据如下:

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万条数据,前三种方法的测试结果如下:

实现方案 测试轮 测试结果
(毫秒)
    1 2 3 4 5 6 7 8
normal prop -
1
1 274 265 248 289 295 265 278 218
  2 273 275 270 273 265 286 280 210
  3 265 262 292 270 274 280 247 203
normal prop -
2
1 133 136 135 132 133 139 156 138
  2 145 148 136 135 141 134 135 137
  3 134 136 136 139 129 142 143 139
MongoDB 1 122 随着数据增多,查询的时间随着增长。
  2 127              
  3 115              
Random File 1 1              
  2 2              
  3 1              

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

100 万条数据
1 4 7 10
B-Tree 121 31 93 53
125 29 105 52
119 30 96 49
随机文件 1 3 2 2
2 2 2 1
1 2 2 1

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

时间: 2024-10-20 10:39:46

编程挑战:查询的相关文章

编程挑战--下拉菜单

最近有一个叫慕客网的学习平台,现在很火.课程后面一般都会留有一道小题目,用来检测小伙伴们的学习结果.我看到有一个课程还不错,后面也跟了很多回复,不过感觉代码质量都不高,这可能和课程定位有关,如果你有信心写的更好,不妨来挑战一下.有兴趣的同学可以参考下面的链接: 课程地址:http://www.imooc.com/code/3631 我把题目要求再贴一下: 编程挑战 小伙伴们,根据所学知识,实现下图所示的菜单效果,实现点击菜单中的向下三角展开菜单,点击页面空白处收起菜单,按下键盘上的向上.向下方向

Linux socket编程 DNS查询IP地址

本来是一次计算机网络的实验,但是还没有完全写好,DNS的响应请求报文的冗余信息太多了,不只有IP地址.所以这次的实验主要就是解析DNS报文.同时也需要正确的填充请求报文.如果代码有什么bug,欢迎指正啊.代码排版有点乱... 本文有以下内容 DNS报文的填充和解析 利用socket API传输信息 一.填充DNS请求报文 随便百度一下,就可以知道DNS报文的格式.所以这里只介绍如何填充DNS报文. 首先是填充报文首部: ? 1 2 3 4 5 6 7 8 9 /* 填充首部的格式大致相同,下面的

CSDN编程挑战——《高斯公式》

高斯公式 题目详情: 高斯在上小学时发明了等差数列求和公式:1+2+..+100=5050.现在问题在于给你一个正整数n,问你他可以表示为多少种连续正整数之和?(自身也算). 输入格式: 多组数据,每组数据一行,一个正整数n. 0<n<2000000000 输出格式: 每组数据一行,包含一个正整数,表示结果. 答题说明: 输入样例 5 120 输出样例: 2 4 解释: 5=2+3=5 120=1+2+...+15=22+23+24+25+26=39+40+41=120 初稿代码: /* 3:

编程挑战系统的输入和输出详细说明

在高校俱乐部线上编程挑战中,一道题目的所有测试数据是放在一个文本文件中,选手将一道题目的程序提交给评判系统运行,程序从该文件中读取测试数据,再把运行结果输出到另一个文本文件中.系统把输出文件与标准答案比对,来评判程序编写得正确与否. 本系统采用标准的输入输出,输入结束有文件末尾标识(EOF),这可以用于确定输入结束. 一.四种基本输入形式 1.      一组输入数据 示例:整数求和 描述 给定两个整数,求它们之和. 输入 两个整数A,B. 输出 两个整数的和. 样例输入 1 2 样例输出 3

编程挑战JavaScript进阶篇(慕课网题目)

编程挑战 现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居    200万内购五环三居 140万安家东三环    北京首现零首付楼盘 53万购东5环50平    京楼盘直降5000 中信府 公园楼王现房 家居: 40平出租屋大改造 美少女的混搭小窝     经典清新简欧爱家 90平老房焕发新生     新中式的酷色温情 66平撞色活泼家居     瓷砖就像选好老婆 卫生间烟道的设计 二手房: 通州豪华3

JavaScript进阶 - 第10章 编程挑战

10-1 编程挑战 现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居     200万内购五环三居 140万安家东三环     北京首现零首付楼盘 53万购东5环50平     京楼盘直降5000 中信府 公园楼王现房 家居: 40平出租屋大改造 美少女的混搭小窝      经典清新简欧爱家 90平老房焕发新生      新中式的酷色温情 66平撞色活泼家居      瓷砖就像选好老婆 卫生间烟道的设计

(csdn高校俱乐部编程挑战)2的补码

题目详情 在计算机中,整数是以2的补码的形式给出的. 给出整数A和B,假设计算机是32位机,求从A到B之间的所有二进制数中,一共用了多少个1. 输入格式: 多组数据,每组数据一行,由两个整数A,B, -2147483648<=A<=B<=2147483647 输出格式: 每组输出一行,从A到B使用的1的个数. 答题说明 输入样例 -2 0 0 0 0 1 输出样例: 63 0 1 刚开始觉得这个题灰常简单,可是代码写完提交上去挑战失败,看了半天也没搞懂问题出在哪里了~~ 我的理解是因为有

(csdn高校俱乐部编程挑战)绝对值最小

题目详情 给你一个数组A[n],请你计算出ans=min(|A[i]+A[j]|)(0<=i,j<n). 例如:A={1, 4, -3}, 则: |A[0] + A[0]| = |1 + 1| = 2. |A[0] + A[1]| = |1 + 4| = 5. |A[0] + A[2]| = |1 + (-3)| = 2. |A[1] + A[1]| = |4 + 4| = 8. |A[1] + A[2]| = |4 + (-3)| = 1. |A[2] + A[2]| = |(-3) + (

安卓权威编程-挑战练习 15章。

15.5 挑战练习:ShareCompat 第一个练习比较简单.Android支持库有个叫作 ShareCompat 的类,它有一个 IntentBuilder. ShareCompat.IntentBuilder 内部类.利用这个内部类创建用于发送消息按钮的 Intent 略微方 便一些. 因此,你要接受的挑战就是:在 mReportButton 的监听器中,改用 ShareCompat. IntentBuilder 来创建你的 Intent . 修改CrimeFragment中的mRepor