проверить дубликат в хеш-таблице - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь прочитать файл, каждая строка будет меньше 30, и из тысяч будет 20 уникальных последовательностей. Мы подсчитываем, сколько раз уникальности появляются в хеш-таблице. У меня проблемы с обработкой столкновений. Я инициализирую все значения char [] в «0», однако, если (protiens [key] .protien == «0») не работает, чтобы проверить, имеет ли это место в структуре значение «0» или один из моих протианов, который всегда "ABCDJ ..." более 10 и менее 30 символов. Так что я решил, что инициализация всего «0» будет способом увидеть, положил ли я в структуру protien или нет.

Эта логическая ошибка в моем втором операторе if.

Это алгоритм, который мы должны использовать, а затем мой код.

While(there are proteins)
 Read in a protein
 Hash the initial index into the proteins table
 While(forever)
   If(found key in table)
    Increment count
    Break;
   If(found empty spot in table)
    Copy key into table
    Increment count
    Break;
   Increment index; // collision! Try the next spot!

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

//struct to hold data and count
struct arrayelement 
{
  char protien[30] {"0"};
  int count;
};
arrayelement protiens[40];

//hash function A=65 ascii so 65-65=0 lookup table = A=0,B=1... 
//h(key) = ( first_letter_of_key + (2 * last_letter_of_key) ) % 40

int getHashKey(char firstLetter, char lastLetter)
{
   return ((int(firstLetter) - 65) + (2 * (int(lastLetter) - 65))) % 40;
}


int main()
{
   fstream file;
   string filename;
   char word[30];
   int key;

   filename = "proteins.txt";

    //open file
    file.open(filename.c_str());

    //while not eof
    while (file >> word)
    {
       //get key
       key = getHashKey(word[0], word[strlen(word)-1]);

        //loop "forever" no difference if i use 1 or 10000000 besisdes run time????
    for (int j = 0; j < 1; j++)
    {
        //if found key in table
        if (protiens[key].protien == word)
        {
            protiens[key].count++;
            break;
        }

        //if found empty spot in table
        //if(protiens[key].protien == "0") i intialized all protiens to "0" why would this not work for 
        //checking if i put a protien there already or not
        else
        {
            strcpy_s(protiens[key].protien, word);
            protiens[key].count++;
            break;
        }

        //collison incrment key
        key = getHashKey(word[0], word[strlen(word) - 1]) + 1;

    }

}
//print array of uniques with counts
for (int j = 0; j < 40; j++)
{
    cout << j << "\t" << protiens[j].protien << "\t" << protiens[j].count << endl;
}

}

1 Ответ

0 голосов
/ 10 ноября 2018
    //if(protiens[key].protien == "0") i intialized all protiens to "0" why would this not work for 
    //checking if i put a protien there already or not

Поскольку "0" - это константа, а protiens[key].protien - указатель на переменную, они не могут быть равны.

Представь, если бы они были равны. Это будет означать, что protients[key].protien[0]='Q'; будет точно таким же, как "0"[0]='Q';. Но первое имеет смысл, меняя переменную. И последний безумен, изменяя константу.

Я не знаю, почему вы используете массивы символов таким образом, когда у вас есть std::string. Но если вы настаиваете на этом, используйте strcmp для сравнения строк. Сравнение указателей с символами на равенство показывает, равны ли два указателя, а не указывают ли они на идентичные строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...