Sunteți pe pagina 1din 6

Ministerul Educației, Culturii și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare, Informatică și Microelectronică

Raport la
Lucrarea de laborator Nr. 2
Disciplina: Algoritmi si proiectarea algoritmilor

Tema: ” Ciurul lui Eratostente. Analiza algoritmilor.”

Au efectuat: Botnaru Alexandru

A verificat: Mihai Gaidau

Chișinău – 2020
Scopul lucrării: 1. Analiza empirică a algoritmilor

SARCINA DE BAZĂ:
1. Implementați 3 algoritmi ce rezolva ciurul lui Eratostene intr-un limbaj de
programare.(JAVA)
package com.company;

import java.util.Scanner;

public class Main {

static int c1 = 0, c2 = 0, c3 = 0;

public static void main(String args[]) {


int n;
Scanner sc = new Scanner(System.in);
System.out.println("Introduceti n");
n = sc.nextInt();
sc.close();

System.out.println("Rezultatul primului algoritm : (Erathostenes) ");


prime1(n);
System.out.println("\nNumarul de iteratii : " + c1);

System.out.println("\nRezultatul celui de-al doilea algoritm : ");


prime2(n);//algoritm simplu
System.out.println("\nNumarul de iteratii : " + c2);

System.out.println("\nRezultatul celui de-al treilea algoritm : ");


boolean sirulPrim[]=prime3(n);
for(int i = 2; i < n; i++)
{
if(sirulPrim[i])
System.out.print(i + " ");
}
System.out.println("\nNumarul de iteratii : " + c3);

static void prime2(int n) {


int i, j, flag;

for (i = 1; i <= n; i++) {

if (i == 1 || i == 0)
continue;
flag = 1;

for (j = 2; j <= i / 2; ++j) {


if (i % j == 0) {
flag = 0;
break;
}
c2++;
}
if (flag == 1)
System.out.print(i + " ");
}
}

static public void prime1(int n)//ciurul lui Erathostenes


{
boolean prime[] = new boolean[n + 1];
for (int i = 2; i <= n; i++)
prime[i] = true;

for (int p = 2; p * p <= n; p++) {


if (prime[p] == true) {
for (int i = p * p; i <= n; i += p) {
prime[i] = false;
c1++;
}
}
}

for (int i = 2; i <= n; i++) {


if (prime[i] == true)
System.out.print(i + " ");
}
}

static boolean[] prime3(int n) {


int[] prime = new int[n+1];
int[] minFactorPrim = new int[n+1];
boolean[] isprime = new boolean[n+1];
int incr = 0;
for (int i = 2; i < n; i++) {

isprime[i] = true;

}
for (int i = 2; i <= n; i++) {
if (isprime[i] == true) {
prime[incr] = i;
minFactorPrim[i] = i;
incr++;
}
for (int j = 0; j < incr && i * prime[j] < n && prime[j] <=
minFactorPrim[i]; j++) {
isprime[i * prime[j]] = false;
minFactorPrim[i * prime[j]] = prime[j];
c3++;
}

}
return isprime;
}
}
2.Stabiliți proprietăţile datelor de intrare în raport cu care se face analiza
Datele de intrare sunt niste numere intregi (4 biti), cuprinse in
intervalul[10...1000]
3.Alegeți metrica pentru compararea algoritmilor
Numarul de iteratii
4.Efectuaţi analiza empirică a algoritmilor propuşi
Pentru n=10:
Rezultatul primului algoritm : (Erathostenes)
2357
Numarul de iteratii : 5
Rezultatul celui de-al doilea algoritm :
2357
Numarul de iteratii : 4
Rezultatul celui de-al treilea algoritm :
2357
Numarul de iteratii : 4

Pentru n=50:
Rezultatul primului algoritm : (Erathostenes)
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
Numarul de iteratii : 45
Rezultatul celui de-al doilea algoritm :
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
Numarul de iteratii : 160
Rezultatul celui de-al treilea algoritm :
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
Numarul de iteratii : 33
Pentru n=100:
Rezultatul primului algoritm : (Erathostenes)
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Numarul de iteratii : 104
Rezultatul celui de-al doilea algoritm :
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Numarul de iteratii : 542
Rezultatul celui de-al treilea algoritm :
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Numarul de iteratii : 73

Pentru n=200:
Numarul de iteratii al prime1(Erathostenes) : 232
Numarul de iteratii al prime2 : 2181
Numarul de iteratii al prime3 : 152

Pentru n=500:
Numarul de iteratii al prime1(Erathostenes) : 656
Numarul de iteratii al prime2 : 11155
Numarul de iteratii al prime3 : 403

Pentru n=1000:
Numarul de iteratii al prime1(Erathostenes) : 1411
Numarul de iteratii al prime2 : 39212
Numarul de iteratii al prime3 : 830

Observam ca al 3-lea algoritm este practic mereu cel mai eficient, comparand dupa
numarul de iteratii, cu exceptia cind n<=10.In acest caz numarul iteratiilor este
egal cu celui de-al doilea algoritm.Urmatorul dupa eficienta este Ciurul lui
Erastothenes si apoi cel de-al 3lea(cu dividere).
Complexitatea prime1 este O(nlog(log(n))).

Complexitatea Fib2 este de O(n^2).

Complexitatea Fib3 este de O(n)

5. Faceți o prezentare grafică a datelor obținute


12000

10000

8000
Numarul de iteratii

6000

4000

2000

0
n=10 n=50 n=100 n=200 n=500 n=1000

prime1 prime2 prime3

Concluzie:
Scopul acestei lucrari de laborator a fost de a efectua analiza
empirica a 3 algoritmi destinati rezolvarii aceleiasi probleme : de a afisa
numerele prime dintr-un interval anumit(folosind ciurul lui
Eratosthenes).In urma acestei analize am ajuns la concluzia ca cel mai
eficient algoritm este al 3-lea, cu complexitatea O(n), pentru ca numarul
de iteratii este cel mai mic.In urma lucrarii date am inteles ce este si cind
se foloseste analiza empirica.

S-ar putea să vă placă și