数组 – 是否有比O(N)更好的算法来找到主要由连续块组成的比特阵列中的第一个比特集?

假设我们有一个bitarray并且我们知道该数组的复杂性非常低:它主要由连续的“1”或“0”块组成.也就是说,如果我们读取两个连续的位,它们相同的几率远高于50%.例如:

00001111100011100000111111100000

这是这种格式的典型数组,因为它主要由相同位的连续块组成.这是一个:

00000000000000000000011111111000

但这不是:

10100110001010011100110001000111

这个概念可以用更精确的方式形式化,例如“迭代我们看到的最多log(N)位变化的数组”,或“2个连续位相同的几率是> 95%”,但我是不确定这很重要.

我的问题是:什么是快速算法来查找位数组上的第一个位设置的索引(即1)?

解决方法

根据您的系统,Count Leading Zeros操作clz可以使这一点变得更快.这在ARM体系结构中很常见.通过此操作,您可以一次计数许多未设置的位.有一些转变(在ARM中基本上是免费的)可能会加快速度.计数0,而不是位,移走已知位,重复.

仍然是线性的,但肯定是更快的线性 – 特别是如果数据在你的建议中有大量的运行.

相关文章

文章浏览阅读903次。文章主要介绍了收益聚合器Beefy协议在币...
文章浏览阅读952次。比特币的主要思路是,构建一个无中心、去...
文章浏览阅读2.5k次。虚拟人从最初的不温不火,到现在步入“...
文章浏览阅读1.3k次,点赞25次,收藏13次。通过调查和分析用...
文章浏览阅读1.7k次。这个智能合约安全系列提供了一个广泛的...
文章浏览阅读1.3k次。本文描述了比特币核心的编译与交互方法...