20230407 11.1. 散列表

引入概念

已知的几种查找方法:

查找方法 时间复杂度
顺序查找 O(N)
二分查找(静态查找) \(O(log_2N)\)
二叉搜索树 O(h) h为二叉查找树的高度
平衡二叉树 \(O(log_2N)\)

【问题】如何快速搜索到需要的关键词?如果关键词不方便比较怎么办?

  • 查找的本质: 已知对象找位置。
    • 有序安排对象:全序、半序
    • 直接“算出”对象位置:散列
  • 散列查找法的两项基本工作:
    • 计算位置:构造散列函数确定关键词存储位置;
    • 解决冲突:应用某种策略解决多个关键词位置相同的问题
  • 时间复杂度几乎是常量:O(1) ,即查找时间与问题规模无关!

抽象类型表示

类型名称:符号表(SymbolTable)

数据对象集:符号表是“名字(Name)-属性(Attribute)”对的集合。

操作集:Table ∈ SymbolTable,Name ∈ NameType,Attr ∈ AttributeType

  1. SymbolTable InitializeTable( int TableSize ):

    创建一个长度为TableSize的符号表;

  2. Boolean IsIn( SymbolTable Table, NameType Name):

    查找特定的名字Name是否在符号表Table中;

  3. AttributeType Find( SymbolTable Table, NameType Name):

    获取Table中指定名字Name对应的属性;

  4. SymbolTable Modify(SymbolTable Table, NameType Name, AttributeType Attr):

    将Table中指定名字Name的属性修改为Attr;

  5. SymbolTable Insert(SymbolTable Table, NameType Name, AttributeType Attr):

    向Table中插入一个新名字Name及其属性Attr;

  6. SymbolTable Delete(SymbolTable Table, NameType Name):

    从Table中删除一个名字Name及其属性。

概念

“散列(Hashing)” 的基本思想是:

  1. 以关键字key为自变量,通过一个确定的函数 h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。

  2. 可能不同的关键字会映射到同一个散列地址上, 即h(keyi) = h(keyj)(当keyi ≠keyj),称为“冲突(Collision)”。

    ----需要某种冲突解决策略

装填因子(Loading Factor):设散列表空间大小为m,填入表中元素个数是n,则称α= n / m为散列表的装填因子

Java 关联

  • HashMap
  • Hashtable
    • 实现了Map接口,是同步的
posted @ 2023-06-20 11:24  流星<。)#)))≦  阅读(11)  评论(0编辑  收藏  举报