实验内容一:两类算法分别编程实验,自己写数据进行运行,要求数据个数为10以上,使用同一组数据进行实验。写好程序后,可计算一下程序的时间耗费,对比算法差别
算法1
代码
import java.util.Calendar;
import java.util.Random;
public class One {
// 生成随机数组函数
public static int[] gennerateArray(int len, int max) {
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = (int) (Math.random() * max);
}
return arr;
}
// 比较函数
public static int compare(int num, int[] array) {
int count = 0;
for (int i = 0; i < array.length; i++) {
count++;
if(array[i] == num){
return count;
}
}
return 0;
}
public static void main(String args[]) {
Random r = new Random(3);
// 生成随即数组
int[] a = gennerateArray(15, 100);
System.out.print("生成随即数组:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
// 生成随机数
int number = r.nextInt(100);
System.out.println("生成随机数:"+number);
// 获取开始时间
long startTime = Calendar.getInstance().getTimeInMillis();
int ans = compare(number,a);
// 获取结束时间
long endTime = Calendar.getInstance().getTimeInMillis();
System.out.println("输出结果:"+ans);
System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}
}
运行结果
算法二
代码
import java.util.Arrays;
import java.util.Calendar;
import java.util.Random;
public class two {
// 生成随机数组函数
public static int[] gennerateArray(int len, int max) {
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = (int) (Math.random() * max);
}
return arr;
}
// 比较函数
public static int compare(int num, int[] array) {
int count = 0;
for (int i = 0; i < array.length; i++) {
count++;
if (array[i] == num) {
return count;
}
if(array[i]<num){
return 0;
}
}
return 0;
}
public static void main(String args[]) {
Random r = new Random(3);
// 生成随即数组
int[] a = gennerateArray(15, 100);
Arrays.sort(a);
System.out.print("生成随即数组:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
// 生成随机数
int number = r.nextInt(100);
System.out.println("生成随机数:" + number);
// 获取开始时间
long startTime = Calendar.getInstance().getTimeInMillis();
int ans = compare(number, a);
// 获取结束时间
long endTime = Calendar.getInstance().getTimeInMillis();
System.out.println("比较次数:" + ans);
System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}
}
运行结果
算法差别
算法一: 顺序检索算法未经排序,按照从头到尾一个个扫描,直到扫描到第一个元素为止,如果未找到的话必然事件复杂度为O(n);
算法二: 经过改进后,该算法只有在当前数大于数组中的所有元素的情况下时间复杂度才为O(n)。
实验内容二 可用随机数生产100个数据对两类检索进行实验,可在程序中添加起始时间函数及终止时间函数来记录两种算法的时间耗费,对比两类算法差别。
算法1运行结果
算法二运行结果
算法差别
算法一: 顺序检索算法未经排序,按照从头到尾一个个扫描,直到扫描到第一个元素为止,如果未找到的话必然事件复杂度为O(n);
算法二: 经过改进后,该算法只有在当前数大于数组中的所有元素的情况下时间复杂度才为O(n)
实验总结
计算程序耗时代码
// 获取开始时间
long startTime = Calendar.getInstance().getTimeInMillis();
int ans = compare(number,a);
// 获取结束时间
long endTime = Calendar.getInstance().getTimeInMillis();
System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
数组排序代码
Arrays.sort(a);
收获
在设计算法的时候,应尽量避免遍历全数组的情况,遍历过程中尽量采用剪枝。