专题要点:
散列最重要的运用就是方便查找,提高效率。个人认为本专题是对提高代码效率的最基础最常用最有效的方法,必须掌握。常见的数组散列表有,字母表,ASCII码,数字表等。
几点注意:
- 当数据量小时,可将数据值作为数组下标
- 当数据量大时,取余
- 二维坐标散列:H(Point) = x * Range + y (x >= 0, y <= Range)
- 字母散列:个人常用int H = c - ‘a’ 来转化为整型,或者直接用ASCII码表即,bool asc[130]。另外,将字符做数组下标时hashTable[str[i] ],会被强制转化为ASCII码的int型
- 含数字和大小写字母时,除了ASCII码表散列之外,可使用
‘9’ (数字 str[i])- ‘0’
‘Z’ (大写字母 str[i])- ‘A’ + 10
‘z’ (小写字母str[i])- ‘a’ + 36
来转化(其中’9’, ‘Z’, 'z’可用任意字母代替) - 进制散列:参考进制转换,从头开始遍历,从R的0次方到R的n-1次方(n位数),如三个字母的散列:26 * 2 + str[0] + 26 * 1 + str[1] + 26 * 0 + str[2]
- 图中边的散列:边的两个顶点u,v,数据范围为10000,其hash函数可写作hash(u,v) = u * 10000 + v(v * 10000 + u),其中u,v一定不同,因此hash不会冲突
- 其他散列方法:构造字典(位置要 一 一 对应)
dict[6] = {, , , , , }
cnt[6] = { , , , , ,}
可构造出字母和次数之间的映射关系,类似map(此处两数组数据位置相同) - 其他散列方法:当数组数据位置无法保证相同时,且数据量比较合理时,可用一个数组的值,当作另一个数组的索引进行查找
- 注意数组或字符串的范围如,PAT.A1050,A1041
多用多熟悉!本专题题目不难!