Je suis confronté à un problème de recherche de discontinuités (intervalles) d'une longueur donnée dans une suite de nombres. Donc, par exemple, donné [1,2,3,7,8,9,10]
et un écart de length=3
, je vais trouver [4,5,6]
. Si l'écart est length=4
, je ne trouverai rien. La séquence réelle est, bien sûr, beaucoup plus longue. J'ai vu ce problème dans un bon nombre de messages, et il avait diverses applications et implémentations possibles. Un moyen que j'ai pensé pourrait fonctionner et devrait être relativement rapide est de représenter l'ensemble complet comme un tableau de bits contenant 1 pour le nombre disponible et 0 pour manquant - de sorte que ce qui précède ressemblera [1,1,1,0,0,0,1,1,1,1]
. Ensuite, exécutez éventuellement une fonction de fenêtre qui va masquer un tableau de la longueur donnée avec l'ensemble complet jusqu'à ce que tous les emplacements aboutissent à 1. Cela nécessitera un seul passage sur toute la séquence dans approximativement ~ O (n), plus le coût de masquage dans chaque course.Trouver des trous de données avec masquage de bits
Voici ce que je réussi à venir avec:
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
Ceci est assez rapide pour ~ 100k (< 1 sec). J'apprécierais des conseils sur la façon de rendre cela plus rapide/plus efficace pour les grands ensembles. Merci!
start est le tableau idx et non la valeur? – kevpie
Je n'aurais pas compris le problème. Ne peux-tu pas chercher les éléments adjacents pour lesquels 'a [i + 1] - a [i] == gap + 1'? –
@Marcelo Je pense que vous pouvez vraiment, et que le PO est sérieusement compliquer les choses, peut-être basé sur des idées mal comprises sur l'optimisation. J'ai écrit ma réponse sur cette hypothèse. –