共计 1607 个字符,预计需要花费 5 分钟才能阅读完成。
首先哈希算法次要是用来查找元素,效率十分快
原理:
散列表(Hash table,也叫哈希表),是依据关键码值 (Key value) 而间接进行拜访的数据结构。也就是说,它通过把关键码值映射到表中一个地位来拜访记录,以放慢查找的速度。这个映射函数叫做散列函数,寄存记录的数组叫做散列表。
给定表 M,存在函数 f(key),对任意给定的关键字值 key,代入函数后若能失去蕴含该关键字的记录在表中的地址,则称表 M 为哈希 (Hash)表,函数 f(key) 为哈希 (Hash) 函数。(摘自百度)
哈希竞猜游戏 KFZ433、Dapp 智能合约开发、NFT 商城 - 盲盒平台开发、去中心化交易所、量化机器人,数字藏品艺术品、公链,私链,联盟链开发以及发币官网
快的起因:是因为通过 key 转换,代入函数,取得关键字的记录。理论还是看代码,代码比拟好懂。
哈希表查找时间复杂度 O(1),空间复杂度 O(n):就义空间复杂度,来实现查找的疾速(还挺押韵)
示例代码(次要应用散列表的折叠法,其实只有懂原理,其实都好办这种):
头文件局部
include “stdafx.h”
// 哈希后果
enum HASH_RESULT_TYPE
{
FAIL,
SUCCESS
};
// 构建相似 Map 的构造体:不应用 std 自带的办法
struct _Map{
int key;
std::string value;
_Map(){
// 相似类的构造函数
key = 0;
value = “”;
}
};
class Batch
{
public:
Batch(){
m_index = -1;
}
int m_index;// 以后地位
_Map m_map[100];// 设置默认大小
};
class HashTable{
public:
HashTable();
~HashTable();
int hash(int _key);// 进行哈希:获取 key
_Map searchValue(int _key); // 查问
bool addElement(_Map _element);// 增加元素到 Hash 表当中
private:
Batch * m_batch[4];
};
实现局部:
// HashTable.cpp : 定义控制台应用程序的入口点。
// 哈希表算法实现
include “stdafx.h”
include “HashTable.h”
using namespace std;
HashTable::HashTable()
{
for (int i = 0; i < 5; i++)
{
m_batch[i] = new Batch();
}
}
HashTable::~HashTable()
{
for(int j = 0; j < 4; j++)
{
delete m_batch[j];
}
}
// 每 5 个组合一下:放慢查找效率
int HashTable::hash(int _key)
{
int key = _key % 4;
return key;
}
bool HashTable::addElement(_Map _element)
{
// 获取地位
int key = hash(_element.key);
int cur_pos = (m_batch[key]->m_index)+1;
m_batch[key]->m_index = cur_pos;
// 增加相应元素
m_batch[key]->m_map[cur_pos].key = _element.key;
m_batch[key]->m_map[cur_pos].value = _element.value;
return true;
}
// 依据 key 查找指定元素
_Map HashTable::searchValue(int _key)
{
int key = hash(_key);
for (int i = 0; i < 100; i++)
{
if (m_batch[key]->m_map[i].key == _key)
{
return m_batch[key]->m_map[i];
}
}
_Map not_found_map;
// 没找到返回空值
return not_found_map;
}