《算法笔记》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中硬币相同的情况

猜你喜欢

转载自blog.csdn.net/qq_33657357/article/details/81783352