Questions tagged «hash-tables»

一种使用将多个值映射到几个地址的函数来寻址存储值的有限映射数据结构。

4
(何时)哈希表查找为O(1)?
人们通常说哈希表查找是在恒定时间内进行的:您计算哈希值,这将为数组查找提供索引。但这忽略了碰撞。在最坏的情况下,每一项都恰好落在同一存储桶中,并且查找时间变为线性()。Θ(n)Θ(n)\Theta(n) 数据上是否存在可以使哈希表查找真正变为?这是仅是平均水平,还是哈希表可以进行最坏情况查找?O (1 )O(1)O(1)O(1)O(1)O(1)O(1) 注意:我是从程序员的角度出发的;当我将数据存储在哈希表中时,它几乎总是字符串或某些复合数据结构,并且数据在哈希表的生存期内发生变化。因此,尽管我欣赏有关完美哈希的答案,但从我的观点来看,它们很可爱,但很有趣,而且不切实际。 PS跟进:哈希表操作O(1)适用于哪种数据?

4
为什么最好在散列函数中使用质数作为mod?
如果我有一个从1到100的键值列表,并且想将它们组织成11个存储桶的数组,那么我会被教导如何形成mod函数 H=kmod 11H=kmod 11 H = k \bmod \ 11 现在,所有值将在9行中一个接一个地放置。例如,在第一个存储桶中将有0,11,22…0,11,22…0, 11, 22 \dots。在第二个中,将有1,12,23…1,12,23…1, 12, 23 \dots等。 假设我决定成为一个坏孩子,并使用非质数作为我的哈希函数-以12为例。使用哈希函数 H=kmod 12H=kmod 12 H = k \bmod \ 12 会导致哈希表的值在第一个存储桶中为0、12、24 0,12,24…0,12,24…0, 12, 24 \dots ,在第二个存储桶中为1、13、25 1,13,25…1,13,25…1, 13, 25 \dots等,依此类推。 本质上,它们是同一件事。我没有减少冲突,也没有通过使用质数哈希码更好地进行扩展,而且我看不出它有什么好处。

1
哈希表与二叉树
当实现字典时(“我想通过他们的客户ID查找客户数据”),使用的典型数据结构是哈希表和二进制搜索树。例如,我知道C ++ STL库使用(平衡的)二进制搜索树实现字典(它们称为地图),而.NET框架在后台使用哈希表。 这些数据结构的优缺点是什么?在某些情况下还有其他合理的选择吗? 请注意,对于键具有强大的基础结构的情况,例如,它们都是1到n之间的整数或类似的东西,我并不特别感兴趣。

1
填充糕点的路由表如何工作?
此问题是从软件工程堆栈交换迁移的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 我正在尝试实现Pastry Distributed Hash Table,但是有些事情使我无法理解。我希望有人能澄清一下。 免责声明:我不是计算机科学专业的学生。我一生中刚上过两门计算机科学课程,但都没有涉及任何远程复杂的问题。我从事软件工作已经有多年了,所以如果我能将想法付诸实践,我觉得我已经完成了实现任务。因此,我可能只是缺少一些明显的东西。 我已经阅读了作者发表的论文[1],并且取得了一些不错的进步,但是我一直对路由表的工作原理这一点感到困惑: 该文件声称 一个节点的路由表中,RRR,被组织成⌈log2bN⌉⌈log2b⁡N⌉\lceil \log_{2^b} N\rceil 与行2b−12b−12^b - 1每个条目。路由表第n行的2b−12b−12^b - 1条目均引用一个节点,该节点的nodeId在前n位共享当前节点的nodeId,但其n + 1位具有2 b − 1可能值之一,而不是所述ñ + 1个数位在本节点的id。nnnn+1n+1n + 12b−12b−12^b - 1n+1n+1n + 1 的bbb代表一个应用程序特定的变量,通常是444。为了简单起见,让我们使用b=4b=4b=4。所以上面是 一个节点的路由表中,RRR,被组织成 ⌈log16N⌉⌈log16⁡N⌉\lceil \log_{16} N\rceil与行151515的每个条目。路由表第n行的151515个条目均引用一个节点,该节点的nodeId在前n个数字中共享当前节点的nodeId,但其n + 1个数字具有除n +以外的2 b - 1可能值之一当前节点ID中的第1位数字。nnnn+1n+1n + 12b−12b−12^b - 1n+1n+1n + 1 我很了解 此外,NNN是群集中服务器的数量。我也知道 …

5
哈希表操作O(1)适用于哪种数据?
从(何时)的答案是哈希表查找O(1)?,我收集到,当数据满足某些统计条件时,哈希表具有最坏情况的行为,至少已摊销,并且有一些技术可以使这些条件变宽。O(1)O(1)O(1) 但是,从程序员的角度来看,我事先并不知道我的数据是什么:它通常来自某些外部来源。而且我很少一次拥有所有数据:插入和删除的发生率经常不低于查找率,因此需要对数据进行预处理以微调哈希函数。 因此,迈出一步:在掌握了有关数据源的一些知识之后,如何确定哈希表是否有机会进行操作,以及可能在哈希函数上使用哪些技术?O(1)O(1)O(1)

3
“非病理数据”是什么意思?
我在Coursera上了算法课。视频中有关哈希表的教授说 事实是,对于非病理数据,您将在正确实现的哈希表中获得恒定时间的操作。 “非病理数据”是什么意思?你能举一些例子吗?

1
实践中的通用哈希
如果 ,则哈希函数族是通用的 您可以在此Wikipedia 文章中找到有关通用哈希的更多信息。HHH^ h :ü→ { 0 ,… ,M− 1 }H:ü→{0,…,中号-1个}h: U \rightarrow \{0,\ldots,M-1\}∀ X , ÿ∈ ü,x ≠ y⇒ 镨ħ ∈ ħ[ h (x )= h ( y)] ≤ 1中号∀X,ÿ∈ü,X≠ÿ⇒镨H∈H[H(X)=H(ÿ)]≤1个中号\forall x,y \in U, x \neq y \Rightarrow \Pr_{h \in H}[h(x) = h(y)] \leq \frac{1}{M} 现在,通用哈希的概念已成为本科生数据结构课程的标准部分。能够激励学生认识通用哈希在工业应用中的重要性。所以我的问题是: 哈希函数通用族的构造在实践中重要吗?如果答案是肯定的,请您分享一些您所看到的有趣的工业应用程序吗?

4
布谷鸟哈希比动态完美哈希有什么优势?
动态完美哈希表和布谷鸟哈希表是两个不同的数据结构,它们支持最坏情况下的O(1)查找和预期的O(1)时间插入和删除。两者都需要O(n)辅助空间,并需要访问散列函数系列才能进行操作。 我认为这两个数据结构本身都是美丽而辉煌的,但是我不确定我如何,何时将其中一个比另一个更好。 这些数据结构中的一个结构是否具有明显的优势,是否存在特定的环境?还是它们大多数都可以互换?

1
推断优化类型
在工作中,我的任务是推断一些有关动态语言的类型信息。我将语句序列重写为嵌套let表达式,如下所示: return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } 由于我从一般类型信息开始,并试图推断出更具体的类型,因此自然的选择是精简类型。例如,条件运算符返回其真假分支类型的并集。在简单的情况下,它效果很好。 但是,在尝试推断以下类型时遇到了障碍: function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 


3
为什么(无冲突)哈希表查找真的是O(1)?
免责声明:我知道这里和Stackoverflow上已经存在类似的听起来的问题。但是它们都是关于碰撞的,这不是我要的。 我的问题是:为什么在碰撞较少查找O(1)摆在首位? 假设我有此哈希表: Hash Content ------------- ghdjg Data1 hgdzs Data2 eruit Data3 xcnvb Data4 mkwer Data5 rtzww Data6 现在,我正在寻找k哈希函数h(k)给出的键h(k) = mkwer。但是查找如何“知道”哈希mkwer在位置5?为什么不必在所有按键中滚动O(n)才能找到它?哈希不能是某种真正的硬件地址,因为我失去了移动数据的能力。据我所知,哈希表未按哈希排序(即使是哈希,搜索也将采用O(log n))? 知道哈希如何帮助您找到表格中的正确位置?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.