当前位置: 首页 > 知识库问答 >
问题:

在leetcode中设计哈希集,代码给出运行时错误

万知
2023-03-14

我正在试图解决一个关于HashSet设计的问题。

在不使用任何内置哈希表库的情况下设计哈希集。

具体来说,您的设计应包括以下两个功能

add(value):在HashSet中插入一个值
contains(value):返回哈希集中是否存在该值。

移除(值):移除哈希集中的值。如果该值在哈希集中不存在,则不执行任何操作。

例:

MyHashSet hashSet=新建MyHashSet();哈希集。增加(1)
哈希集。增加(2);哈希集。包含(1);//返回真哈希集。包含(3);//返回false(未找到)哈希集。增加(2)
哈希集。包含(2);//返回真哈希集。移除(2)
哈希集。包含(2);//返回false(已删除)

注:

所有值都将在[1000000]范围内。操作的数量将在[1,10000]范围内。请不要使用内置的HashSet库。

以下代码在本地运行良好,但在提交时失败,并给出了错误,

运行时错误消息:“int”类型的引用绑定到未对齐的地址0x736c61662c657572,需要4字节对齐

上次执行的输入:[MyHashSet, add,删除,添加,包含,添加,删除,添加,添加,添加,添加,添加"] [[],[6],[4],[17],[14],[14],[17],[14],[14],[18],[14]]]

class MyHashSet { public:
vector<vector<int>> setHash;
MyHashSet() {
    setHash.reserve(10000);
}

void add(int key) {
    int bucket = key % 10000;
    vector<int>::iterator it;
    it = find(setHash[bucket].begin(),setHash[bucket].end(),key);
    if(it == setHash[bucket].end()){
        setHash[bucket].push_back(key);
    }
}

void remove(int key) {
    int bucket = key % 10000;
    vector<int>::iterator it1;
    it1 = find(setHash[bucket].begin(),setHash[bucket].end(),key);
    if(it1 != setHash[bucket].end()){
        int index = distance(it1,setHash[bucket].begin());
        setHash[bucket].erase(setHash[bucket].begin()+index);
    }

}

/** Returns true if this set did not already contain the specified element */
bool contains(int key) {
    int bucket = key % 10000;
    vector<int>::iterator it2;
    it2 = find(setHash[bucket].begin(),setHash[bucket].end(),key);
        if(it2 != setHash[bucket].end()){
            return true;
        }

    return false;
}

};

我怀疑这是因为内存问题。但我还是无法理解,因为我还在学习c的基础知识。

共有1个答案

夏昌胤
2023-03-14

如果你的问题是如何修复你的实现,我会听从评论中的建议。

如果您希望了解C并以最佳方式解决问题,我会使用std::bitset。事实上,他们给了你定义的输入范围[11000000],这让我相信他们正在寻找类似的东西。

这可能属于内置哈希表库的范畴,因此这里是一个潜在的实现。

class MyHashSet {
public:
    void add(int key) {
        flags.set(key);
    }
    void remove(int key) {
        flags.reset(key);
    }
    bool contains(int key) const {
        return flags[key];
    }
private:
    bitset<1000000+1> flags;
};

在我的平台上,这需要约16kB(而10000个向量需要30kB)。它也不需要动态内存分配。

如果你认为这是离题或作弊,请提供LeetCode问题的标题/编号,这样我就可以使用他们的测试用例来编写你的代码草案。我现在也在研究哈希表,所以这将是一个双赢的局面。

 类似资料:
  • 我刚刚讨论了散列码的概念,遇到了一行:

  • 1. 数组中两个数的和为给定值 2. 判断数组是否含有重复元素 3. 最长和谐序列 4. 最长连续序列 哈希表使用 O(N) 空间复杂度存储数据,并且以 O(1) 时间复杂度求解问题。 Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组

  • 嗨,我想知道如果你有你要寻找的对象的Hashcode,是否可以直接访问HashSet的内容,有点像在HashMap中使用Hashcode作为键。 我想它可能会像这样工作: 谢谢 编辑:谢谢你的回答。好的,我知道我可能会稍微推动HashSet的契约,但是对于这个特定的项目,等式完全由hashcode决定,我确信每个hashcode/hashbucket只有一个对象。我非常不愿意使用HashMap的原

  • 我收到一个HTTP错误:运行sturts 2应用程序时出现503服务不可用错误。确切的误差是 HTTP错误:503访问/project\u 47/WEB-INF/classes/action/action\u-trial时出现问题。Java语言原因: 由Jetty提供支持:// 我的控制台如下所示: 在端口8080上启动预览服务器 模块:project_47(/project_47)

  • 在EJB中运行客户端代码时出错: 线程“Main thread”java中出现异常。lang.NoClassDefFoundError:weblogic上的weblogic/kernel/KernelStatus。jndi。环境(Environment.java:78)在weblogic。jndi。WLInitialContextFactory。javax上的getInitialContext(W