リストを連続して半分に分割するシーケンスで項目の ArrayList を処理したいと思います。二分探索に似ていますが、並べ替えられたデータでは機能せず、深さ優先ではなく幅優先を使用します。
このシーケンスでは、最初のステップは position の項目を選択することn/2
です。2 番目のステップでは、各半分の中心位置を選択します。これにより、 と が選択n/4
され3n/4
ます。3 番目のステップでは、これらの四半期を再び半分に分割し、インデックスを選択しますn/8, 3n/8, 5n/8, 8n/8
。インデックスは、ステップ 1 と 2 でおよび2n/8, 4n/8, 6n/8
として選択されているため、このステップではスキップされます。このシーケンスは、すべてのアイテムが列挙されるまで続きます。n/2
n/4, 3n/4
これを IEnumerable を使用して C# 2.0 に実装するにはどうすればよいでしょうか?
これは私が書いたコードで、同様のシーケンスを生成しますが、インデックス 0 で始まり、あまりエレガントではありません。
private static IEnumerable BinaryDecomposition(ArrayList items)
{
ArrayList yieldedItems = new ArrayList();
int n = 2;
while (yieldedItems.Count < items.Count)
{
for (int i = 0; i < items.Count; i += (int)Math.Ceiling(1.0 * items.Count / n))
{
if (!yieldedItems.Contains(i))
{
yieldedItems.Add(i);
yield return items[i];
}
}
n *= 2;
}
}