Gavin.han

致力于移动开发 技术改变生活
随笔 - 133, 文章 - 0, 评论 - 46, 阅读 - 42万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

查找算法 分享4:哈希查找

Posted on   gavin.han  阅读(2349)  评论(0编辑  收藏  举报

这个算法比较复杂!

 

 关键字:构造哈希函数,按地址查找。

 

#  哈希查找是使用给定数据构造哈希表,然后在哈希表上进行查找的一种算法。先给定一个值,然后根据哈希函数求得哈希地址,再根据哈希地址查找到要找的元素。

#  哈希查找是通过数据元素的存储地址进行查找的一种算法。

## 算法步骤:

  (1)用给定的哈希函数构造哈希表。

  (2)根据选择的冲突处理方法解决地址冲突。

  (3)在哈希表的基础上执行哈希查找。

以下代码是:根据提示输入学生信息,然后输入查找学生的学号,如果有的话,输出学生姓名和位置,如果没有的话,提示没有该学生的信息。

复制代码
View Code
#import <Foundation/Foundation.h>
#define MAX 20

typedef struct
{
    int num;
    char name[20];
} ElemType;   //定义查找的节点元素

typedef struct
{
    ElemType *elem;
    int count;
    int sizeindex;
} HashTable;   //定义哈希表

int hash(int num)  //定义哈希函数
{
    int p;
    p = num % 5;
    return p;
}

void InitHash(HashTable *H)
{
    int i;
    H -> elem = (ElemType *)malloc(MAX * sizeof(ElemType));
    H -> count = 0;
    H -> sizeindex = MAX;
    for (int i = 0; i < MAX; i++) {
        H -> elem[i].num = 0;           //初始化,使hashSearch()函数能判断到底有没有元素在里面
    }
}

int hashSearch(HashTable H, int key, int *p)
{
    int c = 0;
    *p = hash(key);
    while (H.elem[*p].num!=key && H.elem[*p].num!=0) {  //通过二次探测再散列解决冲突
        c = c + 1;
        if (c%2 == 1) {
            *p = *p + (c+1)*(c+1)/4;
        }
        else
        {
            *p = *p - (c*c)/4;
        }
    }
    if (H.elem[*p].num == key) {
        return 1;
    }
    else
    {
        return 0;
    }
}

void insertHash(HashTable *H, ElemType e) //如果查找不到就插入元素
{
    int p;
    hashSearch(*H, e.num, &p);
    H -> elem[p] = e;
    ++H -> count;
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        HashTable H;
        int p, key;
        ElemType e;
        InitHash(&H);
        for (int i = 0; i < 3; i++)
        {
            loop:printf("请输入第%d个学生的学号\n", i+1);
            scanf("%d", &e.num);
            
            if (!hashSearch(H, e.num, &p)) {
                printf("输入第%d个学生名字\n", i+1);
                scanf("%s", e.name);
                insertHash(&H, e);
            }
            else
            {
                printf("该学号已经存在");
                goto loop;
            }
            
        }
        
        printf("请输入您要查找的学生学号:\n");
        scanf("%d", &key);
        if (hashSearch(H, key, &p)) {
            printf("查找成功!学生的姓名是%s\n",H.elem[p].name);
            printf("学生所在表中的位置是%d\n", p);
        }
        else
        {
            printf("您要查找的学生不存在!\n");
        }
        
    }
    return 0;
}
复制代码

输入学生信息:

按学号查找的结果:

 

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示