0

リストを連続して半分に分割するシーケンスで項目の 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/2n/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;
        }
    }
4

0 に答える 0