我不知道如何实现特殊的哈希表。 想法是哈希表给出一个近似值 比赛。所以一个完美的哈希表(比如在java.util中找到) 只是给出一张地图,这样:
Hashtable h = new Hashtable();
...
x = h.get(y);
如果x是将映射h应用于参数y的结果, 即基本上在数学中它将是一个函数 即x = h(y)。现在进行近似匹配,那是什么呢 快速给我的数据结构:
x = h(k) where k=max { z<=y | h(z)!=null }
问题是k可能离给定的y很远。例如 y可能是2000,下一个占用的时隙k可能是1000.有些 线性搜索成本很高,数据结构应该可以胜任 更快速。
我知道怎么用树(*)来做,但是带有哈希的东西可以这样做 也工作?或者可能在搜索中组合一些树和哈希属性 数据结构?一些倾向于O(1)访问的数据结构?
再见
(*)你可以使用y排序的树,找到下面的东西或等于y。
答案 0 :(得分:1)
这称为空间散列。请记住,必须根据您的特定领域进行定制。
当 hash 告诉你关于对象的逻辑排列的事情时,可以使用它。因此,|hash(a)-hash(b)| < |hash(a)-hash(c)|
表示b
更接近 / <{em>更接近{/ 1>}而不是a
。
然后基本的想法是你将空间划分为桶(例如,丢弃哈希的最低有效数字 - 天真的方法),你的空间哈希就是这个桶ID 。当对象非常靠近彼此时,您必须处理边缘情况,同时位于存储桶的边界(例如c
但h(1999) = 1
)。您可以通过两个重叠哈希来解决这个问题,并为它们提供两个单独的哈希映射并查询它们,或者查看相邻的桶等...
在我开始时,我必须仔细考虑这一点。
树(例如,更高维度的KD树)在设计阶段并不是那么苛刻,而且通常是最近邻居查询的更方便的方法。
答案 1 :(得分:1)
您给出的具体公式表明您需要一个能够检索小于给定输入的最大项目的集合。
实现这一目标的一个简单方法是保留项目的排序列表,并执行二进制搜索以定位列表中将插入给定元素的位置,然后返回等于或小于的元素那个元素。
与往常一样,任何集合都可以通过使用配对对象来包装键值对,或者通过维护值的并行数据结构来转换为映射。
对于基于数组的方法,运行时将是O(log n)用于检索,O(n)用于插入单个元素。如果'add all'对添加的元素进行排序然后合并它们,它可以是O(n log n)。
1 不可能有一个恒定时间算法,可以回答第一个元素比给定元素使用散列方法更少的东西;一个好的散列算法展开类似(但不相等)的项目,以避免许多类似的项目落入同一个桶并破坏所需的常量时间检索行为,这意味着散列集(或映射)的元素非常故意甚至没有远程接近排序顺序,它们在使用有效的可重复散列算法时尽可能接近随机分布。
1.当然,证明这是不可能的,因为人们不能轻易地证明没有一个简单的可重复的恒定时间请求可以可靠地说服一个神谕(或上帝,如果上帝是那么容易操纵)给你答案你想要的问题,但似乎不太可能。