数据结构第十一周笔记—— 散列查找系列1 (慕课浙大版本--XiaoYu)

简介: 散列表

11.1 散列表

11.1.1 引子:散列的基本思路

C语言变量名必须:

  1. 先定义(或者声明)后使用

编译处理时,涉及变量及属性(如:变量类型)的管理:

  1. 插入:新变量定义(将变量名及其定义插到我们要管理的这个集合里面去)
  2. 查找:变量的引用(在编译的时候,会查找你使用的这个变量是否定义,在根据变量的类型去进行判别看能不能这么使用)

编译处理中对变量管理:

  1. 动态查找问题

利用查找树(搜索树)进行变量管理?

  1. 两个变量名(字符串)比较效率不高,因为变量名比较比整数的比较要复杂。
  2. 整数比较一次比较大小相等就行了,而变量是字符串,需要一个字符一个字符的比过去
  3. 是否可以先把字符串转换为数字再处理?这样就是进行比较两个数字的方式了,这就是散列查找

已知的几种查找方法:

  1. 顺序查找:要查找的放数组列表,从头到尾慢慢找,效率差
  2. 二分查找(静态查找):从小到大排好然后用二分查找这样,查找效率高
  3. 二叉搜索树,平衡二叉树  

网络异常,图片无法展示
|

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

  1. 查找的本质:已知对象找位置
  1. 有序安排对象:全序(典型的二分查找,从小到大排好),半序(某些关键词之间存在一个秩序,例如查找树,任何一个结点都比左边左子树的所有结点要来得大,比右边右子树的所有结点要来得小,但并不像二分查找一样完全有序)
  2. 直接"算出"对象位置:散列
  1. 散列查找法的两项基本工作:
  1. 计算位置:构造散列函数确定关键词存储位置
  2. 解决冲突:应用某种策略解决多个关键词位置相同的问题
  1. 时间复杂度几乎是常量:O(1),即查找时间与问题规模无关!
  1. 散列如果在函数的计算方面还有冲突策略提得好,效率就会非常高

11.1.2 什么是散列表

类型名称:符号表(SymbolTable)

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

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

1.SymbolTableInitializeTable(intTableSize )://表的初始化

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

2.BooleanIsIn(SymbolTableTable,NameTypeName)://判别一个对象是不是在这个表里

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

3.AttributeTypeFind(SymbolTableTable,NameTypeName)://在表里查找属性

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

4.SymbolTableModefy(SymbolTableTable,NameTypeName,AttributeTypeAttr)//把表中属性改掉

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

5.SymbolTableInsert(SymbolTableTable,NameTypeName,AttributeTypeAttr)://在表里插入一个新的对象

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

6、SymbolTableDelete(SymbolTableTable,NameTypeName)://从表里删除

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

       

       主要操作:上面的3、5、6

网络异常,图片无法展示
|

装填因子:散列表在外面这里是个数组,这个数组被充满的程度

冲突的设计:采用二维数组,同一个地址的就放在同一行,有冲突的在所在那行后一列继续放,如图所示:

网络异常,图片无法展示
|

哈希函数设计:

哈希函数指将哈希表中元素的关键键值映射为元素存储位置的函数。

一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。 理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系,使每个关键字和结构中一个唯一的存储位置相对应。

只要不冲突的话效率还是很高的

网络异常,图片无法展示
|

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

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

(2)可能不同的关键字会映射到同一个散列地址上,即h(keyi)=h(keyj)(当keyi不等于keyj),称为“冲突(Collision)”。---需要某种冲突解决策略


目录
相关文章
|
5月前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
5月前
|
存储 算法
【树】数据结构——树和二叉树的概念&笔记
【树】数据结构——树和二叉树的概念&笔记
|
4月前
|
存储 算法 C语言
软考中级之数据库系统工程师笔记总结(二)数据结构与算法
软考中级之数据库系统工程师笔记总结(二)数据结构与算法
35 0
|
5月前
|
存储 算法 Linux
【内核链表】数据结构——深入理解内核链表的概念和操作&笔记
【内核链表】数据结构——深入理解内核链表的概念和操作&笔记
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
|
17天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
7天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
16 1
|
10天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
13天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
15天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
43 4