Поиск бинарных иш через частично заказанный набор

cs.stackexchange https://cs.stackexchange.com/questions/128133

  •  29-09-2020
  •  | 
  •  

Вопрос

У меня есть интересная функция. Это требует подмножеств {1, ..., N} к положительным целым числам, то есть $ f: p ([n]) \ prightarrow z ^ + $ . Я знаю, что если S - это подмножество S ', $ f (s) . Кроме того, если S и S 'имеют ту же кардинальность, упорядочение, вызванное F, является лексикографическим, поэтому, например, $ f (\ {1,2,4 \}) . Учитывая значение z , я хотел бы найти S такого, что $ f (s) <= z $ и $ f (s) <= f (t) <= z $ подразумевает $ f (s)= f (t) $ - То есть я хочу сделать поиск на решетке подмножеств [n].

Если бы я знал, что упорядочение было совершенно лексикографическим, я бы использовал простой двоичный поиск. Я не знаю этого, и я верю, что это не (например, $ 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 $ должен быть включен в лучшее подброс один за другим, взяв реальное преимущество лексикографического порядка на подмножествах.

  1. инициализировать $ b_k= f (\ emptyset) $ . $ \ b_k $ будет лучшее значение на подмножестве размеров $ K $ в конце этой процедуры ,
  2. инициализировать $ count= 0. $ $ \ count $ - это количество элементов, которые у нас есть в комплект входит в лучшее подмножество.
  3. Проверьте $ f (\ {n \}) $ . Если $ b_k + f (\ {n \}) + f (\ {1, 2, \ cdots, k-count -1 \}) \ le z $ , должен быть включен $ n $ . Добавить $ f (\ {n \}) $ на $ b_k $ и добавьте 1 на <класс span= «Математический контейнер»> $ COUNT $ .
  4. Проверьте $ 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 $ .
  5. и так далее.
  6. до тех пор, пока мы не проверили $ f (\ {1 \}) $ или $ count== k $ < / span>.
  7. Возможно, мы можем задаться вопросом, если он будет принимать $ 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 $ . В этом случае алгоритм должен вернуть, что такого подмножества нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top