【发布时间】:2018-05-04 13:05:48
【问题描述】:
我一直在研究一个有趣的问题,并认为我应该在这里发布它。问题如下:
给定两个数组,A 和 B,每个数组的元素是 0 或 1。目标是确定 A 中的所有 1 是否都在 B 中的第一个 1 之前。你可以假设所有 1 都是连续的 - 你不能在 2 个之间有 0。 (即你永远不会有 [1,0,1])。 一些例子:
正确:A = [0,1,1,0],B = [0,0,0,1]
正确:A = [1,0,0,0],B = [0,1,1,0]
错误:A = [0,0,0,1],B = [1,0,0,0]
错误:A = [0,1,1,0],B = [0,0,1,0]
您可以假设 len(A) = len(B) = N,但 N 可以非常大。因此,不能简单地将整个数组转换为二进制数,因为它太大而无法表示。
我想以最有效的方式找到解决方案,最好是 O(1)。我一直在使用 Numpy 数组在 Python 中对此进行编码,因此您可以对数组执行逻辑操作(例如 A 和 B,它会告诉您 A 和 B 之间是否有任何 1 重叠)。很想看看您能想出的任何解决方案!
【问题讨论】:
-
直接的解决方案是找到 B 中第一个出现的 1 的索引,然后检查 A 中的所有 1 是否都有较小的索引。我看不出你怎么可能在不到
O(N)的时间内做到这一点,因为你必须检查 A 的所有元素。 -
我在想有一种方法可以在这里巧妙地使用位算术。例如,如果 A&B 全部为 0,则没有重叠,那么您只需检查 A > B
-
虽然按位运算非常快,但它们仍然是
O(#bits) = sizeof(type)*8*N,即O(N)
标签: python algorithm numpy bit-manipulation time-complexity