Для серии алгоритмов, которые я реализую, мне нужно моделировать такие вещи, как наборы монет, взвешиваемых или объединенных образцов крови. Главной целью является выявление редкого набора интересных предметов в наборе идентичных предметов. Эта идентификация выполняется путем тестирования групп предметов вместе. Например, классическая проблема заключается в том, чтобы найти легкую поддельную монету в группе из 81 (идентичных) монет, используя как можно меньше весов баланса лотка. Трюк состоит в том, чтобы разделить 81 монет на три группы и взвесить две группы друг против друга. Затем вы делаете это в группе, которая не балансирует, пока у вас не останется 2 монеты.Тестирование вектора без сканирования
Ключевым моментом в обсуждении выше является то, что набор интересных элементов разрежен в более широком наборе - алгоритмы, которые я реализую для всех типов бинарного поиска и т. Д. Для этого типа ввода.
Что мне нужно, это способ проверить вектор весь, что указывает на наличие одного или нескольких из них, без сканирования вектор покомпонентно.
I.e. способ вернуть вес Хэмминга вектора в операцию O (1) - это будет точно имитировать объединение образцов крови/групп взвешивания монет в балансе лотка.
Ключом к тому, что вектор не сканируется, но на выходе должно указываться, что в векторе имеется по меньшей мере один символ. При сканировании я имею в виду просмотр вектора с такими алгоритмами, как бинарный поиск или просмотр каждого элемента по очереди. Это необходимо для моделирования групп элементов (например, образцов крови) и одного теста в группе, который указывает на наличие 1.
Я реализовал этот «вектор» в качестве списка в настоящее время, но это необходимо «Не станешь в камне. Задача состоит в том, чтобы определить, тестируя группы подписок, где находятся 1s в векторе. Примером списка является:
sparselist = [0]*100000
sparselist[1024] = 1
Но это также может быть длинным/установленным/что-то еще, как предложено ниже.
В настоящее время я использую any() в качестве теста, но мне было указано, что any() сканирует вектор - побеждая цель того, чего я пытаюсь достичь.
Вот пример наивного двоичного поиска с использованием любого для проверки группы:
def binary_search(inList):
low = 0
high = len(inList)
while low < high:
mid = low + (high-low) // 2
upper = inList[mid:high]
lower = inList[low:mid]
if any(lower):
high = mid
elif any(upper):
low = mid+1
else:
# Neither side has a 1
return -1
return mid
Я прошу прощения, если этот код не качество продукции. Любые предложения по его улучшению (за пределами теста any()) будут оценены.
Я пытаюсь найти лучший тест, чем любой(), как было указано, что any() сканирует список - побеждая то, что я пытаюсь сделать. Тест не должен возвращать точный вес Хэмминга - он просто должен указать, что в тестируемой группе (или нет!) Нет 1 (то есть верхний/нижний код выше).
Я также думал об использовании двоичного xor, но не знаю, как использовать его таким образом, который не является покомпонентным.
Единственный способ сделать это без сканирования - сохранить соответствующую информацию на входе. –
@Tom Kealy, что вы подразумеваете под «бинарным вектором»? – doctorlove
Python имеет произвольные длины целых чисел. Используйте целое число в качестве поля растрового изображения, проверьте, больше ли число больше нуля, чтобы увидеть, содержит ли он хотя бы один бит == 1. –