Questions tagged «data-structures»

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

1
随机可熔堆-预期高度
随机可熔堆具有一个“混合”操作,然后我们将其用于定义所有其他操作,包括插入。 问题是,具有节点的那棵树的期望高度是多少?nnn Gambin和Malinkowski的定理1,随机可融合优先级队列(SOFSEM论文集,计算机科学讲座,第1521卷,第344-349页,1998;PDF)给出了该问题的答案。但是,我不明白为什么可以这样写: E[hQ]=12((1+E[hQL])+(1+E[hQR])).E[hQ]=12((1+E[hQL])+(1+E[hQR])).\mathbb{E} [ h_Q] = \frac{1}{2} ((1 + \mathbb{E}[h_{Q_L}]) + (1 + \mathbb{E}[h_{Q_R}]))\,. 对我来说,树的高度是 hQ=1+max{hQL,hQR},hQ=1+max{hQL,hQR},h_Q = 1 + \max\, \{ h_{Q_L}, h_{Q_R}\}\,, 我可以扩展为: E[hQ]=1+E[max{hQL,hQR}]=1+∑kP[max{hQL,hQR}=k].E[hQ]=1+E[max{hQL,hQR}]=1+∑kP[max{hQL,hQR}=k].\mathbb{E} [ h_Q] = 1 + \mathbb{E}[\max \,\{ h_{Q_L}, h_{Q_R}\}] = 1 + \sum k \mathbb{P}[\max\, \{ h_{Q_L}, h_{Q_R}\} = k]\,. 可以使用总概率定律重写两个子树的高度的最大值等于kkk的概率: P[max{hQL,hQR}=k]=P[max{hQL,hQR}=k∣hQL≤hQR]P[hQL≤hQR]+P[max{hQL,hQR}=k∣hQL>hQR]P[hQL>hQR]=P[hQR=k∣hQL≤hQR]P[hQL≤hQR]+P[hQL=k∣hQL>hQR]P[hQL>hQR].P[max{hQL,hQR}=k]=P[max{hQL,hQR}=k∣hQL≤hQR]P[hQL≤hQR]+P[max{hQL,hQR}=k∣hQL>hQR]P[hQL>hQR]=P[hQR=k∣hQL≤hQR]P[hQL≤hQR]+P[hQL=k∣hQL>hQR]P[hQL>hQR].\begin{align*} \hspace{2em}&\hspace{-2em} \mathbb{P}[\max\, …

3
函数编程中的不变性真的存在吗?
尽管我在日常生活中是一名程序员,并且使用所有流行的语言(Python,Java,C等),但对于什么是函数式编程,我仍然不清楚。根据我的阅读,功能语言的一个特性是数据结构是不可变的。对我来说,这本身就引发了很多问题。但是首先,我会写一些我对不变性的理解,如果我错了,请随时纠正我。 我对不变性的理解: 程序启动时具有固定的数据结构和固定的数据 无法将新数据添加到这些结构 代码中没有变量 您只能从已经存在的数据或当前计算出的数据中“复制” 由于以上原因,不变性给程序增加了巨大的空间复杂性 我的问题: 如果数据结构应该保持不变(不可变),那么有人怎么在列表中添加新项目呢? 拥有无法获取新数据的程序有什么意义?假设您有一个连接到计算机的传感器,该传感器想将数据提供给程序。那是否意味着我们无法在任何地方存储传入的数据? 在这种情况下,函数式编程对机器学习有什么好处?由于机器学习是基于更新程序对事物的“感知”的假设而建立的,因此可以存储新数据。

1
在动态图上维护连接的组件信息的最有效的算法和数据结构是什么?
假设我有一个无向的有限稀疏图,并且需要能够有效地运行以下查询: 一世小号çø Ñ Ñ Ê Ç 吨ë d(N1个,N2)IsConnected(N1,N2)IsConnected(N_1, N_2) - 如果在和之间存在路径,则返回,否则返回N 1 N 2 FŤTTñ1个N1N_1ñ2N2N_2FFF Cø Ñ Ñ Ê Ç 吨ë dñØ dÈ 小号(Ñ)ConnectedNodes(N)ConnectedNodes(N) -返回从可访问的节点集ñNN 通过预先计算图形的连接组件,可以轻松完成此操作。这两个查询都可以在时间中运行。O (1 )O(1)O(1) 如果还需要能够任意添加边 -那么我可以将组件存储在不相交的数据结构中。每当添加一条边时,如果它连接了不同组件中的两个节点,我将合并这些组件。这会将成本增加到,将成本增加到和(也可能是)。一ddËdGÈ (Ñ1个,N2)AddEdge(N1,N2)AddEdge(N_1, N_2)甲d d é d 克ë ø (我Ñ v Ë ř 小号Ë 甲Ç ķ é ř 米一个Ñ Ñ (| Ñ …

3
图形中路径的紧凑表示
我在图中有一些简单路径。路径的长度以为界。ddd 我能以哪种最紧凑的方式(从内存角度)表示路径,以使除所选路径之外的其他路径都无法表示? 请注意,我想在一种算法中使用这种表示形式,该算法将一遍又一遍地遍历路径的这一子集,并且我想相当快,因此,例如,我不能使用任何标准压缩算法。 我想到的一个表示是将它们表示为一组树木。我在猜测,将其降低到最佳数量的树是NP难的吗?还有哪些其他表示形式会很好呢?

2
寻找具有较小内存占用的固定实现
我正在寻找设置数据类型的实现。也就是说,我们必须 维持一个动态子集(的大小从宇宙)U = \ {0,1,2,3,\点中,u - 1 \}大小的ü与Ñ Ù = { 0 ,1 ,2 ,3 ,... ,ù - 1 } üSSSnnnU={0,1,2,3,…,u–1}U={0,1,2,3,…,u–1}U = \{0, 1, 2, 3, \dots , u – 1\}uuu 操作insert(x)(将元素添加x到SSS)和find(x)(检查元素是否x为S的成员SSS)。 我不在乎其他操作。对于定向,在我正在使用的应用程序中,我们有u≈1010u≈1010u \approx 10^{10}。 我知道在O(1)时间内同时提供这两种操作的实现O(1)O(1)O(1),所以我主要担心数据结构的大小。我希望有数十亿个条目,但希望避免交换。 如果有必要,我愿意牺牲运行时间。我可以接受O(\ log n)的摊销运行时间O(logn)O(log⁡n)O(\log n);不允许使用预期的运行时或ω(logn)ω(log⁡n)\omega(\log n)中的运行时。 我的一个想法是,如果SSS可以表示为范围的并集[xmin, xmax],那么我们将能够以一些性能下降的代价节省存储空间。同样,其他一些数据模式也是可能的,例如[0, 2, 4, 6]。 您能否指出我可以执行类似操作的数据结构?

1
旋转数为奇数的八字树
将项目插入展开树时,将基于Z字形或Z字形模式成对执行旋转。如果要执行奇数个旋转,则可以从叶子开始进行额外的旋转,也可以保存额外的旋转并在根部进行。有关系吗? 例如,在附加的图像中,我将4插入BST,然后将其“展开”到根目录。在图的顶部,我首先在叶子节点处找到“ zig-zig”对,并从底部开始执行“ zig-zag”展开,最后在根部进行右旋。在图的底部,我首先从叶子开始进行奇数旋转,然后对根进行曲折展开。 哪个是对的?还是两者都会导致通常的八卦树表演?

2
概率搜索数据结构有用吗?
SkipList提供与平衡树相同的搜索范围,其优点是不需要重新平衡。由于SkipList是使用随机硬币翻转构成的,因此只要SkipList的结构足够“平衡”,这些界限就成立。特别是,对于某些常数,概率为,插入元素后,平衡结构可能会丢失。O(logn)O(log⁡n)O(\log n)1/nc1/nc1/n^cc>0c>0c>0 假设我想将跳过列表用作可能永远运行的Web应用程序中的存储后端。因此,经过一些多项式运算之后,SkipList的平衡结构很可能会丢失。 我的推理正确吗?这样的概率搜索/存储数据结构是否具有实际应用,如果可以,那么如何避免上述问题? 编辑:我知道SkipList有确定性变体,与(经典)随机化SkipList相比,实现起来要复杂得多。

1
有效地删除重复项并降低内存开销
我想以一种只需要存储结果集的方式有效地过滤重复项的整数列表。 一种可见的方式: 我们有一个整数范围其中大(例如)N 2 40小号= { 1 ,...,N}S={1,…,N}S = \{1, \dots{}, N\}ñNN2402402^{40} 我们有一个函数,据说它有很多碰撞(图像均匀地分布在)SF:S→ Sf:S→Sf : S \to S小号SS 然后,我们需要存储,即{ f (x )| X ∈ 小号}F[ S]f[S]f[S]{ ˚F(x )| X ∈ 小号}{f(x)|x∈S}\{f(x) | x \in S\} 我对有一个非常准确的(概率性)估计。是,因此可以预先分配数据结构(例如)。| f [ S ] | ≈ 2 30| F[ S] ||f[S]||f[S]|| F[ 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.