Questions tagged «data-structures»

有关存储数据的方式的问题,以便可以通过算法方便地使用它。

1
是否存在固定大小的现有数据结构,如果插入了新元素,该结构将推出最旧/最后一个元素?
我正在寻找一个数据结构,如果插入了新元素,它将推出其最早/最后的元素。例如,让我们D代表结构。D包含3个类型Number D的默认值的元素将被初始化为1, 2和3。 d = [ 1 ,2 ,3 ]d=[1个,2,3]D = [1, 2, 3] 如果Number将包含值5的插入D,3则会将推出,而1和2会向右移。 d = [ 5 ,1 ,2 ]d=[5,1个,2]D = [5, 1, 2] 首先想到的是一个数组,但是定义不包括推送行为。

1
基于分区细化的算法比对数线性时间运行更快的问题
分区优化是一种从有限的对象集开始并逐步拆分对象集的技术。使用分区细化可以非常有效地解决某些问题(例如DFA最小化)。除了Wikipedia页面上列出的问题之外,我不知道通常可以使用分区优化来解决任何其他问题。在所有这些问题中,维基百科页面提到了两个基于线性分区优化的算法。有按字典顺序排序的拓扑排序[1]和按字典广度优先搜索的算法[2]。 是否还有其他示例或对可以使用分区细化有效解决的问题的引用,这在时间上比对数线性好? [1] Sethi,Ravi,“在两个处理器上调度图形”,SIAM计算杂志5(1):73-82,1976年。 [2] Rose,DJ,Tarjan,RE,Lueker,GS,“图上顶点消除的算法方面”,SIAM计算杂志5(2):266-283,1976。

1
SAT本地搜索的支持数据结构
WalkSAT和GSAT是解决布尔可满足性问题的众所周知的简单本地搜索算法。从实现GSAT算法-如何选择要翻转的文字的问题中复制了GSAT算法的伪代码。并在下面介绍。 procedure GSAT(A,Max_Tries,Max_Flips) A: is a CNF formula for i:=1 to Max_Tries do S <- instantiation of variables for j:=1 to Max_Iter do if A satisfiable by S then return S endif V <- the variable whose flip yield the most important raise in the number of satisfied clauses; S …

2
创建自排序二叉树
我有一个作业,需要使用二叉搜索树并将其更改为自身自定序,以使访问最多(优先级更高)的项目位于树的顶部,根是访问最多的节点。 教授给了我可以使用的BST和节点结构,但是在插入事物时试图让我的脑袋绕开更新树的算法,这使我感到困惑。 我知道随着插入的进行,它会检查当前节点的数据是否小于或大于当前节点,然后递归地以正确的方向运行,直到找到空指针并将其自身插入那里。并将其插入后将优先级增加1。 template <class Type> void BinarySearchTree<Type> :: insert( const Type & x, BinaryNode<Type> * & t ) { if( t == NULL ) t = new BinaryNode<Type>( x, NULL, NULL ); else if( x < t->element ) insert( x, t->left ); else if( t->element < x ) insert( …

5
有效压缩未标记的树木
考虑未标记的,有根的二叉树。我们可以压缩这些树:每当有指向子树TŤT和T′Ť′T'与T=T′Ť=Ť′T = T'(解释===为结构相等),我们店(wlog)TŤT并更换所有指针T′Ť′T'与指针TŤT。有关示例,请参见uli的答案。 给出一种将上述意义上的树作为输入并计算压缩后剩余的(最小)节点数的算法。该算法应在时间O(nlogn)Ø(ñ日志⁡ñ)\cal{O}(n\log n)(在统一成本模型中)运行,输入中的节点数为nñn。 这是一个考试问题,我无法提出一个很好的解决方案,也没有看到一个解决方案。

2
实际中是否已将链接剪切树用于最大流量计算或其他应用程序?
通过使用动态树(也称为链接剪切树),我通常会看到许多实现的最大流算法,狄尼克算法,推入重贴标签以及其他算法可以改善其渐近时间成本。 推重贴标签通常在或或,但带有动态树Ø (V2Ë)Ø(V2Ë)O(V^2E)Ø (V3)Ø(V3)O(V^3)Ø (V2Ë--√)Ø(V2Ë)O(V^2\sqrt{E})Ø (VË日志(五2/ E))Ø(VË日志⁡(V2/Ë))O(VE \log(V^2/E)) Dinic的算法在,但具有动态树Ø (V2Ë)Ø(V2Ë)O(V^2E)Ø (VË日志(五))Ø(VË日志⁡(V))O(VE\log(V)) 但是,大多数库中的最大流算法的实际实现似乎并未利用此数据结构。在实践中是否曾使用动态树进行最大流量计算?还是它们承担了过多的开销以至于无法解决现实世界中的问题规模? 是否还有其他使用链接剪切树的问题域? 这个问题与我在cstheory上提出的一个问题有关:现有技术中的最大流量算法是否可行?

12
用于快速查找字符串之间差异的数据结构或算法
我有一个100,000个字符串数组,长度均为。我想将每个字符串与其他每个字符串进行比较,看看是否有两个字符串相差1个字符。现在,当我将每个字符串添加到数组时,我正在将其与数组中已有的每个字符串进行比较,该字符串的时间复杂度为。kkkn(n−1)2kn(n−1)2k\frac{n(n-1)}{2} k 是否有一种数据结构或算法可以比我已经做的更快地将字符串相互比较? 一些其他信息: 顺序很重要:abcde和xbcde相差1个字符,而abcde和edcba相差4个字符。 对于每一个相差一个字符的字符串对,我将从数组中删除其中一个字符串。 现在,我正在寻找仅相差1个字符的字符串,但是如果可以将1个字符的差异增加到例如2个,3个或4个字符,那就太好了。但是,在这种情况下,我认为效率比提高字符差异限制的能力更为重要。 kkk通常在20-40的范围内。

1
为什么函数式编程没有研究动态树?
动态树在解决诸如网络流,动态图,组合问题(Tarjan和Werneck的“实践中的动态树”)以及最近合并的字典(Adam Karczmarz的“ A Simple Mergeable Dictionary”)等问题中起着重要的作用, 对于动态树,我指的是1983年Sleator&Tarjan的论文“动态树的数据结构”中所述的定义。此后,在功能编程研究领域几乎没有发表任何努力。 Edward Kmett实施了ST树的一个版本,主要是作为C ++对应版本的翻译,请参阅Link-cut树。 克里斯·冈崎(Chris Okasaki)在他着名的《纯函数数据结构》一书中对Splay树做了有限的实现。 Ralf Hinze和Ross Paterson引入了称为2-3手指树的功能数据结构,但其目标与动态树的原始定义有所不同。 动态树的实现(可能是性能)根据三种方法进行划分: 线性化,其中ET树(Euler游览)发挥了重要作用。找不到纯粹的功能研究。 ST树是旗舰的路径分解,刚刚发现了Kmett的版本。 树收缩,其中顶级树,拓扑树和RC树是参与者。找不到纯粹的功能研究。 可以在Splay,AVL,红黑树上找到纯功能分析和实现,但不是动态树。前者被视为后者的影子(也称为虚拟或辅助)数据结构。 所以,我的问题是: 函数式编程研究社区不参与动态树数据结构的原因(缺点,弱点)是什么?

1
可以使哪些类的数据结构持久化?
持久数据结构是不可变的数据结构。对它们的操作将返回数据结构的新“副本”,但会被操作更改;尽管旧的数据结构保持不变。通常,通过共享一些基础数据并避免完全复制数据结构来实现效率。 问题: 是否存在关于可以使数据结构类别持久化(同时保持相同或非常相似的复杂性)的结果? 是否可以使所有数据结构具有持久性(同时保持相同或非常相似的复杂性)? 是否已知任何数据结构无法持久化(同时保持相同或非常相似的复杂性)?

1
最近N个数字的加权和
假设我们正在接收流中的数字。接收到每个数字后,需要计算最后数字的加权和,其中权重始终相同,但是是任意的。ñNN 如果允许我们保留数据结构来帮助计算,那么这样做的效率如何?我们能做得比更好的方法吗,即每次收到一个数字都重新计算总和?Θ (N)Θ(N)\Theta(N) 例如:假设权重为。在某一点上,我们有最后数字的列表和加权和。Ñ 大号1 = ⟨ 一个,b ,c ^ ,d ⟩ > 小号1 = 瓦特1 * 一个+ 瓦特2 * b + 瓦特3 * C ^ + 瓦特4 * dw ^= ⟨ 瓦特1个,w2,w3,w4⟩W=⟨w1,w2,w3,w4⟩W= \langle w_1, w_2, w_3, w_4\rangleñNN大号1个= ⟨ 一个,b ,c ^ ,d⟩ >L1=⟨a,b,c,d⟩>L_1= \langle a, b, c, d \rangle>小号1个= …

1
Ukkonen算法的运行时间如何取决于字母大小?
我担心Ukkonen算法的渐近运行时间问题,它可能是在线性(?)时间构造后缀树的最流行算法。 这是丹·古斯菲尔德(Dan Gusfield)撰写的《关于字符串,树和序列的算法》(第6.5.1节)的引用: “ ... Aho-Corasick,Weiner,Ukkonen和McCreight算法都需要空间,或者O (m )时限应替换为O (m log m )和O的最小值(m log | Σ |) ”。Θ (m | Σ |)Θ(米|Σ|)\Theta(m|\Sigma|)O (米)Ø(米)O(m)Ø (米日志m )Ø(米日志⁡米)O(m \log m)Ø (米日志| Σ | )Ø(米日志⁡|Σ|)O(m \log|\Sigma|) [ 是字符串长度,Σ是字母的大小]米米mΣΣ\Sigma 我不明白为什么这是真的。 空间:好吧,如果我们使用大小为数组表示节点外的分支,那么实际上,我们最终会占用Θ (m | Σ |)空间。但是,据我所知,还可以使用哈希表(例如Python中的字典)存储分支。这样一来,我们将只将Θ (m )指针存储在所有哈希表中(因为树中有Θ (m )个边),同时仍然能够访问O (1 )中的子节点。Θ(|Σ|)Θ(|Σ|)\Theta(|\Sigma|)Θ (米|Σ|)Θ(m|Σ|)\Theta(m|\Sigma|)Θ (米)Θ(m)\Theta(m)Θ (米)Θ(米)\Theta(m)Ô (1 )Ø(1个)O(1) …


1
保存数组初始化
我最近读到,有可能不需要初始化数组,即可以使用它们而不必花费任何时间尝试将每个成员设置为默认值。即,您可以开始使用数组,就好像它已被默认值初始化一样,而不必初始化它。(对不起,我不记得我在哪里读到的)。 例如,为什么这可能令人惊讶: 假设您正在尝试为[ 1 ,n 2 ]范围内的整数的最坏情况O(1)O(1)\mathcal{O}(1)哈希表建模 (针对每个插入/删除/搜索)。[1,n2][1,n2][1, n^2] 您可以分配大小为位的数组,并使用各个位来表示哈希表中是否存在整数。注意:分配内存被视为O(1 )时间。n2n2n^2O(1)O(1)\mathcal{O}(1) 现在,如果您根本不必初始化此数组,则此哈希表上的任何说运算的序列现在都是最坏的情况O(n )。nnnO(n)O(n)\mathcal{O}(n) 因此,实际上,您有一个“完美的”哈希实现,对于操作序列,它使用Θ (n 2)空间,但运行时间为O(n )!nnnΘ(n2)Θ(n2)\Theta(n^2)O(n)O(n)\mathcal{O}(n) 通常,您会希望您的运行时至少与您的空间使用情况一样糟糕! 注意:上面的示例可能用于稀疏集或稀疏矩阵的实现,所以我想这不仅具有理论意义。 所以问题是: 如何有一个像数据结构这样的数组,使我们可以跳过初始化步骤?


2
垂直能见度问题的高效算法
在思考一个问题时,我意识到我需要创建一种有效的算法来解决以下任务: 问题:我们给了nnn边的二维方盒,其边与轴平行。我们可以从顶部进行调查。但是,也有mmm水平段。每段具有的整数yyy -协调(0≤y≤n0≤y≤n0 \le y \le n)和xxx坐标- (0≤x1&lt;x2≤n0≤x1&lt;x2≤n0 \le x_1 < x_2 \le n)并连接点(x1,y)(x1,y)(x_1,y)和(x2,y)(x2,y)(x_2,y)(看下图)。 我们想知道,对于框顶部的每个单元段,如果我们仔细观察该段,可以在框内垂直看到多深。 x∈{0,…,n−1}x∈{0,…,n−1}x \in \{0,\dots,n-1\}maxi: [x,x+1]⊆[x1,i,x2,i]yimaxi: [x,x+1]⊆[x1,i,x2,i]yi\max_{i:\ [x,x+1]\subseteq[x_{1,i},x_{2,i}]} y_i 示例:给定和分段,如下图所示,结果为。看看有多深的光线可以进入盒子。米= 7 (5 ,5 ,5 ,3 ,8 ,3 ,7 ,8 ,7 )n=9n=9n=9m=7m=7m=7(5,5,5,3,8,3,7,8,7)(5,5,5,3,8,3,7,8,7)(5, 5, 5, 3, 8, 3, 7, 8, 7) 对我们来说幸运的是,和都非常小,我们可以离线进行计算。米nnnmmm 解决此问题的最简单算法是蛮力:对于每个段,遍历整个数组并在必要时进行更新。然而,它给我们不是很可观。O(mn)O(mn)O(mn) 很大的改进是使用了一个片段树,该树能够在查询过程中最大化片段上的值并读取最终值。我不会进一步描述它,但是我们看到时间复杂度是。O((m+n)logn)O((m+n)log⁡n)O((m+n) \log n) 但是,我想出了一个更快的算法: 大纲: 按坐标的降序对段进行排序(线性时间使用计数排序的变化)。现在注意,如果以前任何段都被任何段覆盖,则随后的任何段都不能再束缚通过该段的光束。然后,我们将从框的顶部到底部进行扫线。yyyxxxxxx …

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.