2 votes

Méthode pour arriver au milieu du fichier pour la recherche binaire

Je suis en train de faire un travail où on m'a donné un programme qui lit un fichier de données et sort les données dans un tableau d'octets, où les 4 premiers octets du tableau vous disent combien de noms de personnes il a (le fichier de données contient). Suit le reste du tableau qui contient les chaînes de caractères des noms des personnes. Ce tableau est pointé par un const void * foo;

Par exemple, les 4 premiers octets indiquent qu'il y a 5 noms stockés dans le tableau, et les 4 octets suivants vous indiquent l'adresse du nom de la personne. Le nom de la personne est stocké dans le tableau

int num = ((int*)foo)[0];
const int ppl1 = ((int*)foo)[1];
string name = ((char*)foo)+ppl1;

donc num vous dira qu'il y a 5 noms dans le tableau et ppl1 vous indiquerait la position du tableau où vous pouvez trouver le prénom et le nom recueille le nom de la personne située à cet emplacement du tableau.

En gros, on me donne un nom à rechercher dans le tableau, et je voulais utiliser la recherche binaire pour le faire. Je ne connais pas de moyen de trouver le milieu du fichier, pouvez-vous me donner quelques indications ?

merci =]

EDIT : j'ai donc créé ceci, mais il y a des défauts et ne fonctionne que dans un seul cas (lors de la recherche de la première entrée). Je ne sais pas pourquoi...

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

1voto

Anders Abel Points 36203

Vous connaissez le nombre d'éléments et la structure de données vous permet d'effectuer un accès aléatoire à n'importe quel élément :

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

1voto

neodelphi Points 1449

Les fonctions seekg y tellg des flux de fichiers C++ vous permettra de naviguer dans le fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X