【问题标题】:Method to get to the middle of the file for Binary Search二分查找到文件中间的方法
【发布时间】: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


【解决方案1】:

您知道元素的数量,并且数据结构允许您对任何元素进行随机访问:

const int middleOffset = ((int*)foo)[num/2];
string middleName = ((char*)foo)+middleOffset;

【讨论】:

  • 但这会让 middle 总是一个 const 吗?
  • 中间没有变化,直到数据重新加载,所以我把它设置为 const,但如果你希望能够在搜索算法中重新分配它,请跳过const。跨度>
【解决方案2】:

C++ 文件流的seekgtellg 函数将允许您浏览文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2019-11-19
    相关资源
    最近更新 更多