高效的 set

# 找出商品中有多少种价格
products = [
    (143442, 100),
    (122344, 30),
    (132991, 50),
    (133333, 30)
]

# 法1:
# list实现;A & B两次循环,查找时间复杂度为O(n),最坏时间复杂度为O(n^2)
def find_unique_price_using_list(products):
    unique_price_list = []
    for _, price in products:  # A
        if price not in unique_price_list:  # B
            unique_price_list.append(price)
    return len(unique_price_list)

print('unique price is %s' % find_unique_price_using_list(products))

# 法2:
# set 实现; set为哈希表,无重复元素,添加和查找都为O(1),总为O(n)
def find_unique_price_using_set(products):
    unique_price_set = set()
    for _, price in products:
        unique_price_set.add(price)
    return len(unique_price_set)

print('unique price is %s' % find_unique_price_using_set(products))

# 测试
import time
id = [x for x in range(0, 100000)]
price = [x for x in range(200000, 300000)]
products1 = list(zip(id, price))
st = time.perf_counter()
find_unique_price_using_list(products1)
en = time.perf_counter()
print('list: %.5f' % (en-st))

st = time.perf_counter()
find_unique_price_using_set(products1)
en = time.perf_counter()
print('set: %.5f' % (en-st))

# Output:
unique price is 3
unique price is 3
list: 94.21120
set: 0.02036
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值