假设我们有一个bitarray并且我们知道该数组的复杂性非常低:它主要由连续的“1”或“0”块组成.也就是说,如果我们读取两个连续的位,它们相同的几率远高于50%.例如:
00001111100011100000111111100000
这是这种格式的典型数组,因为它主要由相同位的连续块组成.这是一个:
00000000000000000000011111111000
但这不是:
10100110001010011100110001000111
这个概念可以用更精确的方式形式化,例如“迭代我们看到的最多log(N)位变化的数组”,或“2个连续位相同的几率是> 95%”,但我是不确定这很重要.
我的问题是:什么是快速算法来查找位数组上的第一个位设置的索引(即1)?
解决方法
根据您的系统,Count Leading Zeros操作clz可以使这一点变得更快.这在ARM体系结构中很常见.通过此操作,您可以一次计数许多未设置的位.有一些转变(在ARM中基本上是免费的)可能会加快速度.计数0,而不是位,移走已知位,重复.
仍然是线性的,但肯定是更快的线性 – 特别是如果数据在你的建议中有大量的运行.