数据结构------哈希表

哈希表

哈希表(Hash Table,又称散列表),是一种线性表的存储结构.哈希表有一个直接寻址地址和一个哈希函数组成.哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标

过程

直接寻址表

当关键字的全域U比较小时,直接寻址是一种简单而有效的方法
缺点:
当域U很大时,需要消耗大量的内存,很不实际,
如果U很大而实际出现的key很少,则大量的空间被浪费.
无法处理关键字不是数字的情况.

改进直接寻址法—哈希

(1)构建大小为m的寻指标T;
(2)key为k的元素放在h(k)位置上;
(3)h(k)是一个函数,将其域U映射到表T[0,1,2,…m-1]

哈希冲突

由于哈希表的大小是有限的,而需要存储的值的总数量总是无限的,因此对于任何哈希函数,都会出现两个不同元素映射到同一个位置的情况上,这种情况叫哈希冲突.

解决哈希冲突—开放寻址法

开放寻址法:如果哈希函数返回的位置已经有值,则可以向后探查新的位置来存储这个值.
(1)线性探查:如果位置i被占用,则探查i+1,i+2,…
(2)二次探查:如果位置被占用,则探查i+1^2, …
(3)二度哈希:有n个哈希函数,当使用第一个哈希函数h1发生冲突时,尝试使用h2,h3…
(4)拉链法:哈希函数每个位置都连接一个链表,当发生冲突时,将冲突的元素加到该位置链表的最后.

class LinkList:
    class Node:
        def __init__(self, item=None):
            self.item = item
            self.next = None
    class LinkListIterator:
        def __init__(self,node):
            self.node = node
        def __next__(self):
            if self.node:
                cur_node = self.node
                self.node = cur_node.next
                return cur_node.item
            else:
                raise StopIteration        
        def __iter__(self):
            return self
    
    def __init__(self,iterable=None):
        self.head = None
        self.tail = None
        if iterable:
            self.extend(iterable)
    def extend(self,iterable):
        for obj in iterable:
            self.append(obj)
    def append(self,obj):
        s = LinkList.Node(obj)
        if not self.head:
            self.head = s
            self.tail = s
        else:
            self.tail.next = s
            self.tail = s
    def find(self,obj):
        for item in obj:
            if item==obj:
                return True
        else:
            return False
    def __iter__(self):
        return self.LinkListIterator(self.head)
    def __repr__(self):
        return '<<'+','.join(map(str,self))+'>>'
            

class HashTable():
    def __init__(self, size=101):
        self.size = size
        self.T = []

    def h(self,k):
        return k % self.size

    def insert(self, k):
        i = self.h(k)
        if self.find(k):
            print('Duplicated')
        else:
            self.T[i].append(k)

    def find(self,k):
        i = self.h(k)
        return self.T[i].find(k)

哈希表的应用

(1)集合与字典

集合与字典都是通过哈希表来实现的.使用哈希表存储字典,通过哈希函数将字典的键映射为下标.

(2)md5算法

md5曾经是密码学中常用的哈希函数,可以把任意长度的数据映射为128的哈希值,其特征如下:
(1)同样的消息,其MD5值相同;
(2)可以快速计算出任意给定消息的MD5值;
(3)除非暴力枚举所有消息的可能,否则不可能从哈希反推出消息本身.
(4)两条消息之间即使只有微小的差别,其对应的MD5值也应该完全不相同完全不想关.
(5)不能在有意义的时间内人工构造两个不同的消息使其具备相同的MD5值.
例如: 计算文件的hash,来比较两个文件是否相同;

(3)SHA2算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值