Questions tagged «data-structures»

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

6
从一组对中生成组合而无需重复元素
我有一对。每对都具有(x,y)的形式,使得x,y属于范围内的整数[0,n)。 因此,如果n为4,那么我有以下几对: (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) 我已经有一对了。现在,我必须使用n/2对构建一个组合,这样就不会重复任何整数(换句话说,每个整数在最终组合中至少出现一次)。以下是正确和不正确组合以更好地理解的示例 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere] 2. (0,2)(1,3) [Correct] 3. (1,3)(0,2) [Same as 2] 一旦我有了配对,有人可以建议我一种生成所有可能组合的方法。

1
平衡二叉树的两种定义
我已经看到了平衡二叉树的两个定义,它们对我来说看起来有所不同。 如果二叉树认为每个节点的左子树中的内部节点数与右子树中的内部节点数最多相差1,则该树是平衡的。 如果对于任何两个叶子,深度差最大为1,则二叉树是平衡的。 是否满足def的每棵树。1也满足def。2?反过来呢?

2
具有在摊销时间内搜索,插入和删除的数据结构
是否有数据结构可维护在摊销时间内支持以下操作的有序列表?O(1)Ø(1个)O(1) GetElement(k):返回列表的第个元素。kķk InsertAfter(x,y):将新元素y插入x后面的列表中。 Delete(x):从列表中删除x。 对于最后两个操作,您可以假定x是直接作为指向数据结构的指针而给出的。InsertElement返回y的相应指针。InsertAfter(NULL,y)在列表的开头插入y。 例如,从一个空的数据结构开始,以下操作将更新有序列表,如下所示: InsertAfter(NULL,a) ⟹⟹\implies [一种] InsertAfter(NULL,b) ⟹⟹\implies [b,a] InsertAfter(b,c) ⟹⟹\implies [b,c,a] InsertAfter(a,d) ⟹⟹\implies [b,c,a,d] 删除(c) ⟹⟹\implies [b,a,d] 在这五个更新之后,GetElement(2)应该返回d,而GetElement(3)应该返回一个错误。

5
有防布隆过滤器吗?
一个布隆过滤器能够有效地跟踪是否处理过程中已经遇到的各种值。当有许多数据项时,布隆过滤器可以节省散列表上的大量内存。与哈希表共享的Bloom筛选器的主要功能是,如果某项不是新项,则始终显示“ not new”,但将项标记为“ not new”的可能性不为零。即使是新的。 是否有行为相反的“抗布鲁姆过滤器”? 换句话说:是否存在一个有效的数据结构,如果某项是新项,它会显示“ new”,但对于某些非新项也可能会显示“ new”? 保留所有先前看到的项(例如,在排序的链表中)可以满足第一个要求,但可能会占用大量内存。考虑到第二个要求放宽,我希望这也是不必要的。 对于那些更喜欢正式对待的人,如果Bloom过滤器认为是新的,则写,否则,写,如果确实是新的,写,而否则。b (x )= 1b(x)=1b(x) = 1Xxxb (x )= 0b(x)=0b(x) = 0n (x )= 1n(x)=1n(x) = 1Xxxn (x )= 0n(x)=0n(x) = 0 然后 ; ; ; ,对于某些。Pr [ b (x )= 0 | n (x )= 0 ] = 1Pr[b(x)=0|n(x)=0]=1Pr[b(x) = …

1
为什么展开树旋转算法会同时考虑父节点和祖父母节点?
我不太了解为什么splay树数据结构中的轮换不仅要考虑评级节点的父级,还要考虑祖父母(zig-zag和zig-zig操作)。为什么以下方法不起作用: 例如,当我们插入树的新节点时,我们检查是否插入到左或右子树中。如果插入到左侧,则将结果向右旋转,反之亦然,将右子树旋转。递归就是这样 Tree insert(Tree root, Key k){ if(k < root.key){ root.setLeft(insert(root.getLeft(), key); return rotateRight(root); } //vice versa for right subtree } 那应该避免整个“花花公子”程序,你不觉得吗?

2
高效的地图数据结构,支持近似查找
我正在寻找一种数据结构,该结构支持有效的键近似查找(例如,字符串的Levenshtein距离),并为输入键返回最接近的匹配项。到目前为止,我找到的最合适的数据结构是Burkhard-Keller树,但是我想知道是否还有其他/更好的数据结构用于此目的。 编辑:我的具体情况的更多详细信息: 字符串之间的Levenshtein差异通常很大。 字符串的最大长度约为20到30个字符,平均长度接近10到12个字符。 我对有效查找比对插入更感兴趣,因为我将构建一组要有效查询的大部分静态数据。

3
检索动态图的最短路径
我目前正在研究有向图中的最短路径。有许多有效的算法可用于查找网络中的最短路径,例如dijkstra算法或bellman-ford算法。但是,如果图形是动态的,该怎么办?我说动态是指我们可以在程序执行期间插入或删除顶点。我正在尝试找到一种有效的算法,用于在插入边e之后更新从顶点到每个其他顶点u的最短路径,而无需在新图中再次运行最短路径算法。我怎样才能做到这一点?提前致谢。vvvüuuËee 注意:更改可以在算法的第一次迭代后完成 注[2]:两个节点中给出,源和Ť目标。我需要找到这些节点之间的最短路径。当图形更新时,我只需要更新π (s ,t ),这是s和t之间的最短路径。sssŤttπ(s ,t )π(s,t)\pi(s,t)sssŤtt 注意[3]:我只对边缘插入盒感兴趣。 正式定义:给定一个图。定义一个更新操作作为1)的边缘的插入ë到ë或2)的边缘的氨基酸缺失ë从ë。目的是有效地找到更新操作后所有对最短路径的成本。有效地,我们的意思至少比每次更新操作后执行All-Pairs-Shortest-Path算法(例如Bellman-Ford算法)更好。G = (V,E)G=(V,E)G = (V,E)ËeeËEEËeeËEE 编辑:下面是问题的简化版本: 给出了一个加权图,该图由单向边以及两个关键顶点s和t组成。还给出了候选双向边缘的集合C。我必须建立一个边缘(Û ,v )∈ Ç以最小化从距离小号到吨。ģ (V,E)G(V,E)G(V,E)sssŤttCCC(Û ,v )∈ Ç(u,v)∈C(u,v) \in CsssŤtt

1
绳索上有相当于范·埃姆德·博阿斯的树木吗?
我认识的某个人正在计划在不久的将来实现文本编辑器,这促使我思考一下哪种类型的数据结构对于文本编辑器来说是最快的。最常用的结构显然是绳索或间隙缓冲器。 Van Emde Boas树大约是最快的优先级队列,如果您不介意可放入其中的项目数上限和较大的初始化成本。我的问题是,是否存在某些数据结构与van Emde Boas树一样快,但是支持文本编辑器操作。 我们只需要在数据结构中支持最多字符(因此,如果,则我们最多支持4GB的ASCII字符)。我们有时间来初始化新的数据结构。我们希望支持以下操作:mmmlogm=32log⁡m=32\log m = 32m−−√m\sqrt{m} 在中的位置处插入一个字符(从而将每个后续字符的位置增加1)。iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) 在位置删除一个字符在。iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) 在位置返回字符在。iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) 因此,insert(0,'a')后接insert(0,'b')会得出“ ba”。 更好的是: 返回一个“指针”一些索引在。iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) 给定一个“指针”,返回中此位置的字符。O(1)O(1)O(1) 给定一个“指针”,删除中此位置的字符。O(1)O(1)O(1) 给定“指针”,在此位置添加一个字符,然后将指针返回到以下位置。O(1)O(1)O(1) (可选)给定“指针”,将“指针”返回到的下一个/上一个字符。O(1)O(1)O(1)

1
填充糕点的路由表如何工作?
此问题是从软件工程堆栈交换迁移的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 我正在尝试实现Pastry Distributed Hash Table,但是有些事情使我无法理解。我希望有人能澄清一下。 免责声明:我不是计算机科学专业的学生。我一生中刚上过两门计算机科学课程,但都没有涉及任何远程复杂的问题。我从事软件工作已经有多年了,所以如果我能将想法付诸实践,我觉得我已经完成了实现任务。因此,我可能只是缺少一些明显的东西。 我已经阅读了作者发表的论文[1],并且取得了一些不错的进步,但是我一直对路由表的工作原理这一点感到困惑: 该文件声称 一个节点的路由表中,RRR,被组织成⌈log2bN⌉⌈log2b⁡N⌉\lceil \log_{2^b} N\rceil 与行2b−12b−12^b - 1每个条目。路由表第n行的2b−12b−12^b - 1条目均引用一个节点,该节点的nodeId在前n位共享当前节点的nodeId,但其n + 1位具有2 b − 1可能值之一,而不是所述ñ + 1个数位在本节点的id。nnnn+1n+1n + 12b−12b−12^b - 1n+1n+1n + 1 的bbb代表一个应用程序特定的变量,通常是444。为了简单起见,让我们使用b=4b=4b=4。所以上面是 一个节点的路由表中,RRR,被组织成 ⌈log16N⌉⌈log16⁡N⌉\lceil \log_{16} N\rceil与行151515的每个条目。路由表第n行的151515个条目均引用一个节点,该节点的nodeId在前n个数字中共享当前节点的nodeId,但其n + 1个数字具有除n +以外的2 b - 1可能值之一当前节点ID中的第1位数字。nnnn+1n+1n + 12b−12b−12^b - 1n+1n+1n + 1 我很了解 此外,NNN是群集中服务器的数量。我也知道 …


2
哪种数据结构组合可以有效地存储离散贝叶斯网络?
我了解贝叶斯网络背后的理论,并且想知道在实践中建立贝叶斯网络需要做什么。假设在这个例子中,我有一个由100个离散随机变量组成的贝叶斯网络(有向网络)。每个变量最多可以使用10个值之一。 我是否将所有节点都存储在DAG中,并且为每个节点存储其条件概率表(CPT)?当某些CPT更改时(除DAG使用的那些CPT以外),我还应使用其他数据结构来确保有效地计算值吗?

1
AVL树不平衡吗?
在上一个问题中,有一个平衡树的定义和一个关于红黑树的问题。 这个问题是要问同样的问题,但对于AVL树。 问题是,鉴于平衡树的定义与其他问题相同,μμ\mu 是否有一些使所有足够大的AVL树达到平衡?μμ > 0μ>0\mu \gt 0μμ\mu 我认为AVL树只有一种定义,没有歧义。

8
是否每个数据类型都可以归结为带有指针的节点?
数组或向量只是一系列值。它们肯定可以通过链表实现。这只是一堆带有指向下一个节点的指针的节点。 堆栈和队列是Intro CS课程中通常教授的两种抽象数据类型。在课堂上的某个地方,学生通常不得不使用链接列表作为基础数据结构来实现堆栈和队列,这意味着我们回到了相同的“节点集合”的想法。 可以使用堆创建优先级队列。堆可以看作是一棵以最小值为根的树。各种树(包括BST,AVL,堆)都可以看作是由边连接的节点的集合。这些节点链接在一起,其中一个节点指向另一个节点。 似乎每个数据概念总是可以归结为仅带有指向其他某个适当节点的指针的节点。那正确吗?如果这么简单,为什么教科书不解释数据仅仅是一堆带有指针的节点呢?我们如何从节点转到二进制代码?

4
集合相交的数据结构?
是否有任何数据结构可以维护(有限基础集的)集合的集合,从而支持以下操作?任何亚线性运行时间将不胜感激? 初始化一个空集。 将元素添加到集合中。 给定两个集合,报告它们是否相交。

1
无锁,恒定的更新时间并发树数据结构?
我最近阅读了一些文献,并且发现了一些相当有趣的数据结构。 我研究了各种不同的方法来将更新时间降低到最坏情况下的更新时间[1-7]。O(1)O(1)\mathcal{O}(1) 最近,我开始研究无锁数据结构,以支持有效的并发访问。 在无锁数据结构的实现中是否使用了这些最坏情况下的更新时间技术?O(1)O(1)\mathcal{O}(1) 我问是因为 在我看来,它们似乎是这种“理论上的增强”的明显实践扩展。 Tarjan,Robert Endre。“以O(1)循环更新平衡的搜索树。”《信息处理快报》,第16号,否。5(1983):253 – 257。 Driscoll,JR,N Sarnak,DD Sleator和RE Tarjan。“使数据结构持久化”。在第18届ACM计算理论年度学术会议论文集中,109-121。STOC '86。美国纽约州:ACM,1986年。 Levcopoulos,C。和Mark H. Overmars。“具有O(1)最坏情况更新时间的平衡搜索树。” Acta Inf。26号 3(1988年11月):269-277。 鲁道夫·弗莱舍。具有O(1)最坏情况更新时间的简单平衡搜索树 Dietz,Paul F和Rajeev Raman。“一个恒定的更新时间手指搜索树。”信息处理,第52号信。3(1994):147 – 154。 Lagogiannis,George,Christos Makris,Yannis Panagis,Spyros Sioutas和Kostas Tsichlas。“具有最坏情况下恒定更新时间的新动态平衡搜索树。” J. Autom。郎 梳子。8号 4(2003年7月):607-632。 Brodal,GerthStølting,George Lagogiannis,Christos Makris,Athanasios Tsakalidis和Kostas Tsichlas。“指针机器中的最佳手指搜索树。” J. Comput。Syst。科学 67号 2(2003年9月):381-418。

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.