Hash表思想实现python求解两数之和

Hash表思想实现python求解两数之和

  • 什么是哈希表
    • Hash表与数组和链表
    • Hash表的应用
    • 常用的Hash构造函数
    • 常见冲突处方法
  • Hash思想求解两数之和(python 实现)
    • 题目
    • python实现

什么是哈希表

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

记录的存储位置=f(关键字)

这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。

哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。)
而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。

Hash表与数组和链表

1、数组的特点是:寻址容易,插入和删除困难;
2、链表的特点是:寻址困难,插入和删除容易。
3、Hash表的特点是:不论哈希表中有多少数据,查找、插入、删除(有时包括删除)只需要接近常量的时间即0(1)的时间级。

Hash表的应用

哈希表(hash table)是实现字典操作的一种有效的数据结构。尽管最坏的情况下,散列表中查找一个元素的时间与链表中查找的时间相同,达到了O(n)。然而实际应用中,散列的查找的性能是极好的。在一些合理的假设下,在散列表中查找一个元素的平均时间是O(1)。

常用的Hash构造函数

1、直接定址法:取关键字或者关键字的某个线性函数值作为哈希地址。即H(key)=key或者H(key)=a∗key+b,其中a和b都是常数。
2、数字分析法:假设关键字是以r为基的数,并且哈希表中可能出现的关键字都是事先知道的,则可以去关键字的若干数位组成哈希地址。
3、平方取中法:取关键字平方之后的中间几位为哈希地址。
4、折叠法:将关键字分割为位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和作为哈希地址。
5、除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得的余数为哈希地址。即H(key)=keymodp,p≤m
随机数法:选择一个随机数,取关键字的随机函数值作为他的哈希地址。

常见冲突处方法

1、再哈希法:Hi=RHi(key),i=1,2,3,…,k
,RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,知道冲突不在发生。
2、链地址法:将所有关键字为同义词的记录存储在同一线性链表中。假设某哈希函数产生的哈希地址在区间[0,m-1]上,则设立一个指针型向量Chain ChainHash[m];其中每个分量的初识状态都是空指针。凡哈希地址为i的都插入到头指针为ChainHash[i]的链表中。
3、使用公共溢出区:假设哈希函数的值域为[0,m-1],则设向量HashTable[0……m-1]为基本表,每个分量存放一个值,另设立向量OverTable[0,…,v]为溢出表。所有关键字和基本表中的关键字为同义词的记录,不管他们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表中。

Hash思想求解两数之和(python 实现)

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

例如:给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

python实现

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        map = {}
        for i,num in enumerate(nums):
            if target-num in map:
                return map[target-num],i
            else:
                map[num] = i

   
nums = [2,7,11,15]
target = 9
s =Solution()
print(s.twoSum(target,nums))

你可能感兴趣的:(萌新程序媛,数据分析,Hash表,两数之和)