mboost-dp1
Algoritm Tids Kompliexitet - Java
- Forside
- ⟨
- Forum
- ⟨
- Programmering
Hej
I forbindelse med noget materiale omkring tidskomplexitet af algoritmer, har jeg følgende eksempel:
Jeg skal så at kunne udregne værdien af T(n) , hvor hver primitiv operation tæller for en.
Her er hvad jeg er nået frem til
Dvs.:
Men ifølge mit materiale er svaret:
Hvilket jeg altså ikke kan se hvorfor. F.eks. hvis man ser på selve for(;;) delen af koden, så defines komplexiteten som
3(n+2) istedet for 3n+2
Dette kan kun være korrekt hvis man assumere at int i = 0; bliver redefineret for hver iteration, hvilket jo ikke er korrekt i Java (eller for den sags skyld ethvert andet sprog).
Nogle ideer til hvad det er jeg misser?
I forbindelse med noget materiale omkring tidskomplexitet af algoritmer, har jeg følgende eksempel:
int result = 0;
for(int i = 0; i<=n ;i++ )
{
result = result+i;
}
Jeg skal så at kunne udregne værdien af T(n) , hvor hver primitiv operation tæller for en.
Her er hvad jeg er nået frem til
// Initialization, Assignement = 2
int result = 0;
// Initialization, Assignement, (Comparision) * n, (Arithmetic, Assignement) * n = 2 + 1n + 2n = 3n + 2
for(int i = 0; i<=n ;i++ )
{
// (Assignement, Arithmetic) * n = 2n
result = result+i;
}
Dvs.:
2 + 3n + 2 + 2n = 5n + 4
Men ifølge mit materiale er svaret:
1 + 1 + 3*(n+2) + (n+1)+ 4*(n+1) = 8n + 13
Hvilket jeg altså ikke kan se hvorfor. F.eks. hvis man ser på selve for(;;) delen af koden, så defines komplexiteten som
3(n+2) istedet for 3n+2
Dette kan kun være korrekt hvis man assumere at int i = 0; bliver redefineret for hver iteration, hvilket jo ikke er korrekt i Java (eller for den sags skyld ethvert andet sprog).
Nogle ideer til hvad det er jeg misser?
Uden at have en helt præcis definition af hvad primitive operationer er, så er det umuligt at sige.
Jeg får f.eks. løkken til 7n via:
loop:
compare i to n
if greater than jump to endloop
calculate result + i
assign to result
calculate i + 1
assign to i
unconditionally jump to loop
endloop:
Jeg får f.eks. løkken til 7n via:
loop:
compare i to n
if greater than jump to endloop
calculate result + i
assign to result
calculate i + 1
assign to i
unconditionally jump to loop
endloop:
Lige een mere:
Det ydre loop itereres over N gange, og den indre løkke itereres over N ∙ M, men da det er meget variabel må tidskompleksiteten kunne tilnærmes til O(n).
Har jeg forstået det rigtigt?
int T(int n)
{
int result = 0;
for (int i = 0; i < n; i++)
{
for (int j = 1; j < n; j = j*2)
{
result++;
}
}
return result;
}
Det ydre loop itereres over N gange, og den indre løkke itereres over N ∙ M, men da det er meget variabel må tidskompleksiteten kunne tilnærmes til O(n).
Har jeg forstået det rigtigt?
Udover at analysere sig frem kan man også teste.
For fun:
For fun:
public class BigOTester {
public interface Algorithm {
public int t(int n);
}
private static long time(Algorithm alg, int n, int rep) {
long t1 = System.currentTimeMillis();
for(int i = 0; i < rep; i++) {
alg.t(n);
}
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private final static int SECS = 5;
private static double time(Algorithm alg, int n) {
int repprsec = 1;
while(time(alg, n, repprsec) < 1000) repprsec *= 2;
int rep = SECS * repprsec;
return time(alg, n, rep) / (double)rep;
}
private final static double MAXDEV = 0.05;
private final static boolean match(double tlow, double thigh, double clow, double chigh) {
double ratio = (thigh / tlow) / (chigh / clow);
return (1 - MAXDEV) < ratio && (ratio < 1 + MAXDEV);
}
private final static int LOW = 1000;
private final static int HIGH = 10000;
public static void test(Algorithm alg) {
double tlow = time(alg, LOW);
double thigh = time(alg, HIGH);
if(match(tlow, thigh, 1.0, 1.0)) {
System.out.println("O(1)");
} else if(match(tlow, thigh, Math.log(LOW), Math.log(HIGH))) {
System.out.println("O(logn)");
} else if(match(tlow, thigh, (double)LOW, (double)HIGH)) {
System.out.println("O(n)");
} else if(match(tlow, thigh, (double)LOW * Math.log(LOW), (double)HIGH * Math.log(HIGH))) {
System.out.println("O(nlogn)");
} else if(match(tlow, thigh, (double)LOW * (double)LOW, (double)HIGH * (double)HIGH)) {
System.out.println("O(n^2)");
} else if(match(tlow, thigh, Math.pow(LOW, 3), Math.pow(HIGH, 3))) {
System.out.println("O(n^3)");
} else {
System.out.println("Unknown big O");
}
}
public static void main(String[] args) {
test(new Algorithm() {
public int t(int n) {
int result = 0;
for(int i = 0; i < n ; i++)
{
result = result + i;
}
return result;
}
});
test(new Algorithm() {
public int t(int n) {
int result = 0;
for(int i = 0; i < n ; i += 2)
{
result = result + i;
}
return result;
}
});
test(new Algorithm() {
public int t(int n)
{
int result = 0;
for (int i = 0; i < n; i++)
{
for (int j = 1; j < n; j *= 2)
{
result++;
}
}
return result;
}
});
}
}
Gå til top
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.