二进制分解序列

时间:2013-10-29 18:26:58

标签: c# .net-2.0 c#-2.0 enumerator

我想处理序列中的项目的ArrayList,该序列连续地将列表分成两半。与二进制搜索类似的东西,但不处理已排序的数据并使用广度优先而不是深度优先顺序。

在此序列中,第一步是选择位置n/2的项目。第二步将选择每一半的中心位置,这将导致选择n/43n/4。第三步将这些季度再划分为两半,选择指数n/8, 3n/8, 5n/8, 8n/8。此步骤将跳过索引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;
        }
    }

0 个答案:

没有答案