哈希算法又称散列函数算法,是一种查找算法。
简单来说,就是把一些复杂的数据,通过某种函数映射关系,映射成一种易于查找的方式。
但这种映射关系有可能会发生多个关键字映射到同一地址的现象,称之为冲突,需要对关键字进行二次或多次处理。
顺序查找
最简单的查找方式,需要对数据逐个进行匹配,所以效率相对较低,不适合大量数据查找。
二分查找
二分查找效率很高,但是要求数据必须有序,而对数据进行排序通常需要很多的时间开销。
深度优先遍历
对于大数据量的查找问题效率并不高
广度优先遍历
同深度优先遍历,对于大数据量的查找问题效率并不高
哈希查找
由于查找速度快,查询、插入、删除操作简单等原因被广泛应用。
哈希算法进行查找的基本原理是根据数量 预先设置一个长度为M的数组,使用一个哈希函数F,并以数据的关键字作为自变量,得到唯一的返回值,返回值的范围为[0, M-1],这样就可以利用哈希函数F将数据元素映射到数组的某一位下标并把数据存放在对应的位置上。
哈希是一种高效的存储算法,也是一种高效的查找算法。
哈希像一本字典,当进行查词的时候,通过目录找到页码,再到对应页码就能找到所需要的内容
# 难点
一般情况下,哈希算法的查询效率可以达到常数级别,哈希表成为直接寻址的有效替代方案。而有时候关键字的取值范围太大,数据在通过函数进行映射的时候,找不到一个哈希函数,使得关键字不能映射唯一的值,出现冲突现象。
# 解决哈希冲突的方法
1. 链地址法
2. 二次再散列法
3. 线性探测再散列
4. 建立一个公共溢出区
...
问题: 给出一些数,3, 4, 5, 7, 10, 选择两个数使他们的和为一,11
使用双指针的方法解决。
为了找到两个元素的和为目标值,先将数组从小到大排序。由于最后得到的是两个数原有的编号,而非两个数本身,因此需要保留原来数据的下标。
两个数的和解法1
def two_sum(list, target):
res = []
new_list = list[:]
new_list.sort()
# 定义left、right 指针分别指向新数组的开头和结尾
left = 0
right = len(new_list) - 1
while left < right:
if new_list[left] + new_list[right] == target:
for i in range(len(list)):
if list[i] == new_list[left]:
res.append(i)
break
for i in range(len(list)-1, -1, -1):
if list[i] == new_list[right]:
res.append(i)
break
res.sort()
break
elif new_list[left] + new_list[right] < target:
# 让left 指针向右移一位
left += 1
elif new_list[left] + new_list[right] > target:
# 让right 指针向左移一位
right -= 1
return res
# 所有元素
lst = [1, 3, 4, 5, 7]
# 目标值
target = 11
# 获取存放结果编号数据
res = two_sum(lst, target)
print(‘所有数中和为11的元素:‘, [lst[i] for i in res])
使用哈希算法解决
使用哈希算法,要先建立一个字典,用于存放数据和下标的对应关系。
使用字典记录数据,再去字典中查找数据的方式就是哈希方法
两个数的和解法2
def two_sum(list, target):
dict = {}
for i in range(len(list)):
m = list[i]
if target-m in dict:
return (dict[target-m], i)
dict[m] = i
# 所有元素
lst = [1, 3, 4, 5, 7]
# 目标值
target = 11
di = two_sum(lst, target)
print(‘所有数中和为11的元素:‘, [lst[i] for i in di])
原文:https://www.cnblogs.com/JoshuaP/p/13081231.html