【问题标题】:Why is the runtime of a bitwise operation constant?为什么按位运算的运行时间是常数?
【发布时间】:2020-05-07 07:28:09
【问题描述】:

假设我们正在对整数 1 和 4 执行 XOR 运算以找到汉明距离。为什么 XOR 和其他按位运算的运行时间低于常数?是不是因为 int 的大小在 Python 等语言中是固定的,所以无论整数输入如何,操作都会花费恒定时间?

[编辑] 假设我们正在使用 Brian Kernighan 的算法计算两个整数的汉明距离,如下所示。

def hammingDistance(x: int, y: int): xor = x ^ y distance = 0 while xor: distance += 1 # remove the rightmost bit of '1' xor = xor & (xor - 1) return distance

【问题讨论】:

  • 可能是因为这个操作是用硬件执行的,就像每个数学和逻辑运算一样
  • 如果不先确定输入大小,您将无法回答任何运行时问题。
  • 0 ≤ x, y

标签: bit-manipulation bitwise-xor


【解决方案1】:

那个函数不是恒定时间的(它取决于最高设置位是什么),但是其中的每个位运算符在大多数情况下都是恒定时间的(或全部?)现代 CPU,它们具有针对在固定周期数内对整个 16/32/64 位操作数进行操作的指令。

按位指令是一些最简单的 CPU 指令;我很想知道是否有任何处理器有可变时间位操作指令。很少有算术 CPU 指令的运行时间取决于它们的值。一些示例包括除法(在某些/大多数情况下)、涉及非正规时的乘法以及当前 AMD CPU 上的pdep

【讨论】:

  • 由于我们知道最大的 int 是 2^31,所以 2^31 的最大位长阈值为 32,给定bin(2**31).replace('0b','') = '10000000000000000000000000000000'。因此,我们可以假设该函数以恒定的时间复杂度运行。很抱歉我遗漏了输入大小。
猜你喜欢
  • 2018-08-03
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多