//时间复杂度:O(n+k)publicstaticvoidtest11(int n,int k){for(int i =0; i < n; i++){
System.out.println("test");}for(int i =0; i < k; i++){
System.out.println("test");}}
3 斐波那契数相关的算法问题
斐波那契数:0 1 1 2 3 5 8 13 21 34 …
代码
package com.mj;publicclassMain{// 算法一// 时间复杂度:O(2^n)publicstaticintfib1(int n){if(n <=1)return n;returnfib1(n -1)+fib1(n -2);}// 算法二// 时间复杂度:O(n)publicstaticintfib2(int n){if(n <=1)return n;int first =0;int second =1;for(int i =0; i < n -1; i++){int sum = first + second;
first = second;
second = sum;}return second;}//算法三//时间复杂度:O(n)publicstaticintfib3(int n){if(n <=1)return n;int first =0;int second =1;while(n-->1){
second += first;
first = second - first;}return second;}//算法四:特征方程解法//时间复杂度:O(1)publicstaticintfib4(int n){double c = Math.sqrt(5);return(int)((Math.pow((1+c)/2, n)-Math.pow((1-c)/2, n))/c);}publicstaticvoidmain(String[] args){int n =12;
System.out.println(fib2(n));
System.out.println(fib3(n));
System.out.println(fib4(n));// TimeTool.check("fib1", new Task() {// public void execute() {// System.out.println(fib1(n));// }// });// // TimeTool.check("fib2", new Task() {// public void execute() {// System.out.println(fib2(n));// }// });}publicstaticvoidtest1(int n){// 汇编指令// 1(syso),判断忽略if(n >10){
System.out.println("n > 10");}elseif(n >5){// 2
System.out.println("n > 5");}else{
System.out.println("n <= 5");}// 1(i=0) + 4(i++) + 4(<4) + 4(syso)for(int i =0; i <4; i++){
System.out.println("test");}// 140000// O(1)// 只用了一个变量i,所以认为空间复杂度为O(1)}publicstaticvoidtest2(int n){// O(n)// 1 + 3nfor(int i =0; i < n; i++){
System.out.println("test");}}publicstaticvoidtest3(int n){// 1 + 2n + n * (1 + 3n)// 1 + 2n + n + 3n^2// 3n^2 + 3n + 1// O(n^2)// O(n)for(int i =0; i < n; i++){for(int j =0; j < n; j++){
System.out.println("test");}}}publicstaticvoidtest4(int n){// 1 + 2n + n * (1 + 45)// 1 + 2n + 46n// 48n + 1// O(n)for(int i =0; i < n; i++){for(int j =0; j <15; j++){
System.out.println("test");}}}publicstaticvoidtest5(int n){// 8 = 2^3// 16 = 2^4// 3 = log2(8)// 4 = log2(16)// 执行次数 = log2(n)// O(logn)while((n = n /2)>0){
System.out.println("test");}}publicstaticvoidtest6(int n){// log5(n)// O(logn)while((n = n /5)>0){
System.out.println("test");}}publicstaticvoidtest7(int n){// 1 + 2*log2(n) + log2(n) * (1 + 3n)// 1 + 3*log2(n) + 2 * nlog2(n)// O(nlogn)for(int i =1; i < n; i = i *2){// 1 + 3nfor(int j =0; j < n; j++){
System.out.println("test");}}}publicstaticvoidtest10(int n){// O(n)int a =10;int b =20;int c = a + b;// 前面a、b、c大小都是常数,跟n无关// 但数组分配的空间大小,和n成正比,所以空间复杂度为O(n)int[] array =newint[n];for(int i =0; i < array.length; i++){
System.out.println(array[i]+ c);}}}
工具类:Times
package com.mj;import java.text.SimpleDateFormat;import java.util.Date;publicclassTimes{privatestaticfinal SimpleDateFormat fmt =newSimpleDateFormat("HH:mm:ss.SSS");publicinterfaceTask{voidexecute();}publicstaticvoidtest(String title, Task task){if(task == null)return;
title =(title == null)?"":("【"+ title +"】");
System.out.println(title);
System.out.println("开始:"+ fmt.format(newDate()));long begin = System.currentTimeMillis();
task.execute();long end = System.currentTimeMillis();
System.out.println("结束:"+ fmt.format(newDate()));double delta =(end - begin)/1000.0;
System.out.println("耗时:"+ delta +"秒");
System.out.println("-------------------------------------");}}