Questions tagged «data-structures»

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

1
推断优化类型
在工作中,我的任务是推断一些有关动态语言的类型信息。我将语句序列重写为嵌套let表达式,如下所示: return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } 由于我从一般类型信息开始,并试图推断出更具体的类型,因此自然的选择是精简类型。例如,条件运算符返回其真假分支类型的并集。在简单的情况下,它效果很好。 但是,在尝试推断以下类型时遇到了障碍: function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 


1
带有减少键和增加键操作的优先级队列
一个Fibonnaci堆支持以下操作: insert(key, data) :向数据结构添加一个新元素 find-min() :使用最小键返回指向元素的指针 delete-min() :用最小键删除元素 delete(node) :删除由指向的元素 node decrease-key(node) :减少由指向的元素的键 node 所有非删除操作均为(摊销)时间,删除操作为O (log n )摊销时间。O(1)O(1)O(1)O(logn)O(log⁡n)O(\log n) 是否有increase-key(node)在(摊销)时间内也支持的优先级队列的任何实现?O(1)O(1)O(1)

1
表示集合分区的紧凑方式是什么?
存在用于表示集合分区的有效数据结构。这些数据结构对诸如Union和Find这样的操作具有良好的时间复杂性,但是它们并不是特别节省空间。 一种节省空间的方式来表示集合的分区是什么? 这是一个可能的起点: 我知道 具有元素的集合的分区数是,即第个贝尔数。因此,表示具有元素的集合分区的最佳空间复杂度是 位。为了找到这样的表示,我们可以寻找(一组元素的分区集合)与(一组从到的整数)之间的一对一映射。NNNBNBNB_NNNNNNNlog2(BN)log2⁡(BN)\log_2(B_N)NNN111BNBNB_N 有没有这样的映射可以有效地计算?我所说的“高效”是指我想将此紧凑表示形式转换为或时间多项式中的/易于操作的表示形式(例如列表列表。NNNlog2(BN)log2⁡(BN)\log_2(B_N)

3
“地图”是什么意思?
我在各种CS教育材料中已经多次遇到过这个术语: L2 CS162(加州大学伯克利分校): 内存映射的I / O L4 CS162(加州大学伯克利分校): 内存映射文件 L24 CS61(加州大学伯克利分校): “内存映射的I / O”:映射到CPU地址空间的设备控制/数据寄存器 甚至在谷歌搜索“映射”之后,我得到了文章 Map_(higher-order_function),但是对我来说还不是很清楚。 更甚者,尝试bitmap通过阅读Wikipedia文章来理解上下文中的含义: 位数组是从某个域(几乎总是整数范围)到集合{0,1}中的值的映射 我不确定,但是在上面的上下文中,这对我来说是关于数据转换的。 后来,在阅读了CS书籍之后,我只找到了这一段,但没有为我解释“映射”的含义: 内存映射Linux(以及其他形式的Unix)通过将虚拟内存区域与磁盘上的对象相关联来初始化虚拟内存区域的内容,此过程称为内存映射。 我还得到了MapReduce作为搜索结果:where map被解释为“并行计算中的一种习语,其中对序列的所有元素(可能是并行的)应用简单的操作”。 我对这个词仍然感到困惑。在我提到的环境中,谁能解释“地图”的含义?

3
什么数据结构可以有效地存储整数范围?
我需要保留一个范围在0到65535之间的整数的集合,以便可以快速执行以下操作: 插入一个新的整数 插入一系列连续的整数 删除整数 删除整数以下的所有整数 测试是否存在整数 我的数据具有以下特性:它通常在集合中包含整数整数。例如,集合在某个时间点可能是: { 121, 122, 123, 124, 3201, 3202, 5897, 8912, 8913, 8914, 18823, 18824, 40891 } 最简单的方法就是使用像C ++ std :: set这样的平衡二叉树,但是,使用它,我没有利用我经常会有大量数字的事实。也许最好存储一系列范围?但这意味着,如果要删除范围中间的整数,则需要将其分解;如果要填充两个范围之间的空格,则必须将其合并在一起。 是否存在任何适合此问题的现有数据结构?

1
潜在函数二进制堆提取最大值O(1)
我需要帮助来确定最大堆的潜在函数,以便在摊销时间内完成提取最大。我还要补充一点,就是我对潜在方法没有很好的了解。O(1)O(1)O(1) 我知道insert函数应该“付出更多”以减少提取的成本,这必须要考虑到堆的高度(如果给出了堆应该是或)⌊log(n)⌋⌊log⁡(n)⌋ \lfloor \log(n) \rfloor 2log(n)2log⁡(n)2\log(n)∑nk=12log(k)∑k=1n2log⁡(k) \sum_{k=1}^n 2\log(k)



3
CLRS的D元堆问题
解决以下问题时我感到困惑(问题1-3)。 题 甲d进制堆就像是一个二进制堆,但(带有一个可能的例外)非叶节点具有d孩子而2个孩子。 您将如何在数组中表示d -ary堆? n个元素的d元堆的高度分别是n和d? 在d -max-heap中给出EXTRACT-MAX的有效实现。根据d和n分析其运行时间。 在d-最大堆中给出INSERT的有效实现。根据d和n分析其运行时间。 给出INCREASE-KEY(A,i,k)的有效实现,如果k <A [i] = k,则标记一个错误,然后适当地更新d -ary矩阵堆结构。根据d和n分析其运行时间。 我的解决方案 给一个数组A [ a1个。。一个ñ]一个[一个1个。。一个ñ]A[a_1 .. a_n] 根1级2级等级k:一个1个:一个2… 一个2 + d− 1:一个2 + d… 一个2 + d+ d2− 1⋮:一个2 + ∑我= 1k − 1d一世… 一个2 + ∑我= 1ķd一世− 1根:一个1个1级:一个2…一个2+d-1个2级:一个2+d…一个2+d+d2-1个⋮等级k:一个2+∑一世=1个ķ-1个d一世…一个2+∑一世=1个ķd一世-1个\qquad \begin{align} \text{root} &: a_1\\ \text{level 1} &: …

1
分段求和问题的分段树实现的时间复杂度证明
我知道可以使用段树来找到的子数组的总和。根据此处的教程,该操作可以在时间内完成。一个AAO(对数n )O(log⁡n)\mathcal{O}(\log n) 但是我无法证明查询时间确实是。此链接(以及许多其他链接)说,我们可以证明在每个级别上,已处理的最大节点数为,因此。O(对数n )O(log⁡n)\mathcal{O}(\log n)444O(4对数n )= O(对数n )O(4log⁡n)=O(log⁡n)\mathcal{O}(4 \log n) = \mathcal{O}(\log n) 但是,我们怎么可能通过矛盾来证明这一点呢? 如果是这样,如果我们将分段树用于高维数组的范围和,该证明将如何扩展? 例如,我可以考虑通过将原始矩阵划分为4个象限(类似于线性阵列中的一半)来找到一个子矩阵总和,以构建一个象限分段树,但是证明使我难以理解。

1
使用二进制索引树进行范围更新+范围查询
我试图了解如何修改二进制索引树(fenwick树)以处理范围查询和范围更新。 我发现以下来源: http://kartikkukreja.wordpress.com/2013/12/02/range-updates-with-bit-fenwick-tree/ http://programmingcontests.quora.com/Tutorial-Range-Updates-in-Fenwick-Tree http ://apps.topcoder.com/forums/?module = Thread&threadID = 756271&start = 0&mc = 4#1579597 但是即使通读了所有它们,我也无法理解第二个二进制索引树的目的或作用。 有人可以向我解释一下如何修改二进制索引树来处理这些吗?

3
为什么二叉树
在我的Java课上,我们正在学习不同类型的集合的复杂性。 很快我们将讨论我一直在阅读的二叉树。该书指出二叉树的最小高度为,但没有提供进一步的解释。日志2(n + 1 )− 1log2⁡(n+1)−1\log_2(n+1) - 1 有人可以解释为什么吗?

1
给定一组线段,如何构造双向连接的边列表?
对于嵌入在平面中的给定平面图,由一组线段,每个线段均由其端点。为平面细分构造DCEL数据结构,描述算法,证明其正确性并显示复杂性。G(V,E)G(V,E)G(V,E)E={e1,...,em}E={e1,...,em}E= \left \{ e_1,...,e_m \right \} eieie_i{Li,Ri}{Li,Ri}\left \{ L_i,R_i \right \} 根据对DCEL数据结构的描述,DCEL的不同对象(即顶点,边和面)之间存在许多连接。因此,DCEL似乎很难构建和维护。 您知道可用于构造DCEL数据结构的任何有效算法吗?

1
当用作调用堆栈时,无垃圾的意大利面条堆栈会形成DAG吗?
我正在研究用于编程语言的实现技术,并且最近遇到了意粉堆栈,该堆栈被认为非常适合连续传递样式模型(假定它们在例如 Scheme和SML / NJ中使用)。为了简单起见,我们仅考虑此问题的单线程进程。 但是,我对Wikipedia上的图表有些困惑 (也可以在其他地方找到)。特别是,我不明白这种情况如何发生。我只能想象,变灰的分支是无法访问的,应该进行垃圾回收。另一方面,由于我对如何使用意大利面条堆栈实现CPS的含糊理解,我无法想象如何在该结构中实现循环。我必须得出一个结论,它实际上是一个有向无环图,而不是一个“父指针树”,其非垃圾源与线程一样多,宿(与)(潜在)“退出点”一样多。 但是我对这种实现的理解很模糊,所以我想我可能缺少了一些东西。我希望有人可以在“意大利面条调用堆栈”上给我启发,我的意思是指Scheme和/或SML / NJ中用于实现基于CPS的过程的数据结构。 给定以下意大利面条调用堆栈: [exit point] <-- ... <-- [frame A] <-- [frame B (active)] ^ `---- [frame C] 据我了解,来自B的任何流控制要么通过跳到父级(A变为活动状态,现在不可访问的B现在是垃圾)来取消堆栈,要么用子图代替活动帧,仅使用B持有的引用或引用来连接到新的框架。执行无法流向框架C,这必须表示框架C是垃圾。 与以前的情况不同,我认为可能会出现以下无垃圾情况: [exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)] ^ | `---- [frame Y] <---´ 例如,我可以想象Z帧属于某个决策函数,该决策函数要么继续到X帧,要么继续到Y帧(两者都会返回到W)。这意味着意大利面条调用栈不是“父指针树 ”。 但是,我无法想象可以构造循环的任何情况。以以下情况为例: …

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.