我有兴趣计算三角形序列1,它是对的序列,(i, j): (0, 0), (1, 0), (1, 1), (2, 0), (2, 1) ...
它遍历所有对(i, j)
,限制为i >= j
. 具有 i > j 限制的相同序列也很有趣。
(n, n)
除其他外,这些序列表示从 n 元素集(对于最多2的序列)中选择 2 个(可能相同)元素的所有方式,或矩阵3的下三角元素的索引。在 OEIS 中,单独的值序列i
是A003056,而j
单独的是A002262。该序列经常出现在组合算法中,它们的性能可能很关键。
在序列中生成下一个值的一种简单但复杂的方法是:
if (i == j) {
j = 0;
i++;
} else {
j++;
}
}
然而,在计算序列的初始元素时,在检查条件时会出现许多错误预测(i == j)
——通常每次i
都会增加一个错误预测。随着序列的增加,错误预测的数量变得更少,因为i
随着频率的降低而增加,因此j++
分支占主导地位并且被很好地预测。尽管如此,某些类型的组合搜索会反复迭代序列中的小项,因此我正在寻找一种无分支方法或其他一些错误预测较少的方法。
对于许多用途,序列的顺序并不那么重要,因此如果可以产生更好的解决方案,则可以允许以与上述不同的顺序生成值。例如,j
可以倒计时而不是倒计时:(0, 0), (1, 1), (1, 0), (2, 2), (2, 1), ...
.
1我也有兴趣知道这个序列的正确名称是什么(也许我为这个问题取了一个更好的标题)。我只是编造了“三角形序列”。
2这里,i >= j
版本代表子多集(允许重复),而i > j
变体代表正常子集(不重复)。
3在这里,i >= j
版本包括主对角线,而i > j
变体不包括它。