- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题陈述:
方程式以 A / B = k
格式给出, 其中A
和 B
是表示为字符串的变量,k
是实数( float )。
给出一些查询,返回答案。如果答案不存在,返回-1.0。
示例:给定 a / b = 2.0, b / c = 3.0.
查询是:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ?
返回 [6.0, 0.5, -1.0, 1.0, -1.0 ]
输入是:
vector<pair<string, string>> equations
vector<double>& values
vector<pair<string, string>> queries
哪里equations.size() == values.size()
, 并且值为正。
这表示方程式。
返回vector<double>
.
根据上面的例子:方程式 = [ ["a", "b"], ["b", "c"] ]
值 = [2.0, 3.0]
查询 = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]
输入始终有效。您可能会假设评估查询不会导致除以零并且不存在矛盾。
解决方案这可以在不相交的集合上使用 Union+Find 来解决,这里有一个解决方案:
但是,我不清楚第 59 行背后的直觉:
rst[i] = uf.rank.get(queries[i][0]) / uf.rank.get(queries[i][1]);
以及第 99 行:
rank.put(aFather, quotient * rank.get(b) / rank.get(a));
最佳答案
不难理解发生了什么。事实上非常聪明!
让我们举一个更复杂的例子:
a / b = 2.0, b / c = 3.0, c / d = 4.0, d / e = 5.0
在第一步(MakeSet 由 UnionFind uf = new UnionFind(set)
触发)中,每个元素都被设置为它自己的父元素,并且所有等级都被设置为1.0:
parent(a) = a, rank(a) = 1.0
...
parent(e) = e, rank(e) = 1.0
在联合步骤中,节点的等级设置为给定的商,而父节点的等级保持不变(第 99 行)。所以在 union(a, b, 2.0) parent(a) = b, rank(a) = 2.0
之后,为任何节点 n 维护不变量:rank(n)/rank( parent(n)) = value
,其中 value 来自正在处理的方程(quotient
参数)。最后我们得到:
parent(a) = b, rank(a) = 2.0
parent(b) = c, rank(b) = 3.0
parent(c) = d, rank(c) = 4.0
parent(d) = e, rank(d) = 5.0
parent(e) = e, rank(e) = 1.0
在压缩步骤中,如果被搜索节点的父节点不是集合的代表节点,则通过递归搜索设置为parent of parent of parent... 并将当前节点的等级设置为当前等级乘以父等级(第 87 行)。所以最后我们得出:
parent(a) = e, rank(a) = 120.0
parent(b) = e, rank(b) = 60.0
parent(c) = e, rank(c) = 20.0
parent(d) = e, rank(d) = 5.0
parent(e) = e, rank(e) = 1.0
所以确实 rank(a) = rank(b) * 2.0,rank(b) = rank(c) * 3.0 等,正如输入方程中给出的那样。
请注意,一个集合的代表节点(即本例中的最终父节点,e
)最终的等级始终为 1.0。这就是为什么重复调用 compressedFind
并执行第 87 行不会进一步更改节点的等级,一旦它被计算并且父节点被设置。
现在很容易看出第 59 行是如何工作的:如果查询是 a/b 那么 rank(a)/rank(b) = 120.0/60.0 = 2.0
此处使用的术语:https://en.wikipedia.org/wiki/Disjoint-set_data_structure
关于java - Union+Find算法的应用(Disjoint Set),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989854/
我有一组称为 nets 的整数集,我正在尝试对其进行迭代以确定是否已将来自或来自的整数添加到现有集合中;如果是这样,我将它们添加到现有集合中(这是为了跟踪电网中所有短路的组合)。 但是,我无法让 se
很奇怪:A 是一个集合,B 是一个集合的集合: Set A=new HashSet(); Set > B=new HashSet>(); 我给他们加了东西,输出 System.out.println
在 Agda 中,forall 的类型以这样的方式确定以下所有类型都是Set1 (其中 Set1 是 Set 的类型, A 的类型是 Set ): Set → A A → Set Set → Set
在 haskell 中我可以写一个函数 f where f :: Set a -> Set a -> Set a 如果我采用 Set Int 类型的两组 s1 和 s2,然后执行 f s1 s2 它将
在使用 Spring 时,我遇到了一个奇怪的问题。我有一个类,它接受一个集合作为输入,因为该类是底层框架的,所以我无法更改它。这是它的声明 private Set evaluate; public S
我是流的新手,我想通过将流操作应用于其条目集来修改 map ,但由于编译错误我无法这样做。 下面的代码只是创建了一个新的 map 对象并为其分配了一些整数值。然后它尝试通过在其条目集上应用流操作来删除
无论我看什么,我都会看到集合的输入是这样完成的: Set set = new HashSet(); 但是,我像这样定义我的集合 Set set = new HashSet(); 而且我仍然进行类型检查
我想对于 set -e 我可以捕获信号,但其他的我不知道。 最佳答案 为了完整性: set -e:如果命令失败则退出 set -u:如果在设置之前引用变量,则会出现错误 set -x:显示运行的命令
Set 维护唯一记录,并在尝试复制现有元素时更新现有记录。 考虑以下两种情况。您认为两者之间哪一个代码更快、更高效? 场景 1:使用 addAll() Set uniqueSet = new Hash
我在 Fedora 上做这个 问题: (sandbox)[root@localhost mysite]# django-admin.py runserver Error: Could not impo
https://codeforces.com/contest/1435/submission/96757666->使用set.upper_bound() https://codeforces.com/
使用 MySQL,我已将连接字符集设置为 UTF-8: SET NAMES 'utf8mb4'; SET CHARACTER SET 'utf8mb4'; 这样我就能以 UTF-8 格式返回所有内容,
在 Spring 3 MVC 中,我有一个称为 SettingsController 的 Controller ,它具有用于显示用户列表的 displayUsers()、saveUser() 和 de
我正在创建一个使用语法的程序,并查看该语法是否为 LL (1)。我想使用模块Set,但是我不知道如何进行,当然set的元素的类型是char,你能帮忙吗? 最佳答案 此答案假设您已经知道如何确定语法是否
好的,所以我重新整理了这篇文章,使其更容易理解(对所有的 Pastebin 感到抱歉,但堆栈溢出在代码格式化方面很愚蠢) 请注意,我不打算存储如下所述的大量数据。我使用我所说的数量的主要原因是为了尽可
我有一个密码,我保存在 Settings.settings 文件中并且我希望该部分被加密。 This是我得到的提示,但我真的不知道如何应用它。 谁能给我一个关于如何加密这样的密码的想法? 最佳答案 您
我在网上搜索并找到了如何在设置中添加特定的自定义数据类型。 我自己插入数据,而不是在程序运行时通过代码插入数据。我的问题是如何将自定义数据类型添加到设计器中的组合框。现在我想通了,需要建议,如何添加这
我一直在尝试将自定义类的自定义集合添加到我的 winforms 项目的应用程序设置中,我觉得我已经尝试了六种不同的方法,包括 this way , this way , this way , 和 th
在 Visual Studio 2008 中调试我的项目时,我的 Settings.settings 文件在构建之间不断重置。有没有办法防止这种情况发生? 谢谢。 最佳答案 好的,我找到了我真正想要的
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 4年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!