【408数据结构】散列 (哈希)知识点集合复习考点题目

2024-09-08 15:04

本文主要是介绍【408数据结构】散列 (哈希)知识点集合复习考点题目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                                                            苏泽 

“弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家


  

知识点

1. 散列查找

散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(O(1)),但最坏情况下可能会退化到(O(n))。

也称作哈希表,一种数据结构。
数据元素的关键字与其存储地址直接相关
如果通过散列函数映射到同一个为止,则为 冲突

装填因⼦α = 散列表长度m /表中记录数n

3. 散列函数

散列函数是散列存储的核心,其设计需要考虑关键字的分布情况和冲突概率。

  • 散列查找是典型的"用空间换时间"的算法,只要散列函数设计的合理,散列表越长,冲突的概率越
  • 除留余数法,即H(key) = key % p
  • 直接定址法
    H(key) = a * key + b

    适合关键字分布基本连续的情况,如果关键字不连续,空位太多会造成存储空间的浪费
  • 数字分析法

    选取分布较为均匀的若干位作为散列地址
  • 平方取中法

    取关键字的平方值的几位作为散列地址。

    适合散列地址与关键字的每位都有关系

4. 冲突处理

冲突是散列存储中不可避免的问题。处理冲突的方法主要有开放定址法和链地址法。开放定址法通过在表中寻找空闲位置来解决冲突,而链地址法则通过将具有相同散列地址的元素链接成一个链表来处理冲突。

  • 开放地址法:
    线性探测法

      发生冲突的时候,每次往后探测相邻的下一个单元是否为空

      进行查找的时候,通过散列函数得到Hi并依次比较,如果遇到空则说明查找失败

      删除结点不能简单的将被删结点的空间置为空,否则将阶段在它之后填入散列表的同义词的查找路径,而可以做一个删除标记进行逻辑删除
  • 平方探测法比起线性探测表更不容易产生聚集堆积问题
  • 伪随机序列法
      一个伪随机序列

题目

1. 散列查找的缺点是什么?

解答:
散列查找的缺点主要表现在以下几个方面:

  1. 可能会产生冲突,需要解决冲突的方法。
  2. 冲突处理方法(如链地址法)会增加额外的空间开销。
  3. 在最坏情况下(所有元素都冲突),查找时间复杂度会退化到 (O(n))。

2. 什么是散列存储?

解答:
散列存储是一种数据结构,它根据关键码值(Key Value)直接进行访问。通过Hash函数将要查找的项与表的一个位置关联,以加快查找的速度。它是一种“用空间换时间”的算法,只要散列函数设计的合理,散列表越长,冲突的概率越低。

3. 散列存储适用于什么情况?

解答:
散列存储适用于以下情况:

  1. 数据量大,且查找操作较多。
  2. 可以接受一定程度的冲突。
  3. 需要快速查找、插入和删除操作。

4. 散列查找的时间复杂度与什么有关?

解答:
散列查找的时间复杂度主要与以下因素有关:

  1. 散列表的长度(m):散列表越长,冲突的概率越低。
  2. 冲突概率:冲突越少,查找效率越高。
  3. 散列函数的设计:合理的散列函数可以减少冲突,提高查找效率。

5. 散列函数的设计需要考虑哪些因素?

解答:
散列函数的设计需要考虑以下因素:

  1. 关键字的分布情况:散列函数应该能够将关键字均匀地分布在散列表中,减少冲突。
  2. 冲突概率:设计散列函数时应该尽量减少冲突的概率。
  3. 计算效率:散列函数的计算应该尽可能简单高效,以减少查找和插入的时间。

6. 什么是开放地址法?

解答:
开放地址法是一种处理散列冲突的方法。当发生冲突时,它会选择一个开放的散列地址,将元素存入该地址。开放地址法的实现方式包括线性探测法、二次探测法和双重散列法等。

7. 什么是再散列?

解答:
再散列是一种解决哈希冲突的方法。当发生冲突时,通过一定的计算找到一个新的位置来存储数据。再散列可以提高散列表的查找效率,避免堆积现象。

8. 散列查找的平均查找复杂度是多少?

解答:
散列查找的平均查找复杂度是 (O(1))。这是因为在理想情况下,散列函数可以将关键字均匀地分布在散列表中,每个关键字只需要一次查找就可以找到对应的存储位置。

9. 散列表的空间复杂度是多少?

解答:
散列表的空间复杂度是 (O(n))。为了减少冲突,通常需要设计一个足够长的散列表,其长度与存储的元素数量成正比。

10. 如何解决哈希表中的冲突?

解答:
解决哈希表中的冲突的方法主要包括:

  1. 链地址法:将具有相同散列地址的元素存储在一个链表中。
  2. 开放地址法:当发生冲突时,选择一个开放的散列地址,将元素存入该地址。
  3. 再散列法:通过更换散列函数或调整散列表的大小来减少冲突


另外,利用了工作之余的一点点时间,整理了一套考研408的知识图谱,

我根据这一套知识图谱打造了这样一个408知识图谱问答系统

里面的每一个回答都是根据考研408的考点回复的

目前暂时只接入了微信,如果大家对这个问答系统感兴趣的话可以在我的主页里找到我的微信号

找我拉进测试群免费体验哦


这篇关于【408数据结构】散列 (哈希)知识点集合复习考点题目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148442

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In