一連の数字で特定の長さの不連続 (ギャップ) を見つけるという問題に直面しています。したがって、たとえば、[1,2,3,7,8,9,10]
と のギャップが与えられた場合、length=3
が見つかります[4,5,6]
。ギャップが の場合、length=4
何も見つかりません。もちろん、実際のシーケンスはもっと長くなります。この問題はかなりの数の投稿で見てきましたが、さまざまなアプリケーションと可能な実装がありました。
私がうまくいくと思った方法の 1 つは、完全なセットを、使用可能な番号の 1 と欠落の 0 を含むビット配列として表すことです。したがって、上記は のようになります[1,1,1,0,0,0,1,1,1,1]
。次に、すべての位置が 1 になるまで、指定された長さの配列を完全なセットで XOR マスクするウィンドウ関数を実行する可能性があります。各実行でのマスキング。
これが私が思いついたものです:
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 (< 1 秒) でかなり高速です。大規模なセットでこれをより速く/より効率的にする方法についてのヒントをいただければ幸いです。ありがとう!