set和哈希表原理

#集合,由任意个元素构成的集体
#它是可变的,无序的,不重复的元素的集合
set()空集合
set(iterable) new set object
s1=set(range(5))
print(s1,type(s1))
{0, 1, 2, 3, 4} <class 'set'>

{{1},[1],{}} 集合里面不能放集合,列表,空字典
单个元素增加
x=set()
x.add(1)
#增加多个元素
x.update(range(3),'abc')
{0, 1, 2, 'a', 'b', 'c'}
元素行政:
去重:在集合中,所有元素必须相异
无序:因为无序,所有不可索引
可哈希:python集合中的元素必须可以hash,即元素都是可以
使用内建函数hash。目前学过不可以hash的类型有
list set bytearry
可迭代:set中元素不一样,但元素都可以迭代出来
for i in {1,'abe'}:
print(i)
#删除集合元素
x.remove()#key,唯一的不重复的
x.clear()#清除
x.discard()#废弃
x.pop()#无序的,没有最后一个
#修改元素,其实没有改的
x.remove('b') #移除b,增加d,先删后增
x.add('d')


#效率问题
魔术方法
%timeit 一个百分号后面只能跟一个表达式
%timeit (-1 in list(range(100))) #(O(n))
%timeit (-1 in set(range(100)))
上面两个时间比较久,是因为构造列表和集合的时候费时间
%%timeit setup:两个%后面可以进行初始设置

%%timeit x=list(range(100))
-1 in x
%%timeit x=set(range(100))
-1 in x
上面两个找的时候,时间很快
线性表in O(n),哈希表O(1)
线性表遍历、哈希表遍历,谁的效率高?
O(n),遍历只跟规模有关,数据越多,越慢

hash首先确定一个巨大的地址空间,空间是有限的
x%500000000000000000 hash值,住房间
x%5 # hash 冲突
####
#线性数据结构,搜索元素的时间复杂度是O(n),即随着
数据规模增加耗时增大
#set dict使用hash表实现,内部使用hash值作为key,
时间复杂度为O(n),信号线时间和数据规模无关,不会
随着数据规模增大而搜索性能下降

可哈希:
数值型int float compex
布尔型True False
字符串string bytes
tuple
None
以上都是不可变类型,称为可哈希类型,hashable

posted @ 2022-09-19 10:57  红丿领巾  阅读(53)  评论(0)    收藏  举报