《算法笔记》4.2-总结

本章算法笔记的内容是散列(hash)

题目列表:

  1. B1029/A1084
  2. B1033
  3. B1038
  4. B1039/A1092
  5. B1042
  6. B1043
  7. B1047
  8. A1041
  9. A1050
  10. B1005
  11. A1048

散列是一种很常见的算法思想,比如说,给出N个整数,再给出M个整数,要求你查询这M个整数中的每一个是否在这N个整数中出现过。如果我们简单地用暴力方法,直接去遍历这N个整数,那么算法的时间复杂度是O(NM),这显然是不可接受的时间复杂度。

在这个问题下,用散列的思想来思考,就是设置一个bool型数组hashtable[Maxsize],来代表第一次输入的N个数,每当输入一个数字n,我们就把hashtable[n]=true,或者也可以设置成int型的数组,数值另有他用(比如统计这M个数中的每一个在前面N个数中出现的次数)。这样我们在输入后面这M个数的时候,就可以每输入一个数m,就来检查hashtable[m]中的值,判断m是否在之前的N个数中出现过,这样的算法时间复杂度是O(N+M)。

所以说,所谓散列,就是就是直接把输入的数作为数组的下标来对这个数的性质进行统计,如果输入的不是数或者数很特殊不能作为下标,那么我们就要使用散列函数:将元素通过一个函数转换为整数,使得整数可以尽量唯一的代表这个元素

在PAT的题目,需要注意以下几点:

  1. 有的题目需要把大小写字母统一转换为大写或者小写字母来处理
  2. B1039/A1092中可以直接用两个字符串长度相减求出多出的珠子数
  3. cout<<(char)num;可以输出num所代表的ascii码所代表的字符
  4. 注意getline的使用,可以整行读入数据,包括空格
  5. 注意边界条件的处理,比如0的情况,A1048中硬币相同的情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值