所以,如果你有A(A1,...,An)和B(B1,...,Bn)。
当且仅当
A1 * ... * An < B1 * ... * Bn时,A < B
我假设每个值都是正数,因为如果我们允许负数,那么:
(-50,-100,1)>(1,2,3)
因为-50 *(-100)* 1 = 5000> 6 = 1 * 2 * 3
即使没有负值,问题仍然相当复杂。您需要一个解决方案,其中包括一个深度为k的数据结构。如果(A1,...,Ak)<(B1,...,Bk),则我们可以假设在其他维度上,(A1,...,Ak,...,An)的组合可能小于(B1,...,Bk,...,Bn)的组合。因此,无论何时这不成立,情况都会打破概率,因此这些将是规则的例外情况。数据结构应包含:
对于任何这样的异常情况,可能存在一个(C1, ..., Ck)的组合大于(B1, ..., Bk),但是更大的(C1, ..., Ck)组合仍然可能使用进一步维度的值组合,其中(A1, ..., Ak) < (C1, ..., Ck)的规则异常仍然存在。
因此,如果您已经知道(A1, ..., Ak) < (B1, ..., Bk),那么首先必须检查是否存在异常,方法是找到第一个l维度,在选择A的最大可能值和B的最小可能值时。如果存在这样的l,则应找到异常开始的位置(哪个维度,哪个索引)。这将描述异常情况。当您发现异常时,您知道(A1, ..., Ak, ..., Al)的组合>(B1, ..., Bk, ..., Bl),因此在这里规则是A比B大,并且当B变得比A大时会出现异常。
为了反映这一点,数据结构应如下所示:
class Rule {
int k;
int[] smallerCombinationIndexes;
int[] biggerCombinationIndexes;
List<Rule> exceptions;
}
每当你发现一个规则的例外时,这个例外都是基于先前的知识产生的。显然,复杂性大大增加了,问题在于你有规则的例外,还有例外的例外等等。当前的方法会告诉你,如果你取两个随机点 A 和 B,A 是否小于 B,它还会告诉你,如果你取 (A1, ..., Ak) 和 (B1, ..., Bk) 的组合,那么在哪些关键索引处 (A1, ..., Ak) 和 (B1, ..., Bk) 的比较结果会改变。根据你确切的需求,这个想法可能已经足够,或者需要扩展。所以你的问题的答案是:是的,你可以扩展懒惰算法来处理更多的维度,但你需要处理规则的例外才能实现这一点。