数据结构与算法——概念篇

1. 哈希

1.1 哈希表

1.1.1 哈希表的定义

哈希表是一种以键-值存储数据的结构,输入待查找的key,即可找到其对应的value。

1.1.2 哈希表实现原理

利用哈希函数将被查找的键转换为数组的索引,来寻找其对应的值。
理想情况下不同的键会被转换为不同的索引,但有时不同的键会被哈希到同个索引,这时需要处理冲突。
key1!=key2,而 f (key1) = f(key2)。
此法仅适合于:地址集合的大小 = = 关键字集合的大小

1.2 构造哈希函数的方法

  1. 直接定址法:以关键字本身或它的线性函数作为地址。
    H(k)=k 或 H(k)=a×k+b

  2. 数字分析法:分析全部关键字数据,根据冲突尽可能低原则,组合数据中的元素作为地址。
    比如一组员工的出生年月日,我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。
    此法适于:能预先估计出全体关键字的每一位上各种数字出现的频度。

  3. 折叠法: 将关键字分割成位数相同的部分,然后取它们的叠加和作为地址。
    ①. 移位叠加: 将分割后是每一部分的最低位对齐,然后相加;
    ②. 边界叠加: 从一端向另一端沿分割界来回折叠,然后对齐相加。
    此法适于:关键字的数字位数特别多。

  4. 平方取中法:将关键字平方,取结果的中间几位作为地址。
    此法适于:关键字中的每一位都有某些数字重复出现频度很高的现象

  5. 随机数法:选择一随机函数,取关键字的随机值作为地址。

  6. 除留余数法: 假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为h(k)=k % p

1.3 哈希解决冲突的方法

  1. 开放定址法: 当关键字地址冲突时利用,以此地址为基础产生新的地址,直到不发生冲突。
    Hi=(H(key)+di)% m , i=1,2,…,n
    其中H(key)为哈希函数,m 为表长,di称为增量序列。
    三种增量序列:
    线性探测:di = 1, 2, 3…m - 1
    二次探测:di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 )
    伪随机探测:di= 伪随机数
  2. 再哈希法: 构造多个哈希函数,产生冲突时计算另一个hash函数地址,直到不发生冲突。
  3. 链地址法: 将所有Hash地址相同的记录都链接在同一链表中 。
  4. 建立公共溢出区: 将哈希表分为基本表和溢出表,若和基本表发生冲突,则放入溢出表

2. 堆和栈

2.1 数据结构中的堆、栈和队列

2.1.1 堆的定义

堆是一种经过排序的树形数据结构。

2.1.2 堆的性质

(1).堆中某个节点的值总是不大于或不小于其父节点的值。
(2).堆总是一颗完全二叉树。

2.1.3 堆的种类

(1). 最大堆(大根堆):父节点元素 > 子节点元素。(如图一)
(2). 最小堆(小根堆):父节点元素 < 子节点元素。(如图二)
在这里插入图片描述

2.1.4 栈的定义

栈是仅在表尾进行插入和删除的线性表。

2.1.5 栈的性质

后进先出
在这里插入图片描述

2.1.6 栈的应用——“递归”

在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出。

2.1.7 队列的定义

队列是在一端进行插入操作,而在另一端进行删除操作的线性表。
队尾——允许插入数据的一端。
队头——允许删除数据的一端。

2.1.8 队列的性质

先进先出
在这里插入图片描述

2.2 内存分配中的堆区和栈区

2.2.1 堆区和栈区的区别

1. 栈区:
①. 栈是向低地址扩展的数据结构。
②. 是一块连续的内存的区域,容量较小。(栈顶固定)
③. 由系统自动分配释放,效率较高,存放函数的参数值,局部变量。

2. 堆区:
①. 堆是向高地址扩展的数据结构。
②. 是不连续的内存的区域,容量较大。(系统用链表存储空闲内存地址,因而不连续。)
③. 由程序员分配释放,效率较低。(若程序员不释放,程序结束时可能由系统回收。)

3.静态区:用于存放全局变量和静态变量,程序结束后由系统释放。
4.文字常量区: 存放程序和常量,程序结束后由系统释放。
在这里插入图片描述

2.2.2 栈溢出有哪些情况

①. 局部数组过大。
②. 递归调用层次太多。
③. 指针或数组越界。

3. 查找

3.1 二分查找的条件

必须是有序列表

3.2 二分查找的思想

被查找的数与列表中间值比较,若小于列表中间值,则说明数在列表左半部分,在列表左半部分进行二分查找。否则在列表右半部分查找。

3.3 实现方式

在这里插入图片描述

4. 排序

4.1 冒泡排序——O(n2

4.1.1 冒泡排序的思想

依次比较相邻的两个数,把值大的交换到右边,重复执行,直到排序完成。

4.1.2 冒泡排序的实现

在这里插入图片描述

4.2 选择排序——O(n2

4.2.1 选择排序的思想

遍历列表把最小的数放在前面,重复执行,直到排序完成。

4.2.2 选择排序的实现

在这里插入图片描述

4.3 插入排序——O(n2

4.3.1 插入排序的思想

把列表分为有序、无序两部分,依次取无序部分的元素按顺序插入到有序部分,重复执行,直到排序完成。

4.3.2 插入排序的实现

在这里插入图片描述

4.4 希尔排序

4.4.1 希尔排序的思想

取间隔将列表分组,分别进行插入排序,重复执行,直到排序完成。

4.4.2 希尔排序的实现

在这里插入图片描述

4.5 快速排序——O(nlogn)

4.4.1 快速排序的思想

确定一个基准数,比基准小的放在左边,比基准大的放在右边,重复执行,直到排序完成。

4.4.2 快速排序的实现

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值