线性探测代码

时间:2017-03-28 06:57:18

标签: c++

我需要能够使用线性探测执行以下操作。我相信上面的代码应该能够完成这项工作但不能正确编译。任何建议将不胜感激。

x[0]x[7]的In和数组,n = 8,插入3,11,15,23和31。

#include <iostream>
#include <string>

using namespace std;

class Hashmap {

private:
int* table;
int used;
int limit;
int* hist;

void grow() {
    cout << "resizing" << endl;
    limit = limit*2;
    return;

}

public:
Hashmap(int initialSize) : table(new int[initialSize]), limit(initialSize),     used(0), hist(new int[0]) {
        int i;
    for (i = 1; i <= initialSize; i *= 2){
        ;
    }

    table =  new int[i];
    used = 0;
    limit = i / 2;
    hist = new int[60];
}



~Hashmap() {
    delete [] table;
}


int hash(int v) {
return v & (sizeof(table) - 1);
}

void add(int v) {
used++;
if (used > limit)
    grow();
int i = hash(v);
int count = 0;
while (table[i] != 0) {
    i = (i+1) % sizeof(table);
    count++;
    if (count >= 60)
        count = 59;
    hist[count]++;
}
table[i] = v;

}

bool contains(int v) {
    int i = hash(v);
    while (table[i] != 0) {
        if (table[i] == v)
            return true;
        else
            i = (i + 1) % sizeof(table);
    }

}

void output() {
table[0] = 0;
cout << table[0];
for (int i = 0; i < 8; i++)
cout << "," << table[i] << endl;

}
};


int main() {

Hashmap m(8);
int n;
for (int i = 3; i < 32; i = i + n){
    if (i == 11) {
    n = 4;
    m.add(i);
    }
    else
    n = 8;
    m.add(i);
}

m.output();



}

2 个答案:

答案 0 :(得分:0)

首先,您有一个编译警告,并带有明确的信息:

  

main.cpp:71:3:警告:控件可能会达到非空函数的结束[-Wreturn-type]

bool contains(int v)应返回一个布尔值,但在函数末尾没有任何布尔值。

如果您尝试使用这些标志进行编译,那么您还有另一个问题:-Wall -Wextra -Werror

  

main.cpp:22:59:错误:字段'limit'将在字段后初始化   'used'[-Werror,-Wreorder]

此消息非常清楚,您对HashMap类的初始化顺序错误,您需要在used之前初始化limit,因为您的变量是按此顺序声明的。

  

私人:

int  *table;
int  used;
int  limit;
int  *hist;

因此:

  

Hashmap(int initialSize)

: table(new int[initialSize])
, used(0)
, limit(initialSize)
, hist(new int[0])

编译器是你的朋友,学会理解它的咆哮,它将帮助你理解你的代码和缺陷。

PS: 在代码中使用裸指针是一种不好的做法,它非常C风格。

尝试使用C ++功能,例如vector。

答案 1 :(得分:0)

首先,如果您想使用sizeof(table)获取表格的元素数量(大小),您将无法获得它。
您将表定义为int *,因此sizeof将为您提供构成指针的字节数。

如果您坚持使用要在运行时分配的C数组,则需要将其大小保持为单独的变量。

(顺便说一下,如果你要像固定大小的数组int table[5]那样初始化你的表格,你就能得到这样的长度:sizeof(table)/sizeof(int)。但你不想要这可以在这里,或者你不能拥有动态哈希表。)

其次,即使您使用当前代码获取表大小,如果数组不包含至少一个0条目且v不存在,您将永远不会退出以下循环,因为您继续在其上循环迭代(使用模数表大小)

bool contains(int v) {
    int i = hash(v);
    while (table[i] != 0) {
        if (table[i] == v)
            return true;
        else
            i = (i + 1) % sizeof(table);
    }

}

至少,您应该在完整回合后退出,返回false。