数据结构题目-哈希

2023-11-12

目录

A.Hash表-线性探测法解决冲突

B.求3阶B-树的深度

C.输出3阶B-树的构造过程

D.Hash表-链表法解决冲突 


***************************仅作储存代码使用*********************

A.Hash表-线性探测法解决冲突

#include<bits/stdc++.h>
typedef unsigned long long ll;
using namespace std;
 
int main()
{
    int n;
    cin>>n;
    string a[15];
    for(int i=0;i<10;i++)
    a[i]="#";
    while(n--)
    {
        string s;
        cin>>s;
        int len=s.length();
        int num=0;
        for(int i=len-1;i>=len-4;i--)
            num+=int(s[i])-48;
        num=num%10;
        for(int i=0;i<=10;i++)
        {
            if(a[num+i]=="#")
            {
                a[num+i]=s;
                break;
            }
            if(a[num-i]=="#")
            {
                a[num-i]=s;
                break;
            }
        }
    }
    for(int i=0;i<10;i++)
        cout<<a[i]<<endl;
}

B.求3阶B-树的深度

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
 
 
struct BTreeNode{
    int n;
    bool leaf;
    int keys[4];
    BTreeNode* child[4];
    BTreeNode* parent;
    int level;
};
 
BTreeNode* Init(){
    BTreeNode* node=new BTreeNode();
    node->leaf=true;
    node->n=0;
    node->parent=nullptr;
    for(int i=0;i<4;i++)
    {
        node->child[i]=nullptr;
        node->keys[i]=0;
    }
    node->level=0;
    return node;
}
 
struct BTree{
    BTreeNode* root;
    int degree;
};
 
void dfs(const BTreeNode* root)
{
    for(int i=0;i<root->level;i++)
    {
        cout<<"    ";
    }
    for(int i=0;i<root->n;i++)
    {
        cout<<root->keys[i]<<" ";
    }
    cout<<endl;
    if(root->leaf)
    return ;
    for(int i=0;i<root->n;i++)
    {
        root->child[i]->leaf=root->level+1;
        dfs(root->child[i]);
    }
}
 
void print(BTree &b)
{
    dfs(b.root);
}
 
BTreeNode *find(BTreeNode* root,int key)
{
    int i=0;
    for(i=0;i<root->n;i++)
    {
        if(root->keys[i]>=key)
        {
            break;
        }
    }
    if(root->leaf)
    {
        return root;
    }
    else
    {
        return find(root->child[i],key);
    }
}
 
int insert(BTreeNode* &node,int key)
{
    int index=node->n;
    while(index>=1&&node->keys[index-1]>key)
    {
        node->keys[index]=node->keys[index-1];
        node->child[index+1]=node->child[index];
        index--;
    }
    node->keys[index]=key;
    node->n++;
    return index;
}
 
void split(BTree &b,BTreeNode* &node)
{
    BTreeNode* temp=node;
    BTreeNode* node1=Init();
    BTreeNode* node2=Init();
    node1->leaf=node2->leaf=node->leaf;
    node1->n=node2->n=1;
    node1->keys[0]=node->keys[0];
    node1->child[0]=node->child[0];
    node1->child[1]=node->child[1];
    if(node1->child[0]!=nullptr)
    {
        node1->child[0]->parent=node1;
    }
    if(node1->child[1]!=nullptr)
    {
        node1->child[1]->parent=node1;
    }
 
 
    node2->keys[0]=node->keys[2];
    node2->child[0]=node->child[2];
    node2->child[1]=node->child[3];
    if(node2->child[0]!=nullptr)
    {
        node2->child[0]->parent=node2;
    }
    if(node2->child[1]!=nullptr)
    {
        node2->child[1]->parent=node2;
    }
 
    BTreeNode* parent=node->parent;
    if(parent==nullptr)
    {
        parent=Init();
        parent->leaf=false;
        parent->n=1;
        parent->keys[0]=node->keys[1];
        parent->child[0]=node1;
        parent->child[1]=node2;
        node1->parent=node2->parent=parent;
        b.root=parent;
    }
    else
    {
        int index=insert(parent,node->keys[1]);
        parent->child[index]=node1;
        parent->child[index+1]=node2;
        node1->parent=node2->parent=parent;
        if(parent->n==b.degree)
        {
            split(b,parent);
        }
    }
    delete temp;
}
 
void insert(BTree &b,int key)
{
    if(b.root==nullptr)
    {
        b.root=Init();
        b.root->keys[0]=key;
        b.root->n=1;
    }
    else
    {
        BTreeNode* node=find(b.root,key);
        insert(node,key);
        if(node->n==b.degree)
        {
            split(b,node);
        }
    }
}
 
int depth(BTreeNode* root)
{
    if(root->leaf)
    {
        return 1;
    }
    else
    {
        return depth(root->child[0])+1;
    }
}
 
 
int main()
{
    BTree b;
    b.degree=3;
    b.root=nullptr;
    int n;
    cin>>n;
    while(n--)
    {
        int temp;
        cin>>temp;
        insert(b,temp);
    }
    cout<<depth(b.root);
    return 0;
}

C.输出3阶B-树的构造过程

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
 
 
struct BTreeNode{
    int n;
    bool leaf;
    int keys[4];
    BTreeNode* child[4];
    BTreeNode* parent;
    int level;
};
 
BTreeNode* Init(){
    BTreeNode* node=new BTreeNode();
    node->leaf=true;
    node->n=0;
    node->parent=nullptr;
    for(int i=0;i<4;i++)
    {
        node->child[i]=nullptr;
        node->keys[i]=0;
    }
    node->level=0;
    return node;
}
 
struct BTree{
    BTreeNode* root;
    int degree;
};
 
void dfs(const BTreeNode* root)
{
    for(int i=0;i<root->level;i++)
    {
        cout<<"    ";
    }
    for(int i=0;i<root->n;i++)
    {
        cout<<root->keys[i]<<" ";
    }
    cout<<endl;
    if(root->leaf)
    return ;
    for(int i=0;i<root->n+1;i++)
    {
        root->child[i]->level=root->level+1;
        dfs(root->child[i]);
    }
}
 
void print(BTree &b)
{
    dfs(b.root);
}
 
BTreeNode *find(BTreeNode* root,int key)
{
    int i=0;
    for(i=0;i<root->n;i++)
    {
        if(root->keys[i]>=key)
        {
            break;
        }
    }
    if(root->leaf)
    {
        return root;
    }
    else
    {
        return find(root->child[i],key);
    }
}
 
int insert(BTreeNode* &node,int key)
{
    int index=node->n;
    while(index>=1&&node->keys[index-1]>key)
    {
        node->keys[index]=node->keys[index-1];
        node->child[index+1]=node->child[index];
        index--;
    }
    node->keys[index]=key;
    node->n++;
    return index;
}
 
void split(BTree &b,BTreeNode* &node)
{
    BTreeNode* temp=node;
    BTreeNode* node1=Init();
    BTreeNode* node2=Init();
    node1->leaf=node2->leaf=node->leaf;
    node1->n=node2->n=1;
    node1->keys[0]=node->keys[0];
    node1->child[0]=node->child[0];
    node1->child[1]=node->child[1];
    if(node1->child[0]!=nullptr)
    {
        node1->child[0]->parent=node1;
    }
    if(node1->child[1]!=nullptr)
    {
        node1->child[1]->parent=node1;
    }
 
 
    node2->keys[0]=node->keys[2];
    node2->child[0]=node->child[2];
    node2->child[1]=node->child[3];
    if(node2->child[0]!=nullptr)
    {
        node2->child[0]->parent=node2;
    }
    if(node2->child[1]!=nullptr)
    {
        node2->child[1]->parent=node2;
    }
 
    BTreeNode* parent=node->parent;
    if(parent==nullptr)
    {
        parent=Init();
        parent->leaf=false;
        parent->n=1;
        parent->keys[0]=node->keys[1];
        parent->child[0]=node1;
        parent->child[1]=node2;
        node1->parent=node2->parent=parent;
        b.root=parent;
    }
    else
    {
        int index=insert(parent,node->keys[1]);
        parent->child[index]=node1;
        parent->child[index+1]=node2;
        node1->parent=node2->parent=parent;
        if(parent->n==b.degree)
        {
            split(b,parent);
        }
    }
    delete temp;
}
 
void insert(BTree &b,int key)
{
    if(b.root==nullptr)
    {
        b.root=Init();
        b.root->keys[0]=key;
        b.root->n=1;
    }
    else
    {
        BTreeNode* node=find(b.root,key);
        insert(node,key);
        if(node->n==b.degree)
        {
            split(b,node);
        }
    }
}
 
int depth(BTreeNode* root)
{
    if(root->leaf)
    {
        return 1;
    }
    else
    {
        return depth(root->child[0])+1;
    }
}
 
 
int main()
{
    BTree b;
    b.degree=3;
    b.root=nullptr;
    int n;
    cin>>n;
    while(n--)
    {
        int temp;
        cin>>temp;
        cout<<"====insert a key:"<<temp<<endl;
        insert(b,temp);
        print(b);
        cout<<"=================="<<endl;
    }
    return 0;
}

D.Hash表-链表法解决冲突 

#include<bits/stdc++.h>
typedef unsigned long long ll;
using namespace std;
 
int main()
{
    int n;
    cin>>n;
    string a[15];
    for(int i=0;i<10;i++)
    a[i]="#";
    while(n--)
    {
        string s;
        cin>>s;
        int len=s.length();
        int num=0;
        for(int i=len-1;i>=len-4;i--)
            num+=int(s[i])-48;
        num=num%10;
        if(a[num]=="#")
            a[num]=s;
        else
            a[num]=s+" "+a[num];
         
    }
    for(int i=0;i<10;i++)
        cout<<a[i]<<endl;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构题目-哈希 的相关文章

随机推荐

  • Linux提权之内核漏洞提权篇

    前言 在渗透过程中 有时利用某些漏洞可以获取一个低权限的用户 然后想办法提权 提升到root用户权限 从而控制整个系统 在获取到低权限shell后 通常会检查操作系统的发行版本 内核版本 老版本的系统可能会存在一些漏洞 于是我们可以利用这些
  • 点云处理,点云处理算法程序

    点云处理 算法程序代编 top5硕博团队 高质量的服务 基于pcl cgal程序代编 联系方式 q 958417691 或闲鱼id专业点云处理 1 点云分割 单木分割 林下地形提取 DEM制作 等高线制作 地形补洞 2 点云重建 多种方法点
  • H5页面调用扫一扫功能

    想要实现H5页面调用微信扫一扫功能 必须先了解微信JS SDK接口 企业号开发接口文档地址 https qydev weixin qq com wiki index php title E9 A6 96 E9 A1 B5 我们来看下使用的大
  • 将任意一个数解析为2的幂的和的方法

    将任意一个数解析为2的幂的和的方法 递归 规律 如给定 14 2 3 lt 14 lt 2 4 14中必有8 2 3 14 8 6 2 2 lt 6 lt 2 3 6中必有4 2 2 6 4 2 2 2 14 2 3 2 2 2 1 Par
  • 第36.1节 动画-刚体动画控制

    目录 本节功能 具体实现 存放动画 寻找动画 播放 暂停 复位 加速 减速 最后用一个事件响应来联接这一切 所有代码 本节功能 本节后几个章节会介绍和动画有关的课程 本节实现一个从3DMAX导出的地板破碎的动画的控制 这类动画叫做刚体动画
  • python对两个list取交集、并集、和异或

    第一种方法 使用python基本数据结构set集合 优点 集合运算长度可以不一致 运算效率高 缺点 两个进行运算的集合中不能够含有重复的元素 如果含有的话 转成set集合后 会自动去掉重复元素 a 1 2 3 b 1 2 6 9 12
  • MyBatis-Plus&Druid数据源理解

    SpringBoot集成MyBatis Plus 1 1MyBatis Plus简介 MyBatis Plus 简称 MP 是一个 MyBatis 的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 1 12
  • Unity(Input.GetAxis和Input.GetAxisRaw)

    Input GetAxis 描述 数值返回是慢慢向上加的 1 gt 0 3 gt 1 类似于车慢慢加速的过程 Input GetAxisRaw 描述 数值返回是固定的是 1 gt 0 gt 1
  • undo表空间出现问题的几种情况与处理

    undo空间出现问题的处理 一 数据库正常关闭immediate或normal 创建pfile并使用pfile启动数据库 startup nomount create pfile from spfile shutdown abort sta
  • 【python】实现list除以一个数

    文章目录 新建一个list 存放数据 使用numpy np divide list如何除以一个数 有如下两种方法 import random my list random randint 0 100 for x in range 10 pr
  • mysql 页和叶子页_一看就懂的:MySQL数据页以及页分裂机制,别在说不会了

    下面我们就一起看下 究竟什么是MySQL的数据页 数据区等概念 二 数据页长啥样 数据页长下面这样 image png 三 什么是数据区 在MySQL的设定中 同一个表空间内的一组连续的数据页为一个extent 区 默认区的大小为1MB 页
  • MySQL Flashback拯救手抖党

    MySQL Flashback拯救手抖党 2019 06 12 黄子程 黄子程 黄子程 网易游戏资深运维工程师 曾参与多款网易代理游戏产品的运营维护工作 后逐渐转向数据库管理维护领域 目前主要工作方向为网易游戏 Relational DBa
  • unity3d 对大图额外加载

    加载 UI 背景大图 lua 使用 if self findBack image nil then resMgr UnLoadBigImage self findBack image self findBack image nil self
  • 【华为云】E: You don‘t have enough free space in /var/cache/apt/archives/.

    目录 一 购买华为云系统盘空间 二 扩容前的准备 三 扩容 扩大已有MBR分区 起因 使用华为云服务器 在安装Xfce桌面环境时报错 E You don t have enough free space in var cache apt a
  • sql 数据库删除,修改,增加列语句

    ALTER TABLE 添加 修改 删除表的列 约束等表的定义 查看列 desc 表名 修改表名 alter table t book rename to bbb 添加列 alter table 表名 add column 列名 varch
  • [翻译&摘抄]ES6 中的元编程:Symbol

    原文地址 Metaprogramming in ES6 Symbols and why they re awesome 原文作者 Keith Cirkel 译文出自 掘金翻译计划 转自 https juejin im post 5a0e65
  • LM5118 DC-DC电源降压芯片带载能力不够问题

    1 现象 主机系统带载到2A时 系统反复重启 2 分析 示波器测量VCC 5V 稳压源一显示到2A VCC 5V就会掉到0V 把如下二极管断开 万用表测量电流到3 7A就是掉下 3 解决 查规格书可知电流检测电阻的计算 原来为0 03R 按
  • javascript解析XML生成树形结构

    前两天一个朋友去一家公司面试 面试题是用javascript解析一个XML 生成树形结构 今天闲着没事就试了试 源代码
  • Unity自带的相应事件

    Unity自带的相应事件 代码 条件 各个响应事件 鼠标移入移出 鼠标按下 抬起 点击 鼠标拖拽 选择事件接口 系统按键事件的接口 代码 using UnityEngine using UnityEngine EventSystems pu
  • 数据结构题目-哈希

    目录 A Hash表 线性探测法解决冲突 B 求3阶B 树的深度 C 输出3阶B 树的构造过程 D Hash表 链表法解决冲突 仅作储存代码使用 A Hash表 线性探测法解决冲突 include