【问题标题】:Approximate hashtable, does such a data structure exist?近似哈希表,这样的数据结构存在吗?
【发布时间】:2016-09-23 16:46:03
【问题描述】:

我不知道如何实现一个特殊的哈希表。 这个想法是哈希表给出了一个近似值 匹配。所以一个完美的哈希表(比如在 java.util 中找到的) 只是给出一个地图,这样:

Hashtable h = new Hashtable();
...
x = h.get(y);

如果 x 是将映射 h 应用于参数 y 的结果, 即基本上在数学中它将是一个函数 即 x = h(y)。现在对于近似匹配,a 快速给我的数据结构:

 x = h(k) where k=max { z<=y | h(z)!=null }

问题是 k 可能离给定的 y 很远。例如 y 可能是 2000,下一个占用的 slot k 可能是 1000。有些 线性搜索会很昂贵,数据结构应该可以完成这项工作 更快速。

我知道如何用树(*)来做,但是用散列的东西,可以吗? 也工作?或者也许结合一些树和哈希属性在寻找 数据结构?一些倾向于 O(1) 访问的数据结构?

再见

(*) 您可以使用按 y 排序的树,并在 y 下方或等于 y 下找到下一个。

【问题讨论】:

    标签: java hashtable


    【解决方案1】:

    这称为空间散列。请记住,它必须为您的特定域量身定制。

    hash 告诉你一些关于对象的逻辑排列时,可以使用它。因此,当|hash(a)-hash(b)| &lt; |hash(a)-hash(c)| 表示bac 更接近/更相似 时。

    然后基本思想是将空间划分为桶(例如,删除哈希的最低有效数字 - 天真的方法),您的空间哈希就是这个 桶 ID。您必须注意边缘情况,当对象彼此非常靠近时,同时位于存储桶的边界上(例如h(1999) = 1h(2000)=2)。您可以通过两个重叠的哈希并为它们设置两个单独的哈希映射并查询它们来解决这个问题,或者查看相邻的 buckets 等...

    正如我一开始所说的,这必须经过深思熟虑。

    树(例如更高维度的 KD 树)在设计阶段要求不高,通常是一种更方便的最近邻查询方法

    【讨论】:

      【解决方案2】:

      您给出的特定公式表明您需要一个可以检索小于给定输入的最大项目的集合。

      实现此目的的一种简单方法是保留已排序的项目列表,并执行二进制搜索以定位列表中将插入给定元素的位置,然后返回等于或小于的元素那个元素。

      与往常一样,任何集合都可以通过使用对对象来包装键值对,或者通过维护值的并行数据结构来转换为映射。

      对于基于数组的方法,检索的运行时间为 O(log n),插入单个元素的运行时间为 O(n)。如果'add all'对添加的元素进行排序然后合并它们,它可以是O(n log n)。

      不可能1 有一个恒定时间算法可以使用散列方法回答小于给定元素的第一个元素是什么;一个好的散列算法分散相似(但不相等)的项目,以避免许多相似的项目落入同一个桶中并破坏所需的恒定时间检索行为,这意味着散列集(或映射)的元素非常故意甚至远不接近排序顺序,它们尽可能接近随机分布,同时使用高效的可重复散列算法。


      1. 当然,证明它不可能是困难的,因为人们不能轻易证明没有一个简单的可重复的恒定时间请求可以可靠地说服神谕(或上帝,如果上帝是那么容易操纵)给你你想要的问题的答案,但似乎不太可能。

      【讨论】:

      • 要求仅趋向于 O(1),但我想这在数学上并不精确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 2011-04-04
      • 2017-08-27
      • 1970-01-01
      • 2014-04-06
      相关资源
      最近更新 更多