Questions tagged «ds.data-structures»

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

6
自Okasaki以来,纯功能数据结构有何新变化?
自克里斯·冈崎(Chris Okasaki)1998年出版《纯功能数据结构》一书以来,我还没有看到太多新的令人兴奋的纯功能数据结构。我仅举几例: IntMap(也是由Okasaki于1998年发明,但未在该书中出现) 手指树(及其对monoid的泛化) 还有一些有趣的方法来实现已知的数据结构,例如使用“嵌套类型”或“广义代数数据类型”以确保树不变。 自1998年以来,在该领域又出现了哪些其他新想法?

30
书中的算法。
保罗·埃尔多斯(Paul Erdos)谈论了“书”,其中上帝保留了每个数学定理的最优雅的证明。这甚至启发了一本书(我相信现在是第四版):书中的证明。 如果上帝有一本类似的算法书,那么您认为哪种算法是候选人? 如果可能的话,还请提供可点击的参考以及使之起作用的关键见解。 请每个答案仅使用一种算法。

9
强大的算法过于复杂,难以实施
有哪些合法实用程序的算法过于复杂而难以实现? 让我清楚一点:我不是在寻找像当前的渐近最优矩阵乘法算法(Coppersmith-Winograd)这样的算法,该算法可以合理实施,但具有一个常数,使其在实践中毫无用处。我正在寻找一种可能具有实用价值,但很难编码的算法,以至于它们从未实现,仅在极其人为的环境中实现,或者仅针对非常特殊的应用而实现。 还欢迎具有良好渐近性但实际性能可能不佳的几乎不可能实现的算法。

10
一层,两个队列
背景 几年前,当我还是一名本科生时,我们得到了一项关于摊销分析的作业。我无法解决其中一个问题。我曾在comp.theory中提出过此要求,但没有得到满意的结果。我记得课程中TA坚持了他无法证明的事情,并说他忘记了证明,然后……[你知道吗]。 今天,我回顾了这个问题。我仍然很想知道,所以这里是... 问题 是否可以使用两个队列实现堆栈,以便PUSH 和POP操作都在摊销时间O(1)中运行?如果可以,你能告诉我如何吗? 注意:如果我们要实现一个具有两个堆栈的队列(具有相应的操作ENQUEUE&DEQUEUE),则情况非常简单。请注意区别。 PS:以上问题不是作业本身。作业不需要任何下限;只是一个实现和运行时间分析。

13
对于哪种算法,理论分析与现实之间有很大的差距?
分析算法效率的两种方法是 在其运行时设置渐近上限,并且 运行它并收集实验数据。 我想知道在(1)和(2)之间是否存在明显差距。我的意思是,要么(a)实验数据表明渐近渐近,要么(b)有算法X和Y使得理论分析表明X比Y好得多,实验数据表明Y比Y好得多。 X。 由于实验通常会揭示平均情况下的行为,因此,我希望最有趣的答案涉及平均情况下的上限。但是,我不想排除谈论不同范围的可能有趣的答案,例如Noam关于Simplex的答案。 包括数据结构。请为每个答案输入一个算法/ ds。

2
纯功能数据结构中有哪些尚待解决的问题?
自1998年冈崎(Okasaki)的书出版以来,有关PFDS的新问题又激发了这个问题。 我将从两个问题开始: 是否有一种纯粹的功能集数据结构可以接近哈希表的速度?尝试还不存在。 是否有O(1)附加的纯功能手指树?迄今为止最好的是由Kaplan和Tarjan设计的O(lg lg n)。 还有哪些其他纯粹的功能数据结构问题?

4
对于具有良好理论保证的整数集合(即多集)是否存在哈希函数?
我很好奇是否有一种方法可以存储具有以下属性的多组整数的哈希,理想情况下: 它使用O(1)空间 可以对其进行更新以反映O(1)时间的插入或删除 两个相同的集合(即具有相同元素且具有相同多重性的集合)应始终散列为相同的值,而两个不同的集合应以较高的概率散列为不同的值(即,函数是独立的或成对独立的) 对此的一种初步尝试是将乘积以各个元素的哈希的随机素数模存储。满足1和2,但尚不清楚它是否满足3。 我最初将此内容发布在StackOverflow上。 *属性1和2可以放宽到O(log n)或小的次线性多项式。关键是要看我们是否可以识别多集合并可靠地测试相等性而无需存储元素本身。


6
没有误报的概率集?
因此,Bloom过滤器非常酷-它们是支持成员资格检查的集,没有错误否定,但很少有错误肯定的机会。不过最近,我一直想要一种“布隆过滤器”,它可以保证相反的结果:没有误报,但可能有误报。 我的动机很简单:鉴于有大量要处理的项目(包含重复项),我们希望避免处理以前见过的项目。处理重复副本没有什么坏处,只是浪费时间。但是,如果我们忽略处理元素,那将是灾难性的。使用“反向布隆过滤器”,可以以很小的空间开销存储看到的项目,并通过测试集合中的成员资格来避免以高概率处理重复项。 但是我似乎找不到任何东西。我找到的最接近的是“ 修饰过的Bloom过滤器 ”,它可以使选定的误报以较高的误报率进行交易。但是,当我想删除所有误报时,我不知道其数据结构的性能如何。 有人看到过这样的东西吗?:)

8
高阶算法
从它们的输入和输出是“普通”数据的意义上讲,大多数众所周知的算法都是一阶的。有些是简单的二阶方法,例如排序,哈希表或map和fold函数:它们是通过函数进行参数化的,但是除了在其他输入数据上调用它外,它们实际上并没有做任何有趣的事情。 有些也是二阶的,但更有趣: 由monoids参数化的手指树 在单调谓词上分裂手指树 前缀和算法,通常又用一个monoid或谓词等参数化。 最后,在我最感兴趣的意义上,有些是“真正的”高阶: Y组合器 差异清单 是否存在其他非平凡的高阶算法? 为了澄清我的问题,在“非平凡的高阶”下,我的意思是“在算法的接口和/或实现中以关键的方式使用计算形式主义的高阶设施”

3
基于比较的数据结构,用于查找项目
是否有一个数据结构,该数据结构接受ñnn个无序数组,在执行预处理O (n )O(n)O(n)并回答查询:列表中是否有一些元素Xxx,每个查询的时间最差O (对数n )O(log⁡n)O(\log n)? 我真的认为没有,因此也欢迎提供证明。

4
为什么有人会在KD树上使用八叉树?
我在科学计算方面有一些经验,并且在BSP(二进制空间分区)应用程序中广泛使用了kd树。最近,我对八叉树越来越熟悉,八叉树是一种类似的数据结构,用于对3-D欧几里得空间进行分区,但是从我收集到的数据中,它以固定的固定间隔工作。 一点独立性研究似乎表明,对于大多数数据集,kd树通常在性能上都更好-构造和查询更快。我的问题是,八叉树在空间/时间性能或其他方面的优势是什么?在什么情况下它们最适用(我听说过3D图形编程)?我将不胜感激地总结两种类型的优点和问题。 另外,如果有人能详细说明R树数据结构的用法及其优势,我也将不胜感激。R树(比八叉树更是如此)似乎与kd树非常相似地应用于k最近邻或范围搜索。

6
有稳定的堆吗?
是否存在支持以下操作的优先级队列数据结构? Insert(x,p):添加优先级为p的新记录x StableExtractMin():返回并删除具有最低优先级的记录,并按插入顺序断开联系。 因此,在Insert(a,1),Insert(b,2),Insert(c,1),Insert(d,2)之后,StableExtractMin的序列将返回a,然后c,然后b,然后d。 显然,可以通过将对存储为实际优先级来使用任何优先级队列数据结构,但是我对类似于稳定排序的数据结构没有显式存储插入时间(或插入顺序)感兴趣。。(p,time)(p,time)(p, time) 等效地(?):是否有稳定版本的heapsort不需要额外空间?Ω(n)Ω(n)\Omega(n)

5
二元搜索的二元搜索概括?
假设我在S上有一个位姿“ S”和一个单调谓词“ P”。我想找到S的一个或所有满足P的最大元素。 编辑:我有兴趣减少P的评估数量。 存在针对此问题的哪些算法,它们在S上需要哪些属性和其他操作? 重要的特殊情况如何,例如: S是线性顺序-只要您执行“查找中间”操作,常规二进制搜索就可以工作 S是一个晶格 S是子集格 S是一个多集格 ... 后两种情况似乎特别重要,例如对于实验设计-您具有一组布尔值或实际参数,并且您希望找到它们的最小组合以重现特定模式(例如失败的测试)。

2
我梦见一个数据结构,它存在吗?
我没有找到这种数据结构,但是我不是该领域的专家。 该结构实现了一个集合,并且基本上是具有不变性的可比较元素的数组。不变式如下(递归定义): 长度为1的数组是合并数组。 长度为2 ^ n(对于n> 0)的数组是一个合并数组iff: 前半部分是合并数组,后半部分为空或 第一个数组已满并已排序,第二个数组是合并数组。 请注意,如果数组已满,则会对其进行排序。 要插入一个元素,我们有两种情况: 如果前半部分未满,请递归插入前半部分。 如果前半部分已满,则在后半部分中递归插入。 递归步骤后,如果整个数组已满,请合并两半(已排序),然后将其大小调整为其原始长度的两倍。 要查找元素,请在数组已满时使用二进制搜索将两半递归。(这应该是有效的,因为最多有上升的片段)。O(log(n))O(log⁡(n))O(\log(n)) 该结构可以认为是mergesort的静态版本。 目前尚不清楚应该删除元素的方法。 编辑:提高我对结构的理解之后。

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.