`
masterzs
  • 浏览: 17403 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDK学习之查找算法

阅读更多

今天我们学习两种常用的查找算法:顺序查找和折半查找,废话少说,先上代码,稍后分析:

 

1.下边是两种查找算法,其中第二种取自JDK源码:

 

    顺序查找

 

public static int sequentialSearch(int[] arrays, int key) {
		//声明返回的数组下标
		int index = -1;
		//声明查找标志位,提高查找速度
		boolean found = false;
		
		for (int i = 0; (i < arrays.length) & !found; i++) {
			if (arrays[i] == key) {
				found = true;
				index = i;

			}

		}

		return index;

	}

 

   折半查找,取自JDK中Arrays.binarySearch(int[] a, int key) :

 

	 public static int binarySearch(int[] a, int key) {
		                //声明数组的最小值和最大值
			int low = 0;
			int high = a.length-1;			
			
			while (low <= high) {
		                    //去low与high和中间值的index,将数值赋给midVal
			    int mid = (low + high) >> 1;
			    int midVal = a[mid];
		                    //用midVal跟key比较大小,如果小于key,则将mid+1赋给low,如果大于key,则将
		             //mid-1赋给high,否则就直接返回mid(等于key)
			    if (midVal < key)
				low = mid + 1;
			    else if (midVal > key)
				high = mid - 1;
			    else
				return mid; // key found
			}
			return -(low + 1);  // key not found.
		    }

 

2.典型应用:

 

同样,直接上代码:

public class ArraysTest {

	public static int sequentialSearch(int[] arrays, int key) {
		//声明返回的数组下标
		int index = -1;
		//声明查找标志位,提高查找速度
		boolean found = false;
		
		for (int i = 0; (i < arrays.length) & !found; i++) {
			if (arrays[i] == key) {
				found = true;
				index = i;

			}

		}

		return index;  // key not found.;

	}
	
	
	public static void main(String[] args) {

		int[] compartorIntArray = new int[3];
		compartorIntArray[0] = 1;
		compartorIntArray[1] = 2;
		compartorIntArray[2] = 3;
		System.out.println(ArraysTest.sequentialSearch(compartorIntArray, 3));
		System.out.println(ArraysTest.sequentialSearch(compartorIntArray, 8));
		System.out.println(Arrays.binarySearch(compartorIntArray, 3));
		System.out.println(Arrays.binarySearch(compartorIntArray, 8));
	}

}

 

执行结果:

 

2
-1
2
-4

 

3.总结

我们从上边可以看到,顺序查找的最小查找时间为O(1),最大查找时间为O(n),平均时间复杂度为((n+1)/2)

这里我们要注意,折半查找,必须应用在有序数组并且不是线性链表,无序数组,执行前需要预先进行排序,

平均时间复杂度近似为log(2)[n+1] -1,要比顺序查找的((n+1)/2)高效得多。

 

备注:很多程序员对于时间复杂度和空间复杂度的概念不是很了解,我学习的时候也查看了很多书籍,这里我建议

大家不要对其过度钻研,尤其是做企业开发的程序员,最好能大概记住每个算法的时间复杂度,可以在实际应用中

进行合理的选择,如果真的需要研究,建议先复习一下高等数学。 

 

这里还有一个疑问,为什么JDK中的折半查找,最后返回值是 -(low +1)呢,如果是没查到任何值,我可以直接返回 常量 -1,

这样做有什么优势吗?

 

5
5
分享到:
评论
1 楼 snowolf 2010-04-13  
引用
我们从上边可以看到,顺序查找的最小查找时间为O(1),最大查找时间为O(n),平均时间复杂度为((n+1)/2)

这里我们要注意,折半查找,必须应用在有序数组并且不是线性链表,无序数组,执行前需要预先进行排序,

平均时间复杂度近似为log(2)[n+1] -1,要比顺序查找的((n+1)/2)高效得多。

呵呵,还可以继续举例论证修改时的时空复杂度~~,继续关注!

相关推荐

    JavaJDK6学习笔记(林信良著)

    - 这个RAR文件包含了用Java和C语言实现的算法代码,可能是对排序算法、查找算法等经典计算机科学问题的实现。对比不同语言的实现,有助于理解不同语言的特点和算法的本质。 通过阅读这些资料,不仅可以全面掌握...

    jdk源代码src.zip

    深入研究JDK源代码,不仅可以帮助我们更好地理解和使用Java提供的各种API,还能让我们学习到优秀的编程实践和设计模式。比如,观察Collections类的静态工厂方法,可以学习如何编写高效且易于使用的工具类;研究...

    JDK8u101 windows 64

    这包括对Java插件和浏览器的增强,以及对网络通信和加密算法的改进。 **开发者工具** 除了核心的JVM和类库,JDK 8u101还包括了一套强大的开发者工具,如JConsole用于监视和管理Java应用的性能,VisualVM用于诊断和...

    jdk1.7免安装版本

    - **jdb**:Java调试器,用于查找和修复程序错误。 - **java**:Java解释器,执行.class文件。 - **appletviewer**:用于本地测试Java小应用程序。 - **jconsole**:Java性能监控工具。 - **jvisualvm**:集成...

    JDK1.6 X64

    - **增强的性能**:JDK1.6引入了多项性能优化,例如改进的垃圾回收算法,以减少暂停时间和提高整体效率。 - **NIO.2**:Java 7引入了NIO.2,但在JDK1.6中已有部分实现,提供了一种更灵活的I/O模型,支持异步文件...

    jdk 1.6 64位安装包+安装过程

    **Java Development Kit (JDK) 1.6 64位安装详解** JDK(Java Development Kit)是Oracle公司(原Sun Microsystems)为Java开发者提供的核心工具集...同时,随着技术的发展,不断学习和掌握更新的JDK版本也是必要的。

    算法(第四版)

    2. **搜索算法**:包括线性搜索、二分搜索、广度优先搜索(BFS)和深度优先搜索(DFS),以及哈希表在查找问题中的应用,这些都是解决数据检索问题的关键工具。 3. **数据结构**:数据结构是算法的基础,如链表、栈、...

    jdk 1.3 api 中文版

    《jdk1.3api中文版.chm》文件是一个Windows帮助文档,通常包含有详细的类库索引、方法说明和示例代码,方便开发者快速查找和学习。尽管这个文档可能无法覆盖所有内容,但它仍然是学习和理解JDK 1.3 API的重要资源。...

    最新版windows jdk-11.0.16_windows-x64_bin.zip

    3. **Java Debugger (jdb)**:这是一个强大的调试工具,用于查找和修复Java程序中的错误。 4. **Java Archive (jar)**:用于打包和管理Java类文件及资源文件的工具,便于分发和部署。 5. **Java Documentation ...

    java jdk 8 64位

    5. **Java调试器(jdb)**:用于调试Java程序,帮助开发者查找和修复代码中的错误,提供了设置断点、单步执行、查看变量值等功能。 6. **Java Archive(JAR)工具**:可以将多个类文件打包成一个.jar文件,便于分发...

    jdk版本1.6

    11. **安全增强**:JDK 1.6提升了加密算法和证书处理能力,加强了Java代码签名和沙箱模型,提高了应用程序的安全性。 总的来说,JDK 1.6在许多方面都为Java开发者提供了更好的工具和平台,它的特性不仅提高了开发...

    IBM MAT分析工具+JDK8_64位

    MAT分析工具结合了先进的分析算法和直观的用户界面,使得开发者能够深入理解内存消耗情况,从而优化应用程序性能。在这个压缩包中,我们看到包括IBM MAT和JDK8_64位的组件。 JDK8(Java Development Kit 8)是...

    bcprov-jdk15on-1.68.jar中文-英文对照文档.zip

    在1.68版本中,BCryptProv-jdk15on包含了对多种加密算法的支持,如RSA、DSA、ECC等公钥加密算法,以及AES、DES、Blowfish等对称加密算法。此外,还支持哈希函数如SHA-1、SHA-256,消息认证码(MAC)如HMAC,以及数字...

    jdk1.6-64位免安装

    - 教学与学习:学习Java基础时,可能会从较早的版本开始,理解其发展历程。 - 老版本库依赖:某些第三方库或框架可能只与特定版本的JDK兼容。 总之,JDK1.6作为Java历史上的一个重要版本,虽然已经不再维护,但在...

    jdk1.7 exe文件 1.7

    - JDK 1.7在安全性和性能上进行了优化,例如加强了加密算法,提高了垃圾回收的效率,减少了内存占用。 - 但随着网络安全的日益重要,更现代的JDK版本会提供更强的安全保障,因此在处理敏感数据时建议使用最新版本...

    jdk-6-doc英文官方完整.zip

    开发者可以通过API文档查找特定功能的实现,学习如何使用Java库中的类和方法。例如,`java.util`包提供了集合框架,`java.io`包提供了输入/输出流操作,而`javax.swing`包则包含了用于构建图形用户界面的组件。 2. ...

    java 开发工具 jdk 1.4 免安装版

    3. **正则表达式**:Java 1.4引入了`java.util.regex`包,支持正则表达式的编译和匹配,方便进行字符串的模式查找、替换和分割。 4. **集合框架的改进**:包括`TreeMap`和`TreeSet`的性能提升,以及`HashMap`和`...

    jdk6绿色免安装版

    JDK 6,也称为JDK 1.6,是Java平台标准版的一个重要版本,发布于2006年,为开发者提供了大量新特性和改进,如增强的Swing组件、改进的垃圾回收算法、XML处理的提升等。 **绿色免安装版的优势** 1. **便携性**:...

    jdk1.6.0_45免安装版

    9. **安全增强**:JDK 1.6加强了安全特性,包括证书管理、加密算法的增强以及更严格的权限控制。 10. **调试和诊断工具**:JDK附带的JConsole和VisualVM等工具,帮助开发者更好地监控和调试应用程序,定位性能瓶颈...

    jdk1.7(免安装)

    了解并正确配置JDK1.7对于Java开发人员至关重要,无论是学习还是实际项目开发,它都是基础且必要的工具。免安装版的出现,无疑为开发者提供了更多灵活性和便利性。在使用过程中,确保正确配置环境变量,能够确保Java...

Global site tag (gtag.js) - Google Analytics