suma kartezjańska zbiorów (Cormen)

Dumel
Użytkownik
Użytkownik
Posty: 2000
Rejestracja: 19 lut 2008, o 17:35
Płeć: Mężczyzna
Lokalizacja: Stare Pole/Kraków
Podziękował: 60 razy
Pomógł: 202 razy

suma kartezjańska zbiorów (Cormen)

Post autor: Dumel »

zadanie 30.1-7. z Cormena:
Rozważmy dwa zbiory \(\displaystyle{ A}\) i \(\displaystyle{ B}\), każdy zawierajacy po \(\displaystyle{ n}\) liczb naturalnych z przedzialu od \(\displaystyle{ 0}\) do \(\displaystyle{ 10n}\). Chcemy obliczyć sumę kartezjańską zbiorów \(\displaystyle{ A}\) i \(\displaystyle{ B}\) zdefiniowaną następująco:
\(\displaystyle{ C=\{x+y: x \in A \ i \ y \in B \}}\).
Zauwazmy ze liczby ze zbioru \(\displaystyle{ C}\) sa z przedzialu od \(\displaystyle{ 0}\) do \(\displaystyle{ 20n}\). Chcemy znaleźć wszystkie elementy zbioru \(\displaystyle{ C}\) i określić, na ile sposobów każdy z nich daje się zapisać jako suma elementów z \(\displaystyle{ A}\) i \(\displaystyle{ B}\). Wykaż, że problem ten można rozwiązać w czasie \(\displaystyle{ O(n \ lgn)}\) (Wskazówka: Potraktuj \(\displaystyle{ A}\) i \(\displaystyle{ B}\) jako wielomiany stopnia co najwyżej \(\displaystyle{ 10n}\))

z góry dzięki za pomoc
Awatar użytkownika
argv
Użytkownik
Użytkownik
Posty: 569
Rejestracja: 27 maja 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 51 razy
Pomógł: 66 razy

suma kartezjańska zbiorów (Cormen)

Post autor: argv »

Przypadkiem odkopałem to zadanie przeszukując forum.
Powiedzmy że mamy dwa zbiory:
\(\displaystyle{ A = \{1,5,6\}}\)
\(\displaystyle{ B =\{0,1,4\}}\)

"Traktujemy" je jako wielomiany biorąc elementy zbiorów jako współczynniki:
\(\displaystyle{ A(x) = x^{1}+x^{5}+x^{6}}\)
\(\displaystyle{ B(x) = x^{0}+x^{1}+x^{4}}\)

mnożymy oba wielomiany dostając wielomian \(\displaystyle{ C(x) = A(x)*B(x)}\).
C[k] mówi nam na ile sposobów można uzyskać sumę k, czyli w powyższym przypadku
uzyskamy wielomian:
\(\displaystyle{ x^{1}+x^{2}+2x^{5}+2x^{6}+x^{7}+x^{9}+x^{10}}\) czyli np. 10 uzyskamy raz (biorac 6,4), 6 uzyskamy dwa razy (5,1), (6,0) a sumy trzy nie uzyskamy ani razu.

Ponieważ wielomiany potrafimy mnożyć za pomocą FFT w \(\displaystyle{ \theta(nlogn)}\) stąd uzyskujemy szukaną złożoność

Uzasadnienie: \(\displaystyle{ C[k]}\) = \(\displaystyle{ \sum_{i=0}^{k} A \cdot B[k-i]}\) a ten iloczyn pod sumą jest równy \(\displaystyle{ 1}\) wtw gdy \(\displaystyle{ A=1}\) i \(\displaystyle{ B[k-i]=1}\) czyli gdy \(\displaystyle{ i \in A}\) oraz \(\displaystyle{ k-i \in B}\)
ODPOWIEDZ