Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Fibonacci  (Citit de 8003 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« : August 18, 2011, 05:24:48 »

Comentarii la postul http://infoarena.ro/blog/fibonacci
Memorat
dbaluta
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 6



Vezi Profilul
« Răspunde #1 : August 18, 2011, 11:01:15 »

O(logn), dat fiind faptul că știm formula pentru al n-lea Fibonacci number și a n-a puterea a lui x se poate calcula în O(logn).
Memorat
scipianus
Nu mai tace
*****

Karma: 129
Deconectat Deconectat

Mesaje: 345



Vezi Profilul
« Răspunde #2 : August 18, 2011, 11:07:49 »

Da,de aceeasi parere sunt si eu. Avand formula pentru al n-lea termen trebuie facuta doar ridicarea la putere in timp logaritmic,deci complexitate O(log n) , doar ca precizia nu stiu cat de mare va fi la radicalii aia  Think.

Memorat
Vman
Echipa infoarena
Vorbaret
*****

Karma: 45
Deconectat Deconectat

Mesaje: 176



Vezi Profilul
« Răspunde #3 : August 18, 2011, 11:37:27 »

se poate si fara golden ratio, cu exponentiere de matrice si nu mai ai probleme cu precizia

o alta alternativa ar fi plecand de la formulele
F(2k) = F(k)[2F(k+1)−F(k)]
F(2k+1) = F(k+1)^2+F(k)^2
iar inmultirile se pot face ceva mai repede cu http://en.wikipedia.org/wiki/Karatsuba_algorithm
« Ultima modificare: August 18, 2011, 11:53:37 de către Duta Vlad » Memorat
bent_larsen
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 18



Vezi Profilul
« Răspunde #4 : August 18, 2011, 11:39:53 »

Parca e si in arhiva educationala Cosmin problema asta daca nu ma insel.
Memorat
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #5 : August 18, 2011, 11:51:32 »

Rezultatul Fn are O(n/log n) cifre. Deci algoritmul trebuie sa aiba cel putin timp de rulare O(n/log n).

Formula cu ratia de aur nu e prea utila pt ca faci calcule cu numere irationale si ai nevoie de precizie buna.
« Ultima modificare: August 18, 2011, 12:03:57 de către Cosmin Negruseri » Memorat
yonatan
Strain
*

Karma: 10
Deconectat Deconectat

Mesaje: 47



Vezi Profilul
« Răspunde #6 : August 18, 2011, 20:18:53 »

Nu se poate face cu ridicare la putere in timp logaritmic de matrice?
Ca la problema iepuri http://infoarena.ro/problema/iepuri


L.E.: Nu citisem comentariul lui Vlad. Whistle
Memorat
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #7 : August 18, 2011, 22:20:09 »

Ma interesa complexitatea algoritmului cel mai bun.
Memorat
tudalex
Strain
*

Karma: -8
Deconectat Deconectat

Mesaje: 44



Vezi Profilul
« Răspunde #8 : August 25, 2011, 21:21:29 »

Se mai poate si preprocesa folosind templateuri in C++ [ 0 ], avand apoi O(1) per query. Daca ai in mod ipotetic timp constant pe adunari si inmultiri cea mai rapida metode sa folosesti ridicare la putere in timp logaritmic [ 1 ] folosind o matrice de ordin 2, complexitatea fiind de O(log N). Lucru mentionat si de ceilalti care au postat mai sus.

[ 0 ] - http://blog.emptycrate.com/node/271 (primul link gasit pe google, sigur sunt numeroase metode de a face asta)
[ 1 ] - http://infoarena.ro/problema/lgput
« Ultima modificare: August 25, 2011, 22:06:35 de către FMI - Paul-Dan Baltescu » Memorat

"Doua lucruri sunt infinite: universul si prostia omeneasca, dar de prima inca nu sunt sigur" Albert Einstein
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #9 : August 27, 2011, 03:57:26 »

Preprocesarea e o idee, nu conteaza daca o faci folosind templateuri sau altfel.
Folosirea acestei idei triseaza scopul problemei, pentru ca tot platesti timpul undeva.

Asa cum am zis si mai sus, raspunsul O(log N) e gresit, pentru ca rezultatul va avea multe cifre.
Destul de repede vei avea nevoie sa implementezi numere mari pentru care operatiile de adunare, inmultire ... nu ruleaza in timp constant.

Vlad e mai aproape de raspuns, dar nici el nu mi-a zis complexitatea algoritmului lui. Oricum exista algoritm mai bun.
« Ultima modificare: August 27, 2011, 08:29:08 de către Cosmin Negruseri » Memorat
proflaurian
Client obisnuit
**

Karma: 46
Deconectat Deconectat

Mesaje: 58



Vezi Profilul
« Răspunde #10 : August 29, 2011, 17:21:12 »

Complexitatea la care te gandesti e ceva de forma O( na )  unde a e prin apropiere de 1,7 ?
Memorat
proflaurian
Client obisnuit
**

Karma: 46
Deconectat Deconectat

Mesaje: 58



Vezi Profilul
« Răspunde #11 : August 29, 2011, 17:46:04 »

Scuze. Am aruncat o vorba fara nicio explicatie. Eu ma gandeam la ceva recursiv pe metoda urmatoare:

(Fm+n,Fm+n-1)=( FmFn+Fm-1Fn+FmFn-1 , FmFn+Fm-1Fn-1)

De aici

(F2k,F2k-1)=( Fk2+2FkFk-1 , Fk2+Fk-12)

 si

(F2k+1,F2k)=( F2k+F2k-1,F2k)

Astfel se obtine ceva similar cu ce spunea Vlad. La fiecare pas, n se injumatateste si se aplica operatii de inmultire si adunare care duc la complexitate L2  ( unde L este numarul de cifre n/log n ). Sumand aceste complexitati mie imi da ceva de genul  O ( n1,7 ) .
Memorat
Vman
Echipa infoarena
Vorbaret
*****

Karma: 45
Deconectat Deconectat

Mesaje: 176



Vezi Profilul
« Răspunde #12 : August 29, 2011, 20:17:16 »

sa incerc o estimare...
rezultatul va tinde catre 2^n, deci va avea n biti, deci n/logn cifre. Din cate am citit ar exista un algoritm de inmultire in O(c log c), deci o inmultire ar dura n / log n * log (n / log n) = n / log n * (log n - log log n) = n - n log log n / log n, rezulta o complexitate finala de n^2 log n  Think
Memorat
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #13 : August 30, 2011, 03:20:22 »

Algoritmul naiv in care folosesti numere mari si le aduni unu cate unu ia O(n^2/log^2 n) timp.

@Adrian ai gresit pe la calcule. La ultimul pas inmultesti numere de O(n/log n) cifre in L^2 deci algoritmul ia cel putin O(n^2/log^2 n) care e mai mare decat O(n^1.7). Acuma vezi ca algoritmul ce nu foloseste o inmultire eficienta ca pas intermediar nu bate algoritmul naiv.

@Vlad ai bushit ceva. Algoritmul tau ar trebui sa fie mai rapid decat cel naiv.

« Ultima modificare: August 30, 2011, 04:54:07 de către Cosmin Negruseri » Memorat
Vman
Echipa infoarena
Vorbaret
*****

Karma: 45
Deconectat Deconectat

Mesaje: 176



Vezi Profilul
« Răspunde #14 : August 30, 2011, 11:47:47 »

asa e, am un n in plus acolo la final, de fapt complexitatea la mine e O(N log N)
Memorat
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #15 : August 31, 2011, 02:30:27 »

@Vlad tot iti lipseste o observatie.

La pasul i avem numere de 2^i / log n cifre. Daca sumezi costul inmultirilor vezi ca ajungi la O(n) ca si complexitate finala.

Complexitatea e putin mai mare de O(n)  pentru ca algoritmul cel mai bun de inmultire pe numere mari cunoscut are complexitatea Θ(n log(n) 2^Θ(log*(n)) (http://en.wikipedia.org/wiki/Multiplication_algorithm).
Memorat
proflaurian
Client obisnuit
**

Karma: 46
Deconectat Deconectat

Mesaje: 58



Vezi Profilul
« Răspunde #16 : Septembrie 02, 2011, 20:51:56 »

Eu am facut afirmatia cu n1,7 plecand de la un calcul aproximativ al sumei din (2k/k)2 pentru k < log n folosind n cu 10-20 de cifre. Am refacut cu n avand mult mai multe cifre ( pana la 200) si dupa socotelile mele se ajunge cam la n2. Nu afirm ca asta e raspunsul corect, e doar o parere bazata pe calcule destul de aproximative  Smile

Am folosit urmatoru cod:

Cod:
#include <iostream>
#include<cmath>
using namespace std;

int main()
{
    int i;
    long double n=1,N,C,S=0,EXP;
    for(i=1;i<200;i++)n*=10;
    for(N=n/2;N>=2;N/=2)
    {
        C=N/log(N);
        C*=C;
        S+=C;
    }
    EXP=log(S)/log(n);
    cout << EXP;
    return 0;
}
« Ultima modificare: Septembrie 02, 2011, 21:00:35 de către Panaete Adrian » Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines