идее
вы можете создать dict
. Для каждого элемента хранится отсортированный список позиций, где он встречается.
Чтобы ответить на запрос: бинарный поиск первый элемент, который больше или равен a
, проверьте, если он существует, и меньше, чем b
ПСЕВДОКОД
Preprocessing:
from collections import defaultdict
byvalue = defaultdict(list)
for i, x in enumerate(data):
byvalue[x].append(i)
Запрос:
def has_index_in_slice(indices, a, b):
r = bisect.bisect_left(indices, a)
return r < len(indices) and indices[r] < b
def check(byvalue, x, a, b):
indices = byvalue.get(x, None)
if not indices: return False
return has_index_in_slice(indices, a, b)
Сложность O(log N)
за запрос здесь, если мы предположим, что list
и dict
имеют сложность «получить по индексу» O (1).
Возможно, вам будет нужно добавить дополнительную информацию о возможностях 'x',' a' и 'b'. Многие разные 'x'es для одного экземпляра' [a: b] 'или' '' 'проверены на множество разных' [a: b] 'срезов ...? Кроме того, возможно ли сортировка данных? –
У меня может быть много разных x для каждой пары a, b. Данные списка не отсортированы грустно. – phoenix