package com.cn.ld.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.StringUtils;
public class CollectionUtil extends StringUtils {
public static void arrayOper() {
int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7,
8, 9, 1, 2 };
int[] b = new int[10];
int d[] = new int[10];
List<Integer> c = new ArrayList<Integer>();
System.arraycopy(a, 0, c, 0, 9);
for (int i : c) {
System.out.println(i);
}
}
/**
* 二分法查找
*/
public static int dichotomy(int num, int[] a) {
int lowerBound = 0;
int uperBound = a.length - 1;
int curNum = 0;
while (true) {
curNum = (lowerBound + uperBound) / 2;
if (num == a[curNum]) {
return curNum;
} else if (lowerBound > uperBound) {
return -1;
} else {
if (num > a[curNum]) {
lowerBound = curNum + 1;
} else {
uperBound = curNum - 1;
}
}
}
}
/**
* 线性查找
*
* @param args
*/
public static int linearity(int num, int[] a) {
int index = 0;
for (int i = a.length - 1; i > 0; i--) {
if (a[i] == num) {
index = i;
break;
}
}
return index;
}
public static void main(String[] args) {
int a[] = null;
int arrySize[] = new int[] { 1000, 5000, 10000, 100000 };
for (int j = arrySize.length - 1; j > -1; j--) {
test(arrySize, j);
}
}
private static void test(int[] arrySize, int j) {
int[] a;
a = new int[arrySize[j]];
for (int i = a.length - 1; i > 0; i--) {
a[i] = i;
}
long l1, l2, l3, l4, l5, l6, l7;
int count1, count2;
count1 = 0;
count2 = 2;
l4 = System.currentTimeMillis();
for (int i = a.length - 1; i > 0; i--) {
l1 = System.currentTimeMillis();
int num = CollectionUtil.dichotomy(i, a);
l2 = System.currentTimeMillis();
l3 = (l2 - l1);
if (l3 > 0) {
// System.out.println("输入要查询的数:"+i+" 返回索引:"+num+" 该索引对应值为:"+a[i]+" 此次二分法查找耗时:"+l3+"毫秒");
count1 = count1 + 1;
}
}
l5 = System.currentTimeMillis();
l6 = l5 - l4;
l4 = System.currentTimeMillis();
for (int i = a.length - 1; i > 0; i--) {
l1 = System.currentTimeMillis();
int num = CollectionUtil.linearity(i, a);
l2 = System.currentTimeMillis();
l3 = (l2 - l1);
if (l3 > 0) {
// System.out.println("输入要查询的数:"+i+" 返回索引:"+num+" 该索引对应值为:"+a[i]+" 此次线性查找耗时:"+l3+"毫秒");
count2 = count2 + 1;
}
}
l5 = System.currentTimeMillis();
l7 = l5 - l4;
System.out.println("元数据共:" + a.length + "条 ; 二分法对比超找次数:" + a.length
+ " 次耗时超过0毫秒次数:" + count1 + "次");
System.out.println("二分法查找对比总共耗时" + l6 + "毫秒");
System.out.println("元数据共:" + a.length + "条 ; 线性对比超找次数:" + a.length
+ " 次耗时超过0毫秒次数:" + count2 + "次");
System.out.println("线性查找对比总共耗时" + l7 + "毫秒");
System.out.println("\n\n");
}
}
元数据共:100000条 ; 二分法对比超找次数:100000 次耗时超过0毫秒次数:0次
二分法查找对比总共耗时46毫秒
元数据共:100000条 ; 线性对比超找次数:100000 次耗时超过0毫秒次数:574次
线性查找对比总共耗时60657毫秒
元数据共:10000条 ; 二分法对比超找次数:10000 次耗时超过0毫秒次数:1次
二分法查找对比总共耗时15毫秒
元数据共:10000条 ; 线性对比超找次数:10000 次耗时超过0毫秒次数:58次
线性查找对比总共耗时875毫秒
元数据共:5000条 ; 二分法对比超找次数:5000 次耗时超过0毫秒次数:0次
二分法查找对比总共耗时0毫秒
元数据共:5000条 ; 线性对比超找次数:5000 次耗时超过0毫秒次数:17次
线性查找对比总共耗时234毫秒
元数据共:1000条 ; 二分法对比超找次数:1000 次耗时超过0毫秒次数:0次
二分法查找对比总共耗时0毫秒
元数据共:1000条 ; 线性对比超找次数:1000 次耗时超过0毫秒次数:3次
线性查找对比总共耗时16毫秒
总结:对于后期系统重构对比查找的地方,要考虑数据源数量大小进行处理。如果数量较小没必要优化算法
分享到:
相关推荐
采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较, 如果当前位置arr[k]值等于key,则查找成功; 若key小于当前位置值arr[k],则在数列的前半段...
线性查找 二分查找算法的mfc代码 1)动态生成自定义大小的数组,并以随机数初始化数组。 2)随机产生查找数据 3)按“开始”菜单演示查找过程,按“结束”菜单结束查找演示过程。 4)在客户区正确显示当前查找情况过程。...
- 当数组规模较大时,相比于线性查找等方法,二分法查找具有更高的效率。 - 在内存访问成本较高的环境中,由于每次只访问一个元素,因此可以减少不必要的内存访问。 #### 算法实现细节 根据提供的代码片段,我们...
在理想情况下,二分查找的时间复杂度为O(log n),这比线性查找(时间复杂度为O(n))要高效得多。 #### 代码解析与扩展 本段代码实现了一个简单的二分查找程序,具体包括以下几个部分: 1. **初始化数组**:首先...
二分法查找是一种在有序数据集中高效定位特定元素的算法,其基本原理是将有序数列对半分隔,通过比较目标值与中间值的关系来确定查找的范围,进而缩小搜索区间,直至找到目标值或判断目标值不存在。在含有n个元素的...
二分法,也称为折半搜索或区间搜索,是一种在有序序列中查找特定元素的搜索算法。它通过不断将搜索范围减半来逼近目标值,适用于解决特定类型的数学问题,如寻找连续函数的零点。在本场景中,我们将探讨如何运用...
二分法查找,又称折半查找,是一种在有序数组中搜索特定元素的高效算法。它利用了数组的线性特性,每次将待搜索区域减半,直到找到目标元素或者确定不存在为止。这种方法大大减少了查找所需的平均时间复杂度,是...
二分法查找,又称折半查找,是一种在有序数组中高效地查找特定元素的搜索算法。这种方法的关键在于利用数组的有序性,通过不断缩小搜索范围来快速定位目标值。在这个C++版本的二分法查找中,我们将深入理解其原理,...
二分法的基本步骤是:取区间的中点,判断中点对应的函数值与零的关系,然后根据零点定理缩小搜索区间至函数值变号的一半,重复此过程直到满足精度要求。二分法的优点是简单稳定,不需计算导数,但收敛速度相对较慢,...
本资料重点探讨的是基本查找算法与二分法查找,这两种方法在不同场景下有着广泛的应用。 首先,让我们从基本查找算法开始。基本查找通常指的是线性查找,即遍历数组或列表的每个元素,逐个比较目标值,直到找到匹配...
在探讨“二分法查找数组”这一主题时,我们深入解析了其算法原理、实现细节以及性能优势。本文将从二分法查找的基本概念出发,逐步解析其在数组中的应用,进而理解为何它能实现高效的查找效率。 ### 二分法查找基本...
二分法的时间复杂度为O(log n),相比于线性查找(时间复杂度为O(n))有着更高的效率。 #### 二、代码解析 ##### 1. 函数 `boolBinarySearch` 分析 该函数实现了基于二分法查找单词的功能,接收三个参数: - `...
有序二分法查找基于分治策略,适用于已排序的线性数据结构,如数组。其基本思想是将搜索区间不断缩小,直到找到目标元素或者搜索区间为空。步骤如下: 1. 计算数组中间索引。 2. 检查中间元素是否为目标值。如果是...
"浅谈二分法查找和原始算法查找的效率对比" 二分法查找和原始算法查找是两种常用的查找算法,它们在查找大规模数据集时的效率对比是非常重要的。今天,我们将对这两种算法进行分析和比较,以了解它们的优缺点和应用...
这个函数的实现可以充分展示二分法查找的优势,尤其是在处理大量数据时,其性能优势尤为明显。 总的来说,通过理解和应用二分法查找,VB.NET开发者可以在处理大数据集时显著提升查找效率,降低计算资源的消耗。这个...
二分法查找的时间复杂度为O(log n),远优于线性查找的O(n)。但要注意,这种方法只适用于静态数据结构,如数组,对于动态数据结构如链表,二分查找并不适用。 在实际应用中,二分查找常用于大型数据集的预处理,如...
将要查找的对象(关键字key)与数组中每个元素逐一比较,如果某一元素值与关键词key相等,则表示查找成功,返回元素的位置;如果没有元素相等,表示查找不成功,就返回-1。 如有一维数组[11,22,43,90,4,90,56,49,-10,...
二分法查找的时间复杂度为O(log n),比线性查找效率高很多。 对于初学者,理解这些基础算法的概念、工作原理以及它们的实现方式至关重要。在实际编程中,熟练运用这些算法能有效提高代码的执行效率。在Java中,你...
首先,**二分法(Bisection Method)** 是一种基于连续函数性质的查找算法,特别适用于求解单变量方程的根。它的基本思想是在已知方程f(x)的一个变号区间内,不断将区间对半划分,直到找到足够接近根的值。MATLAB...
二分法,也称为折半搜索,是一种在有序序列中查找特定元素的搜索算法。它在计算机科学中具有广泛的应用,特别是在数值计算和数据结构中。在这个“erfenfa.rar”压缩包中,我们主要关注的是如何使用二分法来求解非...