Я не очень обдумывал это, поэтому, пожалуйста, поправьте меня, если я ошибаюсь.
Скажем, - это ширина набора.вес
Для poset, который является объединением непересекающихся цепочек, вам нужно как минимум w log n оценок P , просто применяя стандартную нижнюю границу сложности запроса бинарного поиска к каждой цепочке.весw logNп
Поскольку вы даете сравнения бесплатно, вы можете вычислить цепную декомпозицию множества в цепей бесплатно. Выполнять двоичный поиск на каждой цепи , чтобы идентифицировать первый элемент, удовлетворяющий P . Затем перейдите к выявленным элементам и удалите все доминирующие. Количество оценок P равно O ( w log n ) . Это идентифицирует все максимальные элементы, поскольку в цепочке может быть не более одного максимального элемента.весппO ( w logн )
ДОБАВЛЕНО: На самом деле я вижу простой рекурсивный алгоритм, который делает намного лучше ( ) для решетки подмножеств 2 [ n ] ( РЕДАКТИРОВАТЬ : domotor описал общую стратегию в своем ответе). Здесь я предполагаю, что P монотонно вниз (то есть подмножества { X : P ( X ) = 1 } образуют нижний набор), что, я думаю, вы имеете в виду. Итак, вот алгоритм поиска члена нижнего набора:O ( n )2[ п ]п{ X: P( X) = 1 }
а) Испытание . Если 0, то остановись.п( ∅ )
б) Тест . п( { n } )
bi) Если 0, то рекурсивно на (ОК, так как ни один набор, содержащий n, не может быть в нижнем наборе).2[ n - 1 ]N
b.ii) Если 1, то существует элемент нижнего множества в подрешетке . Эта подрешетка изоморфна 2 [ n - 1 ], поэтому еще раз мы можем вернуться. Точнее, мы можем запустить алгоритм для 2 [ n - 1 ] , но когда алгоритм просит оценить P ( Y ) , мы оцениваем P ( X ), где X = Y ∪ { n } .{ X: n ∈ X}2[ n - 1 ]2[ n - 1 ]п( Y)п( X)Икс= Y∪ { n }
Таким образом, на каждом шаге мы обращаемся к подрешетке, которая вдвое меньше оригинальной. В целом, нам нужно оценить не более 2 n раз (на самом деле вы можете реализовать алгоритм для оценки предиката n + 1 раз, как указывает Йошио, поскольку вам нужно проверять ∅ только один раз).п2 нn + 1∅