【发布时间】:2010-12-07 09:54:13
【问题描述】:
我遇到了在数字序列中查找给定长度的不连续性(间隙)的问题。因此,例如,给定[1,2,3,7,8,9,10] 和length=3 的差距,我会找到[4,5,6]。如果差距是length=4,我什么也找不到。当然,真正的序列要长得多。我在很多帖子中都看到过这个问题,它有各种应用和可能的实现。
我认为可能可行并且应该相对较快的一种方法是将完整集表示为一个位数组,其中包含 1 表示可用数字和 0 表示缺失 - 所以上面看起来像 [1,1,1,0,0,0,1,1,1,1]。然后可能运行一个窗口函数,它将用完整的集合对给定长度的数组进行 XOR 掩码,直到所有位置的结果为 1。这将需要在大约 ~O(n) 内对整个序列进行单次传递,加上成本在每次运行中进行掩蔽。
这是我设法想出的:
def find_gap(array, start=0, length=10):
"""
array: assumed to be of length MAX_NUMBER and contain 0 or 1
if the value is actually present
start: indicates what value to start looking from
length: what the length the gap should be
"""
# create the bitmask to check against
mask = ''.join( [1] * length )
# convert the input 0/1 mapping to bit string
# e.g - [1,0,1,0] -> '1010'
bits =''.join( [ str(val) for val in array ] )
for i in xrange(start, len(bits) - length):
# find where the next gap begins
if bits[i] != '0': continue
# gap was found, extract segment of size 'length', compare w/ mask
if (i + length < len(bits)):
segment = bits[i:i+length]
# use XOR between binary masks
result = bin( int(mask, 2) ^ int(segment, 2) )
# if mask == result in base 2, gap found
if result == ("0b%s" % mask): return i
# if we got here, no gap exists
return -1
这对于大约 100k(
【问题讨论】:
-
start 是数组 idx 而不是值?
-
我一定没有正确理解这个问题。你不能只寻找
a[i + 1] - a[i] == gap + 1的相邻元素吗? -
@Marcelo 我认为你真的可以,并且 OP 严重地将事情复杂化了,可能是基于一些关于优化的知之甚少的想法。我根据这个假设写了我的答案。
-
了解您是否要在同一序列中查找多个不同长度的间隙非常重要。如果您想迭代地查找长度为 1 到 100 的间隙,那么首先转换序列可能是值得的。
-
您是否只是想要一个列表来补充提供的列表,其中的间隙与请求的确切大小相匹配? [1,2,5,8] 长度=2 -> [3,4,6,7]?
标签: python arrays performance bitmask