Po pierwsze, nie jest wcale jasne, że gwarancja binarna jest tu gwarantowana . Możliwe, że wyszukiwanie liniowe jest szybsze, gdy liczba interwałów jest mała.
Jeżeli obawiasz się o wydajność, rozważne rzeczą do zrobienia jest do profilowania kodu, a może obie metody porównawcze na typowy wejść.
Zastrzeżenia bok, przeszukiwanie binarne mogą być realizowane przez sortowanie interwały raz, a potem wielokrotnie za pomocą modułu bisect
zrobić wyszukiwania:
import bisect
intervals = [(999, 2333, 'int1'), (0, 128, 'int2'), (235, 865, 'int3')]
intervals.sort()
def find_int(intervals, val):
pos = bisect.bisect_left([interval[1] for interval in intervals], val)
if pos < len(intervals) and val >= intervals[pos][0]:
return intervals[pos]
else:
return None
print(find_int(intervals, 0))
print(find_int(intervals, 1))
print(find_int(intervals, 200))
print(find_int(intervals, 998))
print(find_int(intervals, 999))
print(find_int(intervals, 1000))
print(find_int(intervals, 2333))
print(find_int(intervals, 2334))
W powyższym sądzę, że przedziały są bez nakładania , a interwał obejmuje zarówno punkt początkowy, jak i końcowy.
Wreszcie, aby zwiększyć wydajność, można by rozważyć faktoring [interval[1] for interval in intervals]
z funkcji i robi to tylko raz na początku.
Czy to "warte" posortowania w celu użycia wyszukiwania binarnego? [jeśli planujesz przeszukać kilka razy, nie "warto" go posortować, jeśli planujesz wiele razy szukać, to jest to] – amit
Obiekty będą musiały być posortowane. – rplnt
Jaka jest absolutna górna i dolna granica tych liczb? Możesz rozszerzyć zakresy na właściwy "indeks odwzorowany bitowo", w którym po prostu wyliczasz wszystkie wartości w zakresie. –