iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >散列表结构 字典与集合
  • 402
分享到

散列表结构 字典与集合

字典结构列表 2023-01-31 08:01:54 402人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

散列表结构 字典与集合 散列表 散列表(Hash Table)结构是字典(Dictionary)和集合(Set)的一种实现方式。散列算法的作用是尽可能快地在数据结构中找到一个值。在散列表上插入、删除和取用数据都非常快,但是对于查找操作来

散列表结构 字典与集合

散列表

散列表(Hash Table)结构是字典(Dictionary)和集合(Set)的一种实现方式。散列算法的作用是尽可能快地在数据结构中找到一个值。在散列表上插入、删除和取用数据都非常快,但是对于查找操作来说却效率地下

散列表是基于数组进行设计的,数组的长度是预先设定,如有需要可随时增加。所有元素根据和该元素对应的键,保存在数组的特定位置。使用散列表存储数据时,通过一个散列函数将键映射为一个数字,这个数字范围是0到列表长度。散列函数的选择依赖于键的数据类型,在此我们对键的hash值对数组长度区余的方法。散列表的数组究竟应该有多大?这是编写散列函数时必须要考虑的。对散列表大小的限制,通常数组的长度应该是一个质数。

理想情况下,散列函数会将每个键值映射为唯一的数组索引,然而,键的数量是无限的,散列表的长度是有限的,一个理想的目标是让散列函数尽量将键均匀地映射到散列表中。即使使用一个高效的散列函数,仍然存在将两个键映射为同一个值的可能,这种现象称为碰撞(collision)。当碰撞发生时,我们需要方案去解决。

  • 分离链接:实现散列表底层数组中,每个数组元素是一个新的数据结构,比如另一个数组(二维数组),这样就能存储多个键了。即使两个键散列后的值相同,依然被保存在同样的位置,只不过它们在第二个数组中的位置不一样罢了。
  • 线性探查:当发生碰撞时,线性探测法检测散列表的下一个位置是否为空。如果为空,就将数据存入该位置;如果不为空,则继续检查下一个位置,直到找到一个空的位置为止。

负载因子:如果我们持续往散列表中添加数据空间会不够用。负载因子是已使用的空间比散列表大小的值。比如,散列表大小为13,已使用空间位8,负载因子位0.62。通常当负载因子超过0.8时,就要新开辟空间并重新散列了。

散列表的操作:

方法 操作
put 向散列表添加新键值,或更新键的值
remove 从散列表删除键值
get 返回键索引到的值
# python3
class HashTable:
    def __init__(self, size=11):
        self._keys = [None] * size
        self._values = [None] * size
        self._length = 0

    # 获取负载因子
    @property
    def _load_factor(self):
        return self._length / float(len(self._keys))

    # 散列函数
    def _hash_func(self, key):
        l = len(self._keys)
        idx = abs(hash(key)) % l
        # 获取空索引
        while self._keys[idx] is not None and \
                self._keys[idx] != key:
            idx = (idx + l + 1) % l
        return idx

    def put(self, key, value):
        idx = self._hash_func(key)
        # 更新
        if self._keys[idx] == key:
            self._values[idx] = value
        # 添加
        elif self._keys[idx] is None:
            self._keys[idx] = key
            self._values[idx] = value
            self._length += 1
            # 检查负载因子
            if self._load_factor >= 0.8:
                self._rehash()

    def get(self, key):
        idx = self._hash_func(key)
        if self._keys[idx] == key:
            return self._values[idx]
        return None

    def remove(self, key):
        idx = self._hash_func(key)
        if self._keys[idx] == key:
            self._keys[idx] = None
            self._values[idx] = None
            self._length -= 1
        elif self._keys[idx] is None:
            self._values[idx] = None
        else:
            return -1

    # 重新散列,扩展大小
    def _rehash(self):
        old_keys = self._keys
        old_value = self._values
        new_size = len(self._keys) * 2
        self._keys = [None] * new_size
        self._values = [None] * new_size
        self._length = 0
        for idx in range(len(old_keys)):
            if old_keys[idx] is not None:
                self.put(old_keys[idx], old_value[idx])

    def length(self):
        return self._length

字典

散列表的基本方法就是字典常用的方法,在此可以继承散列表类的方法,然后完善其他的字典支持的方法。

字典的操作:

方法 操作
keys 返回所有键
values 返回所有值
items 返回所有键值对
# python3
class Dict(HashTable):
    def keys(self):
        return [key for key in self._keys if key is not None]

    def values(self):
        return [value for value in self._values if value is not None]

    def items(self):
        return [(self._keys[idx], self._values[idx])
                for idx in range(0, len(self._keys))
                if self._keys[idx] is not None]

    def __iter__(self):
        return iter(self.keys())

    def __len__(self):
        return self.length()

    def __getitem__(self, key):
        return self.get(key)

    def __setitem__(self, key, value):
        self.put(key, value)

    def __contains__(self, key):
        idx = self._hash_func(key)
        return self._keys[idx] is not None

集合

集合是一种包含不同元素的数据结构。集合中的元素被称为成员。集合的两个重要特性:首先,集合中的成员是无序的;其次:集合中不允许相同的成员存在。

集合的定义:

  • 不包含任何成员的集合称为空集,包含一切可能成员的集合称为全集
  • 如果两个和的成员完全相同,则称两个集合相等。
  • 如果一个集合中所有的成员都属于另一个集合,则前一集合称为后一集合的子集

集合的运算:

  • 并集:将两个集合中的成员进行合并,得到一个新集合。
  • 交集:两个集合中共同存在的成员组成一个新的集合。
  • 补集:属于一个集合而不属于另一个集合的成员组成的集合。

其实集合也是个散列表,散列表有键和值,在这里我们把值设置位True即可。具体实现如下。

集合的操作:

方法 操作
put 向集合添加成员。
remove 从集合移除成员。
uNIOn 接收一个集合进行并集运算返回结果
intersection 接收一个集合进行交集运算返回结果
difference 接收一个集合进行补集运算返回结果
# Python3
class Set(HashTable):
    def put(self, key):
        return super(Set, self).put(key, value=True)

    # 并集运算
    def union(self, other):
        if isinstance(other, Set):
            temp = other
            for key in self._keys:
                temp.put(key)
            return temp
        else:
            raise TypeError

    # 交集运算
    def intersection(self, other):
        if isinstance(other, Set):
            temp = Set()
            for key in self._keys:
                if key in other:
                    temp.put(key)
            return temp
        else:
            raise TypeError()

    # 补集运算
    def difference(self, other):
        if isinstance(other, Set):
            temp = Set()
            for key in self._keys:
                if key not in other:
                    temp.put(key)
            return temp
        else:
            raise TypeError()

    def __or__(self, other):
        return self.union(other)

    def __and__(self, other):
        return self.intersection(other)

    def __sub__(self, other):
        return self.difference(other)

    def __len__(self):
        return self._length

    def __iter__(self):
        for key in self._keys:
            if key is not None:
                yield key

    def __contains__(self, key):
        idx = self._hash_func(key)
        return self._keys[idx] is not None

--结束END--

本文标题: 散列表结构 字典与集合

本文链接: https://www.lsjlt.com/news/193244.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 散列表结构 字典与集合
    散列表结构 字典与集合 散列表 散列表(Hash Table)结构是字典(Dictionary)和集合(Set)的一种实现方式。散列算法的作用是尽可能快地在数据结构中找到一个值。在散列表上插入、删除和取用数据都非常快,但是对于查找操作来...
    99+
    2023-01-31
    字典 结构 列表
  • 【Python】基础数据结构:列表——元组——字典——集合
    文章目录 一、简述二、Python中的列表详解2.1 创建列表2.2 访问列表元素2.3 修改列表元素2.4 列表切片2.5 列表方法2.6 列表推导式 三、Python中的元组详解3.1...
    99+
    2023-10-25
    python 数据结构 原力计划
  • python3(元组,列表,集合,字典)
    1.列表 1)创建列表 数组:存储同一种数据类型的集合 scores=[12,13,14] 列表:(打了激素的数组):可以存储任意数据类型的集合 列表里:可以存储不同的数据类型 s=[1,4,5,'ty'] print ...
    99+
    2023-01-31
    字典 列表
  • Python 列表&元组&字典&集合
    列表(list) 有序性,可存储任意类型的值 通过偏移存取,支持索引来读取元素,第一个索引为0 ,倒数第一个索引为-1 可变性 ,支持切片、合并、删除等操作 可通过索引来向指定位置插入元素 可通过pop()方法删除末尾元素,pop(索引...
    99+
    2023-01-30
    字典 列表 Python
  • python列表、元组、字典、集合的简单
    1、常用操作函数 1 #Author:CGQ 2 import copy 3 #列表 4 ''' 5 names=["ZhangYang","XiaoHei","XiaoHei","LiSan"] 6 print(nam...
    99+
    2023-01-30
    字典 简单 列表
  • Python 列表、元组、字典及集合操作
    一、列表 列表是Python中最基本的数据结构,是最常用的Python数据类型,列表的数据项不需要具有相同的类型 列表是一种有序的集合,可以随时添加和删除其中的元素 列表的索引从0开始 1、创建列表 >>> lis...
    99+
    2023-01-30
    字典 操作 列表
  • python 列表,集合和字典的增删改查
    目录一 列表二 集合三 字典总结 一 列表 # 列表:包含0个或多个对象引用的有序队列,用中括号[]表示 # 增加 a = [] a.append(1) # a.append...
    99+
    2024-04-02
  • python_列表——元组——字典——集
    列表——元组——字典——集合: 列表: # 一:基本使用# 1、用途:存放多个值# 定义方式:[]内以逗号为分隔多个元素,列表内元素无类型限制# l=['a','b','c'] #l=list(['a','b','c'])# l1=l...
    99+
    2023-01-30
    字典 列表
  • Python基础学习列表+元组+字典+集合
    目录一、列表二、元组三、字典四、集合五、总节前言: 这一章的知识紧接上一章,零基础的小伙伴可以从上一章学起来。当然,你也可以收藏起来慢慢学习,学习是不可操之过急的啦… ...
    99+
    2024-04-02
  • Python中的字典合并与列表合并技巧
    目录前言1 合并字典2 合并列表前言 又到了每日分享Python小技巧的时候了,今天给大家分享的是Python中两种常见的数据类型合并方法。 1 合并字典 在某些场景下,我们需要对两...
    99+
    2024-04-02
  • Java数据结构之散列表详解
    目录介绍1 散列表概述1.1 散列表概述1.2 散列冲突(hash collision)2 散列函数的选择2.1 散列函数的要求2.2 散列函数构造方法3 散列冲突的解决3.1 分离...
    99+
    2024-04-02
  • Python列表、字典、元组和集合实例分析
    这篇文章主要介绍了Python列表、字典、元组和集合实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python列表、字典、元组和集合实例分析文章都会有所收获,下面我们一起来看看吧。列表1.列表什么是列表...
    99+
    2023-06-30
  • JavaScript字典与集合详解
    目录字典什么是字典JavaScript中的字典字典的应用集合什么是集合JS中的集合集合中的操作交集、并集、差集的封装字典 什么是字典 说到字典,第一时间想到的应该就是新华字典,实际上...
    99+
    2024-04-02
  • Python中的字典与集合
    Dictionary:字典     Set:集合 字典的语法: Dictionary字典(键值对) 语法: dictionary = {key:value,key:value,key n:value n} 与 C# dictionary...
    99+
    2023-01-31
    字典 Python
  • Python数据容器——列表、元组、字符串、集合、字典
    作者:Insist-- 个人主页:insist--个人主页 本文专栏:Python专栏 专栏介绍:本专栏为免费专栏,并且会持续更新python基础知识,欢迎各位订阅关注。 目录 一、了解数据容器 1. 为什么需要数据容器? 2....
    99+
    2023-09-22
    python 数据容器 元组 列表 集合
  • Python字符串,列表,字典和集合实例处理分析
    今天小编给大家分享一下Python字符串,列表,字典和集合实例处理分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.如何...
    99+
    2023-07-02
  • Python基本数据类型--列表、元组、字典、集合
    一、Python基本数据类型--列表(List)  1、定义:[ ]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素。  2、列表的创建:   # 方式一list1 = ['name...
    99+
    2023-06-02
  • python-字典与列表学习
    #字典练习 def print_dict(): contect_file = 'contect_list.txt' f = file(contect_file) #读取 contect_dic = {} ...
    99+
    2023-01-31
    字典 列表 python
  • python集合与字典的用法
    python集合与字典的用法 集合: 1.增加  add 2.删除   •del 删除集合          •discard(常用)删除集合中的元素  #删除一个不存在的元素不会报错     •remove 删除一个不存在的元素会报错 ...
    99+
    2023-01-30
    字典 python
  • Python基础:字典(dict)与集合
    查找场景下与列表的性能对比    字典与集合之所以高效的原因是:内部结构都是一张哈希表。   平均情况下插入、查找和删除的时间复杂度为 O(1).   假设有数量100,000的产品列表: import time id = [x for...
    99+
    2023-01-31
    字典 基础 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作