Построить набор с использованием hash-map на C ++ - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь построить набор, используя hash-map, но система тестирования отправляет мне неправильные ответы. У меня нет доступа к тестам, но на моих тестах код работает нормально. У меня нет идей для новых тестов, может быть, у вас есть какие-нибудь? Это мой код:

#include <iostream>
#include <fstream>
using namespace std;

int h1(int number) {
    number %= 1000003;
    return abs(number);
}

int h2(int number) {
    number = number % 999991 + 12;
    return abs(number);
}

int Insert(int * Hash_table,bool * Deleted,int& number) {
    int x = h1(number);
    int y = h2(number);
    for(int i = 0; i < 1000003;i++) {
        if(Hash_table[x] == NULL || Deleted[x]) {
            Hash_table[x] = number;
            Deleted[x] = false;
            break;
        }
        x = (x + i * y) % 1000003;
    }
}

string Exists(int * Hash_table,bool * Deleted,int& number) {
    int x = h1(number);
    int y = h2(number);
    for(int i = 0; i < 1000003;i++) {
        if(Hash_table[x] == 0 && number == 0 && !Deleted[x])
            return "true\n";
        if(Hash_table[x] != NULL) 
            if(Hash_table[x] == number && !Deleted[x] ) {
                return "true\n";
            }
        if(Hash_table[x] == NULL || Deleted[x])
            return "false\n";

        x = (x + i * y) % 1000003;

    }

}
int Delete(int * Hash_table,bool * Deleted,int& number){
    int x = h1(number);
    int y = h2(number);
    for(int i = 0; i < 1000003;i++){
        if(Hash_table[x] == 0 && number == 0){
            Deleted[x] = true;
            break;
        }
        if(Hash_table[x] != NULL) {
            if(Hash_table[x] == number) {
                Deleted[x] = true;
                break;
            }

         x = (x + i * y) % 1000003;
        }
        else
            return 0;
    }
}

int main () {
    int Hash_table[1000003];
    bool Deleted[1000003];
    ifstream input("set.in");
    ofstream output("set.out");
    string command;
    int number;
    while(true) {
        input >> command;
        if(input.eof())
            break;
        if(command == "insert") {
            input >> number;
            Insert(Hash_table,Deleted,number);
        }
        if(command == "delete") {
            input >> number;
            Delete(Hash_table,Deleted,number);
        }
        if(command == "exists") {
            input >> number;
            output << Exists(Hash_table,Deleted,number);
        }
    }
}

Мне нужно реализовать такие команды, как «ввод», «существует» и «удалить». Я думаю, что логика кода хороша, но я не уверен насчет хеш-функций. Обновлено: добавлены операторы if для 0 и теперь h1 и h2 возвращают абсолютные значения. Но сейчас у меня проблемы в 4-м тесте.

1 Ответ

0 голосов
/ 11 ноября 2018
int h1(int number) {
    number %= 1000003;
    return number;
}

int h2(int number) {
    number = number % 99991 + 1;
    return number;
}

Функция Abouve выдаст отрицательный результат для отрицательного числа. Это приведет к ошибке времени выполнения для Hash_table[x]. Смотрите ниже:

int h1(int number) {
    number = (number%1000003 + 1000003) % 1000003;
    return number;
}

int h2(int number) {
    number = (number % 99991 + 99991) % 99991 + 1;
    return number;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...