TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
任何项目开发中,在一个集合或数组中循环查找,搜索目标数据,是经常用到的。如果搜索的数据范围比较小,那么不管什么算法,对于今天的计算机来说,性能上基本差别不大,但是如果数据量达到几百万,甚至更大,那么算法的选择和优化就显得比较重要。有空之余测试了下顺序搜索和二分搜索的性能,竟然发现效率差异在1500倍左右。当然,这2种比较的前提是,集合中的数据已经进行了排序处理。 下边是测试代码: /**
* 搜索算法测试,主要是比较二分搜索和顺序搜索的效率
* @author 百里乐
*/
public class SearchTest
{
/** 被搜索数据的大小*/
private static final int size = 5000000; /**
* 启动方法
* @param args
*/
public static void main(String[] args)
{
long[] data = new long[size];
//添加测试数据
for(int k =0 ;k<data.length;k++)
{
data[k] = k;
}
// 要查找的数据
long target = 4980002;
binaryFindTest(data,target);
orderFindTest(data,target);
} /**
* 二分搜索测试
* @param data 数据集合
* @param target 搜索的数据
*/
public static void binaryFindTest(long[] data, long target)
{
long start = System.nanoTime();
int result = binaryFind(data,target);
long end = System.nanoTime();
System.out.println("binary search position:" + result);
System.out.println("binary search time:" + (end-start));
} /**
* 顺序搜索测试
* @param data 数据集合
* @param target 搜索的数据
*/
public static void orderFindTest(long[] data, long target)
{
long start = System.nanoTime();
int result = orderFind(data,target);
long end = System.nanoTime();
System.out.println("order search position:" + result);
System.out.println("order search time:" + (end-start));
} /**
* 二分搜索算法实现
* @param data 数据集合
* @param target 搜索的数据
* @return 返回找到的数据的位置,返回-1表示没有找到。
*/
public static int binaryFind(long[] data, long target)
{
int start = 0;
int end = data.length - 1;
while (start <= end)
{
int middleIndex = (start + end) / 2;
if (target == data[middleIndex])
{
return middleIndex;
}
if (target >= data[middleIndex])
{
start = middleIndex + 1;
}
else
{
end = middleIndex - 1;
}
}
return -1;
} /**
* 顺序搜索算法实现
* @param data 数据集合
* @param target 搜索的数据
* @return 返回找到的数据的位置,返回-1表示没有找到。
*/
public static int orderFind(long[] data, long target)
{
for(int k = 0;k<data.length;k++)
{
if(target==data[k])
{
return k;
}
}
return -1;
}
} 运行测试代码,执行结果如下: inary search position:4980002
binary search time:19204
order search position:4980002
order search time:31723602
源码下载:http://file.javaxxz.com/2014/11/11/000321812.zip |
|