python list set 查询效率对比

本文通过实验对比了Python中List和Set的数据结构在查询效率上的差异,特别是在处理大量节点的链表循环检测问题上。实验表明,Set的查询效率远高于List,这主要归因于Set内部使用了类似于红黑树的数据结构,而List则需线性搜索。此外,文中还探讨了Dict的查询效率,指出其实现并非完全的O(1),而是接近O(logn)。
部署运行你感兴趣的模型镜像

在LeetCode 141. Linked List Cycle中,分别使用list和set存储node,遍历时间差别巨大。

因此,做测试对比list和set的查询效率。

import time
import numpy as np

nums = np.random.randint( 0, 1e7, int(1e3))
set1 = set(np.random.randint(0, 1e7, int(1e5)))
list1 = list(set1)

t1 = time.time()
for i in nums:
    i in set1
t2 = time.time()
for i in nums:
    i in list1
t3 = time.time()
print(t2-t1)
print(t3-t2)

引用 Icoding_F2014  的结论:

单次查询中:看来list 就是O(n)的;而set做了去重,本质应该一颗红黑树(猜测,STL就是红黑树),复杂度O(logn);dict类似对key进行了hash,然后再对hash生成一个红黑树进行查找,其查找复杂其实是O(logn),并不是所谓的O(1)。O(1)只是理想的实现,实际上很多hash的实现是进行了离散化的。dict比set多了一步hash的过程,so 它比set慢,不过差别不大。
————————————————
版权声明:本文为CSDN博主「Icoding_F2014」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jmh1996/article/details/78481365

 

PS

1. 用list存储node

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        nodes = []
        while head != None:
            if head in nodes:
                return True
            else:
                nodes.append(head)
            
            head = head.next
        return False 

 

2. 用set存储node

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        # set要比list的遍历速度快
        nodes = set()
        while head != None:
            if head in nodes:
                return True
            else:
                nodes.add(head)
            
            head = head.next
        return False 

 

 

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值