私は三角形シーケンス1を計算することに興味があります。これは、という制限で(i, j): (0, 0), (1, 0), (1, 1), (2, 0), (2, 1) ...
すべてのペアを反復するペアのシーケンスです。i > j という制限を伴う同じシーケンスも興味深いものです。(i, j)
i >= j
これらのシーケンスは、とりわけ、n 個の要素セット ( 2 までのシーケンス) から(n, n)
2個の (おそらく同一の) 要素を選択するすべての方法、または行列3の下三角要素のインデックスを表します。i
aloneの値のシーケンスはOEIS ではA003056j
ですが、 alone はA002262です。シーケンスは、パフォーマンスが重要になる組み合わせアルゴリズムで頻繁に発生します。
シーケンス内の次の値を生成する単純だが枝分かれした方法は次のとおりです。
if (i == j) {
j = 0;
i++;
} else {
j++;
}
}
ただし、これは、条件をチェックするときに、シーケンスの初期要素を計算する際に多くの誤予測に悩まされます。(i == j)
通常、毎回 1 つの誤予測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
バリアントには含まれていません。