算法导论Java实现-二分查找(习题2.3-5)

简介:

 

 
  1. package lhz.algorithm.chapter.two; 
  2.  
  3. /** 
  4.  * 二分查找,《算法导论》,习题2.3-5 
  5.  *   Referring back to the searching problem (see Exercise 2.1-3), observe that if 
  6.  * the sequence A is sorted, we can check the midpoint of the sequence against v 
  7.  * and eliminate half of the sequence from further consideration. Binary search 
  8.  * is an algorithm that repeats this procedure, halving the size of the 
  9.  * remaining portion of the sequence each time. Write pseudocode, either 
  10.  * iterative or recursive, for binary search. Argue that the worst-case running 
  11.  * time of binary search is Θ(lg n). 
  12.  * 附:习题2.1-3 
  13.  *  Consider the searching problem:  
  14.  * • Input: A sequence of n numbers A = a1, a2, . . . , an and a value v.  
  15.  * • Output: An index i such that v = A[i] or the special value NIL if v does not appear in A.  
  16.  * Write pseudocode for linear search, which scans through the sequence, looking for v.  
  17.  * Using a loop invariant, prove that your algorithm is correct. Make sure that your loop 
  18.  * invariant fulfills the three necessary properties. 
  19.  * 本文地址:http://mushiqianmeng.blog.51cto.com/3970029/731203
  20.  * @author lihzh(苦逼coder) 
  21.  */ 
  22. public class BinarySearch { 
  23.      
  24.     public static void main(String[] args) { 
  25.         //根据题意,给定一个已经排好序的数组 
  26.         int[] input = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13}; 
  27.         //给定查找目标 
  28.         int target = 6
  29.         //初始从0到数组最后以后一位为范围 
  30.         String result = binarySearch(input,target,0,input.length-1); 
  31.         //打印输出 
  32.         System.out.println(result); 
  33.     } 
  34.      
  35.     /** 
  36.      * 二分查找 
  37.      * @param input 给定已排序的待查数组 
  38.      * @param target 查找目标 
  39.      * @param from 当前查找的范围起点 
  40.      * @param to 当前查找的返回终点 
  41.      * @return 返回目标在数组中的索引位置。如果不在数组中返回:NIL 
  42.      */ 
  43.     private static String binarySearch(int[] input, int target, int from, int to) { 
  44.         int range = to - from; 
  45.         //如果范围大于0,即存在两个以上的元素,则继续拆分 
  46.         if (range > 0) { 
  47.             //选定中间位 
  48.             int mid = (to + from) / 2
  49.             //先判断两个二分的临界位 
  50.             if (input[mid] == target) { 
  51.                 return String.valueOf(mid); 
  52.             } 
  53.             //如果临界位不满足,则继续二分查找 
  54.             if (input[mid] > target) { 
  55.                 return binarySearch(input,target,from,mid-1); 
  56.             } else { 
  57.                 return binarySearch(input,target,mid+1,to); 
  58.             } 
  59.         } else { 
  60.             if (input[from] == target) { 
  61.                 return String.valueOf(from); 
  62.             } else { 
  63.                 return "NIL"
  64.             } 
  65.         } 
  66.         /* 
  67.          * 复杂度分析: 
  68.          * 在最坏情况下,一共要进行lgn次二分,可以确定最后结果。而每次二分中只进行二分和值的比较 
  69.          * 等时间为常量的操作。因此,二分查找的时间复杂度为:Θ(lg n) 
  70.          * 公式表示如下: 
  71.          * 设数组长度是n的时候,时间为T(n),则如果拆分成n/2长度的数组的时候,需要的时间为T(n/2),切 
  72.          * 无需合并,拆分需要时间为c,为常量。所以T(n)=T(n/2)+c,T(n/2)=T(n/4)+c... 
  73.          * 所以,T(n)=c+c+c+...,攻击lgn个c。所以时间复杂副为:Θ(lg n) 
  74.          */ 
  75.     } 
  76.  

 

     本文转自mushiqianmeng 51CTO博客,原文链接:http://blog.51cto.com/mushiqianmeng/731203,如需转载请自行联系原作者


相关文章
|
10月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
10月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
493 0
|
6月前
|
存储 算法 搜索推荐
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
专攻软考高频算法,深度解析二分查找、堆排序、快速排序核心技巧,对比九大排序算法,配套动画与真题,7天掌握45%分值模块。
293 1
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
|
5月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
1154 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
算法 Java 索引
算法系列之搜素算法-二分查找
二分查找是一种在`有序`数组中查找特定元素的算法。它的基本思想是通过将数组分成两半,逐步缩小查找范围,直到找到目标元素或确定目标元素不存在。
233 9
算法系列之搜素算法-二分查找
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
621 3
|
算法 索引
【算法】——二分查找合集
二分查找基础模版和进阶模版,查找元素位置,搜索插入位置,x的平方根,山脉数组的峰顶索引,寻找峰值,点名
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明