2013-05-09 16 views
6

Uczę się o równoległości i w jednym ćwiczeniu dostaję kilka algorytmów, które powinny poprawić wydajność. Jednym z nich jest generator sekwencji Fibonacciego:Równolegle generatora sekwencji Fibonacci

array[0] = 0; 
array[1] = 1; 
for (q = 2; q < MAX; q++) { 
    array[q] = array[q−1] + array[q−2]; 
} 

Podejrzewam, że to nie może być optymalizowane (przez parallelization), ponieważ każda liczba zależy od dwóch poprzednich liczb (a więc pośrednio na wszystkich poprzednich numerów). Jak można to zrównoleglić?

+0

Co robiłeś w swojej klasie do tej pory? – devnull

+0

Fibonacci jest kiepskim wyborem do zrównoleglania, jak sądzę. Sprawdź to: http://trigonakis.com/blog/2011/02/27/parallelizing-simple-algorithms-fibonacci/ –

+0

Jeśli nie możesz określić sąsiednich liczb Fibonacciego z wyprzedzeniem, jest mało prawdopodobne, że będziesz w stanie je zrównoleglić . – devnull

Odpowiedz

11

Sekwencja Fibonacciego jest określana właśnie przez jej pierwsze dwa elementy; w rzeczywistości, można jakoś parallelize, chociaż brzydki:

F(n + 2) = F(n + 1) + F(n) 
F(n + 3) = F(n + 1) + F(n + 2) = F(n + 1) * 2 + F(n) 
F(n + 4) = F(n + 2) + F(n + 3) = F(n + 1) * 3 + F(n) * 2 
F(n + 5) = F(n + 3) + F(n + 4) = F(n + 1) * 5 + F(n) * 3 
F(n + 6) = F(n + 4) + F(n + 5) = F(n + 1) * 8 + F(n) * 5 

Mam nadzieję, że teraz można zobaczyć, że:

F(n + k) = F(n + 1) * F(K) + F(n) * F(k - 1) 

Więc po obliczeniowej pierwszych liczb k, można użyć tej relacji do obliczania następne k pozycji w sekwencji, w tym samym czasie, zrównoleglone.

Można również użyć bezpośredniej formuły dla liczb Fibonacciego, aby obliczyć je równolegle, ale to jest trochę zbyt niefajne (również może być zbyt proste do celów edukacyjnych, aby mogło służyć).

2

Liczba "n" jest liczbą Fibanocci, jeśli albo (5n^2 - 4), albo (5n^2 + 4) jest idealnym kwadratem.

http://en.wikipedia.org/wiki/Fibonacci_number

Więc biorąc pod uwagę dużą liczbę można znaleźć kolejne dwa Nums fib za pomocą tego algorytmu i kontynuować Oprócz tego momentu.

W ten sposób można podzielić problem między (0 do N/2), a następnie (N/2 + 1 do N) i uruchomić go w wątkach równoległych.

5

Najlepszym sposobem, aby zbliżyć go do używania 2-wymiarową postać matrycy Fibonacciego

enter image description here

Teraz łatwo można go rozwinąć. Pomogą w tym proste koncepcje mnożenia macierzy.

czy można przejść z inny sposób matematyczny, taki jak

enter image description here