- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在第一学期的学习中,作为我的一部分。科学作业 我必须使用 vector 实现一个简单的 HashMap ,但我在理解这个概念时遇到了一些问题。
首先我必须实现一个散列函数。为了避免冲突,我认为最好使用双重散列,如下所示:
do {
h = (k % m + j*(1+(k % (m-2)));
j++;
} while ( j % m != 0 );
其中 h 是要返回的哈希,k 是键,m 是 hash_map 的大小(和一个质数;它们都是 int 类型)。
这很简单,但是我需要能够在映射中插入或删除一对键和相应的值。
这两个函数的签名应该是 bool,所以我必须返回 true 或 flase,我猜我应该在 vector 中位置 h 没有元素时返回 true。 (但我不知道为什么 remove 也应该是 bool)。
我的问题是当插入函数返回 false 时该怎么办(即当位置 h 上已经保存了一个键值对时 - 我将其实现为名为 find 的函数)。我显然可以通过简单地增加 j 将它移动到下一个空闲位置,但是我的哈希函数计算的哈希不会再告诉我们某个 key 保存在哪个位置,导致删除函数的错误行为。
网上有没有很好的例子,不使用预定义的 STD 方法? (我的谷歌在过去几天表现得很奇怪,只用本地语言给我返回无用的点击)
最佳答案
我被告知要将我的评论移至答案,所以就在这里。我假设您的 get 方法采用您正在寻找参数的值。
所以我们要做的是一个称为线性探测的过程。
当我们插入值时,我们会像往常一样对其进行哈希处理,假设我们的哈希值为 4
[x,x,x,,,x,x]
如我们所见,我们可以简单地将它插入:
[x,x,x,x,,x,x]
然而,如果在插入时 4 被占用,我们将简单地移动到下一个空槽
[x,x,x,**x**,x,,x,x]
在线性探测中,如果我们到达终点,我们将循环回到起点,直到找到一个插槽。你不应该用完空间,因为你正在使用一个 vector ,它可以在它开始接近满容量时分配额外的空间
这会在您搜索时引起问题,因为 4 处的值可能不再是 4(在本例中为 5)。为了解决这个问题,我们做了一些修改。请注意,只要负载平衡低于 1,插入和检索的运行时间复杂度仍然为 O(1)。
在我们的 get 方法中,我们不是返回数组中 4 处的值,而是开始寻找 4 处的值,如果它在那里我们可以返回它。如果不是,我们查看 5 处的值,依此类推,直到找到该值。
在伪代码中新的东西看起来像这样
bool insert(value){
h = hash(value);
while(node[h] != null){
h++;
if( h = node.length){
h = 0;
}
}
node[h] = value;
return true;
}
得到
get(value){
h = hash(value);
roundTrip = 0; //used to see if we keep going round the hashmap
while(true){
if(node[h] == value)
return node[h];
h++;
if( h = node.length){
h = 0;
roundTrip++;
}
if(roundTrip > 1){ //we can't find it after going round list once
return -1;
}
}
}
关于c++ - C++ 中带 vector 的简单 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470816/
运行 PostgreSQL(7.4 和 8.x),我认为这是可行的,但现在我遇到了错误。 我可以单独运行查询,它工作得很好,但如果我使用 UNION 或 UNION ALL,它会抛出错误。 这个错误:
我试图为我的应用程序创建一个导航,使用抽屉导航我的 fragment 之一(HomeFragment)有一个 ViewPager,可容纳 3 个 fragment (Bundy Clock、Annou
以我目前正在开发的应用为例: - 它有一个包含多个项目的抽屉导航;现在有两个项目让我感兴趣,我将它们称为 X 和 Y。 X 和 Y 都在单击时显示包含 x 元素或 y 元素列表的 fragment 选
我有一个形状为 (370,275,210) 的 NumPy 数组,我想将其重新整形为 (275,210,370)。我将如何在 Python 中实现这一点? 370是波段数,275是行数,210是图像包
我们如何与被子 UIViewController 阻止的父 UIViewController(具有按钮)交互。显然,触摸事件不会通过子 Nib 。 (启用用户交互) 注意:我正在加载默认和自定义 NI
我是 Jpa 新手,我想执行过程 我的代码如下 private static final String PERSISTENCE_UNIT_NAME = "todos"; private static
与安装了 LAMP 的 GCE 相比,选择与 Google Cloud SQL 链接的 GCE 实例有哪些优势? 我确定 GCE 是可扩展的,但是安装在其上的 mysql 数据库的可扩展性如何? 使用
这个问题在这里已经有了答案: Value receiver vs. pointer receiver (3 个答案) 关闭 3 年前。 我刚接触 golang。只是想了解为 Calc 类型声明的两种
我不小心按了一个快捷键,一个非常漂亮的断线出现在日期上。 有点像 # 23 Jun 2010 -------------------- 有人知道有问题的快捷方式吗?? (我在 mac 上工作!) 在
我正在Scala中编写正则表达式 val regex = "^foo.*$".r 这很好,但是如果我想做 var x = "foo" val regex = s"""^$x.*$""".r 现在我们有
以下 XML 文档在技术上是否相同? James Dean 19 和: James Dean 19 最佳答案 这两个文档在语义上是相同的。在 X
我在对数据帧列表运行稳健的线性回归模型(使用 MASS 库中的 rlm)时遇到问题。 可重现的示例: var1 <- c(1:100) var2 <- var1*var1 df1 <- data.f
好的,我有一个自定义数字键盘,可以在标签(numberField)中将数字显示为 0.00,现在我需要它显示 $0.00。 NSString *digit = sender.currentTitle;
在基于文档的应用程序中,使用 XIB 文件,创建新窗口时其行为是: 根据最后一个事件的位置进行定位和调整大小 window 。 如果最后一个事件窗口仍然可见,则新窗口 窗口应该是级联的,这样它就不会直
我想使用参数进行查询,如下所示: SELECT * FROM MATABLE WHERE MT_ID IN (368134, 181956) 所以我考虑一下 SELECT * FROM MATABLE
我遇到一些性能问题。 我有一个大约有 200 万行的表。 CREATE TABLE [dbo].[M8]( [M8_ID] [int] IDENTITY(1,1) NOT NULL,
我在 jquery 中的按键功能遇到问题。我不知道为什么按键功能不起作用。我已经使用了正确的 key 代码。在我的函数中有 2 个代码,其中包含 2 个事件键,按一个键表示 (+) 代码 107 和(
我想显示音频波形,我得到了此代码,它需要.raw音频输入并显示音频波形,但是当我放入.3gp,.mp3音频时,我得到白噪声,有人可以帮助我如何使其按需与.3gp一起使用使用.3gp音频运行它。 Inp
我无法让 stristr 函数返回真值,我相信这是因为我的搜索中有一个 $ 字符。 当我这样做时: var_dump($nopricecart); 完整的 $nopricecart 值是 $0 ,我得
如果我有这样的循环: for(int i=0;i O(n) 次。所以do some执行了O(n)次。如果做某事是线性时间,那么代码片段的复杂度是O(n^2)。 关于algorithm - 带 If 语
我是一名优秀的程序员,十分优秀!