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 |
OK... czas na mnie (IMG:style_emoticons/default/winksmiley.jpg)
Kod #include <cstdlib> #include <iostream> #include <ctime> #include <cmath> #include <windows.h> using namespace std; void test(int zakres) { bool dane[zakres+1]; int limit = (int)(sqrt(zakres)); int limit2 = zakres+1; memset(dane, true, (zakres+1)*sizeof(bool) ); memset(dane, false, 2*sizeof(bool) ); for(register int i=2; i <= limit; i++) { if( dane[i] == false ) { continue; } for(register int j = 2*i; j <= zakres; j += i) { dane[j] = false; } } } void test2(int zakres) { int _zakres = (int)(zakres+1)/2; bool dane[_zakres]; int limit = (int)sqrt(_zakres); memset(dane, true, (_zakres)*sizeof(bool) ); memset(dane, false, sizeof(bool) ); for(register int i=1; i < limit; i++) { for(register int j=3*i+1; j<_zakres; j += 2*i+1) { dane[j] = false; } } } int main(int argc, char *argv[]) { int prob, zakres; cout << "Szukaj liczb pierwszych od 2 do: "; cin >> zakres; cout << " i powtorz razy: "; cin >> prob; cout << "\n"; clock_t start = clock(); for(register int r=0; r<prob; r++) test(zakres); cout << (double)(clock()-start)/CLOCKS_PER_SEC << " sekund dla test ze srednia:" << ((double)(clock()-start)/CLOCKS_PER_SEC)/prob << "\n"; system("pause"); clock_t start2 = clock(); for(register int r=0; r<prob; r++) test2(zakres); cout << (double)(clock()-start2)/CLOCKS_PER_SEC << " sekund dla test 2 ze srednia:" << ((double)(clock()-start2)/CLOCKS_PER_SEC)/prob << "\n"; system("pause"); return 0; } Nie bawiłem się w wyświetlanie... Funkcje mają liczyć ;P Są pamięciożerne, ale na moim kompie proces Core 2 Duo T5500 (laptop) miały niezłe czasy (IMG:style_emoticons/default/smile.gif) Pierwsza (test) to klasyczna implementacją sitka. Drugi (test2) to malutka wariacja, gdzie lecę tylko i wyłącznie po liczbach nieparzystych. Wykonuje się wolniej, gdyż ma więcej operacji mnożenia po drodze w porównaniu do test, ale też może większy zakres objąć. C++ ma ograniczenie ilości pamięci dostępnej i z tego co mi system do niego przydzielił, pierwszy przeszukał w tym limicie jakieś 2.080.000 liczb, zaś drugi mniej więcej 2 razy tyle. Na pewno drugi liczy do 4.165.000 zanim się wysypie na braku pamięci (IMG:style_emoticons/default/winksmiley.jpg) Dziwne jest jednak, że i tak w porównaniu do innych algorytmów liczy Ci o kilka rzędów wielkości lepiej. Albo masz sumer mega wypaśną maszynę, albo coś jest nie tak (IMG:style_emoticons/default/smile.gif) Ja swój kod sprawdziłem na procku Core 2 Duo Centrino Duo T5500 (2 rdzenie po 1.83GHz) i pokazało mi w wyniku: Cytat Szukaj liczb pierwszych od 2 do: 1000000 i po prostu zastanawiam się jakim cudem mogłeś 0.00850865 wykręcić, czyli niemal 2 razy lepszy. Jakby co to weź mój kod i przetestuj na swojej i podaj wyniki bym miał jakieś porównanie.i powtórz razy: 1000 11.937 sekund dla test ze srednia:0.011937 14.125 sekund dla test 2 ze srednia:0.014125 EDIT: Przetestowałem na swoim także Twój kod i pokazał on dla tych samych danych: 7.297 sekundy ze średnią 0.007297 na przebieg, więc chyba w moim będę musiał nieco się wziąć za ograniczenie mnożeń. Zwłaszcza że potem zmieniłem z memset na for jakie Ty masz i tylko mi się wyniki obliczeń pogorszyły. Zwłaszcza dla test, który musi używać 2 razy większej tablicy (IMG:style_emoticons/default/winksmiley.jpg) Po daniu wszystkim równych szans z memsetem Twój zszedł nawet do 0.0049, ale zauważyłem, ze mój komp dziwnie chodził i była zastanawiająca różnica na niekorzyść algorytmu 2... test 0.011, a test2 0.015... Więc chyba jeszcze trzeba pooptymalizować (IMG:style_emoticons/default/winksmiley.jpg) EDIT2: Trochę optymalizacji i test2 spadł do 0.0075, przy Twoim 0.0049 (IMG:style_emoticons/default/smile.gif) EDIT3: Trochę więcej optymalizacji... Średni czas zszedł do 0.0050 i różnice sa już na poziomie raczej spowolnienia samych pętli (IMG:style_emoticons/default/winksmiley.jpg) Kod void test2(int zakres) {
register int _zakres = (int)zakres/2; bool dane[_zakres]; register int limit = (int)sqrt(_zakres), i=1, j, p=1, q; memset(dane, true, (_zakres)*sizeof(bool) ); memset(dane, false, sizeof(bool) ); for(;i < limit; i++) { p += 2; q = p+i; if(dane[i]) { for(j=q; j<_zakres; j += p) { dane[j] = false; } } } } Ten post edytował thek 1.09.2009, 04:01:55 |
|
|
|
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
thek Zrównolegnianie to proces przekształcania kodu z s... 30.08.2009, 14:43:15
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
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: 26.12.2025 - 17:44 |