散列函数

散列表

11.3 散列函数

  1. 好的散列函数的特点:一个好的散列函数应满足简单均与假设,每个关键字被等可能的散列到m个槽位中的任何一个,并与其他关键字已散列到哪个槽位无关。
  2. 将关键字转化为自然函数
    • 多数关键字都假定关键字的全域为自然数集N={0,1,2…},如果所给关键字不是自然数,需要找到一种方法来将它们转换为自然数。
    • 一个字符串可以被转换为适当的基数符号表示的整数。如将pt表示为十进制整数对(112,116),然后通过某个基数,进行乘除操作转换为一个很大的数,
  3. 除法散列法
    • 通常取K除以m的余数,将关键字k映射到m个槽中,散列函数为 h(k)=kmodm ,
    • 不要选择 m为2的幂次,通常选择一个不太接近2的整数幂的素数
  4. 乘法散列法
    • 构造乘法散列法的步骤:
      • 第一步,用关键字K乘上常数A(0

练习题解答

11.3-1

  • 查找关键字k,可以利用散列值h(k)找到对应的链表 (这个问题问的很没有水平。不对,应该是我水平不够,没看懂这个问题)

11.3-2

  • 由于以128为基数,如果字符串r很大,那么以128为基数的k值可能会很大,该方法是书中所说的将关键字转换为大自然数,会造成很大的空间消耗。题目意思是进行处理,将大空间消耗减少成固定的空间消耗。所以要计算k mod m,运用除模运算的性质: (a+b)%m=(a%m+b%m)% m, (ab)%m=(a(b%m))%m;参考来源
    代码如下:

     int  hash_string(char a[],int m,int base,int length)
    {
        int res=0;
        int i;
        for(i=0;i<length;i++)
        {
            res+=(a[i]*(base%m))%m;
            res%=m;
        }
        return res;
    }

11.3-3

  • 还是运用(ab)%m=(a(b%m))%m,而 xi(2p)imod(2p1)=xi1(2p)(i1)mod2p1 ,然后逐步递推化解下去。

11.3-4

代码如下:
“`

#include<stdio.h>
#include<math.h>
#define A ((sqrt(5)-1)/2)

int  hash(int key,int m)
{
    double x=key*A;
    int c=(int)key*A;
    return (int)((x-c)*m);
}

int main()
{
    int a[5]={61,62,63,64,65};
    int i;

    for(i=0;i<5;i++)
    printf("%d \t",hash(a[i],1000));
    printf("\n");
    return 0;
}
```

11.3-5

  • 占坑,等会了再来填补

11.3-6

  • 占坑,等会了再来填补

### 散列函数的定义 散列函数是一种将任意长度的输入数据映射为固定长度输出的数学函数[^1]。其主要目的是将输入数据(通常称为键或key)通过某种算法转换为一个固定大小的值,这个值通常被称为散列值、哈希值或哈希码。 ### 散列函数的作用 散列函数的主要作用包括但不限于以下几个方面: - **数据索引**:在数据结构中,如散列表(哈希表),散列函数用于快速定位数据项的位置[^1]。 - **数据完整性验证**:通过计算文件或数据的散列值,可以验证数据是否被篡改[^3]。 - **密码学应用**:在密码学中,散列函数用于生成消息摘要,确保信息传输的安全性[^3]。 ### 散列函数的工作原理 散列函数的工作原理可以分为以下几个关键点: 1. **输入处理**:散列函数接收任意长度的输入数据作为参数。这些输入数据可以是字符串、数字或其他形式的数据。 2. **映射机制**:通过特定的数学运算或逻辑操作,将输入数据转换为一个固定长度的输出值。这一过程需要保证输出值的分布尽可能均匀,以减少冲突的发生[^4]。 3. **输出结果**:最终生成的散列值是一个固定长度的数值,通常表示为整数或十六进制字符串。该值可以用于标识输入数据,或者作为进一步计算的基础[^1]。 以下是一个简单的散列函数实现示例,使用 Python 编写: ```python def simple_hash_function(key, table_size): return sum(ord(c) for c in key) % table_size ``` 在这个例子中,`simple_hash_function` 函数接受两个参数:`key` 是输入的字符串,`table_size` 是散列表的大小。通过计算字符串中每个字符的 ASCII 值之和,并对表大小取模,得到一个散列值。 ### 相关特性与要求 为了保证散列函数的有效性,其设计需要满足以下特性: - **确定性**:对于相同的输入,散列函数必须始终返回相同的输出。 - **高效性**:散列函数的计算过程应该足够快,以支持大规模数据的处理[^1]。 - **均匀分布**:散列值的分布应尽量均匀,以降低冲突的概率。 尽管设计优秀的散列函数可以显著减少冲突的发生,但由于输入数据的无限性和散列值集合的有限性,冲突在理论上是无法完全避免的[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值