哈希表与散列技术在数据库查找中的应用

需积分: 35 0 下载量 58 浏览量 更新于2024-08-15 收藏 538KB PPT 举报
"哈希表,也被称为散列或散列地址,是一种高效的数据结构,用于快速查找、插入和删除数据。它通过哈希函数H(key)将输入的关键字映射到一个有限的连续地址集上,从而确定数据在表中的存储位置。哈希表的设计目标是提供近似于常数时间复杂度的平均操作性能,这使得它在数据库、缓存和其他需要快速访问数据的应用中极其重要。 在查找技术中,查找表是数据元素的集合,其中元素之间的关系是松散的。查找表可以分为静态和动态两类。静态查找表只支持查询和检索操作,而动态查找表则允许在查找过程中进行插入和删除。关键字是数据元素中用于标识元素的重要部分,可以是数据元素本身或其一个属性值。主关键字是能唯一标识记录的关键字,而次关键字则可能用于识别多个记录。 在哈希表的实现中,选择合适的哈希函数至关重要,因为它决定了数据分布的均匀性。一个好的哈希函数应该能够尽可能地避免冲突,即多个不同的关键字被映射到相同的地址。处理冲突的方法有很多,例如开放寻址法、链地址法、再哈希法等。当冲突发生时,这些方法可以帮助找到下一个可用的存储位置。 数据元素通常包括关键字和其他相关信息,其类型可以是浮点型、整型或字符串型。在C语言中,可以使用`typedef`来定义关键字和数据元素的类型,如`typedef float KeyType;`定义了浮点型关键字,`typedef struct {...} ElemType;`定义了包含关键字和其他数据的数据元素结构体。 为了比较不同类型的关键字,可以使用宏定义,例如对于数值型关键字,`EQ(a, b)`用于检查两个关键字是否相等,`LT(a, b)`和`LQ(a, b)`分别用于判断一个关键字是否小于或大于另一个。对于字符串型关键字,可以使用`strcmp`函数的非零返回值来判断是否相等。 在数据库领域,哈希表常用于索引和快速访问数据,例如在索引创建、查询优化以及缓存管理中。通过理解和有效地利用哈希表,可以显著提升数据库系统的性能。同时,哈希表也是算法设计和数据结构课程中的核心概念,学习和掌握哈希表的原理和应用对于成为专业的IT人士至关重要。"

#include <iostream> #include <ctime> using namespace std; struct userNode { int key; bool sex; int birthday; struct userNode *next = NULL; }; userNode *HashTable[288]; int Hash(int key) { int res = 0; while (key) { res += key % 100; key /= 100; } return res - 10; } userNode *Login(int key) { int afterHash = Hash(key); userNode *p = HashTable[afterHash]; while (p && p->key != key) { p = p->next; } if (p && (p->key == key)) { return p; } else { return NULL; } return NULL; } int Register(userNode *newUser) { int afterHash = Hash(newUser->key); // userNode p = HashTable[afterHash]; // while (p) // { // p = p->next; // } newUser->next = HashTable[afterHash]; HashTable[afterHash] = newUser; return 0; } int main() { userNode nowTmp; int tmp; while (1) { system("cls"); cout << "请输入你的PP号:" << endl; tmp=0; while (tmp<100000 || tmp>999999) { cin >> tmp; } nowTmp = Login(tmp); if (nowTmp) { system("cls"); cout << "-------------------------------------------" << endl << "| 登录成功! |" << endl << "| PP号:" << nowTmp->key << " |" << endl << "| 性别:" << (nowTmp->sex ? "男" : "女") << " |" << endl << "| 生日:" << nowTmp->birthday << " |" << endl << "-------------------------------------------" << endl; system("pause"); } else { // 自动注册 srand(time(0)); nowTmp = new userNode; nowTmp->key=tmp; nowTmp->birthday= 2002 + rand() % 21; nowTmp->birthday=100; nowTmp->birthday+= 1 + rand() % 12; nowTmp->birthday=100; nowTmp->birthday+= 1 + rand() % 28; nowTmp->sex= rand() % 2; Register(nowTmp); cout << "这个PP号还没注册!帮你注册了!请重新登录!" << endl; system("pause"); } } //散列情况展示部分 // int a[288]; // for (int i = 0; i <= 287; i++) // { // a[i]=0; // } // for (int i = 100000; i <= 999999; i++) // { // a[Hash(i)]++; // } // for (int i = 0; i <= 287; i++) // { // cout<<"a["<<i<<"]="<<a[i]<<endl; // } return 0; }写注释

2023-06-08 上传

#include <iostream> #include <ctime> using namespace std; struct userNode { int key; bool sex; int birthday; struct userNode* next = NULL; }; userNode* HashTable[298]; int Hash(int key)//散列函数 { int res = 0; while (key) { res += key % 100; key /= 100; } return res; } userNode* Login(int key)//查找 { int afterHash = Hash(key); userNode* p = HashTable[afterHash]; while (p && p->key != key) { p = p->next; } if (p && (p->key == key)) { return p; } else { return NULL; } return NULL; } int Register(userNode* newUser)//插入 { int afterHash = Hash(newUser->key); userNode* p = HashTable[afterHash]; while (p) { p = p->next; } newUser->next = HashTable[afterHash]; HashTable[afterHash] = newUser; return 0; } int main() { userNode* nowTmp; int tmp; while (1) { system("cls"); cout << "请输入你的PP号:" << endl; tmp = 0; while (tmp < 100000 || tmp>999999) { cin >> tmp; } nowTmp = Login(tmp); if (nowTmp) { system("cls"); cout << "-------------------------------------------" << endl << "| 登录成功! |" << endl << "| qq号:" << nowTmp->key << " |" << endl << "| 性别:" << (nowTmp->sex ? "男" : "女") << " |" << endl << "| 生日:" << nowTmp->birthday << " |" << endl << "-------------------------------------------" << endl; system("pause"); } else { // 自动注册 userNode *p; p->key = tmp; p->birthday = 2002 + rand() % 21; p->birthday *= 100; p->birthday += 1 + rand() % 12; p->birthday *= 100; p->birthday += 1 + rand() % 28; p->sex = rand() % 2; Register(p); cout << "这个PP号还没注册!帮你注册了!请重新登录!" << endl; system("pause"); } } return 0; }逐行注释

2023-05-25 上传