我想处理序列中的项目的ArrayList,该序列连续地将列表分成两半。与二进制搜索类似的东西,但不处理已排序的数据并使用广度优先而不是深度优先顺序。
在此序列中,第一步是选择位置n/2
的项目。第二步将选择每一半的中心位置,这将导致选择n/4
和3n/4
。第三步将这些季度再划分为两半,选择指数n/8, 3n/8, 5n/8, 8n/8
。此步骤将跳过索引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;
}
}