Questions tagged «ds.data-structures»

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

2
是否可以在一个阵列中以O(1)推送/弹出时间实现三个堆栈?
使用一个固定大小的数组可以有效地实现两个堆栈:堆栈#1从左端开始向右增长,而堆栈#2从右端开始向左增长。三个堆栈是否可能相同? 更具体地说,在以下条件下是否可以实现三个堆栈: 您有一个固定大小的数组,可以容纳N个对象。 只要这三个堆栈大小之和小于N,push()就不会失败。 push()和pop()操作都应花费O(1)时间。 除了数组之外,您只能使用O(1)额外的空间。 这里是指那些解决方案的例子并不满足这些要求: 将数组拆分为3个固定部分,并将每个部分用于堆栈(违反2)。 与上述类似,但堆栈之间有可移动的边界(违反3)。 基于简单链表的实现(违反4)。 即使它们不能完全满足所有条件(1)-(4),我也会接受非平凡的算法或不可能证明,例如,推/弹出需要O(1)摊销时间的算法,或者额外的内存小于O(N),例如O(log N)。或者说不可能的证据表明,例如,每个推送/弹出操作访问少于5个数组元素是不可能的。

2
选择两个数字之和
这是最近的邻居问题。 给定实数(非常大的!),加上目标实数,找到SUM最接近和。我们允许对(最大为)进行合理的预处理/索引编制,但是在查询时间(给定)下,结果应该非常快地返回(例如时间。a1,…,ana1,…,ana_1, \ldots, a_nnnnppp一个一世一个一世a_i一个Ĵ一个Ĵa_jppp一个1个,… ,一个ñ一个1个,…,一个ña_1, \ldots, a_nØ (ñ 日志n )Ø(ñ日志⁡ñ)O(n \log n)pppO (对数n )Ø(日志⁡ñ)O(\log n) (简单的示例:如果我们只希望最接近的SINGLE,则可以离线对排序,一个一世一个一世a_ippp一个1个,… ,一个ñ一个1个,…,一个ña_1, \ldots, a_nØ (ñ 日志n )Ø(ñ日志⁡ñ)O(n \log n),然后在查询时进行二进制搜索, O (对数n )Ø(日志⁡ñ)O(\log n))。 无效的解决方案: 1)排序 一个1个,… ,一个ñ一个1个,…,一个ña_1, \ldots, a_n脱机,然后在查询时,从两端开始并向内移动两个指针(http://bit.ly/1eKHHDy)。不好,因为O (n )Ø(ñ)O(n) 查询时间。 2)排序 一个1个,… ,一个ñ一个1个,…,一个ña_1, \ldots, a_n 脱机,然后在查询时,将每个 一个一世一个一世a_i并对“伙伴”执行二进制搜索,以帮助其求和到接近。不好,因为查询时间为。pppØ (ñ 日志n )Ø(ñ日志⁡ñ)O(n \log n) 3)离线对所有对)进行排序,然后进行二进制搜索。不好,因为预处理。(一个1个,… …

1
堆排序:堆=〜快速排序:BST =〜合并排序:___?
请原谅标题的简洁性,我可能在简洁的祭坛上牺牲了清晰度。 可以看到,将数组的元素插入到二进制搜索树中并读出来(在插入时)需要与在该数组上运行Quicksort相同的比较。Quicksort使用的枢轴顺序是插入二分搜索树的顺序。 对于Heapsort和heap来说,这也是微不足道的,因为Heapsort实际上是在进行一系列插入,然后将元素读回。 在Mergesort的情况下,是否存在类似的东西?这里是否存在更深层次的联系,还是数据结构和排序算法之间有趣的巧合?

2
和亚线性空间中的几乎通用字符串哈希
这是字符串上的两个哈希函数族:X⃗ = ⟨X0X1个X2…X米⟩x→=⟨x0x1x2…xm⟩\vec{x} = \langle x_0 x_1 x_2 \dots x_m \rangle 对于素数和,对于\ in \ mathbb {Z} _p。Dietzfelbinger等。在“多项式哈希函数可靠”中显示\ forall x \ neq y,P_a(h ^ 1_a(x)= h ^ 1_a(y))\ leq m / p。pppX一世∈žpxi∈Zpx_i \in \mathbb{Z_p}H1个一个(X⃗ )= ∑一个一世X一世模pha1(x→)=∑aiximodph^1_{a}(\vec{x}) = \sum a^i x_i \bmod p一∈žpa∈Zpa \in \mathbb{Z}_p∀ X ≠ ÿ,P一个(H1个一个(x )=H1个一个(y))≤ 米/ p∀x≠y,Pa(ha1(x)=ha1(y))≤m/p\forall x …

2
子集查找算法
假设我有一个列表子集的。如有必要,我可以对此列表进行预处理。进行此预处理后,将看到另一个集合。我想用来识别任何集合。XX\cal X{1,...,n}{1,...,n}\{1, ..., n\}A⊆{1,...,n}A⊆{1,...,n}A \subseteq \{1, ..., n \}B∈XB∈XB \in \mathcal XB⊆AB⊆AB \subseteq A 最明显的算法(无任何预处理)需要时间 -您只需测试针对每个分开。有什么比这更好的了吗?O(n|X|)O(n|X|)O(n |\cal X|)AAAB∈XB∈XB \in \mathcal X 如果有帮助,您可以假设,对于任何,匹配的总数都由类的东西来界定。AAAB∈XB∈XB \in \mathcal XO(1)O(1)O(1)

2
搜索树木集合的高效算法
我有大量的树木数据集,我想通过指定一个treelet(连接的子图)进行搜索。查询应返回数据集中所有小树的出现。 有有效的算法可以做到吗? 我想到的是后缀数组,但是,天真地将树编码为字符串(按其节点的固定遍历顺序)将不起作用,因为搜索小树可以是任意形状。 更新: 有关我期望的典型实例的一些详细信息: 数据集将至少包含数万棵树,每棵树包含约20至30个节点。树不会不是二叉树,但是每个节点的典型子节点数会很小(通常不大于4或5,尽管在某些退化的情况下可以达到约30)。标签的数量将是数万个。 对于NLP应用程序,我需要这样做:每棵树将成为句子的依存关系分析,每个节点代表一个单词出现,每个标签为一个字典单词(带有某种修饰)。

2
是否存在用于快速列表操作和订单查询的数据结构?
我们有一个集合中的元素列表。中的每个元素都显示在L中的单个列表中。我正在寻找可以执行以下更新的数据结构:LLLN={1,2,3,...,n}N={1,2,3,...,n}N = \{ 1, 2, 3, ..., n \}NNNLLL concat(x,y)concat(x,y)concat(x, y):将包含y的列表连接yyy到包含x的列表的末尾xxx split(x)split(x)split(x):含有分割列表xxx后直接xxx 它还需要执行以下查询: follows(x,y)follows(x,y)follows(x, y):返回truetruetrue,如果xxx和yyy是在同一列表和yyy后自带xxx(但不一定是相邻的xxx) first(x)first(x)first(x):返回包含x的列表的第一个元素xxx next(x)next(x)next(x):返回下一个元素后xxx在含列表xxx 我已经想出了一个数据结构,该结构在O(lg ^ 2(n))中执行这些更新,O(lg2(n))O(lg2(n))O(lg^2 (n))并在O(lg(n))O(lg(n))O(lg (n))时间内进行查询。我最感兴趣的是是否已经有一个数据结构可以做到这一点(希望更快吗?)。 动机:可以用其中的两个列表集来表示有根的定向森林,它们可以快速计算此类森林的可达性。我想看看它们还有什么用,如果所有这些都已知。

1
确定一个通配符字符串是否与集合中的另一个通配符字符串完全匹配
这是困扰我一段时间的问题。假设字符串是1和0 的序列,通配符字符串是1、0和?s的序列。所有字符串和通配符字符串具有相同的长度。这些是标准的UNIX通配符。10 ?? 1匹配10011、10111等-a?在该位置匹配1或0。如果和是通配符字符串,那么如果与匹配的每个字符串也与匹配,则我们写。vvvwwwv ≤ w ^v≤wv \leq wvvvwww 问题:给定一组通配符字符串和一个查询(也是通配符字符串),是否存在使得吗?如果不是,我们可以有效地将添加到吗?小号SSvvvw ^ ∈ 小号w∈Sw \in Sv ≤ w ^v≤wv \leq wvvv小号SS 这是显而易见的解决方案(其中是字符串的大小,是RAM的字大小(通常为32或64)):遍历列表中的每个元素并进行测试条件(可以使用位旋转2或3个操作来完成)。还要在扫描时测试是否适合任何。如果未能通过我们的测试,则将添加到集合中,并删除我们标记的。O (ķ米n )O(kmn)O(\frac{k}{m}n)ķkk米mmv ≥ w ^v≥wv \geq wwwwvvvvvvwww 但这还不够快。如果有解决方案,或者在理想情况下,复杂度类似于基数树(),那真的很酷。查询大致正确也可以:即,如果,则返回yes或no;否则,返回false。但是如果条件不成立,则绝对不返回。O (对数n )O(log⁡n)O(\log n)O(k)O(k)O(k)v≤wv≤wv \leq w 尽管这并不能解决最坏的情况,但是您可以假定中的所有元素都由通配符字符串限制;也就是说,存在一些,使得对于所有,。SSSvvvw∈Sw∈Sw \in Sv≥wv≥wv \geq w 我尝试过的想法 通配符字符串形成联接符号。我们可以有一棵包含通配符字符串的n元树;叶子将是通配符字符串,分支将代表所有子代的联接。如果查询和联接是不可比拟的,那么我们不必浪费时间尝试与该分支的所有子代进行比较。此外,如果我们进行更新,而该更新恰好大于联接,则可以简单地删除整个分支。不幸的是,在最坏的情况下,这仍然是,并且在遍历树中添加元素时,我们并不总是找到建立的“最佳”联接。O(n)O(n)O(n) 一个可以形成的基数树根。我们知道由一些通配符字符串限制;假设它是0到0。然后,特里树的所有分支只需位于字符串的第1位和第3位。如果查询的当前位是1,则必须检查?。1个分支;如果为0,我们检查?0个分支;如果是?,我们只检查?。科。因为我们必须潜在地采取多个分支,所以这看起来不太好(出于相同的原因很难更新trie)。由于匹配是非常快速的操作,因此与幼稚的策略相比,在树中进行大量遍历会比较麻烦(遵循一堆指针比进行一些OR和AND的代价高得多)。SSSSSS 相关工作 在网络社区中,此问题表现为“数据包分类”,这是对已知算法和数据结构的良好概述。不幸的是,几乎总是假设通配符字符串仅匹配前缀,并且查询是此类字符串的元组。当然,我们总是可以转换通用通配符字符串来满足以下条件:1?00?1 ?? 是(1,?,0,0,?,1,?,?)。但是,这将是无效的。做出的另一个假设是,这些元组与“颜色”相关联,并且查询应返回颜色(不仅仅是匹配的颜色)。这使问题变得更加困难,因为我们必须对元组进行排序(否则,(0,?)和(?,1)中的哪一个与(0,1)相匹配是模棱两可的)。 在算法社区中,我发现了很多与查找与“无关”匹配的子字符串相关的结果。这是一个相当困难的问题,我无法真正利用任何技术。 结论 谢谢你的帮助!

2
地图树的最佳数据结构是什么。
我正在寻找一种数据结构,它基本上是一棵地图树,其中每个节点上的地图都包含一些新元素以及其父节点地图中的元素。这里的映射是指具有键和值的编程映射,例如STL中的映射或python中的dict。 例如,可能有一个根节点: root = {'car':1, 'boat':2} 和2个子级,每个子级都向父级地图添加一个元素 child1 = {'car':1, 'boat':2, 'jet':35} child2 = {'car':1, 'boat':2, 'scooter':-5} 我希望这是尽可能节省空间的,即我不想在每个节点上存储结果图的完整副本,但理想情况下,查找仍然是O(log N),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.