0
点赞
收藏
分享

微信扫一扫

时间复杂度的天差地别?这个实验带你直观感受


我们都说时间复杂度很重要,却无法直接感受到时间复杂度的重要性。那么这次实验就带你直观感受到不同算法之间时间复杂度的巨大差距

实验原理:
在这个实验中,我们需要用到System.currentTimeMillis()。
System.currentTimeMillis()的作用是可以获得当前时间,那么在执行算法之前获取当前时间,在执行算法之后我们再获得当前时间,前后两次当前时间相减,就可以得到执行算法的时间。

在这次实验中,我们比较两种算法:二分查找和顺序查找的时间复杂度。
这两种查找都是在一个数组中找到我们要的元素,然后返回该元素的小标

//顺序查找
private static int search(int[] arr,int key) {//arr是数组,key是目标元素
for(int i=0;i<arr.length;i++) {
if(arr[i]==key) {
return i;
}
}
return -1;//找不到,返回-1
}

//二分查找
private static int binarySearch(int []arr,int low,int high,int key) {//arr是数组,low是0,high是数组下表的最大值,key是目标元素
if(low>high) {
return -1;
}
int mid=(low+high)/2;
if(arr[mid]<key) {
return binarySearch(arr,mid+1,high,key);
}
else if(arr[mid]>key) {
return binarySearch(arr,low,mid-1,key);
}
else {
return mid;
}

}

接下来上完整实验代码

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
int [] x =new int [10000*10000];
for(int i=0;i<x.length;i++) {
x[i]=i+1;
}
int target=10000*9999;

long now=System.currentTimeMillis();
int index=binarySearch(x,0,x.length-1,target);
System.out.println("二分查找执行时间:"+(System.currentTimeMillis()-now)+"ms");
System.out.println(target+"所在位置为:"+index);

now =System.currentTimeMillis();
index=search(x,target);
System.out.println("顺序查找执行时间:"+(System.currentTimeMillis()-now)+"ms");
System.out.println(target+"所在位置为:"+index);
}

//顺序查找
private static int search(int[] arr,int key) {
for(int i=0;i<arr.length;i++) {
if(arr[i]==key) {
return i;
}
}
return -1;
}

//二分查找
private static int binarySearch(int []arr,int low,int high,int key) {
if(low>high) {
return -1;
}
int mid=(low+high)/2;
if(arr[mid]<key) {
return binarySearch(arr,mid+1,high,key);
}
else if(arr[mid]>key) {
return binarySearch(arr,low,mid-1,key);
}
else {
return mid;
}

}

}

时间复杂度的天差地别?这个实验带你直观感受_二分查找


可以看到,二分查找执行的时间为0ms,说明时间复杂度很小,

而顺序查找执行时间为32ms,时间复杂度很大,这两者差距可以说是无穷大。


举报

相关推荐

0 条评论