Questions tagged «ds.data-structures»

数据结构的属性和应用程序,例如空间下限或对象插入和删除的时间复杂性。

3
数据结构的下界
是否知道结果排除了“过于真实”数据结构的存在? 例如:可以在一个添加和Ĵ ö 我Ñ功能的顺序维护数据结构(参见迪茨和Sleator STOC '87),并且仍然获得Ô(1 )时的动作?小号p 升我吨小号p升一世ŤSplitĴØ 我ñĴØ一世ñJoinO(1)Ø(1个)\mathcal{O}(1) 或者:是否可以用整数键和时间操作实现有序集?当然,这至少和发现用于对整数排序的线性时间算法一样困难。O(1)Ø(1个)\mathcal{O}(1) 这些问题中的任何一个是否都被证明没有答案?下界结果是否已知于任何自然数据结构?


3
关联哈希混合
考虑纯功能设置中的单链链接。它的赞美声从山顶传来,并将继续传给人们。在这里,我将讨论其众多优势之一,以及如何将其扩展到基于树的更广泛的纯功能序列类别的问题。 问题如下:您想通过强哈希在O(1)时间内测试几乎某些结构相等性。如果哈希函数在结构上是递归的,即哈希(x:xs)=混合x(哈希xs),则可以将哈希值透明地缓存在列表中,并在元素被限制在现有列表中的情况下,在O(1)时间更新它们。大多数哈希列表算法在结构上都是递归的,因此这种方法在实践中非常有用。 但是,假设您不是基于单链列表,而是具有基于树的序列,该序列支持在O(log n)时间内连接两个长度为O(n)的序列。为了使散列缓存在这里起作用,散列混合函数必须具有关联性,以便尊重树在表示相同线性序列时所具有的自由度。混合器应获取子树的哈希值,并计算整个树的哈希值。 这是六个月前的一天,当时我花了一天时间思考并研究这个问题。在有关数据结构的文献中似乎没有引起注意。我确实遇到了来自密码学的Tillich-Zemor哈希算法。它依赖于2x2矩阵乘法(关联),其中位0和1对应于在Galois字段中具有条目的子代数的两个生成器。 我的问题是,我错过了什么?我在搜索中找不到的关于密码学和数据结构的文献中必定有相关的论文。任何对此问题的评论以及可能探索的场所将不胜感激。 编辑:我对频谱的软性和加密性强端都对这个问题感兴趣。在较软的方面,它可以用于哈希表,在该表中应避免冲突,但不会造成灾难性的后果。从更有利的方面,它可以用于相等性测试。

4
红色和黑色树的子范围
在尝试修复库中的错误时,我搜索了有关在红树和黑树上找到子范围的论文,但没有成功。我正在考虑使用拉链的解决方案,以及与 不可变数据结构的删除算法上常用的追加操作类似的方法,但我仍在想是否还有我找不到的更好方法,甚至某些最低复杂度边界在这样的手术上? 明确地说,我正在谈论一种算法,给定一棵红黑树并有两个边界,它将生成一个新的红黑树,其中第一棵树的所有元素都属于这些边界。 当然,复杂度的上限是遍历一棵树并通过添加元素构造另一棵树的复杂度。

2
功能编程中的差异列表
问题自Okasaki以来,纯功能数据结构有何新变化?和jbapple的史诗答案,提到了在函数编程中使用差异列表(与逻辑编程相对),这是我最近感兴趣的事情。这使我找到了Haskell 的差异列表实现。我有两个问题(如果我应该在StackExchange上给他们两个不同的问题,请原谅/纠正我)。 一个简单的问题是,除了Haskell库中的代码之外,还有人意识到函数式编程和/或实现中的差异列表的学术考虑吗?jbapple的答案没有引用差异列表(逻辑编程中的差异列表存在于绝大部分内容中,并且存在于我在“周围某处”(TM)中提供的两个资源中)。在找到Haskell实现之前,我不知道这个想法已经从逻辑跃升为函数式编程。当然,Haskell差异列表是高阶函数的自然使用,其工作原理与逻辑编程中的完全不同,但是接口肯定是相似的。 我想问的更有趣(而且更模糊)的问题是上述Haskell差异列表库所要求的渐近上限看起来是否正确/合理。我的困惑可能是因为我失去了一些东西约显而易见约懒惰复杂的推理,但所主张的界限才有意义,我如果替换在大数据结构(或关闭阵型,或者变量查找,或东西)总是恒定的时间。还是“捕获”仅仅是因为“头”和“尾”的运行时间没有限制,正是因为这些操作可能必须经过任意一堆延迟的计算/替换才能完成?

1
单独链接需要多少独立性?
如果将球随机均匀地放入仓中,则最重的装载仓中很有可能会出现球。Pătraşcu和Thorup 在“简单列表散列的威力”中提到,“独立性有限的应用程序的切尔诺夫-霍夫廷界”(镜像)表明,如果球以一定的距离分布,则最重的装载箱上的该界也成立。独立的哈希函数。nnnnnnO(lgn/lglgn)O(lg⁡n/lg⁡lg⁡n)O(\lg n/\lg \lg n)Ω(lgn/lglgn)Ω(lg⁡n/lg⁡lg⁡n)\Omega(\lg n/\lg \lg n) Celis等人在“ Balls and Bins:较小的哈希表族和更快的评估”中。请注意,尚不清楚是否存在哈希函数系列 哈希函数可以用位空间表示O(lgn)O(lg⁡n)O(\lg n) 哈希函数可以在时间内求值O(1)O(1)O(1) 最大负载很有可能是。O(lgn/lglgn)O(lg⁡n/lg⁡lg⁡n)O(\lg n / \lg \lg n) 如果有一个恒定的使得任何为#3不依赖家庭就足够了,那么它的多项式建设不依赖家庭将达到#1和#2。kkkkkkkkk 什么必然做我们有最重的负载箱非依赖性哈希?kkk 使用“切尔诺夫-霍夫定界...”定理4.3.1和联合界,我想我可以得到最重的装箱whp的重量的界O(n2/k)O(n2/k)O(n^{2/k}) 可以使用其他技术将其简化为吗?O(lgcn)O(lgc⁡n)O(\lg ^c n)

2
用于间隔更新和查询零数的数据结构
我正在寻找一种数据结构,该结构将维护大小为n的整数表,并允许在时间O (log n )中进行以下操作。ŤttñnnO (对数n )O(log⁡n)O(\log n) ,这增加了吨[ 一个] ,吨[ 一个+ 1 ] ,... ,吨[ b ]。增加(a ,b )increase(a,b)\text{increase}(a,b)t [ a ] ,t [ a + 1 ] ,… ,t [ b ]t[a],t[a+1],…,t[b]t[a],t[a+1],\ldots,t[b] ,从而减少 t [ a ] ,t [ a + 1 ] ,… ,t [ b ]。减少(a ,b …

4
树旋转基本定理的参考
当两个二叉搜索树在有序遍历中达成一致时,它们被认为是线性等效的。以下定理解释了为什么树旋转如此重要: 令A和B为二叉搜索树。当且仅当它们通过一系列树旋转连接时,A和B才是线性等价的。 很久以前,当我第一次学习数据结构时,我注意到了这个结果,并且想更深入地了解树旋转的特殊状态。 证明简单直观:将最小元素沿左脊旋转到根位置。通过顺序不变,该重新排列的树不能具有左子树。现在,在右边的子树上递归。结果是测试线性等效性的标准形式。 尽管这是一个基本定理,但我在文献中从未见过。对于下次需要使用此结果的参考,我将不胜感激。 (奖金脑筋急转弯:寻找连接两个线性等效二叉搜索树的最短树轮换序列的最佳算法是什么?)

2
动态内存分配的数据结构
想想细胞探针模型。是否有一种数据结构可以分配任何长度的连续内存块(例如,C中的malloc)并释放它们,同时避免内存分段,并在最坏情况下确定性O(log n)时间执行每个操作,其中n为内存的总大小? 通过避免内存分段,我的意思是,如果空闲单元的总数为F,那么我应该能够分配F个单元或大约F个单元的连续段。

1
具有分配敏感型deleteMin的整数优先级队列
是否存在整数优先级队列,该队列使用个空间字并执行以下操作,所有操作均在最坏的情况下进行,并且无法访问随机性:O(n)O(n)O(n) createEmptyQueue在获得一些常数。cO(lgcU)O(lgcU)O(lg^c U)ccc insert在。O(1)O(1)O(1) deleteMin在,其中\ delta _ {\ min}是最小键和第二个最小键之间的差。O(δmin)O(δmin)O(\delta_{\min})δminδmin\delta_{\min} 此外,一旦对密钥kkk进行了a deleteMin运算,则所有其他插入都>k>k> k。 相关工作: Bose等人的“有界宇宙中的快速本地搜索和更新”,它比我需要的速度快,deleteMin但比我需要的速度慢insert。 Brodnik等人的“最坏情况恒定时间优先级队列”,使用了奇异的“ Yggdrasil内存”。出于这个问题的目的,我对更标准的整数RAM模型感兴趣。 Brodnik和Karlsson的“多进程时间队列”,将插入限制为使用(k _ {\ min},k _ {\ min} + \ delta _ {\ min}]中的键进行元素插入(kmin,kmin+δmin](kmin,kmin+δmin](k_{\min}, k_{\min} + \delta_{\min}],其中kminkmink_{\min}是最小值的值键。 请注意,这对于哈希表非常简单,但是使用了摊销和随机性: 队列是一对键的哈希表和最小键的副本。 insert 将密钥添加到哈希表,并在适当时更新最小密钥副本。 deleteMin在哈希表中查找最小键,然后通过依次搜索来搜索下一个最小键。kmin+1,kmin+2,kmin+3,…kmin+1,kmin+2,kmin+3,…k_{\min} + 1, k_{\min} +2, k_{\min} + 3, \dots

1
在幂单调谓词的最小元素
考虑幂集2 |上的单调谓词n | (按包含顺序排序)。通过“单调”我的意思是:∀ X ,ÿ ∈ 2 | n | 使得X ⊂ ÿ,如果P (X )然后P (Ý )。我在寻找一种算法来找到所有的最小元素P,即X ∈ 2 | n | 使得P (x )PPP2| n |2|n|2^{|n|}∀ X ,ÿ∈ 2| n |∀x,y∈2|n|\forall x, y \in 2^{|n|}X ⊂ ÿx⊂yx \subset yP(x )P(x)P(x)P(y)P(y)P(y)PPPX ∈ 2| n |x∈2|n|x \in 2^{|n|}P(x )P(x)P(x)但∀ ÿ⊂ …

6
计算布隆过滤器的近似人口
给定大小为N位和K个哈希函数的Bloom过滤器,其中设置了过滤器的M位(其中M <= N)。 是否可以估计插入到布隆过滤器中的元素数量? 简单的例子 我一直在考虑以下示例,假设BF为100位,并设置了5个散列函数,其中设置了10位... 最佳情况:假设哈希函数确实是完美的,并且为X个值的值唯一地映射了一点,那么在设置了10位的情况下,我们可以说仅在BF中插入了2个元素 最坏的情况:假设哈希函数很差,并且始终映射到同一位(彼此之间是唯一的),那么可以说,BF中已插入10个元素 范围似乎是[2,10],此范围内的大约可能由过滤器的假阳性概率确定-在这一点上,我陷入了困境。

2
使用两个队列反转列表
这个问题的灵感来自于一个现有的问题,即是否可以在每个堆栈操作的摊销时间中使用两个队列来模拟堆栈。答案似乎是未知的。这是一个更具体的问题,与特殊情况相对应,在特殊情况下,首先执行所有PUSH操作,然后执行所有POP操作。使用两个最初为空的队列如何有效地反转N个元素的列表?合法操作是:O (1 )O(1)O(1)ñNN 使输入列表中的下一个元素入队(到任一队列的尾部)。 将元素从任一队列的开头出队,然后再次入队(到任一队列的尾部)。 使任一队列开头的元素出队,并将其添加到输出列表。 如果输入列表包括元素,生成反向输出列表[ N ,N - 1 ,...所需的最小操作数是多少?。。,2 ,1 ]的行为?证明它比O (N )增长快的证据将特别有趣,因为它将解决否定的原始问题。[ 1 ,2 ,。。。,N− 1 ,N][1,2,...,N−1,N][1,2,...,N-1,N][ N,N- 1 ,。。。,2 ,1 ][N,N−1,...,2,1][N,N-1,...,2,1]ø (Ñ)O(N)O(N) 更新(2011年1月15日):问题可以在,如提交的答案和他们的评论中所示;Ω (N )的下限很小。这些界限能否改善?ø (Ñ日志ñ)O(Nlog⁡N)O(N \log N)Ω (N)Ω(N)\Omega(N)


2
逆阿克曼的乐趣
分析算法时,经常会发生Ackermann逆函数。它的一个很好的展示在这里:http : //www.gabrielnivasch.org/fun/inverse-ackermann。 α1(n)=[n/2]α1(n)=[n/2]\alpha_1(n) = [n/2] α2(n)=[log2n]α2(n)=[log2⁡n]\alpha_2(n) = [\log_2 n] α3(n)=log∗nα3(n)=log∗⁡n\alpha_3(n) = \log^* n ......... αk(n)=1+αk(αk−1(n))αk(n)=1+αk(αk−1(n))\alpha_k(n) = 1 + \alpha_k(\alpha_{k−1}(n)) 和 α(n)=min{k:αk(n)≤3}α(n)=min{k:αk(n)≤3}\alpha(n) = \min\{k: \alpha_k(n)\leq 3\} [符号:[X]意味着我们舍入x到最接近的整数,而日志*是迭代数函数在这里讨论:http://en.wikipedia.org/wiki/Iterated_logarithm] 我的问题是:什么是功能 k(n)=min{k:αk(n)≤k}k(n)=min{k:αk(n)≤k}k(n) = \min \{k: \alpha_k(n) \leq k\} 显然1≪k(n)≤α(n)1≪k(n)≤α(n)1\ll k(n) \leq \alpha(n)。一个人对可以给出更严格的界限k(n)k(n)k(n)吗?被k(n)≤logα(n)k(n)≤log⁡α(n)k(n) \leq \log\alpha(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.