Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 866 Pomógł: 32 Dołączył: 2.06.2004 Skąd: Wrocław Ostrzeżenie: (0%)
|
Kuleje jeśli chodzi o kwestie wynajdywania odpowiednich algorytmów żeby rozwiązać dany problem, czasem czytam o jakimś algorytm w necie i nie mam pojęcia jak go ugryźć.
Stąd moje pytanie: Czy jest jakaś książka z której dowiem się sprawnie tworzyć algorytmy, na czym to dokładnie polega? Ale tak od podstaw? W ogóle nie wiem czy w dobrym kierunku szukam, ale trochę błądzę po omacku. Nigdy nie kończyłem studiów informatycznych, ani matematycznych, więc mam w głowie tylko strzępki informacji na ten temat z liceum (IMG:style_emoticons/default/winksmiley.jpg) |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
Zrównolegnianie to proces przekształcania kodu z sekwencyjnego na wieloprocesorowy. Jest to raczej mało używane określenie i mocno nieformalne, bo też czy ktokolwiek interesuje się tym poza bardzo ścisłym gronem znających się na tym? Ciekawe czy masz na to inną nazwę. Ja się nie spotkałem z innym określeniem technicznym, więc używam tego, jakie było powszechne u mnie na studiach wśród prowadzących (miałem jako przedmiot przetwarzanie współbieżne i równolegle ). Jak by to brzmiało po angielsku? Sequence to multiple processor recoding (code coversion?)? (IMG:style_emoticons/default/winksmiley.jpg)
To, że kod wookiego jest mniej optymalny od L0ud'a wynika z narzutu czasowego związanego z reindeksowaniem tablicy i czasem dostępu do zmiennych. Gdyby było to pomijalne to algorytm wookiego jest lepszy z prostej przyczyny - nie kasuje już nie istniejących indeksów. W przypadku C++ nie mógłbym sobie pozwolić na kasowanie tylko musiałbym nadpisywać wartości neutralnym elementem bo kasowanie szybko skończyło by się błędami ochrony pamięci. To, który z nich jest bardziej optymalny jest więc tak naprawdę zależne od implementacji pewnych rozwiązań w danym języku programowania. Gdyby reindeksacja była szybsza to możliwe, że oba byłyby porownywalne. Tablica wookiego za kazdym przejściem pętli jest bowiem "naprawiana" i nigdy w niej nie następuje działanie na nie istniejących indeksach. Tablica u L0uda, gdybyś sprawdzał zwroty funkcji unset co chwilę próbuje usuwać nie istniejące elementy, przez co robi wiele pustych przebiegów. Widać to choćby dla liczby 5, która co 2 cykl próbuje usunąć 10, 20, 30, a te już zostały przecież przez 2 w co 5 kroku usunięte (IMG:style_emoticons/default/winksmiley.jpg) Całościowo jednak algorytm jest szybszy, ponieważ mimo większej liczby operacji odwołanie się bezpośrednio do konkretnego indeksu tablicy jest szybsze niż sprawdzenie modulo określonego indeksu już na poziomie cykli procesora. Kto przerabiał architekturę komputerów ten wie o czym mówię. Algorytm pierwszy jest bardziej optymalny i logiczniejszy pod kątem algorytmicznym, ale drugi ma lepszą implementację w php. To jest jedyna różnica między nimi (IMG:style_emoticons/default/smile.gif) Oba są równie dobre. A jaki wpływ ma implementacja na szybkość? Wczoraj z wookiemb kodwookiego przerobiony został tak, by używał ArrayIterator i tym samym nie przejmował reindeksowaniem tablicy tylko używal next(). Wykonano 1000 razy szukanie dla liczb od 2 do 1000, przy czym algorytm L0ud'a by nieco inny, według mojej koncepcji (czyli sprawdzanie wartości elementu przy każdej iteracji FOR i skoki o wartość pola pod danym indeksem), by mógł startować od 2 a nie od 0. Algorytm woobieb: 13 sekund Algorytm wookieb z sqrt: 8 sekund Algorytm L0ud'a: 1s z hakiem Algorytm na ArrayIterator: ponad 4 minuty(!) Jak widzicie implementacja gra rolę poważną. ArrayIterator ma poważne problemy gdy ostro kasujemy tablice do jakiej jest przypisany. Wersja z sqrt jest prawidłowa, ponieważ od elementu sqrt(długość_tablicy) pętla robi puste przebiegi, gdyż nie ma prawa już znaleźć swoich wielokrotności. Mogę więc zaprezentować prosto różnice pomiędzy obydwoma: Wookieb: tablica zawsze działa tylko na elementach jeszcze nie sprawdzonych, L0ud: tablica jest skuteczna, gdyż nie sprawdza zawartości indeksów, polegając na równoważności indeksu z wartością pod nim przechowywaną. Zmiana miejsca startowego z 0 na dowolne inne wymusza jednokrotne sprawdzenie zawartości indeksu. |
|
|
|
sztosz Książka do Algorytmiki 29.08.2009, 09:33:15
wookieb Zależy jakich algorytmów poszukujesz. W phpie nie ... 29.08.2009, 09:37:21
blooregard @sztosz - jeśli byłbyś zainteresowany zakupem ksią... 29.08.2009, 09:43:04
sztosz Od razu mówię że PHP to mnie akurat mało interesuj... 29.08.2009, 09:56:56
wookieb Niestety ta książka akurat sit nie omawia.
Na stro... 29.08.2009, 10:13:04
thek Tak naprawdę to nie ma dobrej książki do algorytmi... 29.08.2009, 19:39:46
Shadowsword Kup "Wprowadzenie do algorytmów" Wydawni... 29.08.2009, 20:04:07
sztosz No ładnie książka wszędzie kosztuje około 140 zł, ... 29.08.2009, 21:00:28
Shadowsword Naprawdę warto. Jest gruba, dokładnie opisuje napr... 29.08.2009, 21:26:38
l0ud CytatPoza tym nie można temu algorytmowi nic zarzu... 29.08.2009, 22:17:06
wookieb Cytat(l0ud @ 29.08.2009, 23:17:06 ) O... 29.08.2009, 22:34:16
sztosz @Shadowsword: ściągnąłem kilka rozdziałów, przeczy... 29.08.2009, 22:37:05
wookieb CytatUPDATE Wynik mi wyszedł taki: 11.087609052658... 29.08.2009, 22:44:01
sztosz CytatU mnie dzieje się to tutaj
[PHP] pobierz, pla... 29.08.2009, 22:55:38
wookieb Jeszcze mała uwaga Loud Ale tym razem słuszna
[P... 29.08.2009, 23:04:52
thek Kod l0ud'a jest szybszy tylko z jednego powodu... 30.08.2009, 00:33:43
sztosz Ale cała szybkość nie polega na tym że do danego i... 30.08.2009, 01:52:38
thek A popatrz sobie na wyjaśnienie moje oraz chłopaków... 30.08.2009, 02:41:38
sztosz OK, może ten algorytm jest lepszy przy "zrów... 30.08.2009, 10:30:38
rzymek01 również polecam "Wprowadzenie do algorytmów... 30.08.2009, 13:34:12
sztosz Parallel computing (Obliczenia równoległe), tak si... 30.08.2009, 20:08:16
l0ud CytatAlgorytm pierwszy jest bardziej optymalny i l... 30.08.2009, 22:12:53
thek Wczoraj źle zrozumiałem algorytm Patrzyłem na nie... 31.08.2009, 00:04:23
rzymek01 [PHP] pobierz, plaintext <?php /* wykorzys... 31.08.2009, 09:16:03
sztosz W Pythonie
[PYTHON] pobierz, plaintext from time ... 31.08.2009, 15:33:05
l0ud Cytatadded: ktoś wie dlaczego tablica bool [400 00... 31.08.2009, 16:32:05
thek Zabrzmiało to jakby C++ sam nie był językiem wysok... 31.08.2009, 16:52:35
sztosz Nadal jest błąd: [32680]=> int(385001) to jest... 31.08.2009, 16:56:55
l0ud CytatZabrzmiało to jakby C++ sam nie był językiem ... 31.08.2009, 17:13:12
sztosz A przede mną naprawdę dużo nauki, prosta rekurencj... 31.08.2009, 17:22:30
rzymek01 @sztosz, wiadomo, że rekurencja jest wolniejsza i ... 31.08.2009, 19:18:07
thek OK... czas na mnie
Kod#include <cstdlib>
... 1.09.2009, 01:50:22
rzymek01 no tak, memset jest znacznie szybszy
jak ci się ... 1.09.2009, 13:53:48
thek Można robić przez new... Tylko że przy wywoływaniu... 1.09.2009, 20:07:24
l0ud Cytatale gdybym miał zwrócić wynik to byłaby kapli... 1.09.2009, 20:39:12
rzymek01 1. program po zakończeniu swojej pracy zwalnia prz... 1.09.2009, 21:19:48
l0ud rzymek01, jak już to delete[] wyniki; A to, że sy... 1.09.2009, 21:34:17 
rzymek01 Cytat(l0ud @ 1.09.2009, 22:34:17 ) rz... 2.09.2009, 14:55:32
thek @loud: gdyby rezerwacja i kasowanie pamięci były w... 1.09.2009, 22:17:54
Jabol Co do tematu to niestety masz ten problem, że więk... 4.09.2009, 10:43:47 ![]() ![]() |
|
Aktualny czas: 28.12.2025 - 09:19 |