算法:静态查找表

news2024/11/25 11:49:32

查找表(Search table)是由同一类型的数据元素(或记录)构成的集合。关键字(key)是数据元素中某个数据项的值,又称为键值,用它可以表示一个数据元素,也可以标识一个记录的数据项(字段),称之为关键码。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字(primary key)。而对于那些可以识别多个数据元素(或记录)的关键字,称为次关键字(Secondary Key),次关键字也可以理解为不以唯一标识一个数据元素(或记录)的关键字,它对应的数据项就是次关键码。

查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

查找表按照操作方式来分有两大种:静态查找表和动态查找表。

静态查找表(Static Search Table) :只作查找操作的查找表,主要操作为:

(1)查询某个“特定的”数据元素是否在查找表中。

(2)检索某个“特定的”数据元素和各种属性。

动态查找表(Dynamic Search Table):在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。

(1)查找时插入数据元素。

(2)查找时删除数据元素。

本文先来说说静态查找表。

一、顺序表查找

顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表中的一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值都比较不相等时,则表中没有所查的记录,查找不成功。

二、有序表查找

1、折半查找

折半查找(Binary Search)技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

2、插值查找

插值查找(Interpolation Search)是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式 (key-a[low])/(a[high]-a[low]) 。

3、斐波那契查找

斐波那契查找(Fibonacci Search)算法的核心在于

1)当key = a[mid] 时,查找就成功;

2)当key < a[mid] 时,新范围是第low 个到第mid - 1个,此时范围个数为F[k-1]-1个。

3)当key > a[mid] 时,新范围是第m+1 个到第high个,此时范围个数为F[k-2]-1个。

如图8-4-13所示。

示例代码如下:(改编自《大话数据结构》)

#include<iostream>
using namespace std;

#define INFINITLY 65535
#define MAXSIZE 100

int F[100]; /* 斐波那契数列 */

/* 无哨兵顺序查找,arr为数组,n为要查找的数组个数,key为要查找的关键字 */
/* 返回元素的位置pos (下标+1)*/
int Sequential_Search(int *arr, int n, int key)
{
    for (int i = 0; i < n; i++)
        if (arr[i] == key)
            return i + 1;
    return INFINITLY; //返回无穷说明失败
}

/* 有哨兵顺序查找 */
/* 返回元素的位置pos (下标+1)*/
int Sequential_Search2(int *arr, int n, int key)
{
    arr[n] = key;
    int i = 0;
    while (arr[i] != key)
        i++;
    return i + 1; //返回n+1 则说明失败
}
/* 折半查找 */
/* 返回元素的下标 */
int Binary_Search(int *arr, int n, int key)
{
    int low = 0;/* 定义最低下标为记录首位 */
    int high = n - 1;/* 定义最高下标为记录末位 */
    int mid;
    while (low <= high)
    {
        mid = (low + high ) / 2;/* 折半 */
        if (key < arr[mid])/* 若查找值比中值小 */
            high = mid - 1;/* 最高下标调整到中位下标小一位 */
        else if (key > arr[mid])/* 若查找值比中值大 */
            low = mid + 1;/* 最低下标调整到中位下标大一位 */
        else
            return mid;/* 若相等则说明mid即为查找到的位置 */
    }
    return INFINITLY;
}
/* 插值查找 */
int Interpolation_Search(int *arr, int n, int key)
{
    int low = 0;
    int high = n - 1;
    int mid;
    while (low < high)
    {
        /* 插值公式 */
        mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]);
        if (key < arr[mid])
            high = mid - 1;
        else if (key > arr[mid])
            low = mid + 1;
        else
            return mid;
    }
    return INFINITLY;
}

/* 斐波那契查找 */
int Fibonacci_Search(int *arr, int n, int key)
{
    int low = 0;/* 定义最低下标为记录首位 */
    int high = n - 1;/* 定义最高下标为记录末位 */
    int i, k = 0;
    int mid;

    while (n > F[k] - 1)
        k++;
    for (i = n - 1; i < F[k] - 1; i++)
        arr[i] = arr[n - 1];

    while (low <= high)
    {
        mid = low + F[k - 1] - 1;
        if (key < arr[mid])
        {
            high = mid - 1;
            k = k - 1;
        }
        else if (key > arr[mid])
        {
            low = mid + 1;
            k = k - 2;
        }
        else
        {
            if (mid <= n - 1)
                return mid;
            else
                return INFINITLY;
        }
    }

    return INFINITLY;
}

int main(void)
{
    int arr[MAXSIZE] = {1, 16, 24, 35, 47, 59, 62, 73, 88, 99};
    int result = Sequential_Search(arr, 10, 24);
    if (result != INFINITLY)
        cout << "24 's pos : " << result << endl;

    result = Sequential_Search2(arr, 10, 59);
    if (result != sizeof(arr) / sizeof(arr[0]))
        cout << "59 's pos : " << result << endl;

    result = Binary_Search(arr, 10, 73);
    if (result != INFINITLY)
        cout << "73 's pos : " << result + 1 << endl;

    result = Interpolation_Search(arr, 10, 16);
    if (result != INFINITLY)
        cout << "16 's pos : " << result + 1 << endl;

    F[0] = 0;
    F[1] = 1;
    for(int i = 2; i < 100; i++)
    {
        F[i] = F[i - 1] + F[i - 2];
    }

    result = Fibonacci_Search(arr, 10, 88);
    if (result != INFINITLY)
        cout << "88 's pos : " << result + 1 << endl;

    return 0;
}

复制

输出为:

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

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

相关文章

当深度学习撞上高性能计算,科研仿佛坐上了加速器

今天深度学习无处不在&#xff0c;当你打开移动终端的时候&#xff0c;各种APP会推荐到你喜欢的食物、你喜欢的电影&#xff0c;你关注的新闻热点。在生活中更是改变着我们&#xff0c;今天的智能语音让语言障碍破除&#xff0c;在预测疾病基因大数据领域预测疾病来确定药物治疗…

2023年大学生就业怎么样?双一流高校就业率仅15%,到底是咋了?

2023年&#xff0c;大学毕业生就业状况如何&#xff0c;一直是社会关注的焦点。尤其是中国的双一流高校&#xff0c;以其优越的教学与研究背景和实力&#xff0c;被众多年轻人视为就业的理想选择。 然而&#xff0c;在最新的统计数据中&#xff0c;这些一流高校的就业率却惊人…

欧科云链OKLink全新推出Onchain AML服务 助力新金融合规健康发展

据香港大公报报道&#xff0c;为期两天的全球高端经济峰会2023格林威治经济论坛(GreenwichEconomicForum&#xff0c;下称GEF论坛)于6月15日在香港交易所举办&#xff0c;欧科云链控股有限公司&#xff08;下称“欧科云链”&#xff0c;股票代码&#xff1a;01499.HK&#xff0…

【北邮国院大三下】Logistics and Supply Chain Management 物流与供应链管理 Week4

北邮国院大三电商在读&#xff0c;随课程进行整理知识点。仅整理PPT中相对重要的知识点&#xff0c;内容驳杂并不做期末突击复习用。个人认为相对不重要的细小的知识点不列在其中。如有错误请指出。转载请注明出处&#xff0c;祝您学习愉快。 如需要pdf格式的文件请私信联系或…

VALSE 2023 无锡线下参会个人总结 6月12日-3

VALSE2023 无锡线下参会个人总结 6月12日-3 6月12日会议日程安排Workshop&#xff1a;多模态大模型与提示学习左旺孟&#xff1a;预训练模型和语言增强的零样本视觉学习余宙&#xff1a;知识增强的多模态预训练和提示学习王云鹤&#xff1a;多模态交织&#xff1a;高效模型架构…

STM32中断设置以及中断优先级设置-不含代码例程

本项目使用到的是STM32F030C8型号的MCU&#xff0c;我们可以从官方下载到的标准库文件中的启动汇编文件中&#xff0c;查看到本型号单片机的外部中断向量表。&#xff08;如下图所示&#xff09; 首先&#xff0c;我们了解一下NVIC是什么&#xff0c;在core_cm0.h文件中的标准库…

海川润泽“巧克力”DTU强势来袭

1、设备介绍 “巧克力”DTU(型号&#xff1a;HCRZ-DTU200)&#xff0c;它可以实现远程通信、安全传输等功能&#xff0c;提高了传输的效率和可靠性。采用全新工业级设计&#xff0c;灵活应用于不同场景。此款DTU体积小(76mm31mm21.8mm)、重量轻(150g)&#xff0c;安装简便&…

「任务派发」上线,高效管理跨平台营销任务

作为企业矩阵号相关业务的负责人&#xff0c;您在工作中是否遇到&#xff1a; 下达一个营销任务&#xff0c;需要在几十上百个群里沟通对接&#xff1f;任务发布后&#xff0c;无法掌握各运营者执行情况&#xff1f;账号数据难回收&#xff0c;无法检验任务完成效果&#xff1…

阿里云携手开放原子开源基金会倡议发起云原生工作委员会,两大开源项目达成捐赠意向

6月11日&#xff0c;2023开放原子全球开源峰会正式拉开帷幕。本届峰会以“开源赋能&#xff0c;普惠未来”为主题&#xff0c;设置了开幕式暨高峰论坛、20余场分论坛和开源成果及重点项目展览。在峰会主论坛&#xff0c;开放原子开源基金会理事长孙文龙协各家单位共同倡议发起云…

抖音加码自营电商,拿什么做出差异化?

今年618期间&#xff0c;抖音电商可谓是花尽了心思。不仅推出了补贴活动&#xff0c;上架了单品超值购、商城频道主题日、搜索彩蛋等玩法&#xff0c;而且在售后方面&#xff0c;还推出了“安心购”服务&#xff0c;可提供“七天无理由退货”“极速退款”“运费险”“过敏包退”…

关于QTreeView使用自定义Tree Model时,插入子项目时,扩展箭头不显示的问题

在使用自定义的TreeModel显示数据时&#xff0c;添加子项目后&#xff0c;扩展箭头不显示&#xff0c;但是点击原来扩展箭头在的地方时&#xff0c;树仍能够展开添加的子项目。 经过研究发现&#xff0c;QTreeView有以下代码&#xff1a; 说明如果调用的beginInserRows中的par…

Apikit 自学日记: 如何创建/生成 API 文档

在 API 研发管理产品中&#xff0c;几乎所有的协作工作都是围绕着 API 文档进行的。 我们在接触了大量的客户后发现&#xff0c;采用 文档驱动 的协作模式会比先开发、后维护文档的方式更好&#xff0c;团队协作效率和产品质量都能得到提高。因此我们建议您尝试基于文档来进行工…

vite预渲染 vite-plugin-prerender 大坑记录

本文部分配置转自&#xff1a;vite预渲染怎么实现_猿耳盗铃的博客-CSDN博客 懒得重新写&#xff0c;贴下版本和自己踩的各种坑吧 以下为版本&#xff0c;本文只给vite vue3的建议&#xff0c;不一定适用&#xff0c;因为正常情况能build成功&#xff0c;我昨天中午之前一直没…

JUC高级-0614

5.LockSupport与线程中断 5.1 线程中断 蚂蚁金服面试题&#xff1a;如何中等一个线程&#xff0c;如何停止一个线程什么是中断机制 首先&#xff1a;一个线程不应该由其他线程来强制中断或停止&#xff0c;而是应该由线程自己自行停止。所以&#xff0c;Thread.stop, Thread.…

不用编程超简单的自动化测试工具:Airtest入门篇教程

目录 一、背景 二、什么是Airtest 三、Airtest下载安装 四、Airtest入门使用教程 4.1 连接设备&#xff1a; 4.2 具体测试场景案例&#xff1a; 五、总结 一、背景 很多刚入行或从其他行业转行做测试的同学&#xff0c;日复一日每天做点工已经点得疲惫和麻木&#xff…

数仓架构“瘦身”,Hologres 5000CU时免费试用

Hologres基于创新的HSAP架构&#xff0c;可以将您原先数仓架构中的OLAP系统&#xff08;Greenplum、Presto、Impala、ClickHouse&#xff09;、KV数据库/Serving系统&#xff08;HBase、Redis&#xff09;统一在一个大数据计算引擎中&#xff0c;并提供快速的离线实时一体化分析…

企业如何搭建公司的宿舍管理系统?让数字化改变新的管理方式

什么是企业宿舍管理系统 企业宿舍管理系统是一种用于管理企业宿舍的软件。它可以帮助企业更好地管理公司的宿舍&#xff0c;包括员工选房、入住登记、租金管理、公共设施预订等。该系统通常使用计算机和互联网技术&#xff0c;以便更高效地处理和记录与宿舍相关的活动和任务。…

【Nginx】Ubuntu23.04 安装Nginx

Ubuntu23.04 安装Nginx 1.官方文档2.命令补充 1.官方文档 ❤️ 根据Nginx官方文档在Ubuntu23.04版本上安装Nginx&#xff0c;直接跟随步骤复制命令即可。 → Nginx官方Ubunt安装文档 如图&#xff1a; 这里复制了一份&#xff0c;并翻译了&#xff1a; 安装必备组件&#xff1…

【剑指offer专项突破版】哈希表篇——“C“

文章目录 前言一、插入、删除和随机访问都是 O(1) 的容器题目分析思路分析代码 二、最近最少使用缓存题目分析思路分析代码 三、有效的变位词题目分析代码 四、变位词组题目分析思路分析代码 五、外星语言是否排序题目分析思路分析代码 六、最小时间差题目分析思路分析代码①—…

与行业协会共同探索创新前景:B端企业如何拓展品牌与业务增长

B端营销中行业协会是一个非常重要的渠道和抓手&#xff0c;因为这基本上是由企业产品的目标客户组成&#xff0c;但如何利用好行业协会&#xff0c;并低成本的拓展业务需要结合自身业务特点进行规划设计。 Oliver Du 一、行业协会的运作机制与权利结构 行业协会是由行业内的企…