我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python篇——数据结构与算法(第六部分:哈希表)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python篇——数据结构与算法(第六部分:哈希表)

 

目录

1、直接寻址表

2、直接寻址表缺点

3、哈希

4、哈希表

5、解决哈希冲突

6、拉链法

7、常见哈希函数

8、哈希表的实现

8.1迭代器iter()和__iter__

8.2str()和repr()

8.3代码实现哈希表

8.4哈希表的应用


 1、直接寻址表

 

2、直接寻址表缺点

3、哈希

  • 直接寻址表:key为k的元素放到k的位置上
  • 改进直接寻址表:哈希(Hashing)
    • 构建大小为m的寻址表T
    • key为k的元素放到h(k)的位置上
    • h(k)是一个函数,其将域U映射到表T[0,1,2,...,m-1]

4、哈希表

 5、解决哈希冲突

 6、拉链法

 7、常见哈希函数

 8、哈希表的实现

 8.1迭代器iter()和__iter__

  • 从根本上说,迭代器就是有一个next()方法的对象,而不是通过索引来计数。
  • 迭代器更大的功劳是提供了一个统一的访问集合的接口。
  • 迭代器为类序列对象提供了一个类序列的接口。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
  • 迭代器只能往前不会后退。
  • python的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象。
  • 迭代器用起来很灵巧,你可以迭代不是序列但表现出序列行为的对象,例如字典的键、一个文件的行。
def iter_test():    i = iter('happy')#!!!    try:        while True:            print i.next()    except StopIteration:        pass    s = {'one':1,'two':2,'three':3}    print s    m = iter(s) #!!!    try:        while True:            print m.next()  #s[m.next()]    except StopIteration:        passif __name__ == '__main__':        iter_test()
happy{'three': 3, 'two': 2, 'one': 1}threetwoone
  •  使用类实现__iter__()next()函数
  • 另一个创建迭代器的方法是使用类,一个实现了__iter__()和next()方法的类可以作为迭代器使用。
  • next方法:返回迭代器的下一个元素
  • __iter__方法:返回迭代器对象本身
class Fib(object):    def __init__(self):        self.a, self.b = 0, 1 # 初始化两个计数器a,b    def __iter__(self):        return self # 实例本身就是迭代对象,故返回自己    def next(self):        self.a, self.b = self.b, self.a + self.b # 计算下一个值        if self.a > 10: # 退出循环的条件            raise StopIteration();        return self.a # 返回下一个值if __name__ == '__main__':        for n in Fib():        print n 
112358

8.2str()和repr()

  • Python 内置函数 repr() 和 str() 分别调用对象的__repr____str__
  • repr()更能显示出对象的类型、值等信息,对象描述清晰的。 而str()能够让我们最快速了解到对象的内容,可读性较高
  • 在 Python 交互式命令行下直接输出对象默认使用的是__repr__
import datetimes = 'hello'd = datetime.datetime.now()print(str(s))print(repr(s))print(str(d))print(repr(d))
hello'hello'2023-6-13 22:39:18.014587datetime.datetime(2023, 6, 13, 22, 39, 18, 14587)

 Note:

  • map()函数
def square(x) :            # 计算平方数...     return x ** 2...>>> map(square, [1,2,3,4,5])   # 计算列表各个元素的平方[1, 4, 9, 16, 25]>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数[1, 4, 9, 16, 25]

8.3、代码实现哈希表

# hashclass 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 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.append(obj)    def find(self, obj):        for n in self:            if n == 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 = [Linklist() for i in range(self.size)]    def h(self, k):        return k % self.size    def insert(self, k):        i = self.h(k)        if self.find(k):            print("Douplicated insert")        else:            self.T[i].append(k)    def find(self, k):        i = self.h(k)        return self.T[i].find(k)lk = Linklist([1, 2, 3, 4])print(lk)ht = HashTable()ht.insert(0)ht.insert(1)# hashclass 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 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.append(obj)    def find(self, obj):        for n in self:            if n == 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 = [Linklist() for i in range(self.size)]    def h(self, k):        return k % self.size    def insert(self, k):        i = self.h(k)        if self.find(k):            print("Douplicated insert")        else:            self.T[i].append(k)    def find(self, k):        i = self.h(k)        return self.T[i].find(k)lk = Linklist([1, 2, 3, 4])print(lk)ht = HashTable()ht.insert(0)ht.insert(1)ht.insert(3)ht.insert(102)print(",".join(map(str, ht.T)))

结果

<<1,2,3,4>><<1,2,3,4>><<0>>,<<1,102>>,<<>>,<<3>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>,<<>>Process finished with exit code 0

8.4、哈希表的应用

 MD5算法

 

 

 

 

来源地址:https://blog.csdn.net/qq_42120059/article/details/131188575

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python篇——数据结构与算法(第六部分:哈希表)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java数据结构中实现哈希表的分离链接法

这篇文章主要介绍“Java数据结构中实现哈希表的分离链接法”,在日常操作中,相信很多人在Java数据结构中实现哈希表的分离链接法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构中实现哈希表的分离
2023-06-20

Redis | 第一部分:数据结构与对象 中篇《Redis设计与实现》

目录前言1. 跳跃表1.1 跳跃表与其节点的定义1.2 跳跃表的API2. 整数集合2.1 整数集合的实现2.2 整数集合的类型升级2.3 整数集合的API3. 压缩列表3.1 压缩列表的结构3.2 压缩列表节点的定义3.3 连锁更新3.4 压缩列表的API最
Redis | 第一部分:数据结构与对象 中篇《Redis设计与实现》
2021-12-06

Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》

目录前言1. 简单动态字符串1.1 SDS的定义1.2 空间预分配与惰性空间释放1.3 SDS的API2. 链表2.1 链表与节点的定义2.2 链表的API3. 字典3.1 哈希表与哈希节点3.2 字典3.3 哈希算法3.4 解决键冲突3.5 rehash3.
Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》
2016-08-18

如何分析Python数据结构与算法中的顺序表

这篇文章的内容主要围绕如何分析Python数据结构与算法中的顺序表进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!0. 学习目标线性表在计算机中的表示
2023-06-26

Python高级数据结构与算法实例分析

本文小编为大家详细介绍“Python高级数据结构与算法实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python高级数据结构与算法实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、简介我们将从以
2023-07-05

Python数据结构与算法之列表(链表,linked list)简单实现

Python 中的 list 并不是我们传统(计算机科学)意义上的列表,这也是其 append 操作会比 insert 操作效率高的原因。传统列表——通常也叫作链表(linked list)——通常是由一系列节点(node)来实现的,其每一
2022-06-04

python算法与数据结构朋友圈与水杯实验题分析实例

这篇文章主要介绍了python算法与数据结构朋友圈与水杯实验题分析,总的来说这并不是难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路
2022-12-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录