• 散列:散列函数与散列表(hash table)


    1. 散列函数

    如果输入的关键字是整数,则一般合理方法是直接返回对表大小取模(Key mod TableSize)的结果,除非 Key 碰巧具有一些不太理想的特质。如,表的大小为 10,而关键字都是 10 的倍数,显然此时都会被散列在 0 的位置。

    为了避免上述情况的发生,好的方法是保证表的大小是素数(除了 1 和自身没有其他的因子)。当输入的关键字是随机整数时,散列函数不仅算起来简单而且关键字的分配也相对均匀。

    考虑,关键字是字符串的情况:

    typedef unsigned int Index;
    
    Index hash(const char *key, int tableSize){
        unsigned int hashVal = 0;
        while (*key != '')
            hashVal += *key++;
        return hashVal % tableSize;
    }

    上述的散列函数实现起来简单而且能很快地算出答案。不过,如果表很大,则函数将不会很好地分配关键字。例如,TableSize = 10007(10007 是素数),并设所有的关键字至多 8 个字符长。char 型变量的 ASCII 最多为 127,因此散列函数大致只能在 0 和 127*8 = 1016,显然不是一种均匀的分配。

    假设需要对这样的字符串进行散列,Key 至少有两个字符+NULL 结束符。

    Index hash(const char* key, int tableSize){
    
        return (key[0] + 27*key[1] + 729*key[2]) % tableSize;
    }
    • 27:26 个英文字符 + 空格
    • 729:27**2

    涉及所有关键字字符的 hash:

    Index Hash(const char* Key, int TableSize){
        unsigned int HashVal = 0;
        while (*Key != ''){
            HashVal += (HashVal << 5) + *Key++;
        }
        return HashVal % TableSize;
    }
  • 相关阅读:
    函数中的不定长参数研究 *and**
    copy()与直接=赋值的区别
    python的位运算符
    python的list相关知识
    hadoop报错:hdfs.DFSClient: Exception in createBlockOutputStream
    转载计算机的潜意识的文章:机器学习的入门级经典读物
    完全分布式hadoop2.5.0安装 VMware下虚拟机centos6.4安装1主两从hadoop
    PE结构总导航
    利用函数指针绕过断点
    为什么Fun函数能够执行
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423680.html
Copyright © 2020-2023  润新知