- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在普林斯顿算法类(class)的开头,介绍了动态连接问题(快速查找、快速联合)。这是它的描述方式:
The input is a sequence of pairs of integers, where each integer represents an object of some type and we are to interpret the pair p q as meaning “p is connected to q.” We assume that “is connected to” is an equivalence relation, which means that it is
- Reflexive : p is connected to p.
- Symmetric : If p is connected to q, then q is connected to p.
- Transitive : If p is connected to q and q is connected to r, then p is connected to r.
它有一个名为quick-find
的简单实现:
One approach is to maintain the invariant that p and q are connected if and only if id[p] is equal to id[q]. In other words, all sites in a component must have the same value in id[].This method is called quick-find because find(p) just returns id[p], which immediately implies that connected(p, q) reduces to just the test id[p] == id[q] and returns true if and only if p and q are in the same component...To combine the two components into one, we have to make all of the id[] entries corresponding to both sets of sites the same value, as shown in the example at right.
我的问题是如何将其用于真实对象?它适用于整数,但如果我需要知道对象 A
是否连接到对象 B
,而不是 3
是否连接到5
?我能想到的一个解决方案是拥有一个对象数组,其中每个对象在数组中的索引对应于用于连接的数组的索引。例如:
1 2 3 4 5
[ { } { } {A} { } {B} ] <---- real data
1 2 3 4 5
[ 1 2 3 4 3 ] <---- connections (3 and 5 have the same group id 3)
是这样应用的吗?
最佳答案
您的建议肯定会奏效,但当对象列表以某种方式发生变化(例如以不同方式排序)时可能会变得麻烦。
您可以通过使用提到的 id
属性(或任何其他名称)扩展您的对象来实现提到的 quick-find
方法。
例如,如果您有这些对象(使用 Python 语法):
a = { "num": 1, "code": "test" };
b = { "num": 15, "code": "house" };
c = { "num": 9, "code": "garden" };
d = { "num": 4, "code": "flower" };
e = { "num": 24, "code": "cat" };
然后将 id
属性添加到这些对象(这种扩展的语法在许多语言中都不同):
a["id"] = 1 # extend the object with an additional property.
b["id"] = 2
c["id"] = 3
d["id"] = 4
e["id"] = 3
然后创建一个函数,告诉您两个对象是否已连接,如 quick-find
中所述:
def are_connected(x, y):
return x["id"] == y["id"];
在这种情况下,以下测试的结果为真:
print (are_connected(c, e)); # True
如果您不想通过添加 id
属性来改变您的原始对象,您可以创建一个单独的 map 。有些语言可以为每个对象提供一个唯一的标识符。例如,在 Python 中,可以使用内置的 id()
函数检索此标识符。如果不可用,您将使用对象的唯一属性,该属性在示例数据中为 num
属性。所以在 Python 中:
conn = {}
conn[id(a)] = 1
conn[id(b)] = 2
conn[id(c)] = 3
conn[id(d)] = 4
conn[id(e)] = 3
def are_connected(x, y):
return conn[id(x)] == conn[id(y)];
print (are_connected(c, e)); # True
在这种方法中,您不会(总是)为连接的对象存储相同的 id,而是让它们指向同一组连接对象中的另一个(子到父),该树的根指向它自己.
如果需要测试两个对象是否连接,您将找到它们各自连接到的两个根(通过遍历它们的祖先到树的顶部)并查看它们是否共享该根。
使用一些不同的示例数据,并使用 id
属性,它看起来像这样:
a = { "num": 1, "code": "test" };
b = { "num": 15, "code": "house" };
c = { "num": 9, "code": "garden" };
d = { "num": 4, "code": "flower" };
e = { "num": 24, "code": "cat" };
f = { "num": 88, "code": "dog" };
然后将 id
属性添加到这些对象(这种扩展的语法在许多语言中都不同):
a["id"] = a # it is a root, so a self-reference
b["id"] = a # same group as a
c["id"] = c # root of different tree
d["id"] = c # same group as c
e["id"] = c # same group as c
f["id"] = d # same group as c, but child of d
可以这样表示:
a c
| / \
b d e
/
f
告诉您两个对象是否连接的函数现在看起来像这样:
def are_connected(x, y):
while x["id"] != x: # while not at the root
x = x["id"] # go upward in tree
while y["id"] != y: # same for y
y = y["id"] # go upward in tree
return x == y; # if root is the same: the original objects are connected
请注意,您也可以将其编写为递归函数。
在这种情况下,以下测试的结果为真:
print (are_connected(e, f)); # True
关于algorithm - 联合查找算法如何与 "real"数据一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43806710/
我在决定是将我的应用程序归类为“实时”还是“接近实时”,或者甚至是其他类别时遇到了麻烦。 该软件会立即接收从源生成的数据,然后根据某些规则,在满足某些条件时发出警报。它采用每 30 秒检查一次最近 3
我的 c 编译器有问题当编译一个简单的hello world时,用户时间是>>>实时的。 这里是两台机器之间的时间比较。 需要注意的是,机器没有执行任何其他任务,其他操作运行得很快(甚至是其他编译器)
虽然我用 C 实现了很多项目,但我对操作系统完全陌生。我在探索板 (STM32) 上尝试了实时 linux,并得到了 LED 闪烁的正确结果,但我并没有真正理解整个过程,因为我只是按照步骤操作,无法在
我的问题是,“可以使用 select type block 来区分 real::realInput 和 real::realArrayInput(:) ?”很清楚 select type 可以如何用于
通过 fortran-iso-c-binding,我可以连接 C 函数并获取类似类型的变量 real(c_float) integer(c_int) 但在程序的其余部分我想使用基本类型(仅仅是因为我不
我正在编写一个应用程序,在某个 block 中我需要对实数取幂大约 3*500*500 次。当我使用 exp(y*log(x)) 算法时,程序明显滞后。如果我使用另一种基于处理数据类型的算法,速度会快
我目前在 science linux 6 下使用 gfortran 4.4.7 编译器。我需要用 128 位声明变量。我无法更改操作系统希望在science linux 6下能做一些事情。 最佳答案
当我在 .NET 中将进程的优先级设置为实时时: Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
我正在使用 Accelerate Framework 在 iOS 中实现基于加速度计的 FFT,但我仍然有点困惑的是这一部分: /* The output signal is now in a spl
用 f(x::Real) 定义函数有什么区别吗?和 f{T <: Real}(x::T) ? @code_warntype给出相同的输出 function f(x::Real) x^2 end
所以我看到了these two questions on twitter . 1.real 是语法错误,而 1 .real 不是? >>> 1.real File "", line 1 1
我有这个简单的代码,它使用 DGEMM 例程进行矩阵乘法 program check implicit none real(8),dimension(2,2)::A,B,C A(1,1)=
如标题所示,我使用了 Media Foundation WavSink 示例,该示例将音频流解码为 PCM 并转储到文件。 我的应用程序是将此流定向到 FMOD 音频引擎,该引擎以实时速率使用 PCM
1) 独占时间是在方法中花费的时间2) 包含时间是在方法中花费的时间加上在任何被调用函数中花费的时间3)我们称调用方法为“ parent ”,称方法为“子”。引用链接:Click here 这里的问题
我正在尝试使用 PS3 Eye 实时执行到达时间差。由于它内置了4个麦克风阵列,我成功地将阵列重新排列成方形阵列,并使用MATLAB对信号进行互相关,得到了一个相对准确的TDOA算法。然而,到目前为止
我开始改进一些旧的 R 代码,发现下一个函数是 deprecated : real创建指定长度的 double 向量。向量的每个元素都等于 0。 as.real试图将其参数强制为 double 类型。
因此,得出以下结论:实时异常检测的定义是什么? 我正在研究异常检测领域,在许多论文中,该方法被定义为实时,而在许多其他论文中,它简称为异常检测。 我碰巧发现,纠正我是否我错了,大多数所谓的实时方法实际
查看所有现有的操作转换框架示例,它们似乎都解决了将更改转换为纯文本文档的问题。 OT 框架如何用于更复杂的对象? 我想开发一个实时便签样式的应用程序,人们可以在其中共同创建便签,更改他们的位置和文本值
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以使为on-topic。 4
我有大量的点数据流(二维)(每秒数千个)。在这张 map 上,我有几个固定的多边形(几十到几百个)。 我想实时确定(在相当强大的笔记本电脑上几毫秒的数量级)它所在的多边形(多边形可以相交)的每个点。我
我是一名优秀的程序员,十分优秀!