怎样实现从一个数据有序的文件中比较快速的查找?
33 个解决方案
文件中怎样用关键字,又怎样进行折半?用语言描述一下吧
折半查找:
折半查找(binary search)也称二分法查找,使用于顺序存储结构并且数据元素已经按照关键字大小排序的线性表。
基本思想是这样的:
假定线性表的数据元素是按照升序排列的,对于给定值k,从线性表的中间位置开始比较,如果当前数据元素的关键字等于k,则查找成功。否则,若k小于当前数据元素的关键字,则在线性表的前半部继续查找;反之,则在线性表的后半部分继续查找。依次重复进行,直至获得查找成功或不成功的结果。
建议楼主好好打基础,好好看看java数据结构
大哥,我当然知道折半的算法,我要问的是怎么在文件中实现!!
仔细说一下,我的文件的数据项有两部分组成,一项是key,整型;另一项是数据,也是整型。文件只进行读操作,怎么二分?对文件操作好像没有指针。
如果每个记录的长度相同,尝试使用mark() reset() 方法来定位来二分法的上下界
可以第一次遍历时建立一个索引
把这个索引保存起来好了
以后直接查找这个索引
你可以使用java.io.RandomAccessFile来做折半
建索引只是我的一个思路
如果有多个文件
在读入文件时取得它的key
然后建立一个链表
每个节点的内容如下
class node {
int key,//该文件的关键字值
String fileName;//该文件的名字
}
然后每个文件名对应它的关键字值好了
不知能否解决你的问题
现在问题是文件不是从头读起,而是从中间读,怎么办?
建议对文件分段,检索时先确认待查记录在哪一段,之后再把该段全部读到内存,然后二分查找;
如果不想分段可以用skip,不过文档里说性能不好,不推荐(这个函数是顺序读取文件到字节数组,之后不做任何处理扔掉),目前J2ME里没有可以随机移动文件指针的函数。
例:分段文件为0.dat,1.dat,2.dat,各文件首记录key分别为11,22,33
则可以开数组
int key[3]={11,22,33}
String fileName[3]={"0.dat","1.dat","2.dat"}
如果待查key为15,则通过对key[]的查找知道它在文件fileName[0]中,将fileName[0]整个读入内存,之后做二分查找。
文件分段可以写一个拆分器,好解决。
我的文件有7000个纪录,每个纪录有两个整数构成,拆多少个文件合适?
dataoutputstream.read(byte[],off,len)这个函数可以进行跳跃读取吗?
我不知道怎样在文件中跳跃查询,文件不是没有指针么?
你既然有KEY,那么就用KEY查找。
用把你的文件内容分批读到map结构数组中,比如数组大小是500,每读一次,用KEY去找对应的值。找到了就停止,没有就再读500个。
至于IO和MAP的用法,你自己看书把,一两句话说不清。
key value
1 109
2 290
3 3837
4 10
5 4748
楼主的文件是这样的结构吗?
有序排列的是key还是value啊?
DataOutputStream.read(byte[],off,len)可以实现从指定的地方读取。
如果这真的如楼主所说的那样的数据结构的话,
使用这个方法是一个很好的选择。