PinkPrint Ответов: 1

Линейное зондирование(один шаг вниз)


Мой вопрос таков:
Откройте файл в главном меню. В вашем файле есть одно слово в каждой строке. Я должен прочитать файл, суммирующий значения ascii каждого слова, сумма размера хэша будет моим ключом, и я должен позаботиться о столкновениях с линейным зондированием. для линейного зондирования мне нужно создать класс линейного зондирования. У меня есть два вопроса:

а) я не понимаю этого сообщения об ошибке.
"неопределенная ссылка на' LinearProbing:: HashFunction(std:: string, int, int)"
Я не понимаю, почему он так говорит.

б)правильно ли я сделал метод вставки? Моя логика заключается в том, что если место данного ключа пусто, вставьте слово в этот ключ или индекс. Если не пусто, спуститесь на одну ступеньку вниз и вставьте туда слово.

Любой вклад в этот вопрос очень помог бы мне!! и пожалуйста, никаких саркастических замечаний! Спасибо!!!

Что я уже пробовал:

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;
//Global variables
int HASHSIZE=100;
string HashTable[100];

class LinearProbing{

int HashFunction(string,int,int);
void InsertWord(string);
int SearchWord(string);
};


int main(){
string word;
string line;
fstream file;
int index;

//User Input
cout<<"Enter a word you would like to search: ";
cin>>word;

//Reading File
file.open("text.txt");
while(file){                      //http://www.cplusplus.com/forum/beginner/146982/
 getline(file,line);
 }
file.close();

}

int HashFunction(string key, int index,int HASHSIZE){
int sum=0;
for(int i=0;i<index;i++){
    sum=sum+key[i];
}
return sum%HASHSIZE;
}

void LinearProbing::InsertWord(string word){
int key= LinearProbing::HashFunction(word,word.length(),HASHSIZE);
for (int i = 0; i < HASHSIZE; i++){
        if (HashTable[key].empty()==true){//if the spot is empty, fill the space with the word
            HashTable[key] = word;
            return;
        }
        else{
            HashTable[key+1] = word;
        }
    }
}

int LinearProbing::SearchWord(string word){
int key=LinearProbing::HashFunction(word,word.length(),HASHSIZE);
for (int i = 0; i < HASHSIZE; i++){
        if (HashTable[(key + i)%HASHSIZE] == word){
            cout<<"The word you're looking for is in "<<key+i<<"position";
        }
    }
    cout << "Value not contained in table";
    return 0;
}

[no name]

Это означает, что он не может найти функцию, потому что вы пропустили LinearProbing:: при реализации функции.

PinkPrint

Но я использовал LinearProbing:: в обоих случаях, когда мне нужно было вызвать хэш-функцию??

void LinearProbing:: InsertWord(строковое слово){
int key= LinearProbing:: HashFunction(word, word.length(),HASHSIZE);

int LinearProbing:: SearchWord(строковое слово){
int key=LinearProbing:: HashFunction(word, word.length(),HASHSIZE);

jeron1

Вроде не политически правильно сказал,

от

int HashFunction(string key, int index,int HASHSIZE){... 


к
int LinearProbing::HashFunction(string key, int index,int HASHSIZE){...


а вы пробовали?

PinkPrint

О, теперь я понимаю. Большое спасибо!!

1 Ответов

Рейтинг:
1

Arthur V. Ratz

Наверное, вот так:

int LinearProbing::SearchWord(string word){
LinearProbing lp;
int key=lp.HashFunction(word,word.length(),HASHSIZE);
for (int i = 0; i < HASHSIZE; i++){
        if (HashTable[(key + i)%HASHSIZE] == word){
            cout<<"The word you're looking for is in "<<key+i&lt;&lt;"position";&lt;!-- newline="" --="">        }
    }
    cout << "Value not contained in table";
    return 0;
}


Используйте объекты.