【发布时间】:2011-10-21 10:36:04
【问题描述】:
我正在做一个作业,我得到了一个程序,该程序读取数据文件并将数据吐出到一个字节数组中,其中数组的前 4 个字节告诉你它有多少人的名字(数据文件包含)。在包含人名字符串的数组的其余部分之后。该数组由 const void * foo; 指向
例如,前 4 个字节表示数组中存储了 5 个姓名,接下来的 4 个字节告诉您该人姓名的地址。人名存储在数组中
int num = ((int*)foo)[0];
const int ppl1 = ((int*)foo)[1];
string name = ((char*)foo)+ppl1;
所以num 会告诉你数组中有 5 个名字,ppl1 会告诉你数组的位置,你可以在其中找到第一个名字,而 name 收集位于数组该位置的人的名字.
差不多,给了我一个要在数组中搜索的名字,我想用二分搜索来做。我不知道找到文件中间的方法,你们能给我一些指点吗?
干杯 =]
编辑:所以我创建了这个,但它会出现故障并且仅适用于一种情况(在搜索第一个条目时)。不知道为什么...
int first = 0;
int num = ((int*)foo)[0];
int last = num;
while (first <= last) {
int middle = first+last/2;
int offset = ((int*)foo)[middle];
string name = ((char*)foo)+offset;
if (person < name) {
last = middle-1;
} else if (person > name) {
first = middle+1;
} else {
break;
}
【问题讨论】:
-
二分查找需要对数据进行排序。你是这种情况吗?
-
是的,数据已排序(所有名称均已排序)
-
磁盘在顺序访问方面比随机访问要好得多。基本单位是扇区,甚至是扇区簇。你确定二进制搜索是有保证的。如果你真的有足够的数据吞下内存中的所有内容不是一个有效的选择,那么寻找 B-Trees 以获得更适合该任务的数据结构。
标签: c++ search pointers binary variable-assignment