2015-10-19 14 views
6


Ostatni raz znalazłem interesujący problem i utknąłem na nim.
Znajdź k-tą minimalną sumę każdego możliwego podzbioru

Podane n liczby a [1], ..., a [n] w porządku rosnącym i liczbie k (1 < = n, k < = 10^5).

Powiedzmy, że sortujemy każdy możliwy podzbiór danej sekwencji według sumy.
Musimy znaleźć sumę k-tego takiego podzbioru.

Na przykład
n = 4, k = 8
A = {2, 7, 8, 15}

1: {2} suma = 2
2: { 7} suma = 7
3: {8} suma = 8
4: {2, 7}, suma = 9
5: {2, 8} suma = 10
6: {7 8}, suma = 15
7: {15}, sum = 15
8: {2, 15}, suma = 17
...
k = 8, więc odpowiedź = 17 (podzbiór {2,15}).

Oczywiście możemy wygenerować każdy możliwy podzbiór i całe rozwiązanie działa w O (2^n * n), ale szukam czegoś bardziej inteligentnego - liniowego, lub przynajmniej O (nk).

+0

Numery nieujemne? –

+0

Tak, 1 <= a [i] <= 10^9. –

+0

Jak rozróżniać porządek dla zestawów, które mają taką samą sumę? –

Odpowiedz

8

(zamiar założyć niepuste podzbiory dla prostoty. Obchodzenie pusty podzbiór jest linia lub dwa).

Biorąc to niepusty podzbiór indeksów S zdefiniować dzieciom z S być S \ {max(S)} U {max(S) + 1} i S U {max(S) + 1}. Począwszy od {1}, relacja potomna tworzy drzewo, które zawiera każdy niepustny podzbiór dodatnich liczb całkowitych.

{1} 
| \ 
{2} {1,2}______ 
| \  \  \ 
{3} {2,3} {1,3} {1,2,3} 

Kliknięta sumą odpowiednich elementów tablicy, to drzewo jest stosem min. Jeśli ostrożnie obliczysz klucze (dodając i odejmując zamiast sumowania od zera) i zaimplementujesz leniwie kasowanie min-kupka, otrzymasz algorytm O (k log k) -time.

+0

Tak, masz rację! Bardzo mądry pomysł. Ile wierzchołków ma drzewo? A po niektórych usunięciach należy dodać nowe wierzchołki do liści? –

+1

@JacobScott Będzie miał wierzchołki '2^n-1', które są o wiele za dużo dla wyraźnej reprezentacji. Zamiast tego, za każdym razem, gdy usuniesz węzeł, wstaw jego dzieci; wtedy wymagana przestrzeń będzie O (k). –

+0

Dzięki! Ostatnie pytanie: w każdym wierzchołku muszę zachować tablicę. Po każdym usunięciu i wstawieniu drzewa ma jeszcze jeden wierzchołek. Zajmuje pamięć O (k²), czy jest jakiś sposób, aby to naprawić? –

Powiązane problemy