zoukankan      html  css  js  c++  java
  • 查找算法 分享4:哈希查找

    这个算法比较复杂!

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

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

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

    ## 算法步骤:

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

    输入学生信息:

    按学号查找的结果:

  • 相关阅读:
    SQL*PLUS命令的使用大全
    Oracle总结
    SQL*PLUS命令的使用大全
    Java经典面试题
    学习Java的30个基本概念
    Java经典面试题
    学习Java的30个基本概念
    Oracle总结
    ORACLE大数据量下的分页解决方法
    XAMPP修改80和443端口及创建虚拟目录
  • 原文地址:https://www.cnblogs.com/hanjun/p/2893321.html
Copyright © 2011-2022 走看看