Способ попасть в середину файла для бинарного поиска - PullRequest
2 голосов
/ 06 августа 2011

Я выполняю задание, в котором мне дана программа, которая читает файл данных и разбрасывает данные в массив байтов, где первые 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 собирает имя человека, находящегося в этом слоте массива.

Практически, мне дано имя для поиска в массиве, и я хотел использовать бинарный поиск для doit.Я не знаю, как найти середину файла, можете ли вы, ребята, дать мне несколько советов?

cheers =]

РЕДАКТИРОВАТЬ: так что я создал это, но это сегнеисправности и работает только для одного случая (при поиске первой записи).Понятия не имею, почему ...

    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;
        }

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Функции seekg и tellg потоков файлов C ++ позволят вам перемещаться по файлу.

1 голос
/ 06 августа 2011

Вы знаете количество элементов, а структура данных позволяет вам делать произвольный доступ к любому элементу:

const int middleOffset = ((int*)foo)[num/2];
string middleName = ((char*)foo)+middleOffset;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...