【数据结构与算法13】查找(续)

3.树表的查找

1.平衡二叉树的定义


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.平衡调整方法1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四种类型的调整

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.散列表的查找

散列表的基本概念

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
采用散列技术将记录存储在一块连续的存储空间,这块存储空间称为散列表或者哈希表

在这里插入图片描述

散列函数的构造方法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

处理冲突的方法

在这里插入图片描述

(1)开放定址法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)链地址法(拉链法)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

散列表的查找

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include "vector"
#define NULLKEY -32768
using namespace std;
#include "windows.h"

class HashTable
{
public:
    //构造函数
    HashTable(int n);
    //析构函数
    ~HashTable();
    //插入关键字进散列表
    void InsertHash(int key);
    //查找关键字
    int SearchHash(int key);
    //显示散列表
    void showHash();

private:
    //散列函数
    int Hash(int key);
    //数据元素
    vector<int> elem;
    //当前数据元素的个数
    int count;
    //散列表的长度
    int m;
};

HashTable::HashTable(int n=30):count(0),m(n) {
    for (int i = 0;i<n;i++)
    {
        elem.push_back(NULLKEY);
    }
}
HashTable::~HashTable() {

}

int HashTable::Hash(int key) {
    return key%m;//除留余数法
}

void HashTable::InsertHash(int key) {
    int address = Hash(key);//求散列地址
    while (elem[address] != NULLKEY){//如果不为空,则冲突
        address = (address+1) % m;//线性探测法
    }
    elem[address] = key;
    count++;
}

int HashTable::SearchHash(int key) {
    int address = Hash(key);
    while (elem[address] != key){
        address = (address + 1)%m;
        //如果循环回到原点,则代表关键字不存在
        if (elem[address] == NULLKEY || Hash(key) == address)
        {
            return -1;
        }
    }
    return address;
}

void HashTable::showHash() {
    for (int i=0;i<m;i++){
        cout << elem[i] << " " ;
    }
    cout << endl;
}
int main() {
    SetConsoleOutputCP(CP_UTF8);
    int n,e,val;
    vector<int> vec;
    cout<<"输入数据元素的个数:"<<endl;
    cin >> n;
    cout<<"输入数据元素:"<<endl;
    for (int i = 0;i<n; i++){
        cin>>e;
        vec.push_back(e);
    }
    HashTable H(n);
    for (int i = 0;i<n; i++){
        H.InsertHash(vec[i]);
    }
    H.showHash();
    cout<<"要查找的元素:"<<endl;
    cin>>val;
    e = H.SearchHash(val);
    cout<<e <<endl;
    if(e == -1)
    {
        cout<<"查找失败"<<endl;
    }
    else{
        cout<<"散列表下标:"<<e <<endl;
    }

    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姬霓钛美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值