Questions tagged «data-structures»

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

4
计算两个大集合之间的集合差
我有两个大的整数集的AAA和BBB。每组有大约一百万个条目,每个条目是一个正整数,最长为10位数字。 计算A∖BA∖BA\setminus B和的最佳算法是什么B∖AB∖AB\setminus A?换句话说,如何有效地计算不在B中的条目列表,反之亦然?代表这两组数据,使这些操作高效的最佳数据结构是什么?AAABBB 我能想到的最好方法是将这两个集合存储为排序列表,并以线性方式将AAA每个元素与每个元素进行比较BBB。我们可以做得更好吗?

1
实践中的通用哈希
如果 ,则哈希函数族是通用的 您可以在此Wikipedia 文章中找到有关通用哈希的更多信息。HHH^ h :ü→ { 0 ,… ,M− 1 }H:ü→{0,…,中号-1个}h: U \rightarrow \{0,\ldots,M-1\}∀ X , ÿ∈ ü,x ≠ y⇒ 镨ħ ∈ ħ[ h (x )= h ( y)] ≤ 1中号∀X,ÿ∈ü,X≠ÿ⇒镨H∈H[H(X)=H(ÿ)]≤1个中号\forall x,y \in U, x \neq y \Rightarrow \Pr_{h \in H}[h(x) = h(y)] \leq \frac{1}{M} 现在,通用哈希的概念已成为本科生数据结构课程的标准部分。能够激励学生认识通用哈希在工业应用中的重要性。所以我的问题是: 哈希函数通用族的构造在实践中重要吗?如果答案是肯定的,请您分享一些您所看到的有趣的工业应用程序吗?

3
一个高效的数据结构,支持Insert,Delete和MostFrequent
假设我们有一组DDD和的每个成员DDD是数据和密钥对。我们需要一个支持以下操作的数据结构: 将(d,k)(d,k)(d,k)插入DDD, 删除成员eee,(无需搜索以找到eee,例如eee指向的成员DDD), MostFrequent,它返回一个构件e∈De∈De \in D使得e.keye.keye.key是最常用的键之一DDD(请注意,最常用的键不需要唯一)。 什么是该数据结构的有效实现? 我的解决方案是为键及其频率按频率分配优先级的堆,再加上一个哈希表,在哈希表中,哈希函数将具有相同键的成员映射到哈希表中的同一插槽(指针从每个部分指向另一个部分)。 这可以使Θ(lgn)Θ(lg⁡n)\Theta(\lg n)对于前两个操作和Θ(1)Θ(1)\Theta(1)用于第三(最坏情况的运行时间)。 我想知道是否有更有效的解决方案?(或具有相同效率的更简单解决方案?)



1
在实践中评估缓存遗忘性能的研究
Frigo等人介绍了忽略缓存的算法和数据结构是一个相当新的事物。在Cache-oblivious算法,1999年。普罗科普(Prokop)同年的论文也介绍了早期的想法。 Frigo等人的论文。目前的一些实验结果表明了该理论以及忽略高速缓存的算法和数据结构的潜力。许多可忽略缓存的数据结构都是基于静态搜索树的。存储和导航这些树的方法已经发展了很多,也许是Bender等人最著名的。以及Brodal等人的著作。Demaine给出了一个很好的概述。 至少由Ladner等人完成了研究缓存行为的实验工作。使用程序工具,2002年在“缓存感知和缓存遗忘的静态搜索树”的比较中取得成功。Ladner等。使用经典算法,忽略缓存的算法和了解缓存的算法,对解决二进制搜索问题的算法的缓存行为进行了基准测试。每种算法都使用隐式和显式导航方法进行基准测试。除此之外,Rønn,2003年的论文对相同的算法进行了非常详细的分析,并对Ladner等人的相同算法进行了更彻底的测试。 我的问题是 从那以后,在实践中是否有任何新的研究对基准缓存不了解算法的缓存行为进行基准测试?我对静态搜索树的性能特别感兴趣,但我也对其他任何忽略缓存的算法和数据结构感到满意。

1
是否有类似于树数据结构的半格的数据结构?
如果我们将树视为部分有序集,则它成为联接半格的特例。对于联接半格,我们希望能够高效地计算(或多或少)两个元素的(唯一)最小上限。在树的情况下,将使之成为可能的数据结构将是为对应节点中的每个元素存储指向父级的指针和到根的距离度量。(实际上,基于拓扑排序的标记通常用于“到根的距离度量”,实际上,所需的全部是可以有效评估的兼容部分顺序)。 每个有限的连接语义都可以表示为一个有限集合的子集集合,其包含顺序如下,使得最小上限由集合的并集给出。因此,用有限数量的标签表示每个元素,并通过对应标签的并集计算最小上限将是一种可能的数据结构。(通过观察补码,可以看到将最小上限定义为相应标签的交集也是可能的。)一种更为常见的数据结构是简单地使用矩阵来存储“ a <= b”,甚至是“ join(a,b)”的所有结果。 但是,使用这样的数据结构表示树会有些奇怪。联接符号是否还有更多类似树的数据结构,这些结构仍允许(或多或少)有效地计算两个元素的(唯一)最小上限?(也许某种有向无环图在节点中具有类似于树根的距离度量的附加信息?)

2
在BST中搜索时可能的搜索路径数
我有以下问题,但没有答案。如果我的方法正确,我将不胜感激: 问:在二叉搜索树中搜索键值60时,遍历包含键值10、20、40、50、70、80、90的节点,而不必按给定的顺序进行。从包含值60的根节点开始的搜索路径中,这些键值可以出现多少种不同的顺序? (A)35(B)64(C)128(D)5040 从这个问题中,我了解到遍历必须包括所有给定的节点,最终我们必须达到键60。例如,这样的组合之一是: 10、20、40、50、90、80、70、60。 由于我们必须遍历上面给出的所有节点,因此我们必须从10或90开始。如果我们从20开始,我们将不会达到10(因为60> 20并且将遍历20的右子树) 同样,我们不能从80开始,因为我们将无法达到90,因为80> 60,我们将在80的左子树中遍历,因此无法达到90。 取10。剩余的节点为20、40、50、70、80、90。下一个节点可以为20或90。出于前面提到的相同原因,我们不能取其他节点。 如果我们以相似的方式考虑,则在每个级别我们都有两个选择。由于有7个节点,因此前6个有2个选择,最后1个没有选择。所以完全有 2 * 2 * 2 * 2 * 2 * 2 * 12∗2∗2∗2∗2∗2∗12*2*2*2*2*2*1排列= = 6426262^6646464 这是正确的答案吗? 如果没有,更好的方法是什么? 我想概括一下。如果给出节点,则总共可能的搜索路径为2 n − 1ñnn2n − 12n−12^{n-1}


2
良好的快照表数据结构可用于内存索引
我正在为一个非常特殊的用例设计内存对象数据库。它是单个编写器,但必须支持有效的并发读取。读取必须隔离。没有查询语言,数据库仅支持: 通过属性/属性集获取对象(例如,可能支持表达式x.count < 5) 获取对象的属性 查询是命令脚本,由任意数量的上述操作组成。数据大小将是<< <<内存,因此大多数属性上的所有对象和索引都应舒适地容纳而无需交换。 我需要的是对象属性索引的数据结构,该数据结构在写入时可以为O(n),不支持写入并发,但理想情况下应支持O(1)快照(可能在写入时进行复制)和O(logN)访问。理想情况下,这将允许读取时具有高并发性,并在版本之间实现最大的结构共享。 我当时在看CTries,并发BST和并发Splay 树,但是我不确定我是否真的在朝正确的方向看。上面的结构非常关注我不关心的插入物的复杂性。 问题:是否有一个现成的数据结构适合我的用例? 编辑:经过更多思考之后,似乎持久的BST / Splay树将起作用。编写者将更新“主”副本,查询将在执行开始时获得该树,并在完成后将其丢弃。但是,我仍然对是否有更好的解决方案感兴趣。

4
布谷鸟哈希比动态完美哈希有什么优势?
动态完美哈希表和布谷鸟哈希表是两个不同的数据结构,它们支持最坏情况下的O(1)查找和预期的O(1)时间插入和删除。两者都需要O(n)辅助空间,并需要访问散列函数系列才能进行操作。 我认为这两个数据结构本身都是美丽而辉煌的,但是我不确定我如何,何时将其中一个比另一个更好。 这些数据结构中的一个结构是否具有明显的优势,是否存在特定的环境?还是它们大多数都可以互换?

2
仅使用O(k)内存O(n)时间从给定序列中找到第k个最小元素
假设我们逐个读取数字的序列。如何仅使用单元存储器并在线性时间()中找到第个最小元素。我认为我们应该保存序列的前项,并在获得第个项时删除一个确定不能为第个最小元素的项,然后保存第个项。因此,我们应该有一个指标,在每个步骤中显示此不可用的术语,并且该指标应在每个步骤中快速更新。我从“ max”开始;但它无法快速更新;意味着如果我们考虑最大ķnnnkkkO (n )k k + 1 k k + 1O(k)O(k)O(k)O(n)O(n)O(n)kkkk+1k+1k+1kkkk+1k+1k+1然后在第一次删除中,我们错过了最大值,我们应该在搜索最大值,其原因时间不是线性的。也许我们应该更智能地保存前项。O(k)O(k)O(k)k(n−k)×O(k)(n−k)×O(k)(n-k)\times O(k)kkk 我该如何解决这个问题?

2
类似于数组的不可变(持久)数据结构实现,具有快速索引,追加,前置,迭代
我正在寻找类似于数组(但不可变)的持久性数据结构,以允许快速索引,追加,前置和迭代(良好的局部性)操作。 Clojure提供了持久的Vector,但仅用于快速追加。Scala的Vector具有有效的固定时间追加和前置,但我无法实现,因为它基于与Clojure向量相同的数据结构(位映射向量trie),并且据我所知,位映射向量trie没有一些技巧就无法快速上手。 我对不是准备使用实现感兴趣,而对自己如何实现这种数据结构的描述感兴趣。

1
间隔图的数据结构
令nnn为整数,令ZZ\mathbb{Z}表示所有整数的集合。令[a,b][a,b][a,b]表示整数的间隔{a,a+1,a+2,…,b}{a,a+1,a+2,…,b}\{a,a+1,a+2,\dots,b\}。 我正在寻找一种数据结构来表示映射f:[1,n]→Zf:[1,n]→Zf:[1,n] \to \mathbb{Z}。我希望数据结构支持以下操作: get(i)get(i)\text{get}(i)应该返回f(i)f(i)f(i)。 set([a,b],y)set([a,b],y)\text{set}([a,b],y)应更新fff使得f(a)=f(a+1)=⋯=f(b)=yf(a)=f(a+1)=⋯=f(b)=yf(a)=f(a+1)=\cdots=f(b)=y,即更新fff到一个新的地图f′f′f'使得f′(i)=yf′(i)=yf'(i) = y用于i∈[a,b]i∈[a,b]i \in [a,b]并且f′(i)=f(i)f′(i)=f(i)f'(i) = f(i)为i∉[a,b]i∉[a,b]i \notin [a,b]。 应该返回最大间隔 [ 一,b ],使得我∈ [ 一,b ]并且 ˚F是常数 [ 一,b ](即, ˚F (一)= ˚F (一个+ 1 )= ⋯ = ˚F (b ))。stab(i)stab(i)\text{stab}(i)[a,b][a,b][a,b]i∈[a,b]i∈[a,b]i \in [a,b]fff[a,b][a,b][a,b]f(a)=f(a+1)=⋯=f(b)f(a)=f(a+1)=⋯=f(b)f(a)=f(a+1)=\cdots=f(b) 应更新 ˚F到一个新的地图 ˚F '使得 ˚F '(我)= ˚F (我)+ δ为我∈ [ 一,b ]并且 …

3
关于一系列主题的算法书籍
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。没有足够详细信息的答案可以被编辑或删除。 我的任务是为我们的小公司(约15人)建立有关算法的书籍库。预算超过5k,但肯定少于1万,所以我可以买很多书。这里的所有人都至少具有CS或紧密相关领域的学士学位,因此,尽管我会获得像Cormen这样的基本教科书,但我对高级主题的好书更感兴趣。(我将获得Knuth的4卷,顺便说一句。) 一些主题列表如下: 排序算法 图算法 字符串算法 随机算法 分布式算法 组合算法 等等 本质上,我在关于CS中与算法和数据结构相关的主要主题的书籍中寻找好的建议。尤其是超出一门好学校学士学位课程的算法和数据结构课程通常涵盖的内容。我知道这个问题很模糊,因为我正在寻找通用的有用材料。我们开发的软件主要是系统级的东西,处理大量数据。 理想的选择是找到可以涵盖大多数人可能尚未听说的相当新的酷数据结构和算法的任何内容。 编辑:这是我认为应该得到的一些初步书籍: Cormen等人的算法简介。 算法设计,克莱因伯格,塔多斯 Knuth的计算机编程艺术第1-4卷 Vazirani的近似算法 Williamson,Shmoys的近似算法设计 Moghani,Raghavan的随机算法 Sipser计算理论导论 Arora的计算复杂性,巴拉克 Garey和Johnson撰写的《计算机与难处理》 Schrijver的组合优化 我的同事希望与其他有关语言设计,编译器和形式方法的技术和算法的书籍包括: 皮尔斯的类型和编程语言 贝尔的模型检查原理,加藤 编译器:Aho,Lam,Sethi,Ullman编写的原理,技术和工具 编译器设计手册:优化和机器代码生成,第二版,Srikant,Shankar 垃圾收集手册:Jones,Hosking和Moss的自动内存管理技术

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.