学习笔记—查找

线性表查找

顺序查找

  存储结构可以是顺序表,也可以是链表。

  逐个比较查询,如果找到,返回数据或者索引,如果没有找到,返回null。

    /**
     * 时间复杂度  T(n) = O(n)
     * 空间复杂度  S(n) = O(1)
     * @param arr 待查找的数组
     * @param num    查找的值
     * @return 如果找到,返回索引;如果未找到,返回-1
     */
    public static int search(int [] arr,int num) {
        int index = -1;
        for(int i = 0; i < arr.length; i ++) {
            if(arr[i] == num) {
                index = i;
                break;
            }
        }
        return index;
    }

 

 

折半查找

   折半查找又称为二分查找。

  这种查找方法查找效率高,但查找表必须满足两个条件:

  (1) 查找表必须采用 顺序存储结构

  (2) 查找表内元素必须按大小有序排列

  不使用递归

    /**
     * 不使用递归的折半查找
     * T(n) = O (logn)
     * S(n) = O (1)
     * @param array 待查找的数组
     * @param key   查找的值
     * @return  如果找到,返回索引;如果未找到,返回-1
     */
    public static int binarySearch(int[] array,int key) {
        // 指定low 和 high
        int low = 0;
        int high = array.length - 1;
        // 折半查找
        while (low <= high) {
            // 求得mid
            int mid = (low + high) / 2;
            // 判断是否等于
            if(key == array[mid]) {
                return mid;
            } else if (key < array[mid]) {
                high = mid -1;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }

 

  使用递归

    /**
     * 使用递归的折半查找
     * T(n) = O (logn)
     * S(n) = O (1*logn)
     * @param array 待查找的数组
     * @param key   查找的值
     * @return  如果找到,返回索引;如果未找到,返回-1
     */
    public static int binarySearch(int [] array,int key) {
        // 指定low 和 high
        int low = 0;
        int high = array.length - 1;
        return binarySearch(array,key,low,high);
    }
    
    public static int binarySearch(int[] array,int key,int low, int high) {
        // 递归结束条件
        if(low > high) {
            return -1;
        }
        int mid = (low + high) / 2;
        if(key == array[mid]) {
            return mid;
        } else if(key < array[mid]) {
            return binarySearch(array,key,low,mid-1);
        } else {
            return binarySearch(array,key,mid+1,high);
        }
    }

 

查找树

 二叉查找/搜索/排序树  BST (binary search/sort tree)

  或者是一棵空树;

  或者是具有下列性质的二叉树:

  (1) 若它的左子树不空,则左子树上所有结点的值均不大于它的根结点的值;

  (2) 若它的右子树不空,则右子树上所有结点的值均不小于它的根结点的值;

  (3) 它的左、右子树也分别为二叉排序树。

  对二叉查找树进行中序遍历,可得到有序集合。

 

二叉平衡树(Self-balancing binary search tree)

  自平衡二叉查找树 又被称为AVL树(有别与ALV算法)

  或者是一棵空树;

  或它的左右两个子树的高度差(平衡因子)的绝对值不超过1,

  并且左右两个子树都是一棵平衡二叉树

  平衡二叉树必定是二叉排序树,反之则不一定。

  

  平衡因子(平衡度)结点的平衡因子是结点的左子树与右子树的高度差。

  

  平衡二叉树的目的是为了减少二叉查找树层次,提高查找速度

  

  平衡二叉树的常用实现方法有AVL、红黑树、替罪羊树、Treap、伸展树等

 

红黑树

  R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它是一种平衡二叉树。红黑树的每个结点上都有存储位表示结点的颜色,可以是红(Red)或黑(Black)。

 

  红黑树的特性:

  (1) 每个结点或者是黑色,或者是红色。

  (2) 根结点是黑色。

  (3) 每个叶子结点(NIL)是黑色。[注意:这里是叶子结点,是指为空(NI或NULL)的叶子结点!]

  (4) 如果一个结点是红色的,则它的子结点必须是黑色的。

  (5) 从一个结点到该结点的子孙结点的所有路径上包含相同数目的黑结点。

  确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

  红黑树的应用比较广泛,主要用它来存储有序的数据,它的时间复杂度是O(log2N),效率非常高。

  它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。

  例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

 

B树(blanced tree)

  与二叉平衡树相比,是多叉的

  可以降低树的深度,提高查找效率

 

  B树应文件系统的要求而发展起来,大量数据存放在外存中,通常存放在硬盘中。

  由于是海量数据,不可能一次调入内存。因此,要多次访问外存。但硬盘的驱动受机械运动的制约,速度慢。

  B-tree作为索引组织文件,提高访问速度、减少时间。

 

B+树

  在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;

  B+树总是到叶子结点才命中;

 

  数据库的索引的默认数据结构就是采用B+树。

 

B*树

  是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针

转载于:https://www.cnblogs.com/shangyang/p/10543384.html

动态链表学习笔记:查找,插入与删除 有了插入的铺垫,删除的原理与之相似,也是输入要删除的数据(p2)的位置,那么我们只需要用查找函数找到该位置结构体的前一位(p1)和后一位(p3),让前一个结构体的地址部分指向它后一个结构体。我们查找的逻辑是:输入了元素的位置后,先判断输入是否合理(这个变量起码要大于0)我们只需要在函数中添加一个循环控制变量,当变量和我们输入的元素位置的变量相等时返回对应的指针。输入要插入数据的位置,输入要插入的数据,将数据插入到输入的位置数据的后面。输入要删除的元素的位置,将该处的数据从链表中删除。 阅读详情

相关推荐

数据结构-查找-树表(二叉排序树)查找-科班学习笔记

数据结构-查找-树表查找-详细学习笔记 本篇为查找的第二篇,相关基础概念参考第一篇 查找1 树表的查找是基于二叉排序树的,先来看看二叉排序树是什么 二叉排序树(Binary sort tree) 又称二叉查找树,也称二叉搜索树,它的特征是 若它的左子树非空,则左子树上所有结点值(指关键字值)均小于根结点值; 若它的右子树非空,则右子树上所有结点值均大于根结点值; 左、右子树本身又各是一棵二叉排序...

JunsIr的技术栈 1064

笔记:查找

常用查找 顺序查找 private static ArrayList<Integer> temp = new ArrayList<>(); public static void sequenceSearch(int[] arr, int value) { if (!temp.isEmpty()) temp.clear(); for (int i = 0; i < arr.length; i++) { if (arr[i] == value)

Bill的世界 182

算法学习笔记【1】——二分查找

算法学习笔记【1】——二分查找

m0_58327172的博客 1375

二分法查找 算法学习笔记

二分法查找 学习笔记 二分法查找,是一种在已经排好顺序的数组中查找特定元素的方法。 这种方法的基本思路如下: 数组a[],所寻找的特定元素x。 1、设3个指针: l:指向数组第一个数。 h:指向数组中间数(h = (l + r) / 2)。 r:指向数组最后的数。 2、将x与a[h]作比较, (1) 若a[h] > x :将r指针向前移到h-1; (2) 若a[h] < x :将l...

weixin_43900761的博客 264

AXI_IIC读写操作

其实在之前调试过一次AXI_IIC,没调试通,碍于赶进度,就直接使用了zynq-PS侧的IIC,就一直搁置着了,这次抽空将这部分内容继续调试下去,这一次没花多少时间就调通了,现在将我的调试过程,经历,以及参考文档如下: 参考文档:pg090-axi-iic.pdf 参考链接:https://forums.xilinx.com/t5/Design-and-Debug-Techniques-Blog/IIC-Protocol-and-Programming-Sequence/ba-p/1072248 上面的这个

qq_32134427的博客 1万+

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置)

本文详细介绍了如何通过部署开源元搜索引擎SearXNG,为本地运行的OpenWebUI大语言模型(如Qwen、Llama)配置联网搜索功能,解决其知识库过时的问题。文章重点讲解了SearXNG的Docker部署、集成国内搜索引擎(如百度、360)的配置方法,以及如何与OpenWebUI无缝对接,从而实现本地大模型获取实时、准确的中文信息,提升其实用性。

weixin_28835583的博客 1876

【JavaSE】数组、排序、查找学习笔记

排序是将一群数据,依指定的顺序进行排列的过程。这里只简单介绍一下排序,更多排序方法见算法部分排序的分类:内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。

qq_24052051的博客 896

Cobalt Strike4.0安装包(内附中文版)

1.什么是 Cobalt Strike Cobalt Strike 是一个为对手模拟和红队行动而设计的平台,主要用于执行有目标的攻击和模拟高级威胁 者的后渗透行动。 Cobalt Strike已经不再使用MSF而是作为单独的平台使用,它分为客户端与服务端,服务端是一个,客户端可以有多个,可被团队进行分布式协团操作。集成了端口转发、扫描多模式端口Listener、Windows exe程序生成、W...

梦之序章的博客 2万+

快速查找算法学习笔记(Java)

快速查找学习记录

dastatham的博客 520

LVGL高效加载外部Flash图片资源的实现与优化

本文深入探讨了在嵌入式UI开发中,如何为LVGL高效加载外部Flash中的图片资源。针对内部Flash容量不足的痛点,详细解析了LVGL的图片处理原理,并对比了内存映射与流式解码两种主流实现方案。文章重点提供了性能优化技巧与实战避坑指南,旨在帮助开发者实现流畅的图片加载体验,解决SPI Flash读取慢、内存占用高等核心挑战。

t1u2v的博客 462

【影像组学入门百问】1#---#3

理论上讲三大主流平台Windows, Linux和MacOS均可进行影像组学研究。根据笔者实际经验,如果内存不足可能导致软件罢工,其余显示、GPU等均非必要。显示:最小分辨率为1024×768(推荐为1280×1024或更好)。Slicer中的许多计算都是多线程的,并且将受益于多核,多CPU配置。计算机需要足够的内存和图形功能将原始数据和处理结果保存在其内存中。如涉及深度学习等方法的研究需根据实际需求配置电脑,无法一概而论。接口设备:推荐使用带滚轮的三键鼠标。内存:超过4GB(推荐8G以上)。

weixin_38594676的博客 1484

二分查找学习笔记(二):正整数和负整数的最大计数,咒语和药水的成功对数,H 指数 II

ps:笔记内容按本人理解整理,重思路

学习记录 826

Simulink开发项1000例实战专栏--实例148:构建一个完整的电动汽车电池SOH评估仿真模型,包括电池建模模块、数据采集模块、SOH估算算法模块以及性能评估模块

电动汽车的动力电池是其核心部件,而电池的健康状态(State of Health, SOH)直接影响车辆的续航能力和使用寿命。SOH通常定义为当前电池容量与初始容量的比值,用百分比表示。通过基于MATLAB/Simulink平台的SOH评估仿真,可以实时监测电池的退化情况,并为电池管理系统(BMS)提供决策依据。本项目旨在构建一个完整的电动汽车电池SOH评估仿真模型,包括电池建模模块、数据采集模块、SOH估算算法模块以及性能评估模块,并通过仿真验证SOH评估的准确性。

xiaoheshang_123的博客 342

STL学习笔记-查找算法

pejoypan的博客 228

2022年灌溉试验设计与数据分析考试试题

2.表2数据为表层0~10cm的原状土离心机土壤水分特征曲线试验数据,(1)请利用R语言nls函数通过Van Genuchten方程对土壤体积含水率和土壤基质势进行拟合;(3)指明土壤基值势为-33 kPa和-1500kPa时的体积含水率。1.请根据表1数据,以灌溉模式为主区,生物炭用量为子区,利用R语言agricolae包生成裂区试验设计试验处理布置图;3.以R工具包factoextra中decathlon2数据集前10列为数据进行PCA分析,要求计算出(1)前5个主成分的特征值、特征向量;

Mrrunsen的博客 266

ICM20948 DMP代码详解(54)

ICM20948 DMP代码详解(54)

phmatthaus的专栏 424

【学习笔记】Mastering CMake (十)—— 查找包

学习笔记,随时更新。如有谬误,欢迎指正。说明:红色字体。

cxsydzn的博客 1271

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数据结构学习笔记-查找

声明:本博客仅为本人学习途中做的笔记 采自青岛大学王卓老师的视频教学 主要内容为算法思路,具体代码实现还需修改后才能运行,望各位看官多多包涵,您的点赞与评论是对我最大的肯定! 1.查找的基本概念 在哪里找? \qquad\qquad\qquad——查找表 查找表是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。 什么是查找? \qquad\qquad\qquad——根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(.

qq_53548177的博客 569

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

二分查找学习笔记

二分查找

2302_80636518的博客 280

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据结构学习笔记五:二叉查找树

数据结构学习笔记五:二叉查找树 二叉查找树简介 二叉查找树(Binary Search Tree),又被称为二叉搜索树。 它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。那么,这棵树...

ccystewart的博客 205

408数据结构学习笔记——顺序查找、折半查找、分块查找

1.顺序查找 2.折半查找 3.分块查找 4.王道课后题

JiangNan_1002的博客 1万+

Go核心开发学习笔记(十九) —— 冒泡排序,顺序查找,二分查找

冒泡排序 重点,众多面试都考察冒泡排序 冒泡排序的基本思想:通过对 待排序序列从后向前(从下标大的元素开始),一次比较相邻的元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向。 因为排序过程中,各元素不断接近自己位置,如果一趟下来没有进行交换,说明序列有序,因此优化时 要在排序过程中设置一个标志flag判断元素是否进行交换,从而减少不必要的比较。 冒泡排序详细分解剖析 首先要...

weixin_41047549的博客 204

【学习笔记】二叉查找树(BST)的实现

前两天想看下红黑树,结果发现基础的二叉查找树都快忘的差不多了,就大概回顾了一下。重写了下代码。 二叉查找树,作为平衡二叉树的基础,每个节点最多有两个孩子,因为不会对自身进行平衡维护,所以容易退化成链表。 创建 //创建节点 void createNode(BSTree **node) { *node = (BSTree *)malloc(sizeof(BSTree)); (*node)-

许嵩奇 690

数据结构与算法学习笔记3|数组二分查找和双指针算法

也叫折半查找算法、对数查找算法,是一种用于在有序数组中查找特定元素的高效搜索算法。每一次查找,排除掉一定不存在目标元素的区间,在剩下可能存在目标元素的区间中继续查找。给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(log n)的算法。

weixin_45037748的博客 1554

查找 学习笔记

查找结构:线性表,树表,散列表 性能: 设计到重要的相关概念:平均查找长度ASL 一、线性表的查找技术 1.顺序查找 从线性表的一段到另一端比较关键码,从而查找出相应的数据 可通过设置哨兵,来提高查找速度,不需要每趟都判断是否发生数组越界。 一般将哨兵放置于数组最开头的元素,将关键码即需查找的值赋给哨兵。 代码实现: int LineSearch :: SeqSearch(int k) { ...

dat_stick的博客 632

查找学习笔记

1、二分查找 二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0 。 1.1 O(logn) 惊人的查找速度 public int bsearch(int[] a, int value) { int low = 0; int high = a.length; wh...

JUN_LLLL的博客 231
上一篇: 学习笔记--图
下一篇: 学习笔记——快速排序
dinglin1237
博客等级 码龄10年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值