[Algorytmy] Permutacja dająca największą sumę

matinf
Użytkownik
Użytkownik
Posty: 1922
Rejestracja: 26 mar 2012, o 18:52
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 695 razy
Pomógł: 4 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: matinf »

Witam,
Mamy listę \(\displaystyle{ [a_1, a_2, a_3, a_4, ...., a_n]}\)
Naszym zadaniem jest teraz znaleźć taką permutację tej listy, aby suma:
\(\displaystyle{ \sum_{i=1}^{n-1} | x_{p_{i+1}} - x_p_i |}\) była możliwie największa.
Ostatnio zmieniony 29 lis 2013, o 09:29 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Afish »

Sortujesz liczby a następnie sprawdzasz dwa ustawienia:

Kod: Zaznacz cały

największa ; najmniejsza ; druga największa ; druga najmniejsza ...
oraz:

Kod: Zaznacz cały

najmniejsza ; największa ; druga najmniejsza ; druga największa ...
Powinno zadziałać, aczkolwiek nie dowodziłem tego.
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Zordon »

Nie działa: \(\displaystyle{ [1,1,1,1,1000000]}\)
matinf
Użytkownik
Użytkownik
Posty: 1922
Rejestracja: 26 mar 2012, o 18:52
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 695 razy
Pomógł: 4 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: matinf »

Tak, to oczywiście nie działa.
Jakiś inny pomysł ?
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Afish »

Zordon pisze:Nie działa: \(\displaystyle{ [1,1,1,1,1000000]}\)
A jaka odpowiedź jest tutaj poprawna?
matinf
Użytkownik
Użytkownik
Posty: 1922
Rejestracja: 26 mar 2012, o 18:52
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 695 razy
Pomógł: 4 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: matinf »

Generalnie to w sumie bym nie odrzucał tak szybko tego Twojego pomysłu jednak, biorąc pod uwagę, że obydwa przypadki rozważasz.
Faktycznie miałem taki pomysł, ale rozważałem jeden przypadek i pochopnie napisałem, że to nie zadziała.
Należy spróbować zastanowić się nad uzasadnieniem tego.
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Zordon »

Przepraszam, faktycznie podałem zły przykład...
Poprawka: \(\displaystyle{ [0,1,1,1,1,1,1,2]}\)
matinf
Użytkownik
Użytkownik
Posty: 1922
Rejestracja: 26 mar 2012, o 18:52
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 695 razy
Pomógł: 4 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: matinf »

Czy uważasz, że ten przykład uwala algorytm ?
Pokaże te dwa przypadki:
\(\displaystyle{ [0;1;1;2;1;1;1;1]
[2;0;1;1;1;1;1;1]}\)


Jak moglibyśmy niby lepiej uzyskać ?
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Zordon »

Algorytm zwróci inny wynik niż pokazujesz. Tak czy inaczej, żadne z Twoich ustawień nie jest optymalne. Jest takim zaś \(\displaystyle{ [1,2,1,1,1,1,0,1]}\).


edit: tutaj jest opisane zachłanne podejście, które działa ... 37&t=14074 ale niekoniecznie łatwo jest to udowodnić
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Afish »

Okej, dla tego kontrprzykładu wystarczy budować tablice od środka, czyli:

Kod: Zaznacz cały

największy
najmniejszy ; największy ; drugi najmniejszy
drugi największy ; najmniejszy ; największy ; drugi najmniejszy ; trzeci największy
Aczkolwiek to wydaje mi się grubymi nićmi szyte :) Trzeba na spokojnie usiąść i pokminić teoretycznie.
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Zordon »

Budowanie od środka działa, ale ciężko to udowodnić
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Afish »

Zordon pisze:Budowanie od środka działa
Tak obstawiasz, czy masz jakieś mocniejsze przesłanki (na przykład przeszło na jakimś konkursie)?
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: Zordon »

Tak, to jest klasyczne zadanie Nawet chyba gdzieś widziałem dowód. Przy odrobinie zawziętości można to samemu wymyślić, ale zapewne nie jest to przyjemne.
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

[Algorytmy] Permutacja dająca największą sumę

Post autor: norwimaj »

Afish pisze:

Kod: Zaznacz cały

najmniejszy ; największy ; drugi najmniejszy
Albo

Kod: Zaznacz cały

drugi największy; najmniejszy ; największy 
Dla \(\displaystyle{ n}\) nieparzystego są dwa przypadki, w zależności od tego, która ze środkowych różnic jest większa. Dla ciągu \(\displaystyle{ 1,3,4}\) będzie inaczej niż dla \(\displaystyle{ 1,2,4}\). Dla \(\displaystyle{ n}\) parzystego jest tylko jedna możliwość.

Dowód nie wydaje się trudny. Jeśli \(\displaystyle{ x_1\le x_2\le\ldots\le x_{2n}}\), to tą metodą uzyskamy wynik

\(\displaystyle{ 2(x_2-x_1)+4(x_3-x_2)+6(x_4-x_3)+\ldots+2(n-1)(x_n-x_{n-1}) +\\
+ (2n-1)(x_{n+1}-x_n) +\\
+2(n-1)(x_{n+2}-x_{n+1})+\ldots+2(x_{2n}-x_{2n-1}).}\)


Większego wyniku uzyskać nie możemy. Dla \(\displaystyle{ k<n}\) składnik \(\displaystyle{ x_{k+1}-x_k}\) może być policzony co najwyżej z krotnością \(\displaystyle{ 2k}\), bo skoro każdy z wierzchołków \(\displaystyle{ x_1,\ldots,x_k}\) odwiedzamy tylko raz, to wychodzi z nich co najwyżej \(\displaystyle{ 2k}\) krawędzi, zatem jest co najwyżej \(\displaystyle{ 2k}\) krawędzi z tych wierzchołków do wierzchołków \(\displaystyle{ x_{k+1},\ldots,x_{2n}}\). Tak samo dla składników z trzeciej linijki. Składnik środkowy może być z krotnością co najwyżej \(\displaystyle{ 2n-1}\), bo tyle jest wszystkich krawędzi.

Dla nieparzystej liczby wyrazów jest trochę trudniej, ale też da się udowodnić.
ODPOWIEDZ