algorytm wybierania konkretnych par liczb

baracuda2
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 10 paź 2009, o 14:14
Płeć: Mężczyzna
Lokalizacja: dom
Podziękował: 9 razy

algorytm wybierania konkretnych par liczb

Post autor: baracuda2 »

algorytm, który dla danego ciągu A(1),...,A(m) różnych liczb naturalnych i danej liczby x, drukuje wszystkie pary liczb (p,q), takie że A(p) * A(q) = x


witam prosze o pomoc z algorytmem
Piotr20
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 16 paź 2010, o 12:54
Płeć: Mężczyzna
Lokalizacja: Częstochowa

algorytm wybierania konkretnych par liczb

Post autor: Piotr20 »

Kod: Zaznacz cały

for(int i=0; i< (sizeof(A)/sizeof(int)); i++)
		for(int j=0; j<(sizeof(A)/sizeof(int)); j++)
			if(A[i]*A[j] == x)
				cout << "A[" << i+1 << "] * [A" << j+1 << "] = " << x << endl;
Pozdrawiam
PMichalak
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 29 paź 2009, o 20:03
Płeć: Mężczyzna
Lokalizacja: Kalisz
Podziękował: 1 raz
Pomógł: 16 razy

algorytm wybierania konkretnych par liczb

Post autor: PMichalak »

Twój algorytm wykonuje niepotrzebnie \(\displaystyle{ O(n^{2})}\) dzieleń... i wypisuje możliwe pary dwa razy, poniżej poprawiona nieznacznie wersja:

Kod: Zaznacz cały

for(int i=0; i< A.size(); i++)
      for(int j=i; j<A.size(); j++)
         if(A[i]*A[j] == x)
            cout << "A[" << i+1 << "] * [A" << j+1 << "] = " << x << endl;
Da się to jednak zrobić lepiej:
1. Posortować ciąg.
2. Dla każdego elementu \(\displaystyle{ p}\) wyszukać binarnie element \(\displaystyle{ q}\) taki, że \(\displaystyle{ pq = x}\).

Dzięki temu otrzymasz złożoność \(\displaystyle{ O(nlogn)}\) zamiast \(\displaystyle{ O(n^{2})}\).
abc666

algorytm wybierania konkretnych par liczb

Post autor: abc666 »

PMichalak, można posortować ciąg a potem w czasie liniowym znaleźć wszystkie te pary, przesuwając się z końców. Jeżeli dla danego \(\displaystyle{ p}\) znaleźliśmy \(\displaystyle{ q}\) to dla większego \(\displaystyle{ p'}\) nasze \(\displaystyle{ q'}\) nie może być większe niż \(\displaystyle{ q}\).

I tak pozostaje złożoność sortowania ale nie trzeba pisać szukania binarnego.
PMichalak
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 29 paź 2009, o 20:03
Płeć: Mężczyzna
Lokalizacja: Kalisz
Podziękował: 1 raz
Pomógł: 16 razy

algorytm wybierania konkretnych par liczb

Post autor: PMichalak »

Istotnie.
Piotr20
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 16 paź 2010, o 12:54
Płeć: Mężczyzna
Lokalizacja: Częstochowa

algorytm wybierania konkretnych par liczb

Post autor: Piotr20 »

PMichalak pisze:Twój algorytm wykonuje niepotrzebnie \(\displaystyle{ O(n^{2})}\) dzieleń... i wypisuje możliwe pary dwa razy...
Gdyby każdą możliwą parę A(p) * A(q) potraktować osobno to:

\(\displaystyle{ A(1) * A(2)

bo p=1 \wedge q=2

A(2) * A(1)

bo p=2 \wedge q=1}\)


Z tego względu mój algorytm wypisywał wszystkie możliwe pary.
abc666

algorytm wybierania konkretnych par liczb

Post autor: abc666 »

Masz rację. Jednak lepiej przejść po pętli tak jak PMichalak i od razu przy znalezieniu pary wypisać obie permutacje
ODPOWIEDZ