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;
}