Questions tagged «ds.data-structures»

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

2
布隆过滤器的传统分析是错误的吗?
本文认为,对布隆过滤器中错误率的传统分析是不正确的,然后对实际错误率进行了冗长而平凡的分析。链接论文发表于2010年,但我已经看到在各种算法和数据结构课程中仍继续教授Bloom Bloom过滤器的传统方法。 布隆过滤器的传统分析确实不正确吗? 谢谢!

3
合并两个二叉搜索树
我正在寻找一种算法来合并两个任意大小和范围的二进制搜索树。我实现此目标的明显方法是找到整个子树,其范围可以适合另一棵树中的任意外部节点。然而,运行时间对于这类算法的最坏情况似乎是数量级的O(n+m)地方n,并m分别为每棵树的大小。 但是,有人告诉我可以在中完成此操作O(h),其中h的树的高度更大。我完全不知道这是怎么可能的。我尝试过先旋转一棵树,但是将一棵树旋转成脊柱已经是O(h)了。

3
简洁的数据结构调查?
Fischer本月的论文提醒我,我对简洁的数据结构以及使用它们的算法知之甚少。 对于不了解简洁数据结构的用户: 给定组合结构,具有(n)个不同的配置,以及一个已知的“有用”表示。是否存在一个“简洁”的数据结构,该结构需要存储大约 lg (a (n ))位,但允许我们以正常表示R尽快执行操作?R (n )[R(ñ)R(n)lg(a (n ))lg⁡(一种(ñ))\lg(a(n))[R[RR 如果有人想参加讨论,我最感兴趣的是 后缀数组。它们是所有排列的子集。 有序的树。它们是所有二进制“括号”字符串(匹配的变体)的子集。 所有最接近的较小值,如纸张(1)中所示。您不仅可以在两个维度上压缩,还可以在两个维度上压缩。在一个方向上允许的“小的值”的数组是列表的一小部分,因此您需要存储少于n lg (n )位。{ 0 ,。。。,n − 1 }ñ{0,。。。,ñ-1个}ñ\{0,...,n-1\}^nñ LG(n )ñlg⁡(ñ)n \lg(n)

1
八叉树潜在功能:为什么将大小的对数相加?
我正在教一门关于数据结构的课程,并将在下周初讨论八卦树。我已经阅读了很多关于八叉树的论文,并且熟悉数据结构背后的分析和直觉。但是,对于Sleator和Tarjan在他们的分析中使用的潜在功能,我似乎找不到扎实的直觉。 该分析通过为树中的每个元素分配任意权重,然后将节点的大小s (x )设置为以为根的子树中节点的权重之和来进行。然后,他们以该值的对数获取节点的等级,因此。最后,将树的潜在功能定义为所有节点的秩的总和。wiwiw_is(x)s(x)s(x)r (x )r (x )= 对数s (x )xxxr(x)r(x)r(x)r(x)=logs(x)r(x)=log⁡s(x)r(x) = \log s(x) 我了解此潜在功能正常运行,可以进行分析,但是我不明白他们为什么会选择此潜在功能。为每个节点分配大小的想法对我来说很有意义,因为如果对大小进行求和,就可以得到树的加权路径长度。但是,我无法弄清楚为什么他们决定取权重的对数然后对它们进行汇总-我看不到与之对应的树的任何自然属性。 八叉树的潜在功能是否对应于该树的某些自然属性?除了“行之有效”之外,还有其他特定的原因让他们选择这种潜力吗?(我特别好奇,因为这套课程笔记提到“分析是不可思议的。[不]想法如何被发现”) 谢谢!

3
自举手指树结构
在使用2-3个手指树工作了相当多的时间后,我对它们在大多数操作中的速度印象深刻。但是,我遇到的一个问题是与大型手指树的初始创建相关的大量开销。因为构建被定义为一系列串联操作,所以最终构建了大量不需要的手指树结构。 由于2-3个手指树的复杂性质,我看不到用于引导它们的直观方法,而且我所有的搜索都为空。所以问题是,您如何才能以最少的开销引导2-3根手指的树呢? 明确地说:给定已知长度的序列,可以用最少的操作生成的手指树表示。小号小号Sññn小号小号S 天真的方法是连续调用cons操作(在文献中为' '运算符)。然而,这将创造代表的所有切片不同手指的树结构为。◃◃\triangleleftññn小号小号S[ 1 .. 我][1 ..一世][1..i]

2
大约相同大小的类似treap的数据结构的更快连接
给定两个AVL树和以及值使得,很容易构造一个新的AVL树,其中包含和和T中的值在时间,其中表示树的高度(只要树木存储他们的高度)。Ť1个Ť1个T_1Ť2Ť2T_2Ť[RŤ[Rt_r∀ X ∈ Ť1个,∀ ÿ∈ Ť2,X &lt; 吨[R&lt; y∀X∈Ť1个,∀ÿ∈Ť2,X&lt;Ť[R&lt;ÿ\forall x \in T_1, \forall y \in T_2, x < t_r < yŤ[RŤ[Rt_rŤ1个Ť1个T_1Ť2Ť2T_2O (1 + | h (T1个)− h (T2)| )Ø(1个+|H(Ť1个)-H(Ť2)|)O(1+|h(T_1) - h(T_2)|)ħ (Ť)H(Ť)h(T)ŤŤT 对于红黑树来说,这也是可能的,我还假设许多其他种类的平衡树。 这对于陷阱或类似陷阱的数据结构可能吗?如果我们忽略Ť[RŤ[Rt_r怎么办? Algorithmica中的treaps论文显示了如何在ø (分钟(ħ (Ť1个),ħ (Ť2)))Ø(分(H(Ť1个),H(Ť2)))O(\min(h(T_1),h(T_2)))预期时间内执行此操作。如果有一种方法可以在大小(或根优先级)大致相同的挖矿(或类似挖矿的数据结构)上执行O(1)预期的联接,我认为可能可以使用Kaplan和Tarjan引导的技巧棘刺,以便使用双对数联接进行挖掘(或类似挖掘的数据结构)。

2
外部存储器的指数加速
背景 外部存储器或DAM模型通过其执行的I / O数量(本质上是高速缓存未命中的数量)来定义算法的成本。这些运行时间通常以(内存大小)和(一次可以传输到内存的字数)的形式给出。有时和用于和分别。 M中号MB乙BL大号LZžZB乙BM中号M 例如,排序需要的成本,而朴素矩阵乘法则需要。 Θ(N/BlogM/BN/B)Θ(ñ/乙日志中号/乙⁡ñ/乙)\Theta(N/B\log_{M/B} N/B)Θ(n3/BM−−√)Θ(ñ3/乙中号)\Theta(n^3/B\sqrt{M}) 该模型被用来分析“缓存遗忘算法”,它不具备的知识,或。通常,目标是使不受缓存影响的算法在外部存储器模型中达到最佳性能。这并非总是可能的,例如在置换问题中(如Brodal,Faderberg所示,2003年)。请参阅Erik Demaine撰写的这篇文章,以进一步了解对缓存不了解的算法,包括有关排序和矩阵乘法的讨论。B乙BM中号M 我们可以看到,更改会导致排序的对数加速和矩阵乘法的多项式加速。(此结果最初来自Hong,Kung 1981,实际上早于缓存遗忘和外部存储器模型的形式化)。MMM 我的问题是这样的: 在任何情况下,提速都以为指数吗?运行时间将类似于。我对符合此描述但对缓存不了解的算法或数据结构特别感兴趣,但对缓存感知的算法/数据结构甚至是最著名的下限感到满意。MMMf(N,B)/2O(M)f(N,B)/2O(M)f(N,B)/2^{O(M)} 在大多数模型中,通常假设如果为输入大小并且显然,则单词大小。然后的加速比给出的多项式加速比。这使我相信,如果我要查找的问题存在,那不是多项式。(否则,我们可以通过更改常量的大小来获得恒定数量的I / O,这似乎不太可能)。w=Ω(logN)w=Ω(log⁡N)w = \Omega(\log N)NNNM&gt;wM&gt;wM > w2M2M2^MNNN

1
布隆过滤器哈希值:更多还是更大?
在实现布隆过滤器时,传统方法需要多个独立的哈希函数。 Kirsch和Mitzenmacher表明您实际上只需要两个,并且可以将其余部分作为线性组合生成。 我的问题是:两个散列函数和一个具有两倍熵的散列函数之间的区别是什么? 这是通过查看您对散列函数的输出实际执行的操作得出的:您将采用(例如)64位散列值并将其缩放为位向量的大小,该值可能明显小于2 64。显然,这是一种失去熵的转换(在极少数情况下,散列大小和过滤器容量完全一致)。假设我的过滤器具有少于2 个32个条目,那是什么使我无法将64位哈希值拆分为两个32位哈希并采用线性组合呢?还是用它来播种PRNG? 换句话说,为确保标准误报率成立,我实际上需要了解多少信息才能插入到Bloom过滤器中?或更笼统地说,我如何区分元素(使用多少位来描述元素)与Bloom过滤器的性能之间有什么关系? 似乎可以将位用于过滤器大小,或者等效地使用位来存储元素的误报概率为 ....2 升(米)2lg⁡(米)2\lg(m)米米m2 (lg(− n lnp)-2LG(ln2 ))2(lg⁡(-ñln⁡p)-2lg⁡(ln⁡2))2(\lg(-n\ln{p}) - 2\lg(\ln2))ññnppp

2
复杂度分析中平方根概念的著名示例
有许多算法和数据结构利用了在k = \ sqrt n处获得最小值的想法。常见的例子包括max{k,n/k}max{k,n/k}\max \left\{k, n/k\right\}k=n−−√k=nk=\sqrt n 婴儿步长巨步算法,用于计算O(\ sqrt n)中的离散对数O(n−−√)O(n)O(\sqrt n), O(n−−√)O(n)O(\sqrt n)时间和O(n)O(n)O(n)内存中的静态2D正交范围计数, 在O(\ sqrt [k] n)中具有EXTRACT-MIN O(n−−√k)O(nk)O(\sqrt[k] n)并且在O(1)中具有 DECREASE-KEY的优先级队列O(1)O(1)O(1), 在多项式时间内使用O(n−−√)O(n)O(\sqrt n)颜色为3色图着色, 仅举几个。 尽管此类算法通常不是最佳算法,但它们易于为学生所理解,并且可以快速证明幼稚的边界不是最佳算法。同样,由于缓存友好性(不考虑缓存无关紧要的技术),有时平方根思想数据结构比其基于二叉树的数据结构更实用。这就是为什么我在教学时会对此话题给予极大关注的原因。 我对这种更独特的示例感兴趣。因此,我正在寻找任何分析都基于平方根概念的(最好是优雅的)算法,数据结构,通信协议等。它们的渐近性不一定是最佳的。

1
订单维护问题(或“维护列表中的订单”)是为了支持以下操作: singleton:创建一个包含一个项目的列表,并返回指向它的指针 insertAfter:给定一个指向项目的指针,在其后插入一个新项目,并返回指向该新项目的指针 delete:给定指向项目的指针,将其从列表中删除 minPointer:给定两个指向同一列表中项目的指针,则返回更靠近列表前面的那个 我知道此问题的三种解决方案可以在摊销时间内执行所有操作。它们都使用乘法。O(1)O(1)O(1) Athanasios K. Tsakalidis:维护广义链表中的顺序 Dietz,P.,D. Sleator,两种用于维护列表顺序的算法 Michael A. Bender,Richard Cole,Erik D. Demaine,Martin Farach-Colton和Jack Zito,“维护列表中顺序的两种简化算法” 是否可以在摊销时间内以列表形式维护订单,而无需使用A C 0以外的任何算术运算?O(1)O(1)O(1)AC0AC0AC^0

2
一组部分有序元素的持久数据结构是什么?
我需要存储类型为a的元素集。类型a是部分排序的,因此比较和可以返回更小,更大,相等或不可比的结果。一种1个一种1个a_1一种2一种2a_2 哈希表的一个问题是,两个相等的元素可以用不同的方式表示,并且我无法访问与相等一致的哈希函数。 比较两个元素可能是一个漫长的过程,因此最小化比较会很有趣。如果需要,可以记住对比较运算符的调用。我现在意识到,我只需要存储反链(或者假设是这样)。更准确地说,我将需要执行的操作如下: 从反链中删除一个元素; 尝试添加一个元素。如果元素小于成员,则不要添加它,否则,添加它并删除所有小于它的元素。 我还可以用两个整数来绑定每个元素,因此,如果我知道和,那么知道立刻给我。当然,并不意味着 ...与完整的元素比较相比,找到整数范围是一个相对便宜的操作。一世1个&lt; a &lt; 我2一世1个&lt;一种&lt;一世2i_1 < a < i_2一世3&lt; b &lt; 我4一世3&lt;b&lt;一世4i_3 < b < i_4一世2&lt; 我3一世2&lt;一世3i_2 < i_3a &lt; b一种&lt;ba < b一世2≮ 我3一世2≮一世3i_2 \not< i_3一≮ b一种≮ba \not < b

1
在线传递闭包效果优于每个边添加的O(N ^ 2)
我正在寻找一种在线算法来维护有向无环图的传递闭合,其时间复杂度小于每个边添加的O(N ^ 2)。我当前的算法是这样的: For every new edge u-&gt;v connect all nodes in Pred(u) \cup { u } with all nodes in Succ(v) \ \cup { v }. 对于O(N ^ 2)边,这转化为O(N ^ 4)的总时间复杂度,这比例如Floyd-Warshall更差。


1
需要简要介绍数据简洁算法
(已经在主要网站上提出要求,但是在这里也要求获得更好的报道,抱歉) 由于我了解简洁的数据结构,因此迫切需要对这一领域的最新发展进行良好的概述。 我已经在Google上搜索并阅读了很多文章,这些文章是我在脑海中提出的,我可以在google搜索结果中看到的很多文章。我仍然怀疑我在这里错过了一些重要的事情。 以下是我特别感兴趣的主题: 二进制树的简洁编码,通过有效的操作来获取父树,左/右孩子,子树中的元素数量。 这里的主要问题如下:我所知道的所有方法都假定树节点以呼吸优先顺序枚举(例如在该领域的先驱工作中,Jacobson,G. J(1988)。简洁的静态数据结构),该方法没有似乎适合我的任务。我处理的是深度优先布局中给出的巨大的二叉树,而深度优先节点索引是其他节点属性的关键,因此更改树布局对我来说有一些成本,我希望将其最小化。因此,有兴趣参考其他BF树布局来获得对作品的引用。 外部存储器中的大型可变长度项数组。数组是不可变的:我不需要添加/删除/编辑项目。唯一的要求是O(1)元素访问时间和尽可能低的开销,这比直接的偏移量和大小方法更好。这是一些我收集的有关典型数据的统计信息: 典型的物品数量-数亿个,最高达数十毫巴; 大约30%的项目的长度不超过1 位; 40%-60%的项目长度小于8位; 只有百分之几的项目的长度在32到255位之间(限制为255位) 平均项目长度〜4位+/- 1位。 从理论上讲,商品长度的任何其他分布都是可能的,但所有实际有趣的情况下的统计数据都接近上述值。 链接到各种复杂性的文章,任何晦涩难懂的教程,或多或少有文献记载的C / C ++库,-在类似任务中对您有用的任何东西,或者您的有根据的猜测看起来像的东西-都应受到感激。 更新:我忘记添加问题1:我正在处理的二叉树是不可变的。我没有更改它们的要求,我只需要以各种方式遍历它们(总是从节点移动到子节点或到父节点),因此此类操作的平均成本为O(1)。 同样,典型的树有千千万万个节点,因此不应完全存储在RAM中。

1
重用5个独立的哈希函数进行线性探测
在通过线性探测解决冲突的哈希表中,为了确保期望的性能,哈希函数来自5个独立家族是必要且充分的。(充分性:“具有恒定独立性的线性探测”,Pagh等人,必要性:“关于线性探测和最小独立性要求的k独立性”,Pătraşcu和Thorup)O(1)O(1)O(1) 据我了解,已知最快的5个独立家庭使用列表。从这样的家族中选择一个功能可能会很昂贵,因此我想尽量减少这样做的次数,同时仍要防止算法复杂性攻击,如Crosby和Wallach的“通过算法复杂性攻击拒绝服务”中所述。我不太担心计时攻击(即带有秒表的对手)。重用相同功能的后果是什么: 当散列表太满时? 缩小不够完整的哈希表时? 重建具有太多“已删除”位设置的哈希表时? 在不同的哈希表中可能包含一些共同的键?ķķk ķķk

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.