作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
= j .相同的序列-6ren">
我对计算三角形序列1感兴趣,它是对的序列(i, j): (0, 0), (1, 0), (1, 1), (2, 0), (2, 1) ...
它遍历所有对 (i, j)
限制为 i >= j
.相同的序列但具有限制 i > j 也很有趣。
除其他外,这些序列表示从 n 元素集中选择 2 个(可能相同)元素的所有方式(对于直到 (n, n)
2 的序列),或矩阵的下三角元素的索引。 i
的值序列只有A003056在 OEIS 中,而 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), ...
.
i >= j
版本代表子多重集(允许重复),而
i > j
变体代表正常子集(无重复)。
i >= j
版本包括主对角线,而
i > j
变体排除它。
最佳答案
这里有两种不使用任何昂贵计算的无分支方法。第一个使用比较和逻辑与:
const bool eq = i == j;
i += eq;
j = (j + 1) & (eq - 1);
const bool eq = i == j;
i += eq;
j = (j + 1) * (1 - eq);
repeatedly iterate over the small terms in the sequence
,可能其他方法会更可取。您只计算一次序列,然后从内存中重复读取它。
关于performance - 快速生成 "triangle sequence": avoiding mispredictions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38286279/
我对计算三角形序列1感兴趣,它是对的序列(i, j): (0, 0), (1, 0), (1, 1), (2, 0), (2, 1) ...它遍历所有对 (i, j)限制为 i >= j .相同的序列
我是一名优秀的程序员,十分优秀!