Algorithm 降低查找第一组位的摊销时间复杂度

Algorithm 降低查找第一组位的摊销时间复杂度,algorithm,complexity-theory,Algorithm,Complexity Theory,find first set bit算法简单地扫描位数组以查找第一个集合位,这实际上是一种基本的顺序搜索算法 假设我们可以访问设置和清除阵列位的操作,是否可以根据以下要求降低摊销复杂性: 可以使用额外的内存,但它应该是常量,O(1) 无法对位数组进行排序或更改 例如,一个简单的优化可能是使用一个额外的整数保存最后清除的位索引。随后的搜索将在O(1)时间内返回该值。但在我看来,这根本不会影响摊销运行时间,因为这种简单的改进无法为算法的最坏情况定义任何界限。但是像这样的一系列改进可能会降低摊销时

find first set bit算法简单地扫描位数组以查找第一个集合位,这实际上是一种基本的顺序搜索算法

假设我们可以访问设置和清除阵列位的操作,是否可以根据以下要求降低摊销复杂性:

  • 可以使用额外的内存,但它应该是常量,O(1)
  • 无法对位数组进行排序或更改
例如,一个简单的优化可能是使用一个额外的整数保存最后清除的位索引。随后的搜索将在O(1)时间内返回该值。但在我看来,这根本不会影响摊销运行时间,因为这种简单的改进无法为算法的最坏情况定义任何界限。但是像这样的一系列改进可能会降低摊销时间复杂性?还是不


关于这一点,

我打算用位运算符拼凑出一个简单的二进制搜索,但是斯坦福的位旋转黑客页面当然有这样的内容:。这为n位表示提供了O(logn)。它不使用位设置/清除操作,只是测试。我想这是允许的


在该类别中(右侧为零),您可能会喜欢其他几种方法。

在最坏的情况下,所有位都已设置,因此在最坏的情况下,您无法比顺序搜索做得更好。当然,在一般情况下可能会有更好的算法。
空间复杂度不会改变。
!=<代码>可以使用额外的内存,但它应该是常量O(1)。位集是O(n)内存,因此任何也是O(n)的数据结构(当然,这些数据结构的数量是有限的)都是有效的,因为它不会改变内存复杂性。那是哪一个呢?O(1)空间复杂性?或者相同的空间复杂度[O(n)]?好的,很抱歉误解了。我所说的空间复杂度不应改变的意思是,只允许使用O(1)空间来优化/改进算法,而不允许使用O(N)。这是因为对于我们的用例来说,内存效率是最重要的。然而,如果你能找到一种方法,通过使用O(N)空间(当然,使用额外的N位,而不是任何其他数据结构:)来减少摊销时间,我也想听听这个。你希望设置的位的百分比是多少?我得到的印象是它们非常稀疏-是吗?事实上,不确定,位集是用来标记slab内存分配器中的空闲/未空闲内存块的。所以,我想我们可以说输入是随机的。我知道这个页面。不幸的是,我在问题中提到的位数组可能具有动态大小,因此运行时复杂性取决于位的数量。但是,如果您可以将该算法调整为动态大小的位数组,那么我们就可以了。