Поиск бинарных иш через частично заказанный набор
-
29-09-2020 - |
Вопрос
У меня есть интересная функция. Это требует подмножеств {1, ..., N} к положительным целым числам, то есть $ f: p ([n]) \ prightarrow z ^ + $ .
Я знаю, что если S - это подмножество S ', $ f (s)
Если бы я знал, что упорядочение было совершенно лексикографическим, я бы использовал простой двоичный поиск. Я не знаю этого, и я верю, что это не (например, $ f (\ {1,2,3,4,5,6 \}) $ Возможно, больше, чем $ F (\ {7 \}) $ ). Есть ли хороший o (n) алгоритм для этого поиска на Poset? Очевидно, что для любого заметного размера, я должен вычислить f on-fly и не может полагаться на хранение в памяти.
Разъяснение после обсуждения в комментариях: Особый $ f $ Я имею дело с добавкой - в частности, $ f (s)=sum_ {k \ В s} g (k) + f (\ predyset) $ , с $ g $ монотонно увеличивая функцию. Это может быть проще, чем общий случай (который также интересен, но не моя особая проблема).
Решение
Вот простой алгоритм, который работает в $ O (n ^ 2) $ time и $ O (n) $ Space, предполагая, что $ f (\ emptyset) $ , $ f (\ {1 \}) $ , $ f (\ {2 \}) $ , $ \ cdots $ , $ f (\ {n \}) $ приведен в массиве.
Начальная идея примерно так же, как то, что было дано ОП в его комментарии. «Мы будем искать на подмножествах размера k, используя лексикографический порядок, для каждого $ K $ от $ 0 $ Для $ n $ n $ . Сохраняйте единое целое с наилучшим значением $ f $ . "
Проблема в том, как искать наилучшее значение $ F $ на подмножествах размеров $ K $ , с именем $ B_K $ , в $ O (n) $ время. Вместо двоичного поиска мы проверим, будет ли $ n $ , $ n-1 $ , \ cdots, $ 1 $ должен быть включен в лучшее подброс один за другим, взяв реальное преимущество лексикографического порядка на подмножествах.
- инициализировать $ b_k= f (\ emptyset) $ . $ \ b_k $ будет лучшее значение на подмножестве размеров $ K $ в конце этой процедуры ,
- инициализировать $ count= 0. $ $ \ count $ - это количество элементов, которые у нас есть в комплект входит в лучшее подмножество.
- Проверьте $ f (\ {n \}) $ . Если $ b_k + f (\ {n \}) + f (\ {1, 2, \ cdots, k-count -1 \}) \ le z $ , должен быть включен $ n $ . Добавить $ f (\ {n \}) $ на $ b_k $ и добавьте 1 на <класс span= «Математический контейнер»> $ COUNT $ .
- Проверьте $ f (\ {n-1 \}) $ . Если $ b_k + f (\ {n-1 \}) + f (\ {1, 2, \ cdots, k-count-1 \}) \ le z $ , $ n-1 $ должен быть включен. Добавить $ f (\ {n-1 \}) $ на $ b_k $ и добавьте 1 на < Spaness Class="Math-Container"> $ COUNT $ .
- и так далее.
- до тех пор, пока мы не проверили $ f (\ {1 \}) $ или $ count== k $ < / span>.
Возможно, мы можем задаться вопросом, если он будет принимать $ O (n) $ для вычисления каждого $ f (\ {1 , 2, \ CDOTS, K-COUNT-1 \}) $ , вычисления каждая $ b_k $ одна потребует $ O (n * n) $ time. Однако, поскольку $ f $ - это добавка, мы можем вычислить все префиксные суммы $ f (\ {1 \}) $ , $ f (\ {2 \}) $ , $ \ cdots $ , < Spaness Class="Математический контейнер"> $ f (\ {n \}) $ endfront в $ O (n) $ time. Затем требуется $ O (1) $ для доступа к каждой сумме префикса.
С момента поиска $ B_K $ принимает $ O (N) $ Time, для каждого <класс Span= «Математический контейнер»> $ k $ от $ 0 $ на $ n $ , Общее время работы - $ O (n ^ 2) $ .
Описание выше алгоритма пропускает самый простой случай, когда $ f (\ Edityset) \ gt z $ . В этом случае алгоритм должен вернуть, что такого подмножества нет.