`

线性对比查找与二分法对比查找性能对比

阅读更多

 

 

 

 

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毫秒

 

 

总结:对于后期系统重构对比查找的地方,要考虑数据源数量大小进行处理。如果数量较小没必要优化算法


分享到:
评论

相关推荐

    非线性方程求根——二分法python

    采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较, 如果当前位置arr[k]值等于key,则查找成功; 若key小于当前位置值arr[k],则在数列的前半段...

    mfc实现二分法和线性查找

    线性查找 二分查找算法的mfc代码 1)动态生成自定义大小的数组,并以随机数初始化数组。 2)随机产生查找数据 3)按“开始”菜单演示查找过程,按“结束”菜单结束查找演示过程。 4)在客户区正确显示当前查找情况过程。...

    二分法解线性方程二分法解线性方程

    二分法,也称为折半搜索或区间搜索,是一种在有序序列中查找特定元素的搜索算法。它通过不断将搜索范围减半来逼近目标值,适用于解决特定类型的数学问题,如寻找连续函数的零点。在本场景中,我们将探讨如何运用...

    改进的二分法查找

    在含有n个元素的有序数组中,二分法查找的平均和最坏情况下的时间复杂度都是O(log n),远优于线性查找的O(n)。 然而,描述中提到,在某些情况下,我们可能知道更多关于有序数列的信息,比如相邻元素之间的最大差值...

    c语言 二分法查找

    - 当数组规模较大时,相比于线性查找等方法,二分法查找具有更高的效率。 - 在内存访问成本较高的环境中,由于每次只访问一个元素,因此可以减少不必要的内存访问。 #### 算法实现细节 根据提供的代码片段,我们...

    二分法数据查找C语言实现

    在理想情况下,二分查找的时间复杂度为O(log n),这比线性查找(时间复杂度为O(n))要高效得多。 #### 代码解析与扩展 本段代码实现了一个简单的二分查找程序,具体包括以下几个部分: 1. **初始化数组**:首先...

    非线性方程求根 二分法 牛顿法 数值计算 计算方法作业

    二分法(也称为折半查找法)是一种简单而有效的数值求解方法,适用于函数在其定义域内连续且单峰的情况。它通过不断将搜索区间对半划分,逐步逼近方程的根。基本步骤包括:选取包含根的初始区间,检查区间的端点函...

    二分法查找

    二分法查找,又称折半查找,是一种在有序数组中搜索特定元素的高效算法。它利用了数组的线性特性,每次将待搜索区域减半,直到找到目标元素或者确定不存在为止。这种方法大大减少了查找所需的平均时间复杂度,是...

    二分法查找(c++版)

    二分法查找,又称折半查找,是一种在有序数组中高效地查找特定元素的搜索算法。这种方法的关键在于利用数组的有序性,通过不断缩小搜索范围来快速定位目标值。在这个C++版本的二分法查找中,我们将深入理解其原理,...

    非线性方程_非线性方程求解_二分法_choosemhz_非线性_

    二分法的基本步骤是:取区间的中点,判断中点对应的函数值与零的关系,然后根据零点定理缩小搜索区间至函数值变号的一半,重复此过程直到满足精度要求。二分法的优点是简单稳定,不需计算导数,但收敛速度相对较慢,...

    二分法与一般的查找算法

    本资料重点探讨的是基本查找算法与二分法查找,这两种方法在不同场景下有着广泛的应用。 首先,让我们从基本查找算法开始。基本查找通常指的是线性查找,即遍历数组或列表的每个元素,逐个比较目标值,直到找到匹配...

    二分法查找数组

    在探讨“二分法查找数组”这一主题时,我们深入解析了其算法原理、实现细节以及性能优势。本文将从二分法查找的基本概念出发,逐步解析其在数组中的应用,进而理解为何它能实现高效的查找效率。 ### 二分法查找基本...

    基于二分法的从词库中查找单词源代码

    二分法的时间复杂度为O(log n),相比于线性查找(时间复杂度为O(n))有着更高的效率。 #### 二、代码解析 ##### 1. 函数 `boolBinarySearch` 分析 该函数实现了基于二分法查找单词的功能,接收三个参数: - `...

    易语言有序二分法查找

    有序二分法查找基于分治策略,适用于已排序的线性数据结构,如数组。其基本思想是将搜索区间不断缩小,直到找到目标元素或者搜索区间为空。步骤如下: 1. 计算数组中间索引。 2. 检查中间元素是否为目标值。如果是...

    浅谈二分法查找和原始算法查找的效率对比

    "浅谈二分法查找和原始算法查找的效率对比" 二分法查找和原始算法查找是两种常用的查找算法,它们在查找大规模数据集时的效率对比是非常重要的。今天,我们将对这两种算法进行分析和比较,以了解它们的优缺点和应用...

    vb.net二分法快速查找海量数据

    这个函数的实现可以充分展示二分法查找的优势,尤其是在处理大量数据时,其性能优势尤为明显。 总的来说,通过理解和应用二分法查找,VB.NET开发者可以在处理大数据集时显著提升查找效率,降低计算资源的消耗。这个...

    二分法检索查找 计算机算法 c/c++语言

    二分法查找的时间复杂度为O(log n),远优于线性查找的O(n)。但要注意,这种方法只适用于静态数据结构,如数组,对于动态数据结构如链表,二分查找并不适用。 在实际应用中,二分查找常用于大型数据集的预处理,如...

    Java程序设计基础:一维数组应用查找线性查找).pptx

    将要查找的对象(关键字key)与数组中每个元素逐一比较,如果某一元素值与关键词key相等,则表示查找成功,返回元素的位置;如果没有元素相等,表示查找不成功,就返回-1。 如有一维数组[11,22,43,90,4,90,56,49,-10,...

    java 冒泡算法和插入法排序,二分法查找

    二分法查找的时间复杂度为O(log n),比线性查找效率高很多。 对于初学者,理解这些基础算法的概念、工作原理以及它们的实现方式至关重要。在实际编程中,熟练运用这些算法能有效提高代码的执行效率。在Java中,你...

    二分法,牛顿法,迭代法matlab解线性方程

    首先,**二分法(Bisection Method)** 是一种基于连续函数性质的查找算法,特别适用于求解单变量方程的根。它的基本思想是在已知方程f(x)的一个变号区间内,不断将区间对半划分,直到找到足够接近根的值。MATLAB...

Global site tag (gtag.js) - Google Analytics