查找算法

二分查找

送分小仙女□ 提交于 2019-12-19 07:46:33
二分查找也叫折半查找,是一种基本的查找算法,这种查找方法需要待查的表满足两个条件 首先,查找表必须使用顺序的存储结构 其次,查找表必须按关键字大小有序排列 算法的基本思想是: 将查找表中间位置数据元素的关键字与给定关键字比较,如果相等则查找成功; 否则利用中间元素将表一分为二,如果中间关键字大于给定关键字,则在前一子表中进行折半查找,否则在后一子表中进行折半查找。重复以上过程直到找到满足条件的元素,则查找成功; 或直到子表为空为止,此时查找不成功。 二分查找的非递归写法: 1 public int firstOccurrence(int [] nums,int target){ 2 int low = 0,high = nums.length - 1; 3 while(low <= high){ 4 int mid = low + (high-low)/2; 5 if(nums[mid] == target){ 6 return mid; 7 } 8 if(nums[mid] < target){ 9 low = mid+1; 10 }else { 11 high = mid-1; 12 } 13 } 14 return -1; 15 } 来源: https://www.cnblogs.com/stevewys/p/11077302.html

经典算法二分查找循环实现Java版

∥☆過路亽.° 提交于 2019-12-19 04:22:18
二分查找 定义 二分查找(Binary Search)又称折半查找,它是一种效率较高的查找方法。 要求 (1)必须采用顺序存储结构 (2)必须按关键字大小有序排列 查找思路 首先将给定值K,与表中中间位置元素的关键字比较,若相等,返回该元素的存储位置;若不等,这所需查找的元素只能在中间数据以外的前半部分或后半部分中。然后在缩小的范围中继续进行同样的查找。如此反复直到找到为止。 适用情况 该查找方法仅适合于线性表的顺序存储结构,不适合链式存储结构,且要求元素按关键字有序排列。 优缺点 虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。 非递归实现代(还有一种用递归实现的二分查找) Java代码如下(自己写的,有兴趣的可以查看Java源码): import java.util.Arrays; public class BinarySearch { public static void main(String[] args) { // 测试代码 int[] arr = { 4, 58, 69, 54, 2, 48, 62, 78 }; //

【操作系统】总结四(文件管理)

偶尔善良 提交于 2019-12-19 02:15:12
文件管理 主要内容: 文件系统基础:包括文件概念、文件的逻辑结构(顺序文件,索引文件,索引顺序文件)、目录结构(文件控制块和索引结点,单级目录结构和两级目录结构,树形目录结构,图形目录结构)、文件共享和文件保护(访问类型,访问控制)。 文件系统实现 :包括文件系统层次结构、目录实现、文件实现。 磁盘组织与管理 :包括磁盘的结构、磁盘调度算法、磁盘的管理。 4.1 文件的概念和定义 文件(File)是操作系统中的一个重要概念。 在系统运行时,计算机以进程为基本单位进行资源的调度和分配;而在用户进行的输入、输出中,则以文件为基本单位 。大多数应用程序的输入都是通过文件来实现的,其输出也都保存在文件中,以便信息的长期存及将来的访问。当用户将文件用于应用程序的输入、输出时,还希望可以访问文件、修改文件和保存文件等,实现对文件的维护管理,这就需要系统提供一个文件管理系统,操作系统中的文件系统(File System)就是用于实现用户的这些管理要求。 从用户的角度看,文件系统是操作系统的重要部分之一。用户关心的是如何命名、分类和查找文件,如何保证文件数据的安全性以及对文件可以进行哪些操作等。而对其中的细节,如文件如何存储在辅存上、如何管理文件辅存区域等关心甚少。 文件系统提供了与二级存储相关的资源的抽象,让用户能在不了解文件的各种属性、文件存储介质的特征以及文件在存储介质上的具体位置等情况下

数据结构-二叉搜索树(BST binary search tree)

醉酒当歌 提交于 2019-12-18 05:51:32
本文由 @呆代待殆 原创,转载请注明出处: http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left、right、parent,分别指向节点的左孩子、右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简单的指向null也可以,本文的代码部分就会这么处理)。 二叉搜索树的性质 1,任意节点x,其左子树中的key不大于x.key,其右子树中的key不小于x.key。 2,不同的二叉搜索树可以代表同一组值的集合。 3,二叉搜索树的基本操作和树的高度成正比,所以如果是一棵 完全二叉树 的话最坏运行时间为 Θ(lg n ) ,但是若是一个n个节点连接成的 线性树 ,那么最坏运行时间是 Θ( n ) 。 4,根节点是唯一一个parent指针指向NIL节点的节点。 5,每一个节点至少包括key、left、right与parent四个属性,构建二叉搜索树时,必须存在针对key的比较算法。 下面给出一张wiki百科上的二叉搜索树的图示 二叉搜索树的操作 二叉搜索树的基本结构(C++) 1 //节点结构

知识点八:二分查找(上)

ⅰ亾dé卋堺 提交于 2019-12-18 02:27:57
前言 二分查找(Binary Search)算法,也叫折半查找算法,是一种非常简单的查找算法,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。 老规矩,我们还是来看一道思考题:假设我们有 1000 万个整数数据,每个数据占 8 个字节,如何设计数据结构和算法,快速判断某个整数是否出现在这 1000 万数据中? 我们希望这个功能不要占用太多的内存空间,最多不要超过 100MB,你会怎么做呢? 二分思想 二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,我们现在来做一个猜字游戏。我随机写一个 0 到 99 之间的数字,然后你来猜我写的是什么。猜的过程中,你每猜一次,我就会告诉你猜的大了还是小了,直到猜中为止。那么如何快速猜中我写的数字呢? 假设我写的数字是 23,你可以按照下面的步骤来试一试(如果猜测范围的数字有偶数个,中间数有两个,就选择较小的那个)。 可以看出,只需要7 次就猜出来了,是不是很快?这个例子用的就是 二分思想 ,按照这个思想,即便我让你猜的是 0 到 999 的数字,最多也只要 10 次就能猜中。不信的话,你可以试一试。 回到实际的开发场景中。假设有 1000 条订单数据,已经按照订单金额从小到大排序,每个订单金额都不同,并且最小单位是元。我们现在想知道是否存在金额等于 19 元的订单。如果存在

查找算法之二分查找

不想你离开。 提交于 2019-12-18 02:18:07
算法原理: 二分查找的前提是有序序列 将序列中位置纪录与关键字比较,若相等,则查找成功 否则用中间位置纪录将表分成前后两个子表 如果关键字大于查找关键字,则进一步找前一子表 否则进一步查找后一子表 重复以上过程,知道找到满足条件的纪录,使得朝朝成功,或知道子表不存在,此时查找不成功‘ 代码: def bin_search ( dat_sret , val ) : low = 0 high = len ( dat_sret ) - 1 while low <= high : mid = ( low + high ) // 2 # 整除 if dat_sret [ mid ] == val : return mid elif dat_sret [ mid ] < val : low = mid + 1 else : high = mid - 1 else : return 代码解释: 代码中 (low + high) // 2 表示 python 的地板除法 也就是整除。 来源: CSDN 作者: sha_ka 链接: https://blog.csdn.net/sha_ka/article/details/103578567

深入Spring IOC源码之ResourceLoader

别等时光非礼了梦想. 提交于 2019-12-17 17:55:17
在《深入Spring IOC 源码之Resource 》中已经详细介绍了Spring 中Resource 的抽象,Resource 接口有很多实现类,我们当然可以使用各自的构造函数创建符合需求的Resource 实例,然而Spring 提供了ResourceLoader 接口用于实现不同的Resource 加载策略,即将不同Resource 实例的创建交给ResourceLoader 来计算。 public interface ResourceLoader { //classpath String CLASSPATH_URL_PREFIX = ResourceUtils. CLASSPATH_URL_PREFIX ; Resource getResource(String location); ClassLoader getClassLoader(); } 在ResourceLoader 接口中,主要定义了一个方法:getResource() ,它通过提供的资源location 参数获取Resource 实例,该实例可以是ClasPathResource 、FileSystemResource 、UrlResource 等,但是该方法返回的Resource 实例并不保证该Resource 一定是存在的,需要调用exists 方法判断。该方法需要支持一下模式的资源加载: 1. URL

【计算机笔记】Java 符号表

感情迁移 提交于 2019-12-17 03:01:31
前言 初级实现 1. 链表实现无序符号表 2. 二分查找实现有序符号表 二叉查找树 1. get() 2. put() 3. 分析 4. floor() 5. rank() 6. min() 7. deleteMin() 8. delete() 9. keys() 10. 分析 2-3 查找树 1. 插入操作 2. 性质 红黑树 1. 左旋转 2. 右旋转 3. 颜色转换 4. 插入 5. 分析 散列表 1. 散列函数 2. 拉链法 3. 线性探测法 小结 1. 符号表算法比较 2. Java 的符号表实现 3. 稀疏向量乘法 前言 符号表(Symbol Table)是一种存储键值对的数据结构,可以支持快速查找操作。 符号表分为有序和无序两种,有序符号表主要指支持 min()、max() 等根据键的大小关系来实现的操作。 有序符号表的键需要实现 Comparable 接口。 public interface UnorderedST < Key , Value > { int size ( ) ; Value get ( Key key ) ; void put ( Key key , Value value ) ; void delete ( Key key ) ; } public interface OrderedST < Key extends Comparable <

查找技术

喜夏-厌秋 提交于 2019-12-16 22:31:57
一、查找的基本概念 1.列表:由同一类型的数据元素组成的集合。 关键码:数据元素中的某个数据项,可以标识列表中的一个或一组数据元素。 键值:关键码的值。 主关键码:可以唯一地标识一个记录的关键码。 次关键码:不能唯一地标识一个记录的关键码。 2.查找 :在具有相同类型的记录构成的集合中找出满足给定条件的记录。 查找的结果 :若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。 3.静态查找 :不涉及插入和删除操作的查找 。 动态查找 :涉及插入和删除操作的查找。 静态查找适用于:查找集合一经生成,便只对其进行查找,而不进行插入和删除操作; 或经过一段时间的查找之后,集中地进行插入和删除等修改操作; 动态查找适用于:查找与插入和删除操作在同一个阶段进行,例如当查找成功时,要删除查找到的记录,当查找不成功时,要插入被查找的记录。 4.查找结构 :面向查找操作的数据结构 ,即查找基于的数据结构。 线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。 树表:适用于动态查找,主要采用二叉排序树的查找技术。 散列表:静态查找和动态查找均适用,主要采用散列技术。 二、线性表的查找技术 1.普通的顺序查找 基本思想: 从线性表的一端向另一端逐个将关键码与给定值进行比较, 若相等,则查找成功,给出该记录在表中的位置; 若整个表检测完仍未找到与给定值相等的关键码

如何查找YUM安装的JAVA_HOME环境变量详解

纵饮孤独 提交于 2019-12-15 22:40:07
如何查找YUM安装的JAVA_HOME环境变量详解 更新时间:2017年10月27日 09:44:56 作者:铁锚 我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOME环境变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 前言 开发中很多需要javac 的程序依赖 JAVA_HOME环境变量. 如果是手工下载源码安装的JDK,很容易知道JAVA_HOME的目录. 例如 ? 1 whereis javac ? 1 javac: /usr/local/jdk1.8.0_74/bin/javac 那么对应的 JAVA_HOME 为 /usr/local/jdk1.8.0_74. 而 YUM 安装的 jdk, 不需要配置 PATH, 因为已经自动使用软连接做好了。 ? 1 2 echo $PATH javac -version 1. YUM安装JDK 1.1 查找 可用的JDK ? 1 sudo yum list -y java* 然后可用看到类似下面这样的输出(省略部分…): ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... Available Packages java- 1.7 . 0 -openjdk.x86