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 

Problem algorytmiczny

 
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ść
peter_89
[świeżak]



Dołączył: 27 Sty 2007
Posty: 4
Przeczytał: 0 tematów


PostWysłany: Sob 9:50, 27 Sty 2007    Temat postu: Problem algorytmiczny

Witam,
postanowiłem poprosić Was o pomoc, jeśli dałem posta w złym miejscu to przepraszam. :wink:

Problem jest następujący:

Jest n-patyków które trzeba podzielić na k części w taki sposób by:
1) każdy patyk był równy
2) miał maksymalną możliwą długość

np. 3 patyki o długości 4, 3, 2 gdy dzielimy na 5 części to maksymalna możliwa długość wynosi 1,5.

Będę bardzo wdzięczny za każdą możliwą pomoc :D
Pozdrawiam
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: Sob 10:20, 27 Sty 2007    Temat postu:

Nie rozumiem tego zadania...
Ale dopiero się obudziłem...
Spróbuję ponownie za godzinę.
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: Sob 10:43, 27 Sty 2007    Temat postu:

Proponuję wyszukiwać tą możliwą długość binarnie.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
smas
Okrutny Admin



Dołączył: 20 Paź 2005
Posty: 1634
Przeczytał: 0 tematów


PostWysłany: Sob 10:45, 27 Sty 2007    Temat postu:

na pierwszy rzut oka binsearch() załatwia sprawę + sytuacje wyjątkowe, np. gdy patyka najmniejszego w ogóle nie trzeba dzielić.
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: Sob 11:15, 27 Sty 2007    Temat postu:

Nadal nie rozumiem, ale skoro Rogal mówi binsearch, to pewnie binsearch.
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: Sob 11:34, 27 Sty 2007    Temat postu:

nigdy wiecej zadan z asd :P
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
smas
Okrutny Admin



Dołączył: 20 Paź 2005
Posty: 1634
Przeczytał: 0 tematów


PostWysłany: Sob 11:51, 27 Sty 2007    Temat postu:

Madras napisał:
Nadal nie rozumiem, ale skoro Rogal mówi binsearch, to pewnie binsearch.


Kod:

est n-patyków które trzeba podzielić na k części w taki sposób by:
1) każdy patyk był równy
2) miał maksymalną możliwą długość


n-patyków łamiemy tak, aby w tych połamanych znalazło się k równych częsci.
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: Sob 13:20, 27 Sty 2007    Temat postu:

A no to teraz rozumiem, k równych części != każdy patyk jest równy ; ].
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Sob 14:02, 27 Sty 2007    Temat postu:

Tak jest, binSearch między najmniejszym patykiem, a zerem ;)

edit: między min{ (suma / oczekiwana ilość) , najkrótszy_patyk }, a zerem ;)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
peter_89
[świeżak]



Dołączył: 27 Sty 2007
Posty: 4
Przeczytał: 0 tematów


PostWysłany: Nie 21:17, 28 Sty 2007    Temat postu:

Skrobocik napisał:
Tak jest, binSearch między najmniejszym patykiem, a zerem ;)

edit: między min{ (suma / oczekiwana ilość) , najkrótszy_patyk }, a zerem ;)


Hmm. dzięki ale niezupełnie o to mi chodziło. Pewnie źle sformułowałem problem :?

Napiszę to na przykładach.

1)Mamy 1 patyk o długości 10m i dzielimy na 5 części wtedy każda ma po 2m

2) 2 patyki pierwszy 10m i drugi 2m i dzielimy na 3 części to
wtedy największym możliwym kawałkiem spełniajacym założenia będzie 3,3(3)m

3) 3 patyki: 15m, 10m, 3m dzielimy na 2 części wtedy wynik=10m

Może wtedy zapomniałem dodać że nie wszystkie patyki muszą być użyte i że mogą pozostawać resztki po złamaniu. A wynik to jest największy podział spełniający założenie by patyki były równe. Tzn. z tych wszystkich trzeba wybrać tylko określone k-patyków tak by były równe i maksymalne z możliwych.

Przepraszam że traciliście czas wcześniej i BARDZO PROSZĘ O POMOC w rozwiązaniu tego problemu.

Pozdrawiam,
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 21:46, 28 Sty 2007    Temat postu:

Hmmm to może napiszę algorytm w pseudojęzyku... acz robię to tylko dlatego, że jesteś uprzejmy :wink:

Założmy, że patyki mamy dane w tablicy tab[0..n-1], gdzie n to ilość patyków. Ilość równych części które chcemy uzyskać oznaczę przez k.
Będzie potrzebna funkcja pomocnicza:
Kod:
bool isPos(double len) {
    int res = 0;
    for(int i=0; i<n; ++i)
        res += tab[i]/len;  //dzielenie całkowite, tj. 5.0/2.2=2, 10.0/3.3=3, 10.0/3.4=2
    if(res>=k)
        return true; else
        return false;
}

Funkcja ta dla danej długości 'len' zwraca 'true' jeśli da się podzielić wejściowe patyki na przynajmniej k równych o długości 'len'.
I teraz korzystamy z tego przy wyszukiwaniu binarnym:
Kod:
double EPS = 0.00001            //dokladnosc podanego wyniku
double p=0.0, q=2000000000.0;   //q = maksymalna dlugosc patyka na wejsciu
while(p+EPS<q) {
    double m=(p+q)/2.0;
    if(isPos(m))
        p=m; else
        q=m;
}
return p;                       //w zmiennej p jest szukany wynik


edited: jakby co to ostrzegam, że ten binSearch jest na czarnej liście TCS-u :D
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Nie 22:02, 28 Sty 2007    Temat postu:

Aha, no tak, czyli jedyna zmiana, to to, że nie liczysz tego minimum, tylko od razu szukasz między (suma / oczekiwana_ilość) a zerem. Bierzesz środek z tych wartości i łamiesz wszystkie patyki, zaczynając od najdłuższych, na maksymalną ilość możliwych części o długości tego środka. Jeśli wyjdzie Ci więcej części niż jest oczekiwane, to trzeba szukać znowu w połowie między tym środkiem, co sprawdzałeś, a (suma/oczekiwana_ilość) (tutaj można spróbować dzielić patyki na większe części), a jeśli wyjdzie za mało części, to szukasz między tym środkiem a zerem (musisz dzielić na mniejsze, bo nie stracza długości z patyków, żeby podzielić). Jeśli wychodzi więcej niż trzeba, to zapamiętuj w dodatkowej zmiennej tę długość złamania i aktualizuj ją za każdym razem, jak znajdziesz lepiej pasujące złamanie.... no i tyle ;)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
peter_89
[świeżak]



Dołączył: 27 Sty 2007
Posty: 4
Przeczytał: 0 tematów


PostWysłany: Wto 18:53, 30 Sty 2007    Temat postu:

Wielkie dzięki za pomoc. :D

Mam jeszcze jedno pytanie. Jest jakiś algorytm odpowiadający za połączenie kilku miast w taki sposób by każde było połączone (niekoniecznie bezpośrednio) by koszty podróży były jak najmniejsze. Kombinowałem coś z algorytmem Dijkstry ale nie wiem jak go przerobić do obliczania połączeń tzn. on może znaleźć np. najkrótszą drogę z A do D i nie wiem co z tym dalej.

np. w takim połączeniu:

A B C D
A 0 1 2 0
B 1 0 0 3
C 2 0 0 1
D 0 3 1 0

jest to:
A-B 1
C-D 1
A-C 2

Proszę bardzo o jakąś wskazówkę jak się za to zabrać.

PS: Rogal jesteś Wielki.

Pozdrawiam,
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: Wto 19:07, 30 Sty 2007    Temat postu:

On to wie ; ].
A problem o który pytasz, to [link widoczny dla zalogowanych]
Zakładając, że pisząc "koszty podróży" masz na myśli sumę wszystkich użytych ścieżek.


Ostatnio zmieniony przez Madras dnia Wto 19:12, 30 Sty 2007, w całości zmieniany 6 razy
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
hansu
Nieomylny Admin



Dołączył: 17 Lis 2005
Posty: 1990
Przeczytał: 0 tematów

Skąd: przychodzimy? Czym jestesmy? Dokad zmierzamy?

PostWysłany: Wto 19:07, 30 Sty 2007    Temat postu:

Mozesz to jakos sprecyzowac? Co masz dane i co chcesz znalezc? Bo szczerze mowiac tak troche enigmatycznie to napisales, ciezko wywnioskowac o co konkretnie chodzi w problemie...
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
peter_89
[świeżak]



Dołączył: 27 Sty 2007
Posty: 4
Przeczytał: 0 tematów


PostWysłany: Śro 9:23, 31 Sty 2007    Temat postu:

Madras napisał:

A problem o który pytasz, to minimalne drzewo rozpinające


Właśnie o takie coś mi chodziło. Dana jest macierz sąsiedztwa i trzeba wypisać te optymalne połączenia (np. 1 - 4) wraz z kosztem (waga krawędzi). Teraz już mam zobrazowane jak to się liczy, ale nie mam zielonego pojęcia jak to zaimplementować :? Jakby ktoś wiedział gdzie można taką implementację znaleźć lub kiedyś już ten algorytm implementował to byłbym bardzo wdzięczny za pomoc.

Pozdrawiam,
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Śro 10:26, 31 Sty 2007    Temat postu:

Jeden ze sposobów (algorytm Kruskala):
Posortuj wszystkie krawędzie rosnąco względem długości/wagi, czy czego tam masz i zaczynasz od pierwszej - najmniejszej.Masz tutaj zbiory (tu trzeba sobie już jakoś obsłużyć te zbiory, polecam pomocniczą tablicę, w której w n-tej komórce trzymamy numer zbioru, do którego należy n-ty wierzchołek - w trakcie tworzenia może być sporo tych zbiorów, na początku = |V|, więc jakoś trzeba sobie poradzić ;) ) i zaczynasz jazdę: na początku wszystkim wierzchołkom dajesz siebie jako numer zbioru, do którego należą, czyli coś w stylu:
Kod:
set[ n ] = n;

I teraz lecisz krawędziami w kiolejności naszego sortu, od najkrótszych i teraz są wie możliwości:
(1) krawędź łączy wierzchołki z różnych zbiorów, czyli to, o co nam chodzi, więc wybieramy większy zbiór z nich (polecam trzymać też tablicę z mocami zbiorów, bo wszystkim elementom ze zbioru trzeba zmieniać zbiór przy takim łączeniu i czasami może być to uciążliwe, znaczy czasochłonne ;) ) i zmieniamy wartości set[n] wszystkim wierzchołkom, co mają w set[n] numer tego starego zbioru, który dołączamy do większego
(2) krawędź łączy dwa wierzchłki z tego samego zbioru - pomijamy ją, bo nic nam nie zmieni

I tyle, idziesz po wszystkich krawędziach i na wyjściu będziesz miał jeden wielki zbiór punktów i krawędzi, które je złączyły (aha - trzeba oznaczać krawędzie, które łączą zbiory)

Chyba wszystko ;)
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: Śro 10:33, 31 Sty 2007    Temat postu:

Implementowali ten algorytm chyba wszyscy z tego roku, powiedz tylko, do czego Ci to potrzebne?
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: Śro 10:35, 31 Sty 2007    Temat postu:

Najprościej to zrobić to taką Dijkstrą. Masz kolejkę priorytetową Q, tablicę visited[0..n-1] (n = liczba wierzchołków) inicjalizowaną na false i jakoś implementowany graf (nie wnikam jak :D )
W każdym razie pseudokod może wyglądać tak
Kod:
wrzuc do Q wszystkie krawedzie wychodzace z 0 jednoczsnie usuwajac je z grafu;
visited[0] = true;
int found = 1;
int res = 0;
while(found<n) {
    sciagnij z Q krawedz o najmniejszej wadze;
    int a,b = wierzcholki ktore laczy sciagnieta krawedz;
    if(visited[a]==false) {
        visited[a]=true;
        res += waga sciagnietej krawedzi;
        found++;
        dodaj do Q wszystkie krawedzie wychodzace z a i usun je z grafu;
    }
    if(visited[b]==false) {
        visited[b]=true;
        res += waga sciagnietej krawedzi;
        found++;
        dodaj do Q wszystkie krawedzie wychodzace z b i usun je z grafu;
    }
}
w zmiennej res mamy wynik

Dużo tekstu pisanego bo nie mam pojęcia jak implementujesz graf, a zapis korzystający z STL-a jest mało czytelny jeśli ktoś tego STL-a nie zna. Widać, że algorytm to taka przerobiona Dijkstra.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Robson
zielony żul



Dołączył: 21 Paź 2005
Posty: 1274
Przeczytał: 0 tematów

Skąd: Z Lasu :]

PostWysłany: Śro 13:04, 31 Sty 2007    Temat postu:

moze sobie chyba pozwolic na kolejke o czasie O(n) (zwykłe szukanie liniowe) skoro ma implementacje macierzową grafu...
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)
Strona 1 z 1

 
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