【问题标题】:Build set using hash-map on C++在 C++ 中使用 hashmap 构建集
【发布时间】:2018-11-10 20:19:39
【问题描述】:

我正在尝试使用哈希映射构建集合,但测试系统向我发送了错误的答案。我无权访问测试,但在我的测试代码中运行良好。我对新测试没有任何想法,也许你会有一些想法? 这是我的代码:

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

我必须实现诸如“输入”、“存在”和“删除”之类的命令。我认为代码逻辑很好,但我不确定哈希函数。 更新:为 0 添加 if 语句,现在 h1 和 h2 返回绝对值。 但是现在我在第四次测试中遇到了问题。

【问题讨论】:

  • 欢迎来到 Stack Overflow!与我们讨论您最终完成的各种本地测试。如果您还没有编写任何本地测试,我会从那里开始 - 当您可以看到程序正在做什么以及行为与您的预期有何不同时,调试事情要容易得多,而不是提交代码到黑盒测试框架,希望结果很好。
  • 好的,例如,代码对于这样的测试工作正常:插入 2 插入 5 插入 3 存在 2 存在 4 插入 2 删除 2 存在 2 输出:真假假
  • (1) int Hash_table[1000003]; 非常危险。栈小,寿命短,动态分配。 (2) 0 呢?是数字吗? insert 0 然后exists 0
  • (1) 我知道输入数字的数量限制(1000000),这就是我使用 const 值的原因。 (2) 是的,使用 0 我的代码不起作用,是因为 NULL 吗?如何在不使用 NULL 的情况下更改 if 运算符?
  • s/NULL/nullptr/

标签: c++ algorithm hashmap


【解决方案1】:
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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2016-10-28
    • 2011-11-12
    • 1970-01-01
    • 2011-12-10
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多