今天我们学习两种常用的查找算法:顺序查找和折半查找,废话少说,先上代码,稍后分析:
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,
这样做有什么优势吗?
分享到:
相关推荐
- 这个RAR文件包含了用Java和C语言实现的算法代码,可能是对排序算法、查找算法等经典计算机科学问题的实现。对比不同语言的实现,有助于理解不同语言的特点和算法的本质。 通过阅读这些资料,不仅可以全面掌握...
深入研究JDK源代码,不仅可以帮助我们更好地理解和使用Java提供的各种API,还能让我们学习到优秀的编程实践和设计模式。比如,观察Collections类的静态工厂方法,可以学习如何编写高效且易于使用的工具类;研究...
这包括对Java插件和浏览器的增强,以及对网络通信和加密算法的改进。 **开发者工具** 除了核心的JVM和类库,JDK 8u101还包括了一套强大的开发者工具,如JConsole用于监视和管理Java应用的性能,VisualVM用于诊断和...
- **jdb**:Java调试器,用于查找和修复程序错误。 - **java**:Java解释器,执行.class文件。 - **appletviewer**:用于本地测试Java小应用程序。 - **jconsole**:Java性能监控工具。 - **jvisualvm**:集成...
- **增强的性能**:JDK1.6引入了多项性能优化,例如改进的垃圾回收算法,以减少暂停时间和提高整体效率。 - **NIO.2**:Java 7引入了NIO.2,但在JDK1.6中已有部分实现,提供了一种更灵活的I/O模型,支持异步文件...
**Java Development Kit (JDK) 1.6 64位安装详解** JDK(Java Development Kit)是Oracle公司(原Sun Microsystems)为Java开发者提供的核心工具集...同时,随着技术的发展,不断学习和掌握更新的JDK版本也是必要的。
2. **搜索算法**:包括线性搜索、二分搜索、广度优先搜索(BFS)和深度优先搜索(DFS),以及哈希表在查找问题中的应用,这些都是解决数据检索问题的关键工具。 3. **数据结构**:数据结构是算法的基础,如链表、栈、...
《jdk1.3api中文版.chm》文件是一个Windows帮助文档,通常包含有详细的类库索引、方法说明和示例代码,方便开发者快速查找和学习。尽管这个文档可能无法覆盖所有内容,但它仍然是学习和理解JDK 1.3 API的重要资源。...
3. **Java Debugger (jdb)**:这是一个强大的调试工具,用于查找和修复Java程序中的错误。 4. **Java Archive (jar)**:用于打包和管理Java类文件及资源文件的工具,便于分发和部署。 5. **Java Documentation ...
在1.68版本中,BCryptProv-jdk15on包含了对多种加密算法的支持,如RSA、DSA、ECC等公钥加密算法,以及AES、DES、Blowfish等对称加密算法。此外,还支持哈希函数如SHA-1、SHA-256,消息认证码(MAC)如HMAC,以及数字...
5. **Java调试器(jdb)**:用于调试Java程序,帮助开发者查找和修复代码中的错误,提供了设置断点、单步执行、查看变量值等功能。 6. **Java Archive(JAR)工具**:可以将多个类文件打包成一个.jar文件,便于分发...
MAT分析工具结合了先进的分析算法和直观的用户界面,使得开发者能够深入理解内存消耗情况,从而优化应用程序性能。在这个压缩包中,我们看到包括IBM MAT和JDK8_64位的组件。 JDK8(Java Development Kit 8)是...
11. **安全增强**:JDK 1.6提升了加密算法和证书处理能力,加强了Java代码签名和沙箱模型,提高了应用程序的安全性。 总的来说,JDK 1.6在许多方面都为Java开发者提供了更好的工具和平台,它的特性不仅提高了开发...
- 教学与学习:学习Java基础时,可能会从较早的版本开始,理解其发展历程。 - 老版本库依赖:某些第三方库或框架可能只与特定版本的JDK兼容。 总之,JDK1.6作为Java历史上的一个重要版本,虽然已经不再维护,但在...
- JDK 1.7在安全性和性能上进行了优化,例如加强了加密算法,提高了垃圾回收的效率,减少了内存占用。 - 但随着网络安全的日益重要,更现代的JDK版本会提供更强的安全保障,因此在处理敏感数据时建议使用最新版本...
开发者可以通过API文档查找特定功能的实现,学习如何使用Java库中的类和方法。例如,`java.util`包提供了集合框架,`java.io`包提供了输入/输出流操作,而`javax.swing`包则包含了用于构建图形用户界面的组件。 2. ...
3. **正则表达式**:Java 1.4引入了`java.util.regex`包,支持正则表达式的编译和匹配,方便进行字符串的模式查找、替换和分割。 4. **集合框架的改进**:包括`TreeMap`和`TreeSet`的性能提升,以及`HashMap`和`...
JDK 6,也称为JDK 1.6,是Java平台标准版的一个重要版本,发布于2006年,为开发者提供了大量新特性和改进,如增强的Swing组件、改进的垃圾回收算法、XML处理的提升等。 **绿色免安装版的优势** 1. **便携性**:...
9. **安全增强**:JDK 1.6加强了安全特性,包括证书管理、加密算法的增强以及更严格的权限控制。 10. **调试和诊断工具**:JDK附带的JConsole和VisualVM等工具,帮助开发者更好地监控和调试应用程序,定位性能瓶颈...
了解并正确配置JDK1.7对于Java开发人员至关重要,无论是学习还是实际项目开发,它都是基础且必要的工具。免安装版的出现,无疑为开发者提供了更多灵活性和便利性。在使用过程中,确保正确配置环境变量,能够确保Java...