我想按顺序处理一个 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;
}
}