Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Zadanie M - Lustra
Idź do strony Poprzedni  1, 2, 3, 4  Następny
 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Madras
Omylny Admin



Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów

Skąd: Z Pokoju :]

PostWysłany: Nie 3:22, 12 Lis 2006    Temat postu:

To dlaczego do cholery mam ANS?...

BTW thx za opdowiedź.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Fidel
żul



Dołączył: 19 Lis 2005
Posty: 649
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Nie 3:23, 12 Lis 2006    Temat postu:

jak chcesz to moge spojrzec na kod
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysłany: Nie 4:42, 12 Lis 2006    Temat postu:

Spectro napisał:
Czas działania mojego algorytmu to O(w+h+ilość_luster).


Rispekt! Mnie za cholerę nie chce wypisywanie ani czyszczenie tablicy poniżej w*h zejść ;/

MSPANC ;))

(Tak, wiem, nie trzeba czyścić tablicy którą można spokojnie nadpisywać, a w zasadzie - nie trzeba nawet trzymać tablicy, wystarczy wiersz).

A na poważnie, to jak robiłeś? Po cyklach permutacji?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Madras
Omylny Admin



Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów

Skąd: Z Pokoju :]

PostWysłany: Nie 4:58, 12 Lis 2006    Temat postu:

@Fidel: Thx again za helpa ;].
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
liffe
pijak



Dołączył: 16 Paź 2006
Posty: 78
Przeczytał: 0 tematów

Skąd: z daleka

PostWysłany: Nie 9:33, 12 Lis 2006    Temat postu:

kurczę, trzy gwiazdki na tym, że zapominałem linije debagujące wykomentowywać :smt022
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
chlebek
alkoholik



Dołączył: 04 Lut 2006
Posty: 556
Przeczytał: 0 tematów

Skąd: Siedlce\Kraków

PostWysłany: Nie 10:40, 12 Lis 2006    Temat postu:

bywa, bywa. Ja dostalem pierwszego ANS-a bo mialem lustra nie w ta strone. drugiego bo wypisywalem TAK po tablicy wynikowej no i 3 bo nie mialem odstepow w wyniku, i po co bylo sie spieszyc? :]
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Nie 11:04, 12 Lis 2006    Temat postu:

cct napisał:
Rispekt! Mnie za cholerę nie chce wypisywanie ani czyszczenie tablicy poniżej w*h zejść ;/

Wypisywanie to osobna kwestia, tutaj nie da się lepiej tego wykombinować (choć są szybsze rzeczy niż printf) :P . Natomiast czyszczenie memsetem tablicy (kropkami) jest raczej szybsze niż w*h (stawiam, że to będzie logarytm z tej liczby). Tak czy siak, algorytm i tak pędzi ;) .

cct napisał:
A na poważnie, to jak robiłeś? Po cyklach permutacji?

Jazda kolumnami od tyłu, wykonanie kilku niezbędnych zamian, aby warunek znalezienia konfiguracji był spełniony a tablica o kolumnę mniejsza. Każda zamiana = kolejne lustro. To była IMHO najbardziej intuicyjna metoda ;) .
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Nie 13:01, 12 Lis 2006    Temat postu:

Madras napisał:
Pytanko: czy jeśli na wejściu nie ma połączeń wstecznych (tzn. G x D y lub L x P y, gdzie y < x), to znaczy, że rozwiązanie istnieje?

Fidel napisał:
tak to jest wkw

Ciekaw jestem, czy ktoś z was potrafi to formalnie udowodnić. Jeśli tak to proszę, niech się podzieli swoim dowodem na forum.

Spectro: Raczej nie ma bata, żebyś to zrobił szybciej niż O(w*h) choćby ze względu na czyszczenie tablicy (jakim niby cudem memset ma działać szybciej niż liniowo?) i wypisywanie wyniku.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Nie 13:32, 12 Lis 2006    Temat postu:

Rogal napisał:
jakim niby cudem memset ma działać szybciej niż liniowo?

No to sobie porównaj: [link widoczny dla zalogowanych] (nawet jeżeli liniowo, to baaaardzo szybko). Z tego co się orientuję, to inicjaizacja tablic jest aktualnie możliwa w czasie logarytmicznym dzięki właściwościom sprzętowym (prawdopodobnie jakieś odznaczanie bloków pamięci, których rozmiary są potęgami dwójki).
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
jagm
zielony żul



Dołączył: 01 Lut 2006
Posty: 1421
Przeczytał: 0 tematów


PostWysłany: Nie 13:34, 12 Lis 2006    Temat postu:

no memset raczej nie śmiga ;] kiedyś czyściłem 3 tablice dwuwymiarowe memsetem i dostałem przez to tle :P
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Madras
Omylny Admin



Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów

Skąd: Z Pokoju :]

PostWysłany: Nie 13:56, 12 Lis 2006    Temat postu:

@Rogal:
Dowód jest przez indukcję na ilość wierszy. Ścinając wiersz od góry, jeden z promieni przekierowujesz lustrem w otwór po prawej, natomiast pozostałe w ten sposób, żeby nie naruszyć warunku na istnienie rozwiązania. Gdy masz już tylko jeden wiersz, ustawiasz lustro pod każdym promieniem, który ma wpaść w dziurę nie leżącą bezpośrednio pod nim.
Mogę Ci to jutro formalnie rozpisać, jak mnie dorwiesz w przerwie między zajęciami (15:15-16:00, 17:30-18:00), bo nie lubię czegokolwiek na kompie rozpisywać, a nie mam skanera, żeby to zrobić na papierze i wrzucić ;P.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kafex
zielony żul



Dołączył: 28 Mar 2006
Posty: 1458
Przeczytał: 0 tematów

Skąd: Zawiercie

PostWysłany: Nie 14:45, 12 Lis 2006    Temat postu:

hmm hmm ANS po 3s....odp dla wszystkich testow fidela mam takie same...powiedzcie mi po co w tym zadaniu jakiekolwiek czyszczenie ? :]
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Nie 14:57, 12 Lis 2006    Temat postu:

Spectro: Po ostatnim skoku z tej strony widać, że to nie jest logarytmiczne tylko liniowe, acz z dużo mniejszą stałą. I naprawdę nie chce mi się wierzyć w to, że mógłbyś to zrobić logarytmicznie w jakikolwiek sposób... Bo nawet gdybyś chciał oznaczać w jakiś sposób bloki pamięci to później przy odwoływaniu się do danej komórki byś musiał sprawdzać dla każdego bloku w jakim ona leży, czy ten blok przypadkiem nie jest jakoś znakowany. Niby więc mógłbyś zrobić czyszczenie szybsze, ale korzystanie z każdej komórki pamięci by nie było już w czasie stałym tylko też w jakimś logarytmicznym.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
chlebek
alkoholik



Dołączył: 04 Lut 2006
Posty: 556
Przeczytał: 0 tematów

Skąd: Siedlce\Kraków

PostWysłany: Nie 17:15, 12 Lis 2006    Temat postu:

kafex napisał:
hmm hmm ANS po 3s....odp dla wszystkich testow fidela mam takie same...powiedzcie mi po co w tym zadaniu jakiekolwiek czyszczenie ? :]

Mi nie bylo potrzebne
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kafex
zielony żul



Dołączył: 28 Mar 2006
Posty: 1458
Przeczytał: 0 tematów

Skąd: Zawiercie

PostWysłany: Nie 19:25, 12 Lis 2006    Temat postu:

Uzywał ktoś może jakiegoś skutecznego generatora & móglby go zapodac ? :] to jest zadanie z gatunku WTF u wszystkich daje OK ino na athinie nie
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kg86
zielony żul



Dołączył: 22 Gru 2005
Posty: 1194
Przeczytał: 0 tematów

Skąd: pochodze?

PostWysłany: Nie 20:53, 12 Lis 2006    Temat postu:

na poczatku probowalem to napisac tak, jak cwiczeniowiec omawial - strasznie zamotany algorytm, mialem 2 tablice po 2000 elementow, jedna wskazywala na poczatki promieni, druga na konce (p[k1] = k2, w[k2] = k1), meczylem sie z tym zadaniem w piatek przez cala noc - nie chcialo chujstwo przejsc :P r4ku mi zapodal ciekawy algorytm - wstawiaj lustra gdzie sie da, skodowalem to w 15 minut i poszlo :) takze r4ku pomoz innym i opisz swoj algorytm, albo pozwol i ja opisze [uzywalem prostszych struktur danych - jednej tablicy na 2000 elementow :)]
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Madras
Omylny Admin



Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów

Skąd: Z Pokoju :]

PostWysłany: Nie 21:08, 12 Lis 2006    Temat postu:

Polecam test:
3 3
G 1 D 2
G 2 P 2
G 3 P 1
L 1 D 1
L 2 P 3
L 3 D 3

Odpowiedź -
\\\
..\
..\
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kafex
zielony żul



Dołączył: 28 Mar 2006
Posty: 1458
Przeczytał: 0 tematów

Skąd: Zawiercie

PostWysłany: Nie 21:39, 12 Lis 2006    Temat postu:

Poszlo, algos był dobry, wczytywanie też dobre, od początku wszystko ok...tylko programista debil źle deklaruje ;P
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysłany: Nie 23:16, 12 Lis 2006    Temat postu:

Dobra, to a propos złożoności, memseta i paru innych spraw.

Traktować jako luźne dywagacje, a nie pretekst do jakiegoś flame'a, na którego i tak nikt nie ma czasu! ;)

1. Złożoność

Mamy policzyć w*h elementów, i tego nie obejdziemy. Można by jedynie oszacować czego będzie mniej (luster czy pustych pól) i stworzyć jedynie zbiór tych punktów. Jedyne rozwiązanie które mi przychodzi później do głowy na stały czas sprawdzenia to hashowanie (pamiętajmy, tablice odpadają bo wtedy trzeba by je zerować!) - jeśli mamy hita, to należy, jeśli missa, to nienależy. Ale hashowanie z obsługą kolizji (inne nas nie interesuje tutaj) pesymistycznie i tak ma zawsze czas liniowy wyszukiwania... (liniowy względem liczby wyników, bo tyle maksymalnie rzeczy będzie w tabeli).

(Dla uproszczenia - K = liczba wyników).

Inna sprawa to trzymanie wyników w formie posortowanej. Możemy założyć strukturkę podobną do countinga. Tj. wyniki trzymamy w tablicy wyniki[] o długości K, a w tablicy count[] o długości h ( przy założeniu h > w, inaczej transponujemy) szereg ilości elementów w kolejnych wierszach (czyli count[ i ] = ile jest łącznie luster we wszystkich wierszach do i-tego włącznie; inaczej: pozycja ostatniego lustra na i-tym poziomie w tablicy wyniki[]). Wtedy sprawdzenie czy dana pozycja pudełka zawiera lustro czy nie jest binserchem po wynikach odpowiedniego poziomu ( binsearch( left = count[ i-1 ], right = count[ i ], szukany ) ), czyli de facto w wersji z dwoma porównaniami O( log( min{ w, K } ) ).
Opłacalne tylko dla liniowej ilości pól które sprawdzamy.

To tak z nudów napisane, tak czy siak - każda reprezentacja się kwadraci już przy liczeniu dla liczby luster rzędu kwadratowego ;))

Za to ciekawy problem - jaka jest maksymalna minimalna ilość luster niezbędnych do wstawienia? Dla zestawu (n,n) dla którego dobrą odpowiedzią byłyby lustra na każdej pozycji istnieje przykładowo rozwiązanie liniowe ( lustra na przekątnej ). Dla nieco zaburzonych danych, np. 4 x 10, wychodzi 10.
Ciekawe, czy liczba jest zawsze liniowa, np. od dłuższego boku czy sumy?


2. Czyszczenie tablicy

a) tak naprawdę, to jeśli to co raku napisał przetransponować na wiersze (zamiana indeksów) to przy założeniu, że najpierw idą dane dla wszystkich promieni z jednej ściany nie trzeba pamięci niczego trzymać poza jedną ścianą - WPP trzeba trzymać obie, i tyle: wszystko to, co byśmy liczyli dla tablicy lub jej wiersza można puszczać od razu na wyjście (i po zrobieniu kolejnego wiersza wczytywać następny promień z drugiej ściany). Czyli pamięciowo Th( 1*min{ w, h } + 1 ). Oczywiście - wtedy nie ma czego czyścić.

b) memset logarytmicznie nie zadziała. Może bardzo szybko, ale logarytmicznie nie nawet jeśli znakowałby całe bloki jako wyczyszczone, to przy pierwszym odwołaniu do niego i nadpisaniu już spójność "czystości" by się poszła kochać i trzeba by zapamiętywać informacje o zmianach - więc byłby już zbiór informacji, które przy każdym odwoływaniu trzeba by przeszukiwać. (Pewnie binsearchem, ale kogo to obchodzi - byłoby to szalenie długie nawet gdyby sprowadzało się do logarytmu iterowanego).
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Nie 23:40, 12 Lis 2006    Temat postu:

cct: Co do złożoności to poniżej O(w*h) nie da się zejść w tym zadaniu i jest to chyba oczywiste. W końcu trzeba choćby tablicę wypisać...

Natomiast co do ilości luster... Stawiam tezę, że jeśli jakiś układ promieni wejściowych / wyjściowych ma rozwiązanie to jest ono jedyne (nie chodzi tylko o ilość luster ale także o ich ustawienie). Ciekawe czy ktoś to udowodni / obali :D

edited: Żeby było ciekawiej za znalezienie kontrprzykładu funduję nagrodę w postaci Prawdziwego Piwa na najbliższym grillu. Pod warunkiem, że sam wcześniej go nie znajdę...
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysłany: Nie 23:46, 12 Lis 2006    Temat postu:

Rogal napisał:
cct: Co do złożoności to poniżej O(w*h) nie da się zejść w tym zadaniu i jest to chyba oczywiste. W końcu trzeba choćby tablicę wypisać...


Właśnie mówię o tym, co by było gdyby wyniki były z wolnym dostępem do pól (czyli sprawdzani, czy pola ma lustro czy nie).
Oczywiście da się to zrobić liniowo od ilości luster jeśli ma być tylko podane, gdzie mają być lustra.

Rogal napisał:
Natomiast co do ilości luster... Stawiam tezę, że jeśli jakiś układ promieni wejściowych / wyjściowych ma rozwiązanie to jest ono jedyne (nie chodzi tylko o ilość luster ale także o ich ustawienie). Ciekawe czy ktoś to udowodni / obali :D


Przeczytaj mój poprzedni post uważnie.

Hint: dla planszy n x n o parametrach:
n n
G 1 P n
G 2 P n-1
..
G n P 1
L 1 D n
L 2 D n-1
..
L n D 1

rozwiązaniami są:
a) wszędzie lustra (dokładnie n^2 luster)
b) lustra tylko na przekątnej najdłuższej (dokładnie n luster)

Rozrzut duży dość ;)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Nie 23:48, 12 Lis 2006    Temat postu:

cct: Nie żebym się czepiał, ale Twój kontrprzykład wali się już na przypadku 2x2 :D

edited: A nie sorry, źle zrozumiałem. Słowo się rzekło, zgłoś się na grillu.

edited2: Co do minimalnej "lustralizacji" pudełka to na pewno dopóki istnieją 2 lustra takie, że "stykają" się na nich 2 takie same promienie to można te 2 lustra usunąć. Konfigurację taką, że już nie istnieją już 2 takie lustra nazwę minimalną.
Ciekawe, czy istnieją 2 konfiguracje minimalne, które są rozwiązaniem tego samego układu wejść/wyjść?
Jeśli nie, to to jest odpowiedź na pytanie o minimalną ilość luster. Bierzesz dowolne rozwiązanie i je zmniejszasz.


Ostatnio zmieniony przez Rogal dnia Nie 23:54, 12 Lis 2006, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kafex
zielony żul



Dołączył: 28 Mar 2006
Posty: 1458
Przeczytał: 0 tematów

Skąd: Zawiercie

PostWysłany: Nie 23:52, 12 Lis 2006    Temat postu:

O ile dobrze zrozumialem :

4 4
L 1 D 4
L 2 D 3
L 3 D 2
L 4 D 1
G 1 P 4
G 2 P 3
G 3 P 2
G 4 P 1

takie wejscie ma conajmniej dwa rozwiązania jeżeli chodzi o układ i liczność luster...

Kod:
\ \ \ \
\ \ \ \
\ \ \ \
\ \ \ \


Kod:
\ . . \
. \ \ .
. \ \ .
\ . . \


EDITED : kurna za pozno ;P
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
r4ku
żul



Dołączył: 09 Lut 2006
Posty: 722
Przeczytał: 0 tematów

Skąd: klikash? :D

PostWysłany: Pon 0:16, 13 Lis 2006    Temat postu:

Ok. wiec na prośbę kg86 napisze algorytm na to zadanie, chyba najbardziej intuicyjny:

Przy/po wczytaniu danych sprawdzamy czy nie istnieje promień wchodzący z lewej, który musi iść do góry, lub promień wchodzący z góry który musi iść w lewo. Jeśli taka sytuacja wystąpi to piszemy „Nie” i kończymy. W przeciwnym wypadku przechodzimy do wstawiania luster.
Mamy tablice reprezentującą naszą plansze, w każdym polu pamiętamy 2 wartości: gdzie chce dotrzeć promień idący od góry, oraz gdzie promień idący od lewej. Do tego mamy drugą tablice gdzie będziemy wstawiać lustra.

Na początku wiemy gdzie chcą dotrzeć wszystkie promienie od góry w 1 wierszu, oraz wszystkie z lewej w pierwszej kolumnie. pole [1][1] ma określone obie wartości. Idziemy kolumnami w dół, zaczynając od pola [1][1]. Dla każdego pola sprawdzamy czy promień z lewej chce dojść do otworu w tym samym wierszu, oraz czy promień z góry chce dojść do otworu w tej samej kolumnie.

jeśli choć jedna z tych sytuacji wystąpi to nie możemy wstawić lustra i do tablicy luster wstawiamy ‘.’ Następnie podajemy promień dalej, czyli wartość promienia idącego z lewej podstawiamy jako wartość promienia idącego z lewej w polu w następnej kolumnie (w tym samym wierszu). To samo robimy z promieniem idącym od góry, czyli podstawiamy jako wartość promienia idącego z góry do następnego pola w następnym wierszu tej samej kolumny.

W przeciwnym wypadku wstawiamy lustro, zaznaczamy ten fakt w tablicy luster. W naszej tablicy kierujemy promienie tak jak odbiją się od lustra, czyli: dla następnego pola w tym samym wierszu jako wartość promienia idącego z lewej wpisujemy wartość promienia idącego od góry w bieżącym polu. Jako wartość promienia idącego z góry w następnym wierszu tej samej kolumny wpisujemy wartość promienia idącego z lewej w bieżącym polu.

Po przejściu wszystkich pól piszemy „Tak” i wypisujemy tablice luster 

W implementacji najłatwiej posłużyć się tablicą 3 wymiarową shortow [liczbaWierszy][liczbaKolumn][2];

A jeśli ktoś czuje usilną potrzebę oszczędzania pamięci to można to zrobić bez większych problemów w tablicy [liczbaWierszy][2][2] ‘obracając’ kolumny, bo w danym momencie przechodzimy jedną, a wartości aktualizujemy w drugiej, następnie z tej pierwszej już korzystać nie będziemy.

Mam nadzieje ze da się zrozumieć ten algorytm z mojego opisu :P w razie czego pytajcie

ps.
odnosnie dywagacji na temat ilosci luster: ten algorytm wstawi maksymalna liczbe luster, za to bardzo latwo udowodnić jego poprawność :)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysłany: Pon 2:36, 13 Lis 2006    Temat postu:

Rogal napisał:
cct: Nie żebym się czepiał, ale Twój kontrprzykład wali się już na przypadku 2x2 :D

edited: A nie sorry, źle zrozumiałem. Słowo się rzekło, zgłoś się na grillu.


Z reguły nie chodzę na grille + z reguły nie pijam piwa (co najwyżej soczkowate niektóre ;)) = jeśli podtrzymujesz obietnicę to jako ekwiwalent kup najtańszą klawiaturę za parę zł gdziekolwiek z układem qwerty (allegro or sth) i wrzuć ją do pracowni komputerowej pro publico bono ;)

Rogal napisał:
edited2: Co do minimalnej "lustralizacji" pudełka to na pewno dopóki istnieją 2 lustra takie, że "stykają" się na nich 2 takie same promienie to można te 2 lustra usunąć. Konfigurację taką, że już nie istnieją już 2 takie lustra nazwę minimalną.
Ciekawe, czy istnieją 2 konfiguracje minimalne, które są rozwiązaniem tego samego układu wejść/wyjść?
Jeśli nie, to to jest odpowiedź na pytanie o minimalną ilość luster. Bierzesz dowolne rozwiązanie i je zmniejszasz.


Lemat z parzystymi lustrami będącymi odbiciem tych samych luster faktycznie trywialnie można udowodnić.

Inne spostrzeżenia:

- Ilość promieni o zmienionym torze = 0, 2, 3, 4...

- jedno lustro zmienia tor dwóch.
-> czyli minimalna liczba luster do zmienienia toru n luster = n/2;


A teraz danie główne posta :D

// oznaczenia: promien na pozycji i-tej od brzegu ma swoja dziure nazwana i'; numerujemy najpierw sciany, a pozniej gory, tak, ze mamy ciagi: 1, 2, ..., (w+h), 1', 2', ..., (w+k)' )

- tworzymy cykle permutacji (jeśli jeden promień z pozycji i wpada w czyjąś dziurę, to promień którego to była dziura musi wpadać w dziurę kogoś innego etc.), czyli ( i -> j', j -> k', k -> .... -> i' )

// notacja: " -> " oznacza u mnie transpozycję

TWIERDZENIE: dolne ograniczenie na ilość niezbędnych luster jest ilością transpozycji w sumie wszystkich cykli;


DOWÓD

- cykle są rozłączne;

- skoro liczba wyjść i wejść promieni się zgadza, to przyporządkowanie ich sobie jest permutacją liczb ( 1' .. (w+h)' ), a więc każde wejście poprawne można na cykle rozłożyć

- baza indukcji: cykle jednoelementowe ( i -> i' ) mają zerową ilość transpozycji, czyli 0 luster wstawiamy aby je sprawać: trywialne;

- załóżmy, że działa to dla cyklu o długości k oraz spróbujmy coś wrzucić na pozycji i-tej, aby uzyskać cykl o jeden dłuższy;

- oczywiście, wrzucić możemy jedynie takie i, które chce wlecieć w j', będące wyjściem dla j znajdującego się w tym cyklu (nie wspominam nawet, że zakładamy też, iż to co chcemy dodać ma sens, tj. spełnia wkw rekonstuowalności)

// uwaga1: i nie było w żadnym cyklu do tej pory (cykle są rozłączne), więc, na jego torze nie ma żadnych luster!

- czyli zapisując to co właśnie brzydko wyartykuowałem, zmieniamy:
" z -> j' " na " z -> i', i-> j' "

// notacja: poprzednik: niższy dla promienia poziomego lub prawy dla promienia pionowego

- ściana, na której znajduje się nowowstawiony element nie ma znaczenia, podobnie jak jego poprzednik etc., m.in. ponieważ:

- ponieważ spełnione jest wkw, to i jest poprzednikiem j' (bo inaczej " i -> j' " nie spełniałoby wkw), czyli:

- w pewnym momencie promień z leci sobie mijając i'; więc możemy w tym miejscu wstawić lustro, które wrzuci nam promień zeta na i' (patrzy uwaga1), co spełnia nam pierwszą cześć: " z -> i' ";

- patrzymy co się stało po drugiej stronie lustra: leciał tam promień i-ty, który teraz wskoczył na miejsce z-etego; a skoro pierwotnie z-ety wpadał na j', to teraz i-ty tam wpadnie; mamy więc " i -> j' ", co chcieliśmy pokazać i kończy dowód :D

Innymi słowy: istnieje zawsze rozwiązanie co najwyżej (w+h-1) lustrzane

więc: zawsze istnieje rozwiązanie o liniowej liczbie luster (bo najgorszy przypadek to ten, gdy całą permutacja to jeden wielki cykl)

[ praktycznie: jeśli mamy tylko znaleźć pozycje luster i je podać, to faktycznie istnieje algorytm liniowy od sumy długości boków pudełka :D ]

Jeśli ktoś chce go zrozumieć, to mogę jutro przepisać ładniej i uporządkować, powstawało w ramach odstresowującego free-styla podczas nie robienia tego, co muszę jeszcze dzisiaj w nocy zrobić :/

@Rogal: pytanie o rozwiązanie MINIMALNE i jego jednoznaczność dalej pozostaje otwarte.

EDIT: w sumie, to łączna ilość transpozycji w cyklach permutacji będzie jednak MINIMALNĄ ilością luster niezbędną do rozwiązania. Wystarczy w sumie powyższy dowód lekko przerobić i prawie od razu jest dane.
I stawiałbym w takim razie na jednoznaczność.
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych Wszystkie czasy w strefie EET (Europa)
Idź do strony Poprzedni  1, 2, 3, 4  Następny
Strona 3 z 4

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin