Day_41顺序查找与折半查找

news2024/12/28 4:57:14

目录

一. 顺序查找和折半查找的实现

        1. 顺序查找

        1.1 一般线性表的顺序查找

        1.2 有序表的顺序查找

        2. 折半查找

二. 代码实现

        1. 内部节点        

        2. 类的构造函数

        3. 顺序查找

        4. 折半查找

三. 代码展示

四. 数据测试

五. 小结


一. 顺序查找和折半查找的实现

        1. 顺序查找

        顺序查找又称线性查找,顾名思义我们查找的方式就是挨着一个元素一个元素的查找。顺序查找通常分为堆一般无序线性表的顺序查找和对按关键字有序的顺序查找。

        1.1 一般线性表的顺序查找

        作为一种最直观的查找方法,其基本思想是从线性表的一端开始,逐个检查关键字是否满足给定的条件。若查找到某个元素的关键字满足给定条件,则查找成功,返回该元素在线性表中的位置;若已经查找到表的另一端, 但还没有查找到符合给定条件的元素,则返回查找失败的信息。在这里补充说明其中引入的“哨兵”的作用。

        当我们引入哨兵时,我们从数据的最后一位开始判断,当Data i!=Key时,我们将i的值减1,若有Data i的值等于Key则直接返回(我们一定能得到有一个i的值等于Key,因为我们第0位就是Key的值,这样我们在进行循环的时候不用每次判断i是否越界);若不用哨兵,则我们现在的查找变成了在数据里面寻找Data i的值等于Key,且我们每对一个不同的i进行判断就要判断i是否越界(i<Length)。所以这可以让我们少掉不少判断的语句,提升效率。

带哨兵的查找方式

不带哨兵的查找方式

        除此之外,我们这里谈谈平均查找长度ASL:

        在查找过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度则是所有查找过程中进行关键字的比较次数的平均值,其数学定义为:

        ASL=\sum_{i=1}^{n} P_{i}C_{i}

        式子中,n是查找表的长度;P_{i}是查找第i个数据元素的概率,一般认为每个数据元素的查找概率相等,即P_{i}=\frac{1}{n}C_{i}是找到第i个数据元素所需进行的比较次数。平均查找长度是衡量查找算法效率的最主要的指标。

        1.2 有序表的顺序查找

        若在查找之前就已经知道表是关键字有序的,则查找失败时可以不用再比较到表的另一端就能返回查找失败的信息,从而降低顺序查找失败的平均查找长度。

        假设表L是按关键字从小到大排列的,查找的顺序是从前往后,待查找元素的关键字为key,当查找到第i个元素时,发现第i个元素对应的关键字小于key,但第i+ 1个元素对应的关键字大于key,这时就可返回查找失败的信息,因为第i个元素之后的元素的关键字均大于key,所以表中不存在关键字为key的元素。

        若要搜索45,则从10开始,10不等于45,继续比较20,接着比较30...直到比较到50依然不等于45,于是直接返回False。

        2. 折半查找

        折半查找又称二分查找,它仅适用于有序的顺序表。折半查找的基本思想:首先将给定值key与表中中间位置的元素比较,若相等,则查找成功,返回该元素的存储位置;若不等,则所需查找的元素只能在中间元素以外的前半部分或后半部分(例如,在查找表升序排列时,若给定值key大于中间元素,则所查找的元素只可能在后半部分)。然后在缩小的范围内继续进行同样的查找,如此重复,直到找到为止,或确定表中没有所需要查找的元素,则查找不成功,返回查找失败的信息。

折半查找的判定树
标题

二. 代码实现

        1. 内部节点        

        构建一个内部类,用来存储数据,每一个节点由Key(标签),content(内容)构成,构造函数是传入标签,内容构造一个节点。重写了一个输出函数toString。

    /**
     * An inner class for data nodes. The text book usually use an int value to
     * represent the data. I would like to use a key-value pair instead.
     */
    class DataNode {
        /**
         * The key.
         */
        int key;

        /**
         * The data content.
         */
        String content;

        /**
         * ********************
         * The first constructor.
         * ********************
         */
        DataNode(int paraKey, String paraContent) {
            key = paraKey;
            content = paraContent;
        }// Of the first constructor

        /**
         * ********************
         * Overrides the method claimed in Object, the superclass of any class.
         * ********************
         */
        public String toString() {
            return "(" + key + ", " + content + ") ";
        }// Of toString
    }// Of class DataNode

        2. 类的构造函数

        传入标签数组,内容数组,构造(length=标签数组的长度)length长度的节点(数据数组),每个节点是对应标签数组,内容数组的数据,完成初始化。

    public DataArray(int[] paraKeyArray, String[] paraContentArray) {
        length = paraKeyArray.length;
        data = new DataNode[length];

        for (int i = 0; i < length; i++) {
            data[i] = new DataNode(paraKeyArray[i], paraContentArray[i]);
        } // Of for i
    }// Of the first constructor

        3. 顺序查找

        根据传入标签,从最后一个标签开始查找,若数据数组里面的标签等于传入的标签值paraKey,查找成功输出结果;若一直到哨兵位仍然没有找到结果,查找失败。

    /**
     * ********************
     * Sequential search. Attention: It is assume that the index 0 is NOT used.
     *
     * @param paraKey The given key.
     * @return The content of the key.
     * ********************
     */
    public String sequentialSearch(int paraKey) {
        data[0].key = paraKey;

        int i;
        // Note that we do not judge i >= 0 since data[0].key = paraKey.
        // In this way the runtime is saved about 1/2.
        // This for statement is equivalent to
        //for (i = length - 1; data[i].key != paraKey; i--);
        for (i = length - 1; data[i].key != paraKey; i--) {
            ;
        }//Of for i
        return data[i].content;
    }// Of sequentialSearch

        4. 折半查找

        设置左边界初始化为0,tempLeft = 0;右边界初始化为length-1,tempRight = length - 1;接着当tempLeft≤tempRight的时候,开始循环。当tempMiddle对应的标签等于查找的标签时,查找成功,退出循环。若不等,则判断tempMiddle对应的标签和我们所查找的标签,如果tempMiddle对应的标签≤我们所查找的标签,则修改左边界tempLeft = tempMiddle + 1;同理右边。最终我们得到查找的结果。

    /**
     * ********************
     * Binary search. Attention: It is assume that keys are sorted in ascending
     * order.
     *
     * @param paraKey The given key.
     * @return The content of the key.
     * ********************
     */
    public String binarySearch(int paraKey) {
        int tempLeft = 0;
        int tempRight = length - 1;
        int tempMiddle = (tempLeft + tempRight) / 2;

        while (tempLeft <= tempRight) {
            tempMiddle = (tempLeft + tempRight) / 2;
            if (data[tempMiddle].key == paraKey) {
                return data[tempMiddle].content;
            } else if (data[tempMiddle].key <= paraKey) {
                tempLeft = tempMiddle + 1;
            } else {
                tempRight = tempMiddle - 1;
            }
        } // Of while

        // Not found.
        return "null";
    }// Of binarySearch

三. 代码展示

        主类:

package Day_41;

public class demo1 {
    /**
     *********************
     * The entrance of the program.
     *
     * @param args Not used now.
     *********************
     */
    public static void main(String args[]) {
        System.out.println("\r\n-------sequentialSearchTest-------");
        int []paraKeyArray;
        paraKeyArray=new int[]{1,2,3};
        String[] paraContentArray = new String[]{"121","21","324"};
        DataArray test=new DataArray(paraKeyArray,paraContentArray);
        test.sequentialSearchTest();

        System.out.println("\r\n-------binarySearchTest-------");
        test.binarySearchTest();
    }// Of main

}

        调用类:

package Day_41;
/**
 * Data array for searching and sorting algorithms.
 *
 * @author Jian An 2569222191@qq.com.
 */
public class DataArray {
    /**
     * An inner class for data nodes. The text book usually use an int value to
     * represent the data. I would like to use a key-value pair instead.
     */
    class DataNode {
        /**
         * The key.
         */
        int key;

        /**
         * The data content.
         */
        String content;

        /**
         * ********************
         * The first constructor.
         * ********************
         */
        DataNode(int paraKey, String paraContent) {
            key = paraKey;
            content = paraContent;
        }// Of the first constructor

        /**
         * ********************
         * Overrides the method claimed in Object, the superclass of any class.
         * ********************
         */
        public String toString() {
            return "(" + key + ", " + content + ") ";
        }// Of toString
    }// Of class DataNode

    /**
     * The data array.
     */
    DataNode[] data;

    /**
     * The length of the data array.
     */
    int length;

    /**
     * ********************
     * The first constructor.
     *
     * @param paraKeyArray     The array of the keys.
     * @param paraContentArray The array of contents.
     *                         ********************
     */
    public DataArray(int[] paraKeyArray, String[] paraContentArray) {
        length = paraKeyArray.length;
        data = new DataNode[length];

        for (int i = 0; i < length; i++) {
            data[i] = new DataNode(paraKeyArray[i], paraContentArray[i]);
        } // Of for i
    }// Of the first constructor

    /**
     * ********************
     * Overrides the method claimed in Object, the superclass of any class.
     * ********************
     */
    public String toString() {
        String resultString = "I am a data array with " + length + " items.\r\n";
        for (int i = 0; i < length; i++) {
            resultString += data[i] + " ";
        } // Of for i

        return resultString;
    }// Of toString

    /**
     * ********************
     * Sequential search. Attention: It is assume that the index 0 is NOT used.
     *
     * @param paraKey The given key.
     * @return The content of the key.
     * ********************
     */
    public String sequentialSearch(int paraKey) {
        data[0].key = paraKey;

        int i;
        // Note that we do not judge i >= 0 since data[0].key = paraKey.
        // In this way the runtime is saved about 1/2.
        // This for statement is equivalent to
        //for (i = length - 1; data[i].key != paraKey; i--);
        for (i = length - 1; data[i].key != paraKey; i--) {
            ;
        }//Of for i
        return data[i].content;
    }// Of sequentialSearch

    /**
     * ********************
     * Test the method.
     * ********************
     */
    public static void sequentialSearchTest() {
        int[] tempUnsortedKeys = {-1, 5, 3, 6, 10, 7, 1, 9};
        String[] tempContents = {"null", "if", "then", "else", "switch", "case", "for", "while"};
        DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);

        System.out.println(tempDataArray);

        System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(10));
        System.out.println("Search result of 5 is: " + tempDataArray.sequentialSearch(5));
        System.out.println("Search result of 4 is: " + tempDataArray.sequentialSearch(4));
    }// Of sequentialSearchTest

    /**
     * ********************
     * Binary search. Attention: It is assume that keys are sorted in ascending
     * order.
     *
     * @param paraKey The given key.
     * @return The content of the key.
     * ********************
     */
    public String binarySearch(int paraKey) {
        int tempLeft = 0;
        int tempRight = length - 1;
        int tempMiddle = (tempLeft + tempRight) / 2;

        while (tempLeft <= tempRight) {
            tempMiddle = (tempLeft + tempRight) / 2;
            if (data[tempMiddle].key == paraKey) {
                return data[tempMiddle].content;
            } else if (data[tempMiddle].key <= paraKey) {
                tempLeft = tempMiddle + 1;
            } else {
                tempRight = tempMiddle - 1;
            }
        } // Of while

        // Not found.
        return "null";
    }// Of binarySearch

    /**
     * ********************
     * Test the method.
     * ********************
     */
    public static void binarySearchTest() {
        int[] tempSortedKeys = {1, 3, 5, 6, 7, 9, 10};
        String[] tempContents = {"if", "then", "else", "switch", "case", "for", "while"};
        DataArray tempDataArray = new DataArray(tempSortedKeys, tempContents);

        System.out.println(tempDataArray);

        System.out.println("Search result of 10 is: " + tempDataArray.binarySearch(10));
        System.out.println("Search result of 5 is: " + tempDataArray.binarySearch(5));
        System.out.println("Search result of 4 is: " + tempDataArray.binarySearch(4));
    }// Of binarySearchTest
}// Of class DataArray

四. 数据测试

        运行结果

五. 小结

        这一小节的知识比较简单,但是却十分重要。查找不仅仅运用在顺序存储,还有链式存储等等。顺序查找在这里我们引入了一个哨兵位,可以减少判断的次数,提高效率。折半查找只能应用于有序表,由于每一次查找都可以舍弃一般的查找长度,所以查找的效率较好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python定义错误:什么是Python定义错误

Python定义错误&#xff1a;什么是Python定义错误 Python是一种强大的编程语言&#xff0c;被广泛用于各种领域&#xff0c;例如Web开发&#xff0c;数据分析&#xff0c;机器学习等。然而&#xff0c;即使是最有经验的Python开发人员也会犯一些常见的错误&#xff0c;其中之一…

在线教育机构的视频如何做防下载和防盗录?

在线教育平台付费课程、企业内训的培训课程&#xff0c;这类视频课程内容是如何做防下载和防盗录的&#xff1f; 1.AI隐形溯源水印 这个功能能够将水印隐藏在视频中&#xff0c;不会影响观看体验&#xff0c;但却能够帮助企业很好的视频版权保护。更重要的是&#xff0c;对于盗…

【ArcGIS Pro二次开发】(34):从字符串中提取中文、英文、数字与特殊符号

这是一个基于字段计算的工具。 有时候我们会遇到一些混杂着各种中文、英文、数字、特殊符号的文字&#xff0c;这个工具的目的是从这些复杂文字中提取出想要的特定文字。 比如说从CAD测绘图中可以读取到类似【混3】、【砖2】的文字&#xff0c;如果想要从中提取出层数或结构&…

chatgpt赋能python:Python宏变量——简介

Python宏变量——简介 Python是一种高级编程语言&#xff0c;具有易学易用、简洁清晰等优点。但我们在编写代码的时候&#xff0c;有时需要用到常量或者宏定义&#xff0c;这就需要用到宏变量。在Python中&#xff0c;宏变量是一种常见的编程方法&#xff0c;本文将详细介绍Py…

chatgpt赋能python:Python安装后怎么使用?

Python安装后怎么使用&#xff1f; Python是一种高级编程语言&#xff0c;被广泛用于Web开发、数据分析、人工智能和自动化等领域。下面我们将介绍安装Python后如何使用它。 步骤1 - 安装Python 首先&#xff0c;从官方网站下载并安装Python。在安装过程中&#xff0c;您可以…

chatgpt赋能python:Python中的构造方法是什么?

Python中的构造方法是什么&#xff1f; 当你开始学习 Python 编程时&#xff0c;你可能经常听到 “构造方法” 这个词。那么&#xff0c;什么是构造方法&#xff1f;为什么它在 Python 中很重要&#xff1f;本文将为您揭示构造方法的概念以及它们在 Python 中的作用。 什么是…

案例36:基于Springboot药店管理系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

chatgpt赋能python:Python程序员必知的Geany配置技巧

Python程序员必知的Geany配置技巧 如果你是一名Python程序员&#xff0c;并且正在寻找一个简单易用的代码编辑器&#xff0c;那么Geany是一个非常不错的选择。Geany是一款轻量级的集成开发环境&#xff08;IDE&#xff09;&#xff0c;除了Python&#xff0c;还支持许多其他编…

chatgpt赋能python:Python安装完后如何打开

Python安装完后如何打开 Python是一种高级的、解释性、交互式的编程语言&#xff0c;已经成为了广泛的编程应用领域中不可或缺的一部分&#xff0c;如网络编程、数据科学和人工智能等。Python的安装对于学习、开发和应用Python技术非常重要&#xff0c;但安装了Python后如何打…

案例38:基于Springboot电影评论网站开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

chatgpt赋能python:Python中的Gevent:安装和使用

Python 中的 Gevent: 安装和使用 Gevent 是 Python 生态系统中的一个流行的高性能网络库&#xff0c;它是基于 libev 的 Python 网络库&#xff0c;提供了非阻塞IO、协程和并发编程等方面的特性。Gevent 使得开发高性能的网络应用程序变得简单而易行。本文将介绍如何在 Python…

【Leetcode】78 子集 | 保存遍历路径上的所有节点 // 46 排列 | 使用辅助数组记录元素是否使用

78 子集 与组合问题相比&#xff0c;需要保存路上经过的所有节点。 写法1 分为选择第 i i i个元素和不选择第 i i i个元素两种情况递归。 每push进一个元素&#xff0c;代表进入了一个新的节点&#xff0c;就保存当前的路径。 import java.util.ArrayList; import java.uti…

JUC基础-0606

9.ReentrantReadWriteLock读写锁 9.1 锁的基本概念 悲观锁&#xff1a;不支持并发&#xff0c;效率低&#xff0c;但是可以解决所有并发安全问题 乐观锁&#xff1a;支持并发读&#xff0c;维护一个版本号&#xff0c;写的时候比较版本号进行控制&#xff0c;先提交的版本号…

chatgpt赋能python:Python配置指南:提高SEO效果的关键

Python配置指南&#xff1a;提高SEO效果的关键 Python作为一种高效、易学易用的编程语言&#xff0c;在数据科学、机器学习、网络编程等领域得到了广泛应用。作为一个网站管理员&#xff0c;如何让Python支持的应用程序尽可能地符合搜索引擎优化&#xff08;SEO&#xff09;的…

UI自动化测试之Jenkins配置

团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&#xff0c;但由于各种原因&#xff0c;接口自动化测试那部分功能整个废弃掉了&#xff0c;其中和易用性有很大关系…

chatgpt赋能python:Python安装教程:一步步实现Python开发环境搭建

Python安装教程&#xff1a;一步步实现Python开发环境搭建 Python是一种高效、易读、易维护的编程语言。在人工智能、数据科学、Web开发等领域都有广泛的应用。如果你是一名初学者或Python开发者&#xff0c;本文将为你提供Python安装教程。 第一步&#xff1a;下载Python安装…

深入浅出之Docker Compose详解

目录 1.Docker Compose概述 1.1 Docker Compose 定义 1.2 Docker Compose产生背景 1.3 Docker Compose 核心概念 1.4 Docker Compose 使用步骤 1.5 Docker Compose 常用命令 2. Docker Compose 实战 2.1 Docker Compose下载和卸载 2.2 Docker Compose 项目概述 2.3 Do…

chatgpt赋能python:Python定义局部变量的方法

Python定义局部变量的方法 Python是一种非常流行的编程语言&#xff0c;它被广泛用于各种应用程序开发、数据科学和机器学习任务。在Python中&#xff0c;如何定义局部变量是一个非常基本的概念。本文将重点介绍Python中定义局部变量的方法。 什么是局部变量&#xff1f; 在…

前端小项目基础版本----时刻监听audio音频的声音高低 可视化显示+源码

目录 时刻监听audio音频的声音高低第一代实现:基本第二代实现:完善 时刻监听audio音频的声音高低 前端小项目基础----时刻监听audio音频的声音高低 可视化显示 第一代实现:基本 实现的效果 根据 音频的某时刻高低 调整生成不同的柱状 以下就是 源码 直接复制粘贴 找个音频放…

AIGC技术研究与应用 ---- 下一代人工智能:新范式!新生产力!(2.3-大模型发展历程 之 图像、视频生成与视觉大模型)

文章大纲 GAN 模型与强化学习强化学习生成式对抗网络 ( Generative Adversarial Nets, GAN)VAE扩散模型扩散逆扩散参考文献与学习路径GPT 系列模型解析前序文章模型进化券商研报陆奇演讲强化学习生成模型多模态GAN 模型与强化学习 强化学习 Reinforcement learning (RL) is …