【发布时间】:2021-11-01 04:17:26
【问题描述】:
假设有 n 组实数:S[1], S[2], ..., S[n]。关于这些集合,我们知道两件事:
-
每个集合 S[i] 正好有 3 个元素。
-
每个集合 S[i] 中的所有元素都是 [0, 1] 范围内的实数。 (不过,我不知道这个细节是否有助于解决问题)。
让我们考虑可以表示为p[1] * p[2] * p[3] * ... * p[n] 的所有数字的集合T,其中p[i] 是S[i] 的一个元素。这个集合T,显然有 3^n 个元素。
我的问题是,给定集合 S[1], S[2], ..., S[n] (1 T 中比在O(3^n) 时间?重要的是,我不仅需要第 k 个最大的数字,还需要产生它的相应数字 (p[1], p[2], p[3], ... , p[n])。
即使答案是否定的,我也希望您能提供任何关于您将如何近似地解决这个问题的提示,也许,通过使用一些启发式方法?我知道beam search,但也许您可以提出其他建议?甚至对于束搜索,也不清楚如何在这里以最好的方式实现它。
如果可以在少于 O(3^n) 的时间内通过算法获得确切的答案,如果您能指出解决方案,我将不胜感激。
【问题讨论】:
-
“显然,这个集合 T 有 3^n 个元素。” 它有大约 3^n 个元素。但它的元素可能较少,因为某些乘积是相等的,即使您对 S[i] 集合中的数字有一些唯一性假设。
-
如果 T 实际上不太可能具有严格小于 3^n 的元素,我会感到非常惊讶。除非您有一些非常强的假设,例如“集合 S[i] 中的数字是成对互质数”。但这只是我的吹毛求疵——T 的大小仍然是 n 的指数。
-
所以一个观察结果是你的元组有一个自然的偏序。假设每个
S都已排序,那么我们可以说(p_1, p_2, ..., p_n) <= (q_1, q_2, ..., q_n)为所有i提供p_i <= q_i。prod尊重此排序,因此如果在poset 排序中有> 10 个更大的元组,那么我们知道该元组有> 10 个更大的产品。然后需要一些组合学来计算有多少类型的元组在poset ordering中具有10个或更少的更大元素。 -
嗯,例如,“找到 T 的最大元素”很容易:只需选择每个 S[i] 的最大元素,它们的乘积就是 T 的最大元素(假设所有数字是非负数)。然后找到第二大的就是找到将哪些因子更改为稍小的因子的问题。等等。然后再次为第三大。所以看起来你可以在 k 步中找到第 k 个最大的,并且每一步大约需要 n 次操作
-
"每个集合S[i]中的所有元素都是[0, 1]范围内的实数。(不知道这个细节对解决有没有帮助,不过)。” 是的,这很有帮助。数字小于 1 的事实可能并不重要,但它们是非负的这一事实非常重要,并且避免了诸如“如果负因子的数量是奇数则结果为负;如果负面因素的数量即使结果是正面的”
标签: python arrays algorithm sorting