GLib中的HashTables有用吗?

时间:2016-05-20 19:45:36

标签: c hashmap hashtable

我熟悉哈希函数的想法,但我不清楚GLib的实现是如何有用的。我将用一个例子来解释这个。

假设我有一个昂贵的函数,以一种奇怪的方式递归(某种程度上)正实数,这取决于数论(我是数学家)。假设我有一个算法需要在一些小范围的大数字上计算函数。说[1000000000 - 1000999999]。

我不想将我的昂贵功能调用一百万次,所以我开始递归地记忆值。然后在每次调用时我都不需要从头开始计算整个函数,我希望能记住我已经计算过的较低数字(在我的递归期间)函数的任何值。假设第一级递归的实际呼叫总数很低。所以有很多重复的值和记忆实际上为你节省了很多时间。

这是我理解为什么哈希表数据结构有用的卡通方法。我没有得到的是如何在不知道我需要提前确定哪些钥匙的情况下这样做。

由于递归函数一般是数论,所以我不知道它将重复使用哪些值。所以我想把它们放在一个桶(哈希表)中,因为它们会弹出对函数的递归调用

对于GLib来说,你的(键,值)对似乎总是指向你个人不得不躺在某处的数据的指针。所以如果我的函数是为输入x计算的话。我不知道如何判断我之前是否看过值x,函数g_hash_table_contains()例如需要一个指针,而不是值x。那有什么用?!

我还在学习,所以请善待。我熟悉C语言编码,但还没有使用这种语言的哈希表,我正在尝试这样做并且熟练使用GLib,但我只是不明白。

1 个答案:

答案 0 :(得分:0)

让我来深入解释一下。 首先,如果我们使用hashmap,那么我们需要[key,value]对作为我们的输入。

因此,作为hashmap的用户,我们必须对选择密钥具有创造性,并且根据用例的不同而有所不同。

在你的情况下,据我所知,你有一个适用于范围的功能,并给你结果。在计算时,它使用记忆,以便可以使用构成更大问题的小问题的结果。

例如,你的情况,你可以使用字符串作为你的键,其中字符串将是[1000000009],这可能会使用[1000999998]的结果,这可能会进一步使用1000999997的结果,等等,你没有找到结果hashmap,然后你将计算它并将其保存在hashmap中。

简而言之,作为用户,我们需要在选择键时保持创造性。 如果你必须考虑选择数据库的主键,那么要理解的类比就是你将如何做。

另一个想法的例子是你如何考虑使用hashmap解决fibonacci(n)。