8622 哈希查找

**思路:**

  1. 初始化哈希表,长度为 `length`。

  2. 使用哈希函数 `H(k) = 3 * k % length` 计算哈希地址。

  3. 采用线性探测法处理冲突。

  4. 插入关键字序列到哈希表中。

  5. 计算平均查找长度。

**伪代码:**

  1. 初始化哈希表 `H`,长度为 `length`。

  2. 定义哈希函数 `Hash`。

  3. 定义冲突处理函数 `collision`。

  4. 定义查找函数 `SearchHash`。

  5. 定义插入函数 `InsertHash`。

  6. 读取输入的哈希表长度 `length`。

  7. 读取关键字序列,插入哈希表。

  8. 输出哈希表内容。

  9. 计算并输出平均查找长度。

**C++代码:**

复制代码
#include "malloc.h" /* malloc()等 */
#include "stdlib.h" /* exit() */
#include "stdio.h"
#define EQ(a,b) ((a)==(b))
#define SUCCESS 1
#define UNSUCCESS 0
#define NULLKEY -1 /*哈希表无元素时值为-1*/
typedef int ElemType;
int length;
typedef struct {
    ElemType *elem; /* 数据元素存储基址,动态分配数组 */
    int count; /* 当前数据元素个数 */
} HashTable;

void InitHashTable(HashTable *H) {
    int i;
    (*H).count = 0; /* 当前元素个数为0 */
    (*H).elem = (ElemType*)malloc(length * sizeof(ElemType));
    if (!(*H).elem)
        exit(0); /* 存储分配失败 */
    for (i = 0; i < length; i++)
        (*H).elem[i] = NULLKEY; /* 未填记录的标志 */
}

unsigned Hash(ElemType K) {
    return (3 * K) % length;
}

void collision(int *p) {
    *p = (*p + 1) % length; /* 线性探测再散列 */
}

int SearchHash(HashTable H, ElemType K, int *p, int *c) {
    *p = Hash(K); /* 求得哈希地址 */
    while (H.elem[*p] != NULLKEY && !EQ(K, H.elem[*p])) {
        (*c)++;
        if (*c < length)
            collision(p); /* 求得下一探查地址p */
        else
            break;
    }
    if EQ(K, H.elem[*p])
        return SUCCESS; /* 查找成功,p返回待查数据元素位置 */
    else
        return UNSUCCESS; /* 查找不成功(H.elem[p].key==NULLKEY),p返回的是插入位置 */
}

int InsertHash(HashTable *H, ElemType e) {
    int c, p;
    c = 0;
    if (SearchHash(*H, e, &p, &c)) /* 表中已有与e有相同关键字的元素 */
        printf("哈希表中已有元素%d。\n", e);
    else { /* 插入e */
        (*H).elem[p] = e;
        ++(*H).count;
    }
    return c + 1; /*查找长度为冲突次数加1*/
}

void TraverseHash(HashTable H) {
    int i;
    for (i = 0; i < length; i++)
        if (H.elem[i] == NULLKEY) /* 有数据 */
            printf("X ");
        else
            printf("%d ", H.elem[i]);
    printf("\n");
}

int main() {
    float i = 0, j = 0;
    ElemType e;
    HashTable H;
    scanf("%d", &length);
    InitHashTable(&H);
    scanf("%d", &e);
    while (e != -1) {
        j++; /*j记录输入元素个数*/
        i = i + InsertHash(&H, e); /*i记录查找长度的和*/
        scanf("%d", &e);
    }
    TraverseHash(H);
    printf("Average search length=%f\n", i / j);
    return 0;
}

**总结:**

  • 使用哈希函数 `H(k) = 3 * k % length` 计算哈希地址。

  • 采用线性探测法处理冲突。

  • 插入关键字序列到哈希表中,并计算平均查找长度。

相关推荐
靖难都5 分钟前
数据结构:单链表
数据结构
perseveranceX14 分钟前
插入排序:扑克牌式的排序算法!
c语言·数据结构·插入排序·时间复杂度·排序稳定性
2501_9387739920 分钟前
文档搜索引擎搜索模块迭代:从基础检索到智能语义匹配升级
人工智能·算法·搜索引擎
CS创新实验室28 分钟前
典型算法题解:长度最小的子数组
数据结构·c++·算法·考研408
我有一些感想……31 分钟前
浅谈 BSGS(Baby-Step Giant-Step 大步小步)算法
c++·算法·数论·离散对数·bsgs
j_xxx404_33 分钟前
C++ STL:string类(3)|operations|string类模拟实现|附源码
开发语言·c++
麦麦大数据36 分钟前
F042 A星算法课程推荐(A*算法) | 课程知识图谱|课程推荐vue+flask+neo4j B/S架构前后端分离|课程知识图谱构造
vue.js·算法·知识图谱·neo4j·a星算法·路径推荐·课程推荐
贝塔实验室1 小时前
LDPC 码的度分布
线性代数·算法·数学建模·fpga开发·硬件工程·信息与通信·信号处理
快手技术1 小时前
端到端短视频多目标排序机制框架 EMER 详解
算法
Wenhao.1 小时前
LeetCode LRU缓存
算法·leetcode·缓存·golang