数据结构【查找篇】

news2024/11/27 3:42:17

数据结构【查找篇】


文章目录

  • 数据结构【查找篇】
  • 前言
    • 为什么突然想学算法了?
    • 为什么选择码蹄集作为刷题软件?
  • 目录
    • 一、顺序查找
    • 二、折半查找
    • 三、 二叉排序树的查找
    • 四、红黑树
  • 结语


前言

在这里插入图片描述

为什么突然想学算法了?

> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下竞争压力逐渐增大,无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个寒假巩固速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~

在这里插入图片描述


为什么选择码蹄集作为刷题软件?

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
.
在这里插入图片描述


目录

一、顺序查找

#include<iostream>

using namespace std;
#define Maxsize 100

typedef struct{         //查找表的数据结构(顺序表)
    int *elem;          //动态数组基址
    int Tablelen;       //表的长度
    int MaxSize;        //表的最大长度
}SSTable;

//顺序查找
int Search_Seq(SSTable ST,int key){
    int i;
    for(i=0;i<ST.Tablelen && ST.elem[i]!=key;++i);
    //查找功能,则返回元素下标;查找失败,则返回-1
    return i==ST.Tablelen? -1:i;
}

//顺序查找(哨兵)
int Search_SeqShaoBing(SSTable ST,int key){
    ST.elem[0]=key;                     //哨兵
    int i;
    for(i=ST.Tablelen;ST.elem[i]!=key;--i);//从后往前找
    return i;       //查找成功,则返回元素下标;查找失败,则返回0
}


//初始化顺序表
//基本操作——初始化一个程序表(动态分配)
void InitSSTable(SSTable &ST){
    //用malloc函数申请一片连续的存储空间
    ST.elem =(int*)malloc(Maxsize * sizeof(int));
    ST.Tablelen=0;
    ST.MaxSize=Maxsize;
}

//增加动态数组的长度
void IncreaseSize(SSTable &ST,int len){
    int *p=ST.elem;
    ST.elem=new int(Maxsize+len);
    for(int i=0;i<ST.Tablelen;i++){
        ST.elem[i]=p[i];      //将数据复制到新区域
    }
    ST.MaxSize=ST.MaxSize+len; //顺序表最大长度增加len
    delete p;
}

//在顺序表位置i处插入元素e
bool InsertSSTable(SSTable &ST,int i,int e){
    if(i<1 || i>ST.Tablelen+1) return false;
    if(ST.Tablelen >= ST.MaxSize) return false;
    for(int j=ST.Tablelen;j>i;j--){
        ST.elem[j]=ST.elem[j-1];
    }
    ST.elem[i-1]=e;
    ST.Tablelen++;
    return true;
}


//销毁顺序表
void DeleteSSTable(SSTable &ST){
    free(ST.elem);
    ST.elem = NULL;
    ST.Tablelen = ST.MaxSize = 0;
}

//输出顺序表
void PrintfSSTable(SSTable ST){
    for(int i=0;i<ST.Tablelen;i++)
        cout<<ST.elem[i]<<" ";
    cout<<endl;
}

int main(){
   SSTable ST;
   InitSSTable(ST);

    for(int i=1;i<=10;i++){
        InsertSSTable(ST,i,i);
    }

    PrintfSSTable(ST);

    int i=Search_Seq(ST,5);
    cout<<i<<endl;

    //销毁动态顺序表
    DeleteSSTable(ST);
    cout<<endl;


    return 0;
}

二、折半查找


#include<iostream>

using namespace std;
#define Maxsize 100

typedef struct{         //查找表的数据结构(顺序表)
    int *elem;          //动态数组基址
    int Tablelen;       //表的长度
    int MaxSize;        //表的最大长度
}SSTable;

//折半查找
int Binary_Search(SSTable ST,int key){
    int low=0,high=ST.Tablelen-1,mid;
    while(low<=high){
        mid=(low+high)/2;              //向下取整,取中间位置
        if(ST.elem[mid]==key)
            return mid;              //查找成功则返回所在位置
        else if(ST.elem[mid]>key)
            high = mid-1;            //从前半部分继续查找
        else
            low = mid+1;             //从后半部分继续查找
    }
    return -1;                       //查找失败,返回-1
}

//初始化顺序表
//基本操作——初始化一个程序表(动态分配)
void InitSSTable(SSTable &ST){
    //用malloc函数申请一片连续的存储空间
    ST.elem =(int*)malloc(Maxsize * sizeof(int));
    ST.Tablelen=0;
    ST.MaxSize=Maxsize;
}

//增加动态数组的长度
void IncreaseSize(SSTable &ST,int len){
    int *p=ST.elem;
    ST.elem=new int(Maxsize+len);
    for(int i=0;i<ST.Tablelen;i++){
        ST.elem[i]=p[i];      //将数据复制到新区域
    }
    ST.MaxSize=ST.MaxSize+len; //顺序表最大长度增加len
    delete p;
}

//在顺序表位置i处插入元素e
bool InsertSSTable(SSTable &ST,int i,int e){
    if(i<1 || i>ST.Tablelen+1) return false;
    if(ST.Tablelen >= ST.MaxSize) return false;
    for(int j=ST.Tablelen;j>i;j--){
        ST.elem[j]=ST.elem[j-1];
    }
    ST.elem[i-1]=e;
    ST.Tablelen++;
    return true;
}


//销毁顺序表
void DeleteSSTable(SSTable &ST){
    free(ST.elem);
    ST.elem = NULL;
    ST.Tablelen = ST.MaxSize = 0;
}

//输出顺序表
void PrintfSSTable(SSTable ST){
    for(int i=0;i<ST.Tablelen;i++)
        cout<<ST.elem[i]<<" ";
    cout<<endl;
}

int main(){
    SSTable ST;
    InitSSTable(ST);

    for(int i=1;i<=10;i++){
        InsertSSTable(ST,i,i);
    }

    PrintfSSTable(ST);

    int i=Binary_Search(ST,5);
    cout<<i<<endl;

    //销毁动态顺序表
    DeleteSSTable(ST);
    cout<<endl;


    return 0;
}

三、 二叉排序树的查找

//在二叉排序树中查找值为key的结点
BSTNode *BST_Search(BSTree T,int key){
    while(T!=NULL && key!=T->key){          //若树空或等于根结点值,则结束循环
        if(key<T->key) T=T->lchild;         //小于,则在左子树上查找
        else T=T->rchild;                   //大于,则在右子树上查找
    }
    return T;
} //最坏空间复杂度O(1)

//在二叉排序树中查找值为Key的结点(递归实现)
BSTNode *BSTSearch(BSTree T, int key){
    if(T==NULL)
        return NULL;                        //查找失效
    if(key==T->key)
        return T;                           //查找成功
    else if(key < T->key)
        return BSTSearch(T->lchild,key);    //在左子树中找
    else 
        return BSTSearch(T->rchild,key);    //在右子树中找
} //最坏空间复杂度O(h)

//在二叉排序树插入关键字为k的新结点(递归实现)
int BST_Insert(BSTree &T,int k){
    if(T==NULL){
        T = (BSTree)malloc(sizeof(BSTNode));
        T->key=k;
        T->lchild=T->rchild=NULL;
        return 1;                           //返回1,插入成功
    }
    else if(k==T->key)                      //树中存在相同关键字的结点,插入失败
        return 0;
    else if(k<T->key)                       //插入到T的左子树
        return BST_Insert(T->lchild,k);
    else                                    //插入到T的右子树
        return BST_Insert(T->rchild,k);
}

//按照str[]中的关键字序列建立二叉排序树
void Creat_BST(BSTree &T,int str[],int n){
    T=NULL;                                 //初始时T为空树
    int i=0;
    while(i<n){                             //依次将每个关键字插入到二叉排序树中
        BST_Insert(T,str[i]);
        i++;
    }
}


四、红黑树

struct RBNode{          //红黑树的定义
    int key;            //关键字的值
    RBNode* parent;     //父节点指针
    RBNode* lChild;     //左孩子指针
    RBNode* rChild;     //右孩子指针
    int color;          //结点颜色,如:可用0/1表示黑/红,也可以使用枚举型enum表示颜色
};

结语

感谢大家一直以来的不断支持与鼓励,码题集题库中的进阶塔350题正在逐步更新,之后会逐步跟进星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?

另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~

愿你的结局,配得上你一路的颠沛流离。
在这里插入图片描述

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

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

相关文章

22 闪烁按钮

效果演示 实现了一个按钮的样式&#xff0c;包括背景颜色、边框、圆角、点击效果等。当鼠标悬停在按钮上时&#xff0c;按钮的背景颜色和文字颜色会发生变化&#xff0c;同时按钮会出现闪烁的效果。 Code <button class"btn"><svg height"24" wi…

UDP通信(服务器-客户端)

一、 UDP服务器-客户端通信 UDP&#xff08;User Datagram Protocol&#xff09;是一种面向无连接的传输层协议&#xff0c;它提供了一种简单的、不可靠的数据传输服务。与TCP&#xff08;Transmission Control Protocol&#xff09;不同&#xff0c;UDP不建立连接&#xff0c;…

奈奎斯特定理

奈奎斯特定理是通信领域中重要的理论基础之一&#xff0c;它对于数字通信系统中的信号采样和重构具有至关重要的作用。在数字信号处理和通信技术中&#xff0c;奈奎斯特定理的应用不仅具有理论意义&#xff0c;还对通信系统的设计、优化和性能提升起着重要的指导作用。本文将以…

MySQL8.0主从复制实现及遇到的个人问题

文章目录 1、准备两个服务器或者虚拟机2、主库配置3、从库配置4、配置过程中使用到的命令5、遇到的问题 1、准备两个服务器或者虚拟机 这里使用的VM虚拟机的Centos、MySQL版本是8.0.26、使用FinalShell进行远程操作。 2、主库配置 修改MySQL配置文件(/etc/my.cnf) #启用二进…

leetcode:1464. 数组中两元素的最大乘积(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums&#xff0c;请你选择数组的两个不同下标 i 和 j&#xff0c;使 (nums[i]-1)*(nums[j]-1) 取得最大值。 请你计算并返回该式的最大值。 示例 1&#xff1a; 输入&#xff1a;nums [3,4,5,2] 输出&#xff1a;12 解释&#xff1a;如…

麒麟Kylin服务器版-破解root密码

一、单用户模式修改root密码 1.重启服务器系统后&#xff0c;将光标移动到第二项&#xff0c;按【e】键进入用户登录页面。 2.在【username】下方所在行输入root名称&#xff0c;【password】下方所在行输入密码Kylin123123后&#xff0c;进入编辑模式。代码如下&#xff1a; …

芯课堂 | MCU之TIMER精准延时

引言 华芯微特公司SWM系列单片机提供的TIMER个数和功能有些微差别&#xff0c;为了让您更加简单的使用这一功能&#xff0c;下面小编将以SWM190为例&#xff0c;给大家展示如何使用SWM系列产品的TIMER功能。 TIMER精准延时 一、TIMER简介 TIMER是一种定时器工具&#xff0c;…

C# 全屏label控件实现的贪吃蛇。

C# 全屏label控件实现的贪吃蛇。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using stat…

神经网络:激活函数的介绍

神经网络的激活函数是一种非线性函数&#xff0c;它被应用于每个神经元的输出&#xff0c;以引入非线性性质到网络中。 激活函数的目的是将输入转换为输出&#xff0c;并且将输出限制在特定的范围内。它们非常重要&#xff0c;因为线性变换&#xff08;例如加法和乘法&#xf…

七夕祭

title: 七夕祭 date: 2024-01-03 22:47:05 tags: 传送门 题目大意 解题思路 行的感兴趣的摊点或者列的感兴趣的摊点的数量能被行数或者列数整除&#xff0c;则能够实现要求。“均分”思想&#xff0c;设总感兴趣摊点数 T T T 和行数列数 n n n&#xff0c;当前感兴趣的摊点数…

ansible 配置jspgou商城上线(MySQL版)

准备环境 准备两台纯净的服务器进行&#xff0c;在实验之前我们关闭防火墙和selinux systemctl stop firewalld #关闭防火墙 setenforce 0 #临时关闭selinux hosts解析(两台服务器都要去做) [rootansible-server ~]# vim /etc/hosts 10.31.162.24 ansible-ser…

某和医院招采系统web端数据爬取, 逆向js

目标网址:https://zbcg.sznsyy.cn/homeNotice 测试时间: 2024-01-03 1 老规矩,打开Chrome无痕浏览,打开链接,监测网络,通过刷新以及上下翻页可以猜测出数据的请求是通过接口frontPageAnnouncementList获取的,查看返回可以看出来数据大概率是经过aes加密的,如图: 通过查看该请…

Spark Streaming的DStream与窗口操作

实时数据处理已经成为当今大数据时代的一个重要领域&#xff0c;而Spark Streaming是Apache Spark生态系统中的一个关键模块&#xff0c;用于处理实时数据流。本文将深入探讨Spark Streaming中的DStream&#xff08;离散流&#xff09;概念以及如何使用窗口操作来处理实时数据。…

人工智能如何重塑金融服务业

在体验优先的世界中识别金融服务业中的AI使用场景 人工智能&#xff08;AI&#xff09;作为主要行业的大型组织的重要业务驱动力&#xff0c;持续受到关注。众所周知&#xff0c;传统金融服务业在采用新技术方面相对滞后&#xff0c;一些组织使用的还是上世纪50年代和60年代发…

PostgreSQL荣获DB-Engines 2023年度数据库

数据库流行度排名网站 DB-Engines 2024 年 1 月 2 日发布文章宣称&#xff0c;PostgreSQL 荣获 2023 年度数据库管理系统称号。 PostgreSQL 在过去一年中获得了比其他 417 个产品更多的流行度增长&#xff0c;因此获得了 2023 年度 DBMS。 DB-Engines 通过计算每种数据库 2024 …

java税务信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web税务信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

互联网分布式应用之SpringCloud

SpringCloud Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 微服务项目介绍 2. Eure…

C# halcon 工业产品尺寸测量

产品检测 这段代码是一个基于HalconDotNet的Windows窗体应用程序&#xff0c;主要用于图像处理和测量。以下是对代码的一些总结&#xff1a; 1. **图像显示与加载&#xff1a;** - 使用HalconDotNet库进行图像处理。 - 通过OpenFileDialog实现图像文件的选择和加载。 …

设计模式_结构型模式_装饰器模式

装饰器模式和代理模式很像。 代理模式是已经知道代理谁了&#xff0c;所以只是对委托类的访问权限进行限制&#xff0c;因此用户只需要访问相应的代理类就可以。装饰器模式并不知道要装饰谁&#xff0c;所以需要传入具体的被装饰对象进行功能的添加 目的&#xff1a; 增加现有…

关于设计模式的一点总结

一、GoF 23种设计模式 1.分类 GoF 23种设计模式可分为几类&#xff1a;创建型、结构型和行为型。如下表 分类设计模式创建型单例模式、工厂方法模式、抽象工厂模式、原型模式、建造者模式结构型代理模式、适配器模式、装饰者模式、桥接模式、组合模式、门面模式、享元模式行…