实现哈希表

2023-11-22

我正在尝试创建一个有效的查找表C.

我有一个整数作为键和一个可变长度char*作为值。

我看过uthash,但这需要固定长度char*价值。如果我把这个数字设得很大,那么我就使用了太多的内存。

struct my_struct {
    int key;
    char value[10];             
    UT_hash_handle hh;
};

有人有任何指点吗?任何见解都非常感激。


谢谢大家的回答。我已经和uthash并定义了我自己的自定义结构来容纳我的数据。


你首先必须考虑你的碰撞策略:

  1. 你会有多个哈希函数吗?
  2. 或者您必须在哈希表内使用容器吗?

我们选1。

然后你必须选择一个分布良好的哈希函数。例如,我们将选择

int hash_fun(int key, int try, int max) {
    return (key + try) % max;
}

如果您需要更好的东西,也许可以看看中平方法.

然后,您必须决定什么是哈希表。

struct hash_table {
    int max;
    int number_of_elements;
    struct my_struct **elements;
};

然后,我们必须定义如何插入和检索。

int hash_insert(struct my_struct *data, struct hash_table *hash_table) {
    int try, hash;
    if(hash_table->number_of_elements >= hash_table->max) {
        return 0; // FULL
    }
    for(try = 0; true; try++) {
        hash = hash_fun(data->key, try, hash_table->max);
        if(hash_table->elements[hash] == 0) { // empty cell
            hash_table->elements[hash] = data;
            hash_table->number_of_elements++;
            return 1;
        }
    }
    return 0;
}

struct my_struct *hash_retrieve(int key, struct hash_table *hash_table) {
    int try, hash;
    for(try = 0; true; try++) {
        hash = hash_fun(key, try, hash_table->max);
        if(hash_table->elements[hash] == 0) {
            return 0; // Nothing found
        }
        if(hash_table->elements[hash]->key == key) {
            return hash_table->elements[hash];
        }
    }
    return 0;
}

至少有一种删除方法:

int hash_delete(int key, struct hash_table *hash_table) {
    int try, hash;
    for(try = 0; true; try++) {
        hash = hash_fun(key, try, hash_table->max);
        if(hash_table->elements[hash] == 0) {
            return 0; // Nothing found
        }
        if(hash_table->elements[hash]->key == key) {
            hash_table->number_of_elements--;
            hash_table->elements[hash] = 0;
            return 1; // Success
        }
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现哈希表 的相关文章

  • 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接 [重复]

    这个问题在这里已经有答案了 可能的重复 使用扩展方法表示的嵌套 from LINQ 查询 https stackoverflow com questions 9115675 nested from linq query expressed
  • 双线性序列给出奇数结果

    我试图让我的表现技能 不存在 达到标准 但在将公式写入代码时遇到了问题 这是我试图将其引用为 转换 为代码的公式 考虑一个序列 u 其中 u 定义如下 号码u 0 1是第一个u 对于每个x in u then y 2 x 1 and z 3
  • C语言中的递归是如何工作的?

    我试图了解 C 中递归的工作原理 任何人都可以给我解释控制流吗 include
  • C++ 返回值、引用、const 引用

    你能向我解释一下返回值 值引用和值常量引用之间的区别吗 Value Vector2D operator const Vector2D vector this gt x vector x this gt y vector y return t
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • 如何在线程创建和退出时调用函数?

    include
  • 使用 JSON 格式正确配置 NLog 到 IHostBuilder

    我有以下代码 应该接受 NLog 的 JSON appsettings 配置 然后使用它来创建 NLog LogFactory 这个 NLog 工厂应该被传递到 MyService 类中 以便在那里创建一个记录器 class Program
  • 代码块 power 函数在 c 中不起作用

    我正在使用代码块来学习c 我的代码是 include
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 在不使用 ncurses 的情况下用 C/C++ 编写“真正的”交互式终端程序,例如 vim、htop...

    不 我不想使用ncurses 因为我想了解如何 终端可以工作 并且我自己编程也很有趣 没有 必须是可移植的 它必须只能在基于 linux xterm 的终端仿真器上工作 我想做的是编写一个交互式终端应用程序 例如 htop 和 vim 我的
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • 带双重检查锁的单例设计模式

    假设您有以下代码 1 为什么我们使用双重检查锁 为什么单锁不够好 请提供详细的例子 2 这种实施方式的主要缺点是什么 我该如何证明呢 Thanks public sealed class SomeSingleton5 private sta
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 按值返回的函数的返回语句中的初始化

    我的问题源于深入研究std move in return语句 例如以下示例 struct A A std cout lt lt Constructed lt lt this lt lt std endl A A noexcept std c
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 数组与映射的性能

    我必须循环一个大数组中的元素子集 其中每个元素都指向另一个元素 问题来自于检测大图中的连接组件 我的算法如下 1 考虑第一个元素 2 将下一个元素视为前一个元素所指向的元素 3 循环直到没有发现新元素 4 考虑1 3中尚未考虑的下一个元素
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat

随机推荐

  • 如何使传单中的标记闪烁

    有没有一种简单的方法可以使传单地图中的标记闪烁 我的意思是动画闪烁 类似于 1 秒内从不透明度 1 0 过渡到不透明度 0 5 的循环 然后反转 循环结束 当您添加一个Marker你可以指定一个Icon 选项包括className 你可以用
  • 将 Hibernate 会话与 Quartz 结合使用

    我有一个使用 Struts 和 Hibernate 等框架的 Web 应用程序 目前我正在使用 Quartz 为该应用程序开发一个调度程序 在编码时 我意识到使用 Quartz 线程不可能使用 Hibernate 会话 有人有使用石英作业类
  • 了解 Rails 4 中的 after_update 回调

    我有一个 Rails 对象after update将记录发送到队列的回调 问题是我注意到有时队列的处理速度比对象的实际更新速度快 我的问题 是after update不是在对象更新结束后调用 而是在对象更新开始时调用 如果我只想用它做某事
  • 如何在 ARM 模板中检索 Application Insight(驻留在另一个资源组中)的检测密钥?

    有没有办法在 ARM 模板中检索 Application Insights 驻留在另一个资源组中 的仪器密钥 我已经使用以下代码使用 ARM 模板创建了一个 appInsights schema http schema management
  • Android 添加本机支持 - 未解析的 jni.h、android/log.h 等

    今天之前我使用 Eclipse 3 8红杉插件适用于 Android NDK 项目 但今天我决定将 Eclipse 更新为带有 SDK 和 NDK 的 Juno 版本 我很高兴然后我看到Android 原生工具在 ADT 安装中 它将执行与
  • 如何将自定义 git hook 添加到 GitHub Enterprise 存储库?

    我已经启动了 GitHub Enterprise 11 10 272 的实例并创建了一个存储库 我已经用 Ruby 编写了一个预接收钩子 我想将其与该存储库一起使用 GitHub Enterprise 与常规 GitHub 一样 允许配置服
  • NODE_ENV === '生产'之外的精简代码。这意味着 Redux 的开发构建速度会变慢

    所以这是完整的错误 您当前正在使用 NODE ENV 生产 之外的精简代码 这意味着您正在运行较慢的 Redux 开发版本 我正在使用第三方图表库 CanvasJS 它需要访问全局范围 当我将它导入到我的任何模块中时 在浏览器中 可能是th
  • 为什么这里在数组定义中使用 splat ?

    def initialize apps catch 404 apps has app apps each app add app catch catch each status catch status true end 在这个方法中从机架
  • Eclipse 上的 PyDev Jython 交互式控制台创建失败

    为什么在 Eclipse 中调用我的 Jython 交互式控制台时可能无法创建 按照 Jython 手册中的 在 IDE 中使用 Jython 说明进行操作 http www jython org jythonbook en 1 0 Jyt
  • 有没有正确的方法来处理重叠的 NSView 兄弟姐妹?

    我正在开发一个 Cocoa 应用程序 并且遇到了一种情况 我希望两个 NSView 对象重叠 我有一个父 NSView 其中包含两个子视图 NSView A 和 NSView B 每个子视图都可以有自己的多个子视图 有没有适当的方法来处理这
  • jQuery SlideDown 不流畅

    我有这个小的 jQuery SlideDown 效果http jsfiddle net Gg4eP 2 但动画不流畅 我做错了什么 谢谢你的时间 您只需为每个可扩展 div 添加宽度即可 http jsfiddle net BpMam 解释
  • 对象检测 API 错误:“ImportError:无法导入名称anchor_generator_pb2”

    我正在尝试获取 Tensorflow 的新功能物体检测API在职的 我已经按照安装说明 但是当运行命令时 python object detection builders model builder test py 我收到以下错误 from
  • swfupload 不再在 IE 下工作

    http demo swfupload org v250beta2 simpledemo index php似乎不再在 IE 中工作了 有解决办法吗 我得到一个红十字 并且 按钮 不可点击 我运行的是 IE 8 我可以在 Windows 7
  • 格式“%d”需要“int”类型的参数,但参数 2 的类型为“int *”

    每次我在 hackerrank 上提交程序时都会出现以下错误 solution c In function main solution c 22 14 warning format d expects argument of type in
  • 箭头键在输入和文本区域中不起作用

    我的网络应用程序中有一个简单的文本区域和输入 由于某种原因 我无法使用箭头键返回输入的文本 输入光标不会向后移动 不过 我可以使用 ctrl a 或者用鼠标单击我要编辑的位置 这很令人困惑 我没有在代码中的任何关键事件中使用 e preve
  • Bash here 文档没有产生任何输出,知道为什么吗?

    在我的带有 Lubuntu 13 04 的 Acer 725 上 这个小脚本 bin bash echo echo lt
  • Django 过滤器与获取模型

    我是 Django 的新手 想了解过滤器与 get 之间的区别 Get Entry objects get id exact 14 Filter Entry objects filter id exact 14 上述声明有什么区别 提前致谢
  • Haskell - for 循环

    如果我想表达类似的东西 只是一个简单的例子 int a 0 for int x 0 x lt n x 1 a 1 a 我应该在哈斯克尔做什么 因为它没有变量概念 可能是错的 参见 Haskell 有变量吗 有几种选择 首先 您可以用朴素递归
  • 套接字异常:“端点映射器没有更多可用端点”

    我正在使用winsock 和C 来设置服务器应用程序 我遇到的问题是调用listen导致第一次机会异常 我想通常这些可以被忽略 但我发现其他人也有同样的问题 它导致应用程序偶尔挂起 任何帮助将不胜感激 第一个机会例外是 0x 1234567
  • 实现哈希表

    我正在尝试创建一个有效的查找表C 我有一个整数作为键和一个可变长度char 作为值 我看过uthash 但这需要固定长度char 价值 如果我把这个数字设得很大 那么我就使用了太多的内存 struct my struct int key c