【发布时间】:2011-11-16 21:00:41
【问题描述】:
我有一个长度相当大 (500,000) 的 c# BitArray,我正在尝试获取数组中设置的所有正位的索引。目前我正在通过以下方式实现这一目标:
public int[] GetIndexesForPositives()
{
var idIndexes = new int[GetPositiveCount + 1];
var idx = 0;
for (var i = 0; i < Length; i++)
{
if (Get(i))
{
idIndexes[idx++] = i;
}
}
return idIndexes;
}
我创建一个已知正位大小的空数组,然后我在该位数组上进行 lopp 并将索引值添加到返回数组中。
这意味着我必须在数组上执行 500,000 次循环,而且速度并不快。 (大约需要 15 毫秒)。
我知道 BitArray 在幕后使用了一个整数数组(我用它来编写 GetPositiveCount 函数 - 通过一个我从堆栈中下来的算法),我想知道是否也有一个算法可以做到这一点?
【问题讨论】:
-
并且该算法不需要具有 500K 次迭代的循环? (我的观点:即使这还不够快,您也可以尝试更改任何除了循环)。
-
也许递归是错误的词,我只是想避免循环 500k 次。 id 更倾向于遍历 BitArray 类中的底层整数数组,这将涉及更少的循环。
-
如果这不是过早的优化,您可以使用循环展开并将循环减少到 125.000。但是您从这种优化中获得了什么?我认为没什么。
-
@AaronHS 也许您的意思是您正在迭代整个集合。
-
@PVitt 感谢展开的建议。我做到了,它有所作为。除非你愿意,否则我会把它作为答案发布?关于过早的优化,我认为在不了解更多背景的情况下质疑动机是不公平的:)
标签: c# performance algorithm