문제

나는 흥미로운 기능을 가지고 있습니다. {1, ..., n}의 {1, ..., n}의 {1, ..., n}의 서브 세트를 취합니다. $ f : p ([n]) \ 권투 z ^ + $ . 나는 s 's's 's'span class="수학 컨테이너"> $ f (s) $ f (s ') $ 의 하위 집합임을 알고 있습니다. 또한, S와 S '가 동일한 카디널리티를 갖는 경우, F에 의해 유도 된 순서는 조명 조명이므로, 예를 들어 $ F (\ {1,2,4 \}) . z 값을 감안할 때 $ f (s) <= z $ $ f (s) <= f (t) <= z $ $ f (s)= f (t) $ 을 암시합니다 - 그건, 나는 [n]의 하위 집합의 격자에 대한 검색을하고 싶다.

주문이 완벽하게 조립 된 것이 었는지 알고 있으면 간단한 바이너리 검색을 사용할 수 있습니다. 나는 그것을 모르고, 나는 그것이 그렇지 않다고 믿는다 (예 : $ f (\ {1,2,3,4,5,6 \}) $ $ f (\ {7 \}) $ 보다 큽니다. 이 검색을하기 위해 좋은 O (n) 알고리즘이 있습니까? 분명히 상당한 크기의 n을 위해 나는 F를 온다. 그리고 메모리 내 스토리지에 의존 할 수는 없습니다.

의견에 대한 토론 후 설명 : 특정 $ f $ 나는 첨가제를 다루고있다 - 특히 $ f (s)=sum_ {k \ $ G $ 에서 단조롭게 증가하는 기능을 갖춘 s} g (k) + f (\ eventyset) $ . 이것은 일반적인 경우보다 쉽지만, 또한 흥미로울 수도 있지만, 내 특정 문제는 아닙니다.

도움이 되었습니까?

해결책

$ o (n ^ 2) $ $ o (n)에서 실행되는 간단한 알고리즘이 있습니다. $ $ f (\ emptyset) $ , $ f (\ {1 \})라고 가정합니다. $ , $ f (\ {2 \}) $ , $ \ cdots $ , $ F (\ {n \}) $ 은 배열에 제공됩니다.

시작 아이디어는 그의 의견에서 OP가 제공 한 것과 동일합니다. "우리는 각 $ k $ 에서 $ 0 $ 에 대해"우리는 사전 결정을 사용하여 크기 K의 하위 집합을 검색합니다. $ n $ . $ f $ "의 최상의 값으로 하나를 유지하십시오.

문제는 $ f $ 크기 $ k $ $ b_k $ , $ o (n) $ 시간. 바이너리 검색 대신 $ n $ , $ n-1 $ , \ cdots, $ 1 $ 은 하위 집합에서 사전 판술 순서의 실제 이점을 취하여 최고의 하위 집합에 포함되어야합니다.

  1. 초기화 $ b_k= f (\ equipyset) $ . $ \ 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 $ 에 추가하고 $ 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 $ 에 추가하고 < SPAN 클래스="수학 컨테이너"> $ count $ .
  5. 등등.
  6. $ f (\ {1 \}) $ 또는 $ count== k $ < / span>.
  7. $ o (n) $ 을 찍어 각 $ f (\ {1 , 2, \ cdots, k-count-1 \}) $ , 각 $ b_k $ 만으로는 $ o (n * n) $ 시간. 그러나 $ f $ 은 첨가제이기 때문에 $ f (\ {1 \})의 모든 접두사 합계를 계산할 수 있습니다. , $ f (\ {2 \ \}) $ , $ \ cdots $ , < SPAN 클래스="수학 컨테이너"> $ F (\ {n \}) $ $ o (n) $ 시간에 상승하십시오. 그런 다음 $ o (1) $ 을 사용하여 각 접두사 합계에 액세스합니다.

    $ b_k $ 은 각 시간에 $ 0 $ $ 0 $ $ n $ , 총 실행 시간은 $ o (n ^ 2) $

    입니다.


    알고리즘의 설명은 $ F (\ emptyset) \ gt z $ 에 가장 쉬운 경우를 건너 뜁니다. 이 경우 알고리즘은 그러한 하위 집합이 없음을 반환해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top