Questions tagged «trees»

有关一种特殊图形的问题,即连通图和无周期图。


3
无向树中只有一个遍历的最长路径
有两种使用深度优先搜索的标准算法来查找无向树中的最长路径: 从随机顶点开始DFS 并找到离它最远的顶点;说是。vvvv′v′v' 现在从开始DFS,以找到离它最远的顶点。该路径是图中的最长路径。v′v′v' 问题是,这可以更有效地完成吗?我们可以用一个DFS或BFS做到吗? (这可以等效地描述为计算无向树的直径的问题。)

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

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 

7
使用BFS / DFS查找树的直径的算法。为什么行得通?
该链接提供了一种使用BFS / DFS查找无向树的直径的算法。总结: 在图中的任何节点上运行BFS,记住您最后发现的节点。记住最后发现的节点v,从u运行BFS。d(u,v)是树的直径。 为什么行得通? 第2页,这提供了一个理由,但它是混淆。我引用了证明的初始部分: 在图中的任何节点上运行BFS,记住您最后发现的节点。记住最后发现的节点v,从u运行BFS。d(u,v)是树的直径。 正确性:令a和b为任意两个节点,使得d(a,b)是树的直径。从a到b有一条独特的路径。令t为BFS在该路径上发现的第一个节点。如果从s到u 的路径p1p1p_1和从a到b的p2p2p_2路径不共享边,则从t到u的路径包括s。所以 d(t,u)≥d(s,u)d(t,u)≥d(s,u)d(t,u) \ge d(s,u) d(t,u)≥d(s,a)d(t,u)≥d(s,a)d(t,u) \ge d(s,a) ....(更多不平等现象随之而来。) 不平等对我来说没有意义。

5
有效压缩未标记的树木
考虑未标记的,有根的二叉树。我们可以压缩这些树:每当有指向子树TŤT和T′Ť′T'与T=T′Ť=Ť′T = T'(解释===为结构相等),我们店(wlog)TŤT并更换所有指针T′Ť′T'与指针TŤT。有关示例,请参见uli的答案。 给出一种将上述意义上的树作为输入并计算压缩后剩余的(最小)节点数的算法。该算法应在时间O(nlogn)Ø(ñ日志⁡ñ)\cal{O}(n\log n)(在统一成本模型中)运行,输入中的节点数为nñn。 这是一个考试问题,我无法提出一个很好的解决方案,也没有看到一个解决方案。

1
为什么函数式编程没有研究动态树?
动态树在解决诸如网络流,动态图,组合问题(Tarjan和Werneck的“实践中的动态树”)以及最近合并的字典(Adam Karczmarz的“ A Simple Mergeable Dictionary”)等问题中起着重要的作用, 对于动态树,我指的是1983年Sleator&Tarjan的论文“动态树的数据结构”中所述的定义。此后,在功能编程研究领域几乎没有发表任何努力。 Edward Kmett实施了ST树的一个版本,主要是作为C ++对应版本的翻译,请参阅Link-cut树。 克里斯·冈崎(Chris Okasaki)在他着名的《纯函数数据结构》一书中对Splay树做了有限的实现。 Ralf Hinze和Ross Paterson引入了称为2-3手指树的功能数据结构,但其目标与动态树的原始定义有所不同。 动态树的实现(可能是性能)根据三种方法进行划分: 线性化,其中ET树(Euler游览)发挥了重要作用。找不到纯粹的功能研究。 ST树是旗舰的路径分解,刚刚发现了Kmett的版本。 树收缩,其中顶级树,拓扑树和RC树是参与者。找不到纯粹的功能研究。 可以在Splay,AVL,红黑树上找到纯功能分析和实现,但不是动态树。前者被视为后者的影子(也称为虚拟或辅助)数据结构。 所以,我的问题是: 函数式编程研究社区不参与动态树数据结构的原因(缺点,弱点)是什么?


1
克努斯,德布赖恩和赖斯(1972)的“种植平面树的平均高度”
我试图仅通过基本手段(没有生成函数,没有复杂分析,没有傅立叶分析)来获得标题中的经典论文,尽管精度要低得多。简而言之,我“仅”要证明具有节点的树的平均高度(即,从根到叶的最大节点数)满足。hnhnh_nnnnhn∼πn−−−√hn∼πnh_n \sim \sqrt{\pi n} 概述如下。令为高度小于或等于的树数(对于所有,约定),B_ {nh}为n个节点的树数高度大于或等于h + 1(即B_ {nh} = A_ {nn}-A_ {nh})。然后h_n = S_n / A_ {nn},其中S_n是有限和 S_n = \ sum_ {h \ geqslant 1} h(A_ {nh}-A_ {n,h-1})= \ sum_ {h \ geqslant 1 } h(B_ {n,h-1}-B_ {nh})= \ sum_ {h \ geqslant 0} B_ {nh}。 众所周知,A_ {nn} = …

3
是否可以遍历一棵树而无需递归,堆栈或队列,而只需几个指针?
半年前,我坐在一个数据结构课上,如果有人可以在不使用递归,堆栈,队列等(或任何其他类似数据结构)而仅使用几个指针的情况下遍历一棵树,教授将提供额外的荣誉。我想出了一个我认为是对这个问题的明显答案,最终被教授接受了。我和同一系的另一位教授坐在一门离散数学课上,他断言没有递归,堆栈,队列等就不可能遍历一棵树,而且我的解决方案无效。 那么,有可能还是不可能?为什么或者为什么不? 编辑:为澄清起见,我在具有三个元素的二叉树上实现了这一点-每个节点上存储的数据和指向两个孩子的指针。我的解决方案仅需少量更改即可扩展到n元树。 我的数据结构老师没有对树的变异施加任何限制,实际上,后来我发现他自己的解决方案是使用子指针在回落的过程中指向树的后方。我的离散数学教授说,根据树的数学定义,树的任何突变都意味着它不再是树,他的定义还将排除指向父代的任何指针,这与我上面解决它的情况相符。

2
最小顶点覆盖树的贪婪算法的正确性证明
有一种贪婪算法,用于查找使用DFS遍历的树的最小顶点覆盖。 对于树的每个叶子,选择其父级(即,其父级处于最小顶点覆盖范围内)。 对于每个内部节点: 如果未选择其任何子节点,则选择此节点。 如何证明这种贪婪策略给出了最佳答案?是否没有比上述算法产生的顶点覆盖更小的尺寸?

2
一棵树的线性时间标记算法?
我有一棵无向的树,我要标记其顶点。叶节点应标记为一个。然后,假设叶子被去除了。在剩下的树中,叶子应标记为两片。该过程将以显而易见的方式继续进行,直到所有顶点都具有标签为止。我这样做的原因是我想将顶点存储在队列中,并“先离开”浏览它们。有没有简单的方法可以执行此时间?O(n+m)O(n+m)O(n+m) 我可以通过在每个步骤上进行BFS来解决该问题。但是在最坏的情况下,在我经过每个顶点的每一步中,都精确地移去两片叶子并将它们排队。我相信这需要二次时间。 另一个想法是首先找到所有叶子,然后对每个叶子进行BFS。这没有给我想要的解决方案。例如,考虑下图所示的一种“皇冠图”。显示了所需的解决方案,但是从每个叶子启动BFS只会导致使用两个标签。 理想地,线性时间算法也将易于解释和实现。
12 algorithms  trees 


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 ]并且 …

1
此代码终止的机会是什么?
我写了这个Python代码,想知道它有时是否根本不会终止(假设我们有无限的内存/时间并且没有递归深度限制)。 凭直觉,您会认为它会终止,因为在某些时候您必须很幸运,如果它没有终止,您将有无限的时间来获得幸运。另一方面,随着递归深度的增加,您必须变得越来越幸运。 import random def random_tree(): if random.random() < 0.5: return 0 return [random_tree() for _ in range(random.randint(1, 5))] 如果random_tree不总是终止,为什么?终止的机会是什么? 我已经尝试使用来计算的话,其在它的极好的无用任一给出的答案〜0.684124或... 1。P=1−(1−0.5)(1−(P+P2+P3+P4+P5)/5)P=1−(1−0.5)(1−(P+P2+P3+P4+P5)/5)P = 1 - (1 - 0.5)(1 - (P + P^2 + P^3 + P^4 + P^5)/5)0.6841240.6841240.684124111 可能更复杂,但也令我着迷的是,以下情况的终止机会 :P(a,b)P(a,b)P(a, b) def random_tree(a, b): if random.random() < a: return 0 …

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.