Questions tagged «data-structures»

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

5
学习用于同一目的的不同算法/数据结构的原因是什么?
自从我是一名本科生以来,我一直在想这个问题。这是一个普遍的问题,但我将在下面详细说明。 我见过很多算法-例如,对于最大流量问题,我知道大约3种算法可以解决该问题:福特-富克森(Ford-Fulkerson),埃德蒙兹-卡普(Edmonds-Karp)和狄尼克斯(Dinic),其中狄尼克斯具有最高的复杂性。 对于数据结构(例如堆),有二进制堆,二项式堆和Fibonacci堆,其中Fibonacci堆具有最佳的整体复杂性。 让我感到困惑的是:我们有什么理由需要全部了解它们吗?为什么不学习并熟悉最好的复杂性呢? 我知道这是最好的,如果我们都了解它们,我只是想知道是否有任何“更有效的”原因,例如某些问题/算法只能通过使用A而不是B来解决,等等。


4
(何时)哈希表查找为O(1)?
人们通常说哈希表查找是在恒定时间内进行的:您计算哈希值,这将为数组查找提供索引。但这忽略了碰撞。在最坏的情况下,每一项都恰好落在同一存储桶中,并且查找时间变为线性()。Θ(n)Θ(n)\Theta(n) 数据上是否存在可以使哈希表查找真正变为?这是仅是平均水平,还是哈希表可以进行最坏情况查找?O (1 )O(1)O(1)O(1)O(1)O(1)O(1) 注意:我是从程序员的角度出发的;当我将数据存储在哈希表中时,它几乎总是字符串或某些复合数据结构,并且数据在哈希表的生存期内发生变化。因此,尽管我欣赏有关完美哈希的答案,但从我的观点来看,它们很可爱,但很有趣,而且不切实际。 PS跟进:哈希表操作O(1)适用于哪种数据?

4
为什么最好在散列函数中使用质数作为mod?
如果我有一个从1到100的键值列表,并且想将它们组织成11个存储桶的数组,那么我会被教导如何形成mod函数 H=kmod 11H=kmod 11 H = k \bmod \ 11 现在,所有值将在9行中一个接一个地放置。例如,在第一个存储桶中将有0,11,22…0,11,22…0, 11, 22 \dots。在第二个中,将有1,12,23…1,12,23…1, 12, 23 \dots等。 假设我决定成为一个坏孩子,并使用非质数作为我的哈希函数-以12为例。使用哈希函数 H=kmod 12H=kmod 12 H = k \bmod \ 12 会导致哈希表的值在第一个存储桶中为0、12、24 0,12,24…0,12,24…0, 12, 24 \dots ,在第二个存储桶中为1、13、25 1,13,25…1,13,25…1, 13, 25 \dots等,依此类推。 本质上,它们是同一件事。我没有减少冲突,也没有通过使用质数哈希码更好地进行扩展,而且我看不出它有什么好处。

4
为什么红黑树如此受欢迎?
在我看来,似乎到处都在使用红黑树(std::set在C ++,SortedDictionaryC#等中)实现数据结构。 在我的算法课程中刚刚覆盖了(a,b),红黑和AVL树之后,这就是我的收获(也是从问问教授,翻阅几本书并仔细研究一下)得出的: AVL树的平均深度小于红黑树,因此在AVL树中搜索值的速度始终更快。 与AVL树相比,红黑树进行结构调整以平衡自身的可能性要小一些,这可能会使它们的插入/删除速度更快。我可能会说,因为这将取决于对树的结构更改的成本,因为这将在很大程度上取决于运行时和隐含(当树是不可变的时,功能语言是否也可能完全不同?) 网上有很多基准可以比较AVL和红黑树,但令我惊讶的是,我的教授基本上说过,通常您会做以下两件事之一: 要么您根本就不在乎性能,在这种情况下,大多数情况下AVL与Red-black的10-20%的差异根本不重要。 或者,您真的很在乎性能,在这种情况下,您会抛弃AVL树和红黑树,并选择B树,可以对B树进行调整以使其工作得更好(或(a,b)树),我将所有这些都放在一个篮子里。) 这样做的原因是因为B树将数据更紧凑地存储在内存中(一个节点包含许多值),因此缓存未命中的情况将大大减少。您还可以根据用例来调整实现,并使B树的顺序取决于CPU缓存大小等。 问题在于,我几乎找不到任何可以分析现实硬件上不同实现的搜索树实际使用情况的资源。我浏览过许多有关算法的书,但没有发现可以将不同的树变体进行比较的任何东西,除了表明一棵树的平均深度比另一棵树小(这并没有真正说明树的行为方式)在实际程序中。) 话虽这么说,是否有一个特定的原因为什么到处都使用红黑树,而根据上述内容,B树应该胜过它们?(作为唯一的基准测试,我还可以看到http://lh3lh3.users.sourceforge.net/udb.shtml,但这可能只是具体实现的问题)。还是为什么每个人都使用Red-black树是因为它们很容易实现,或者换句话说,很难实现不好呢? 另外,当人们进入功能语言领域时,这将如何改变?似乎Clojure和Scala都使用Hash数组映射的trys,其中Clojure使用32的分支因子。

9
是否存在带有提取的优先级队列?
有很多数据结构实现了优先级队列接口: 插入:将元素插入结构 Get-Min:返回结构中的最小元素 Extract-Min:删除结构中的最小元素 实现此接口的常见数据结构是(min)堆。 通常,这些操作的(摊销)运行时间为: 插入:(有时)O(log n )O(1 )O(1)\mathcal{O}(1)O(对数n )O(log⁡n)\mathcal{O}(\log n) Get-Min:O(1 )O(1)\mathcal{O}(1) 提取最小值:O(对数n )O(log⁡n)\mathcal{O}(\log n) 例如,斐波那契堆可达到这些运行时间。现在,我的问题是: 是否存在具有以下(摊销)运行时间的数据结构? 插入:O(对数n )O(log⁡n)\mathcal{O}(\log n) Get-Min:O(1 )O(1)\mathcal{O}(1) 提取最小值:O(1 )O(1)\mathcal{O}(1) 如果我们可以在给定排序输入的情况下在时间内构造这样的结构,那么我们可以例如在比使用“通常”优先级队列的路口快得多。o (nO(n )O(n)\mathcal{O}(n)ø (Ñ日志ñ)o(nlog⁡n)o\left(\frac{n}{\log n}\right)

1
想象一棵红黑的树。是否总会有一系列插入和删除操作来创建它?
让我们假设以下是红黑树的定义: 它是二叉搜索树。 每个节点都被涂成红色或黑色。根是黑色的。 通过边连接的两个节点不能同时为红色。 像Wiki一样,这应该是NIL叶的良好定义。NIL叶为黑色。 从根到任何NIL叶的路径都包含相同数量的黑色节点。 题 假设您已经为红黑树实现了insert和delete操作。现在,如果为您提供了有效的红黑树,是否总有一个构造它的insert和序列delete? 动机 这个问题是由这个问题和这个问题的讨论引起的。 就个人而言,我确实相信,如果您想象一个仅由黑色节点组成的有效红黑树(这意味着您正在想象一个完美平衡的树),那么将有一个由insert和delete构成的序列。然而, 我不知道如何准确证明 我也对更一般的情况感兴趣

2
用于构建快速拼写检查器的高效数据结构
我正在尝试编写一个拼写检查器,该检查器应与相当大的词典一起使用。我真的想要一种有效的方法来索引我的字典数据,该数据将使用Damerau-Levenshtein距离来确定哪些单词最接近拼写错误的单词。 我正在寻找一种数据结构,该结构将在空间复杂度和运行时复杂度之间取得最佳折衷。 根据我在互联网上发现的信息,我对使用哪种类型的数据结构有一些建议: 特里 这是我的第一个想法,看起来很容易实现,应该提供快速的查找/插入。使用Damerau-Levenshtein进行的近似搜索在此处也应易于实现。但是就空间复杂度而言,它看起来不是很有效,因为指针存储很可能会带来很多开销。 帕特里夏·特里(Patricia Trie) 这似乎比常规的Trie占用更少的空间,因为您基本上避免了存储指针的成本,但是对于像我一样的非常大的字典,我有点担心数据碎片。 后缀树 我不确定这一点,似乎有些人确实发现它在文本挖掘中很有用,但是我真的不确定它对于拼写检查器的性能会有什么帮助。 三元搜索树 这些看起来不错,并且在复杂性方面应该与Patricia Tries接近(更好?),但是我不确定碎片是否比Patricia Tries更好。 爆裂树 这似乎是一种混合,我不确定它比Tries等具有什么优势,但是我已经读过好几次了,它对于文本挖掘非常有效。 我想就哪种数据结构最适合在这种情况下使用以及什么使它比其他结构更好的问题得到一些反馈。如果我缺少一些更适合拼写检查的数据结构,我也很感兴趣。

11
为什么计算机科学中的数据被认为是离散的?
我了解数据的“结构”完全取决于布尔代数,但是: 为什么将数据视为离散的数学实体而不是连续的数学实体? 与此相关: 在将数据构造为rrr维中的连续实体时,有哪些缺点或不变性受到侵犯? 我不是该领域的专家,因为我是本科数学学生,所以如果有人像我五岁时那样向我解释这一点,我将非常感激。

3
硬件/实现会影响算法的时间/空间复杂度吗?
我什至都不是CS学生,所以这可能是一个愚蠢的问题,但是请忍受... 在前计算机时代,我们只能用抽屉数组来实现数组数据结构。由于一个有定位与从它提取值之前对应的索引的抽屉,阵列查找的时间复杂度是,假设二进制搜索。Ø(升Ò 克(n ))Ø(升ØG(ñ))O(log(n)) 但是,计算机的发明产生了很大的变化。现代计算机可以如此快速地从其RAM中读取数据,因此我们现在认为数组查找的时间复杂度为(即使从技术上讲也不是这种情况,因为将寄存器移至更远的距离需要花费更多时间,等等)O (1 )Ø(1个)O(1) 另一个例子是Python字典。虽然人们可能会得到一本字典访问的复杂性与病人写重载魔术方法(或可笑的坏运气,即具有大量的散列冲突的键),它通常被认为是Ø (1 )。在这种情况下,时间复杂度既取决于Python字典的哈希表实现,也取决于哈希函数的键的实现。O (n )Ø(ñ)O(n)__hash__O (1 )Ø(1个)O(1) 这是否意味着硬件/实现会影响算法的时间复杂度?(虽然这两个示例都是关于数据结构而不是算法,但后者是建立在前者之上的,而且我从未听说过数据结构的时间复杂性,因此在这里我使用术语“算法”) 对我来说,算法是抽象的和概念性的,它们的属性(例如时间/空间复杂度)不应受到是否以特定方式实现而受到影响,但它们是吗?

2
基数树和Patricia trys有什么区别?
我正在学习基数树(也称为压缩尝试)和Patricia尝试,但是我发现关于它们实际上是否相同的冲突信息。当节点是唯一的子节点时,可以通过将节点与其父节点合并来从基数(未压缩)的树中获得基数树。这也适用于帕特里夏(Patricia)尝试。两种数据结构在哪些方面有所不同? 例如,NIST将两者列出为相同: 帕特里夏树 (数据结构) 定义:Trie的紧凑表示,其中作为唯一子节点的任何节点都与其父节点合并。 也称为基数树。 网络上的许多消息来源都声称相同。但是,显然Patricia尝试是基数树的特例。维基百科条目说: PATRICIA尝试是基数等于2的基数尝试,这意味着将分别比较密钥的每个位,并且每个节点都是双向(即,左与右)分支。 我不太明白。区别仅在于进行查找时进行比较的方式吗?每个节点如何成为“双向分支”?ALPHABET_SIZE给定节点最多应该有最多分支吗? 有人可以澄清吗?出于实际目的,基数尝试是否通常像Patricia尝试一样实现(因此通常被认为是相同的)?还是不能做出这样的概括?

1
哈希表与二叉树
当实现字典时(“我想通过他们的客户ID查找客户数据”),使用的典型数据结构是哈希表和二进制搜索树。例如,我知道C ++ STL库使用(平衡的)二进制搜索树实现字典(它们称为地图),而.NET框架在后台使用哈希表。 这些数据结构的优缺点是什么?在某些情况下还有其他合理的选择吗? 请注意,对于键具有强大的基础结构的情况,例如,它们都是1到n之间的整数或类似的东西,我并不特别感兴趣。

2
并非所有的红黑树都是平衡的?
直观地,“平衡树”应该是每个节点的左右子树必须具有“大约相同”数目的节点的树。 当然,当我们谈论红黑树*(请参阅最后的定义)时,实际上是指它们在高度上是平衡的,从某种意义上说,它们是平衡的。 假设我们尝试将上述直觉形式化如下: 定义:二叉树被称为μμ\mu -balanced,具有0≤μ≤120≤μ≤120 \le \mu \leq \frac{1}{2},如果对于每个节点,不等式NNN μ≤|NL|+1|N|+1≤1−μμ≤|NL|+1|N|+1≤1−μ \mu \le \frac{|N_L| + 1}{|N| + 1} \le 1 - \mu 对于每个,都有一个节点,上面的语句失败。是和的左子树中的节点数。是树下以为根(包括根)的节点数。μ′>μμ′>μ\mu' \gt \mu|NL||NL||N_L|NNN|N||N||N|NNN 我相信,在有关此主题的一些文献中,这些树被称为重量平衡树。 可以证明,如果具有节点的二叉树是平衡的(对于常数),那么树的高度是,因此保持了很好的搜索属性。nnnμμ\muμ>0μ>0\mu \gt 0O(logn)O(log⁡n)\mathcal{O}(\log n) 所以问题是: 是否有一些使每个足够大的红黑树达到平衡?μ>0μ>0\mu \gt 0μμ\mu 我们使用的Red-Black树的定义(来自Cormen等人的Introduction to Algorithms): 二进制搜索树,其中每个节点的颜色为红色或黑色, 根是黑色的 所有NULL节点均为黑色 如果节点为红色,则其两个子节点均为黑色。 对于每个节点,从该节点到后代NULL节点的所有路径都具有相同数量的黑色节点。 注意:在上面的 balanced 的定义中,我们不计算NULL节点。(尽管我相信这是否重要)。μμ\mu

2
为什么C的void类型不同于Empty / Bottom类型?
维基百科以及我发现的其他来源都将C的void类型列为单位类型,而不是空类型。我觉得这很混乱,因为在我看来,它void更适合于空/底类型的定义。 void据我所知,没有价值观存在。 返回类型为void的函数指定该函数不返回任何内容,因此只能执行某些副作用。 类型的指针void*是所有其他指针类型的子类型。同样,void*在C中进行来回转换是隐式的。 我不确定最后一点是否可以作为void空类型的参数,void*或多或少是与无关的特例void。 另一方面,void它本身不是所有其他类型的子类型,据我所知,这是将类型作为底部类型的要求。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

1
是否有支持这些字符串操作的“字符串堆栈”数据结构?
我正在寻找一种数据结构,该结构可在字符集上存储一组字符串,该字符集能够执行以下操作。我们将为存储字符串集合的数据结构。D(S )SΣΣ\SigmaD(S)D(S)\mathcal{D}(S)SSS Add-Prefix-Set在:给定一组(可能为空)字符串,其大小由一个常数限制,而字符串长度由一个常数限制,则返回。这两个边界常量都是全局的:对于所有输入它们都是相同的。Ť d({ 吨小号|吨∈ Ť ,小号∈ 小号} )ŤD(S)D(S)\mathcal{D}(S)TTTD({ts | t∈T,s∈S})D({ts | t∈T,s∈S})\mathcal{D}( \{ t s\ |\ t \in T, s \in S\} )TTT Get-Prefixes在:返回。请注意,只要我可以在时间内枚举其内容,我就不介意此集合使用什么结构。{ a | 一个小号∈ 小号,一个∈ Σ } Ö (|Σ |)D(S)D(S)\mathcal{D}(S){a | as∈S,a∈Σ}{a | as∈S,a∈Σ}\{ a \ | \ as \in S, a \in \Sigma \}O(|Σ|)O(|Σ|)O(|\Sigma|) Remove-Prefixes在D(S)D(S)\mathcal{D}(S):返回D({s …

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.