系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、线性查找
- 二、实现查找算法
- 三、循环不变量
- 四、复杂度分析
- 五、常见复杂度
- 六、测试算法性能
- 总结
前言
从线性查找入手算法。
一、线性查找
线性查找 | |
---|---|
目的 | 在线性数据结构中一个一个查找目标元素 |
输入 | 数组和目标元素 |
输出 | 目标元素所在的索引;若不存在,返回-1 |
二、实现查找算法
public class LinearSearch {
private LinearSearch(){}
//构造函数私有化
public static <E> int search(E[] data, E target)
{
for(int i = 0;i < data.length;i++)
{
if(data[i].equals(target))
return i;
}
return -1;
}
}
三、循环不变量
循环的目的 |
---|
维持循环不变量 |
四、复杂度分析
算法复杂度分析 | T = o(?) |
---|---|
分析 | 通过计算执行指令量(数据的规模)来衡量算法的复杂度,最终让算法的复杂度归结某一个量级,再来进行比较算法的性能 |
复杂度 | 随着数据规模n的增大,算法性能的变化趋势 |
五、常见复杂度
复杂度估算量级 |
---|
时间复杂度的计算与数据规模相关,要先确定数据规模 |
六、测试算法性能
public class ArrayGenerator {
public static Integer[] generateOrderedArray(int n)
{
Integer[] arr = new Integer[n];
for(int i = 0;i < n;i++)
{
arr[i] = i;
}
return arr;
}
}
public class Main {
public static void main(String[] args)
{
int[] dataSize = {100000, 1000000};
for(int n:dataSize)
{
Integer[] data = ArrayGenerator.generateOrderedArray(n);
long startTime = System.nanoTime();
for(int k = 0;k < 100;k++)
LinearSearch.search(data, n);
long endTime = System.nanoTime();
double time = (endTime - startTime) / 1000000000.0;
System.out.println("n = " + n + ",100 runs," + time + "s");
}
}
}
总结
算法复杂度需要结合数据规模进行分析,要看懂一个算法需要找到循环不变量和数据规模。