数据结构与算法之 数据结构:哈希表

数据结构:数据元素的集合 + 数据元素之间的关系

哈希表

通过哈希函数来计算数据存储位置:直接寻址表 + 哈希

1、哈希冲突

        两个不同元素映射到同一个位置上
解决方法:
    开放寻址法
    拉链法

 

2、补充:直接寻址表

缺点:
    当域很大时,需要消耗大量内存,很不实际
    如果域很大而实际出现的key很少,则大量空间被浪费
    无法处理关键字不是数字的情况

3、常见的哈希函数:

 4、应用:md5、SHA2

5、代码部分:

class LinkList:
    """链表"""
    class Node:
        """链表结点"""
        def __init__(self, item):
            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):
        # 刚开始head、tail为空
        self.head = None
        self.tail = None
        if iterable:
            self.extend(iterable)
            
    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 extend(self, iterable):
         for obj in iterable:
             self.qppend(obj)
            
    def find(self, obj):
         for n in self:
                if n == obj:
                    return True
                else:
                    return False
      
    def __iter__(self):
         """让链表支持for循环"""
         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 = [LinkList() for i in range(self.size)]
    
    def h(self, k):
        """哈希函数"""
        return k % self.size
    
    def insert(self, k):
        """插入k"""
        i = self.h(k)
        if self.find(k):
            print('重复插入!!')
        else:
            self.T[i].append(k)
            
    def find(self, k):
        """ k"""
        i = self.h(k)
        return self.T[i].find(k)
        
    
lk = LinkList([1,2,3,4,5])
for element in lk:
    print(element)
    
ht = HashTable()
ht.insert(0)
ht.insert(1)
ht.insert(102)
# 转化为字符串,打印
print(",".join(map(str,ht.T)))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值