zoukankan      html  css  js  c++  java
  • python set dict实现原理和常用数据结构方法分析

    Python数据结构总结

    dict与set的实现原理

    两者的原理都是哈希表。

    dict与set实现原理是一样的,都是将实际的值放到list中。唯一不同的在于hash函数操作的对象,对于dict,hash函数操作的是其key,而对于set是直接操作的它的元素,假设操作内容为x,其作为因变量,放入hash函数,通过运算后取list的余数,转化为一个list的下标,此下标位置对于set而言用来放其本身,而对于dict则是创建了两个list,一个list该下表放此key,另一个list中该下标方对应的value。

    其中,我们把实现set的方式叫做Hash Set,实现dict的方式叫做Hash Map/Table(注:map指的就是通过key来寻找value的过程)。


    下面是常用数据结构和时间复杂度分析。


    string

    不可变。

    方法 解释
    str.count(‘a’) 返回str中字符a的个数
    str.lower() 返回str的小写形式
    str.upper() 返回str的大写形式
    str.strip() 去除str首尾 和空白字符,也可取任意字符
    str.replace(‘a’, ‘z’) 替换全部a为z
    str.find(‘a’) 返回str中第一个a的位置下标
    str.ljust(10, ‘0’) 输出str左对齐,右边补字符0,共10位
    str.rjust(10, ‘0’) 输出str右对齐,左边补字符0,共10位

    list

    可变。

    方法 解释 时间复杂度
    l.append(30) 末尾添加30 O(1)
    l.extend([30, 40, 50]) 合并一个列表到l尾部
    l.pop() 删除l最后一个元素 O(1)
    l.pop(index) 删除l下标为index的元素 O(n)
    l.insert(index, x) 在index位置插入元素x O(n)
    l.sort() 原地排序,升序 O(nlogn)
    l.reverse() 反转列表 O(n)
    l.index() 返回x在列表中的第一个位置 O(1)
    l.count(x) 列表中x存在的个数 O(n)
    l.remove() 删除列表中元素x,只删除第一个 O(n)
    del l[2] 删除下标为2的元素 O(n)
    x in l x是否存在于列表 O(n)

    tuple

    不可变。一旦创建不可更改,不能添加、删除元素,不能存储可变类型的数据。

    方法 解释
    t = (1, 2, 3, 1, 5, 1, 6) 定义
    t.count(1) 元组中数字1的个数
    t[2] # 3 可用下标访问

    set

    可变。集合是无序的、没有重复值。

    只能包含不可变的(可哈希化的)数据类型。列表和字典甚至另一个集合都不能作为集合的元素,但是元组可以(因为元组是不可变的)。

    方法 解释 时间复杂度
    s1 = {1, 2, 3}
    s2 = {1, 3, 4, 5}
    定义
    s1 - s2 # {2} s1独有
    s1 | s2 # {1, 2, 3, 4, 5} 并集 O(n)
    s1 & s2 # {1, 3} 交集 O(n)
    s1.add(9) # {1, 2, 3, 9} 添加元素 O(1)
    s1.pop() 随机删除一个 O(1)
    s1.remove(2) s1删除元素2 O(1)
    s1.clear() 清空 O(1)
    s1.union(s2) 并集,相当于 | O(n)
    s1.intersection(s2) 交集,相当于 & O(n)
    s1.issubset(s2) s1是否为s2子集
    x in s1 x 是否存在于s1 O(1) , set原理为哈希表

    由于集合本身是可变的,因此,要想在一个集合中嵌入另一个集合,需要用frozenset创建一个不可变的集合。

    a = frozenset([1, 2, 3])
    b = set([1, 2, a])        # b为{frozenset({1, 2, 3}), 1, 2}
    

    为什么使用集合?

    1. 集合内元素是不重复的,因此可以将list或其他类型的数据转换成集合,从而过滤掉其中的重复元素。

    dict

    key:value,key不可变,value可变。

    方法 解释
    d.keys() dict_keys列表
    d.values() dict_values列表
    d.items() [(key, value), (key, value), ..],列表元组
    d.get(key) 无值返回None O(1)
    d.get(key, default_value) 无值返回设定的默认值default_value O(1)
    del d[key] 删除key-value O(1)
    d[key] = value 增加 O(1)
    x in d 判断x是否在d.keys()中 O(1),dict原理为哈希表

    自Python3.6以后,dict就是有序的了,保持了插入时的顺序,不需要再用collections.OrderedDict保持插入顺序了。若要把字典从小到大排序输出,排序d.keys()即可:

    for key in sorted(d.keys()):
        print(key, d[kdy])
    
  • 相关阅读:
    Spring注解开发系列Ⅵ --- AOP&事务
    Spring注解开发系列Ⅴ --- 自动装配&Profile
    Spring注解开发系列Ⅲ --- 生命周期
    Spring注解开发系列Ⅱ --- 组件注册(下)
    .net Core在过滤器中获取 系统接口方法(以IMemoryCache 为例) 及HttpContext 获取系统接口
    【旧文章搬运】炉子给的SYSTEM_HANDLE_TYPE有点错误
    【旧文章搬运】超级无敌大炉子的LzOpenProcess
    【旧文章搬运】PE重定位表学习手记
    【旧文章搬运】ZwQuerySystemInformation枚举内核模块及简单应用
    【旧文章搬运】ZwQuerySystemInformation枚举进线程信息
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/12849647.html
Copyright © 2011-2022 走看看