- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一些degenerate tree
(它看起来像数组或双链表)。例如,就是这棵树:
每条边都有一定的重量。我想找到所有相等的路径,从每个顶点开始。
换句话说,我想得到所有元组(v1,v,v2),其中v1和v2是任意的祖先和后代,因此c(v1, v) = c(v, v2)
。
让边具有以下权重(仅为示例):a-b = 3
b-c = 1
c-d = 1
d-e = 1
然后:
顶点A
没有任何相等的路径(左侧没有顶点)。
顶点有一对相等的顶点。路径B
等于路径B-A
B-E
。
顶点有一对相等的顶点。路径(3 == 3)
等于路径C
B-C
。
顶点有一对相等的顶点。路径C-D
等于路径(1 == 1)
D
。
顶点C-D
没有任何相等的路径(右侧没有顶点)。
我实现了简单算法,它在D-E
中工作。但对我来说太慢了。
最佳答案
你在评论中写道,你目前的做法是
看来,我在寻找一种降低o(n^2)常数的方法。我选择
一些顶点。然后我创建两个集合。然后我把这些装满
部分和,同时从这个顶点迭代到树的开始和
完成树。然后我找到集合交集,得到路径数
从这个顶点。然后对所有其他顶点重复算法。
基于所谓的双指针方法,有一种更简单、更快的O(n^2)
方法。
对于每个垂直方向,同时进入两个可能的方向。让一个指向顶点(v
)的“指针”在一个方向上移动,另一个(vl
)在另一个方向上移动,并尽量使从vr
到v
的距离尽可能接近从vl
到v
的距离。每次这些距离相等,你就有相等的路径。
for v in vertices
vl = prev(v)
vr = next(v)
while (vl is still inside the tree)
and (vr is still inside the tree)
if dist(v,vl) < dist(v,vr)
vl = prev(vl)
else if dist(v,vr) < dist(v,vl)
vr = next(vr)
else // dist(v,vr) == dist(v,vl)
ans = ans + 1
vl = prev(vl)
vr = next(vr)
vr
。)
dist
,则算法将在
L
中运行。然而,它在概念上更先进,在编码上也更先进。
O(L log L)
。让我们有两个数组,
v
和
a
,它们不是c风格的零索引数组,而是索引从
b
到
-L
的数组。
L
,
i>0
iff在
a[i]=1
右边的距离正好
v
。
i
a[i]=0
,
i=0
a[i]≡a[0]=1
,
i<0
iff在
a[i]=1
左边的距离上正好有一个顶点,否则
v
-i
位于原点。如果坐标
a[i]=0
处有一个顶点。
v
的顶点“b”:
a--------b--c--d--e
--|--|--|--|--|--|--|--|--|-->
-4 -3 -2 -1 0 1 2 3 4
a: ... 0 1 0 0 1 1 1 1 0 ...
a[i]=1
,我们以原点对称的方式定义值,好像我们已经反转了轴的方向:
i
,
v
iff在
b
的左边
i>0
b[i]=1
,
v
i
,
b[i]=0
iff在
i=0
右边的距离上正好有一个顶点,否则
b[i]≡b[0]=1
i<0
以便
b[i]=1
,这里的星号用于普通乘法。显然,如果长度路径
v
到顶点的左端,长度路径
-i
到顶点的右端。因此,对于
b[i]=0
而言,
c
中的每个位置都对应于您需要的路径。还有一些负位置(
c[i]=a[i]*b[i]
和
c[i]=1
),它们只是反映了正位置,还有一个位置
abs(i)
,即位置
abs(i)
。
i>0
中所有元素的总和。这个总和将是
c
,其中
c[i]=1
是以
c[i]=1
为中心所需的路径总数。因此,如果您知道
i<0
,您可以轻松确定
c[i]=1
。
i=0
和
c
以及当我们改变顶点
sum(c)=2P+1
时它们是如何变化的。让我们表示最左边的顶点(树的根)和相应的顶点数组。
P
表示
v
。很容易看出,对于顶点
sum(c)
来说,数组
P
和
a
只是数组
b
和
v
移位
v0
:
a[i]=a0[i+d]
b[i]=b0[i-d]
a0
(所有顶点使用一个数组),对于每个顶点,让我们将
b0
的值放入
a
元素(
b
和
v
取决于
d=dist(v0,v)
)。
v
以便对每个
a
S[d] = sum_over_i(a0[i+d]*b0[i-d])
b
数组,我们就可以在顶点上迭代,对于每个顶点
a0
只需使用
b0
就可以得到它的
d
,因为对于每个顶点
S
我们都有
v
。
sum(c)
的公式非常简单:
S[d]
只是
d
和
c
序列的
convolution。(公式不完全遵循定义,但很容易修改为精确的定义形式。)
v
和
S
(我们可以在
d
时间和空间中计算),计算
S
数组。在此之后,我们可以迭代
v
数组并简单地从
sum(c)
中提取路径数。
S[d]
。但是,应用快速傅立叶变换算法,两个序列的卷积
can be calculated in d=dist(v,v0)
。此外,您可以应用类似的
Number theoretic transform(不知道是否有更好的链接)来仅处理整数并避免精度问题。
calculate a0 and b0 // O(L)
calculate S = corrected_convolution(a0, b0) // O(L log L)
v0 = leftmost vertex (root)
for v in vertices:
d = dist(v0, v)
ans = ans + (S[d]-1)/2
v
,因为
sum(c)=sum(a0[i+d]*b0[i-d])
并不完全是一个卷积,而是一个非常相似的对象,可以应用类似的算法。此外,您甚至可以定义
S
,然后
S
是正确的卷积。)
关于algorithm - 如何在退化树中找到从特定顶点开始的所有等价路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30269778/
是: x -= y; 相当于: x = x - y; 最佳答案 不,它们并不等同于您表达它们的方式。 short x = 0, y = 0; x -= y; // This compiles f
这个问题在这里已经有了答案: What is the rationale for all comparisons returning false for IEEE754 NaN values? (1
我在哪里可以找到与 Python maketrans 和 translate 等效的 C# 代码?谢谢! 最佳答案 这应该带你到那里的大部分方式: public class MakeTrans {
我正在 SwiftUI 中构建一个应用程序其中包含很多组件,包括 Text包含长字符串的 View 。 当我在 iPhone 11 上启动该应用程序时,一切正常,但当我在较小的设备(例如 iPhone
这个问题已经有答案了: What is the equivalent lambda expression for System.out::println (2 个回答) Function pointe
我最近在使用 postgres,我必须做一些计算。然而我一直没能模仿Excel的HOUR()函数,我看了official information但这对我帮助不大。 函数接收一个小数,并得到小数的时、分
如果在 cython 中定义了一个指针 vector ,那么与 python 中的 enumerate 类似的函数或过程是什么,用于遍历指针数组中元素的索引和值在 C 声明类型函数内的循环中? 测试.
要选择: select user_id, max(case when value > 0 then timestamp else 0 end) as max_timestamp_whe
如果没有例子,这个问题很难问,所以这里是: #include struct O { }; struct C { template void function1(void (C::*call
我得到了这个结构的实现: struct NodoQ { Etype elem; NodoQ *sig; }; 下面是这段代码吗, typedef NodoQ *PtrNodoQ; PtrNod
我有一些宏需要访问当前类的类型,目前我通过违反 DRY 的模式解决了这个问题: struct ThisScruct{ int a; double b; //example st
我想知道 TensorFlow 的 softmax_cross_entropy_with_logits 是否有等效的 PyTorch 损失函数? 最佳答案 is there an equivalent
我找到了一个 trie 的 java 实现,并希望在 J2ME 中有一个类似的实现。这是代码。 节点类 import java.util.Collections; import java.util.L
我刚刚学习了 GraphQL,我想找到用户 id=2 OR 用户 id=3 现在我将如何进行 GraphQL 查询,我正在使用以下查询获取整个集合 { users() {
假设我有两个 Web 服务:A 和 B。两者都在 Apache 上运行。我希望它们可以从我的主机的不同端口访问:A 来自端口 88,B 来自端口 89。 我可以手动完成(首先创建图像,然后使用“doc
我一直在 excel 中使用一个非常简单的数组公式来处理一些数据集,但是它们变得太大并且在我更新计算时完全破坏了我的计算机性能。 excel表格和MySQL数据库布局如下: +-Timestamp-+
我有一个类,其实例要通过不同于它们携带的数据值的标识来区分。在我的代码中,我打算使用 == 来表示两个实例在它们的数据方面是等价的,并且 is 表示两个变量引用同一个实例,也就是说,他们是相同的。根据
我正在 Windows 中使用 WinSock 2.0 开发代理服务器。如果我想在阻塞模型中开发它,select() 是等待客户端或远程服务器从中接收数据的方法。是否有任何适用的方法可以使用 I/O
我正在将我制作的 Android 应用移植到 iOS。 Android 有一个 Yield() 函数可以将线程从运行中移到线程队列的后面(?)。这很有用,这样该线程就不会占用过多的 CPU 并使其他一
这是否保证始终为真: std::numeric_limits::max() == INT_MAX C++ 标准对此有何规定?我在标准中找不到任何明确说明这一点的引用资料,但我一直在阅读这些内容应该是等
我是一名优秀的程序员,十分优秀!