我正在试图解决一个关于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的基础知识。
如果你的问题是如何修复你的实现,我会听从评论中的建议。
如果您希望了解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问题的标题/编号,这样我就可以使用他们的测试用例来编写你的代码草案。我现在也在研究哈希表,所以这将是一个双赢的局面。
我刚刚讨论了散列码的概念,遇到了一行:
嗨,我想知道如果你有你要寻找的对象的Hashcode,是否可以直接访问HashSet的内容,有点像在HashMap中使用Hashcode作为键。 我想它可能会像这样工作: 谢谢 编辑:谢谢你的回答。好的,我知道我可能会稍微推动HashSet的契约,但是对于这个特定的项目,等式完全由hashcode决定,我确信每个hashcode/hashbucket只有一个对象。我非常不愿意使用HashMap的原
1. 数组中两个数的和为给定值 2. 判断数组是否含有重复元素 3. 最长和谐序列 4. 最长连续序列 哈希表使用 O(N) 空间复杂度存储数据,并且以 O(1) 时间复杂度求解问题。 Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组
我收到一个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