【发布时间】:2019-07-05 14:17:30
【问题描述】:
注意:这是this problem 的两个乘数变体
给定一个集合A,由0.0和1.0之间的浮点数组成,找到一个最小集合B,使得对于A中的每个a,要么有一个值a == B[x],要么有一对唯一值,其中a == B[x] * B[y]。
例如,给定
$ A = [0.125, 0.25, 0.5, 0.75, 0.9]
B 的一个可能(但可能不是最小的)解决方案是
$ B = solve(A)
$ print(B)
[0.25, 0.5, 0.75, 0.9]
这满足了最初的问题,因为A[0] == B[0] * B[1]、A[1] == B[1]等,这让我们可以重新创建原始集合A。 B 的长度小于A 的长度,但我猜也有更小的答案。
我假设B 的解空间很大,如果不是无限的话。如果存在解决方案,如何找到最小集合B?
注意事项:
- 我们不一定限于 A 中的项目。B 可以由任何一组值组成,无论它们是否存在于 A 中。
- 由于 A 中的项目都是 0-1 浮点数,我假设 B 也将是 0-1 浮点数。是这样吗?
- 这可能是一个约束满足问题,但我不确定它是如何定义的?
- 由于浮点数学通常存在问题,因此任何答案都应围绕有理数构建算法。
【问题讨论】:
-
这个问题的整数对应物在素因数等方面有一个完善的理论。我建议你寻找方法将你的问题转化为涉及整数的问题。然后你也会知道任务的计算复杂度。
-
使用浮点数可能不会给您预期的结果,除非您试图将数字与非二次幂隔离开来。
-
整数对于我的应用程序是完全可行的,如果我们将
A的值作为一组百分比,然后将每个百分比乘以 100。(实际上,我将值向下舍入到最接近的 .0001的 A,但如有必要,我可以四舍五入到 0.01。)使用出乎意料的十进制值是什么意思?只是浮点数学限制?我打算使用 Python 的 Decimal 库,我相信它应该可以处理这种精度。 -
例如在IEEE754双精度中,0.07 * 20不等于1.4。使用整数会起作用。
-
@RobertBaron @saucewaffle
Fraction类可用于在 Python 中精确表示有理数。
标签: python algorithm set constraints set-theory