数据结构学习笔记07散列查找

1.散列表(Hash)

查找的本质: 已知对象找位置。
  有序安排对象:全序、半序
  直接“算出”对象位置:散列
  时间复杂度几乎是常量:O(1),即查找时间与问题规模无关

散列查找法的两项基本工作:
  计算位置:构造散列函数确定关键词存储位置;
  解决冲突:应用某种策略解决多个关键词位置相同的问题

散列(Hashing) 的基本思想是:
  ①以关键字key为自变量,通过一个确定的函数 h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。
  ②可能不同的关键字会映射到同一个散列地址上,即h(keyi) = h(keyj)(当keyi ≠keyj),称为“冲突(Collision)”。
                                          ----需要某种冲突解决策略

2.散列函数的构造方法

散列函数两个关键:

  ①计算简单,以便提高转换速度;
  ②关键词对应的地址空间分布均匀,以尽量减少冲突。

数字关键词的散列函数构造

①直接定址法
  取关键词的某个线性函数值为散列地址,即
  h(key) = a * key + b (a、b为常数)

②除留余数法
  散列函数为:h(key) = key mod p  (一般p取素数)

③数字分析法
  分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址
    Eg:取11位手机号码key的后4位作为地址:
    散列函数为:h(key) = atoi(key+7)  (char *key)

④折叠法
  把关键词分割成位数相同的几个部分,然后叠加

    Eg: 56793542
         542
         793
        + 056
       ———
        1391
            h(56793542) = 391

⑤平方取中法
    Eg: 56793542
      56793542
     x 56793542
    —————————
 3225506412905764
            h(56793542) = 641

字符关键词的散列函数构造

①一个简单的散列函数——ASCII码加和法
  对字符型关键词key定义散列函数如下:
  h(key) = (Σkey[i]) mod TableSize

②简单的改进——前3个字符移位法(易造成空间浪费)
  h(key)=(key[0]*27^2 + key[1]*27 + key[2]) mod TableSize

③好的散列函数——移位法
  涉及关键词所有n个字符,并且分布得很好:

  Eg:h(“abcde”)=‘a’*324+’b’*323+’c’*322+’d’*32+’e’

  Index Hash ( const char *Key, int TableSize )
  {
    unsigned int h = 0; /* 散列函数值,初始化为0 */
    while ( *Key != ‘\0’) /* 位移映射 */
      h = ( h << 5 ) + *Key++;
    return h % TableSize;
  }

……

时间: 2024-10-04 17:24:10

数据结构学习笔记07散列查找的相关文章

C++学习笔记 &lt;hash_map&gt; &lt;散列映射&gt;

对于大型容器而言hash_map要比map快5至10倍的元素查找速度. map对其元素类型要求有一个<,hash_map要求一个==和一个散列函数. map<string,int>  m1;   //用<比较串 map<string,int Nocase>   m2;       //用Nocase()比较串 hash_map<string,int>   hm1;        //用Hash<string>()散列,用==比较 hash_map

Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)

1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素,就需要使用线性表.线性表不仅可以存储重复的元素,而且允许用户指定存储的位置.用户可以通过下标来访问线性表中的元素. 3. Java集合支持三种类型的规则集:散列集HashSet.链式散列集LinkedHashSet和树形集TreeSet.HashSet以一个不可预知的顺序存储元素:LinkedHas

学习笔记:散列

一.简述 散列是一种数据访问技术,所有的数据项均有散列码与之关联. 散列码可在任何时候通过散列函数计算得到,通常为数据索引. 二.散列构造 ①直接定址法:取关键字本身或其线性函数计算结果作为散列码. ②数字分析法:取关键字中分布较均匀的若干位作为散列码. ③折叠法:根据表长取关键字拆分为若干等长部分后叠加求和并去掉进位的结果作为散列码.(可存在一个不等长部分) ④平方取中法:根据表长取关键字平方数值中间的若干位作为散列码. ⑤除留余数法:根据表长取关键字模运算结果作为散列码. 三.冲突处理 ①开

查找之散列查找(哈希表)

本学习笔记部分内容来自网易云课堂浙江大学数据结构课程,谢谢! 1.散列表(哈希表) 已知的几种查找方法: 顺序查找  O(N) 二分查找(静态查找)  O(logN) 二叉搜索树      O(h)  h为二叉树高度   (动态查找:有插入有删除有查找) 平衡二叉树      O(logN) 查找的本质:已知对象找位置 1.有序安排对象:全序或半序: 2.直接算出对象位置:散列. 散列查找法的两项基本工作: 1.计算位置:构造散列函数确定关键词存储位置: 2.解决冲突:应用某种策略解决多个关键词

学习笔记 07 --- JUC集合

学习笔记 07 --- JUC集合 在讲JUC集合之前我们先总结一下Java的集合框架,主要包含Collection集合和Map类.Collection集合又能够划分为LIst和Set. 1. List的实现类主要有: LinkedList, ArrayList, Vector, Stack. (01) LinkedList是双向链表实现的双端队列:它不是线程安全的.仅仅适用于单线程. (02) ArrayList是数组实现的队列,它是一个动态数组.它也不是线程安全的,仅仅适用于单线程. (03

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

数据结构学习笔记——线性表的应用

数据结构学习笔记——线性表的应用 线性表的应用 线性表的自然连接 计算任意两个表的简单自然连接过程讨论线性表的应用.假设有两个表A和B,分别是m1行.n1列和m2行.n2列,它们简单自然连接结果C=A*B(i==j),其中i表示表A中列号,j表示表B中的列号,C为A和B的笛卡儿积中满足指定连接条件的所有记录组,该连接条件为表A的第i列与表B的第j列相等. 如:         1 2 3                3 5 A  =  2 3 3         B =  1 6       

小猪的数据结构学习笔记(三)

小猪的数据结构学习笔记(三) 线性表之单链表 本章引言: 上一节中我们见识了第一个数据结构--线性表中的顺序表; 当你把操作的代码自己写几遍就会有点感觉了,如果现在让你写顺序表的 插入算法,你能够想出大概的代码么?如果可以,那么你就可以进入新的章节了; 否则,还是回头看看吧!在本节,我们将迎来线性表的链式表示--单链表 单链表和顺序表有什么优势和劣势呢?单链表的头插法和尾插法有什么不同呢? 请大家跟随笔者的脚步来解析线性表中的单链表把! 本节学习路线图 路线图解析: ①先要理解顺序表和单链表各自

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了