파이썬 목록 세트 쿼리 효율성 비교

LeetCode 141. Linked List Cycle에서 list를 사용하고 노드를 저장하도록 설정하면 순회 시간이 크게 달라집니다.

따라서 목록과 집합의 쿼리 효율성을 비교하는 테스트를 수행하십시오.

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   결론 :

단일 쿼리에서 : 목록이 O (n) 인 것 같습니다. 세트가 중복 제거되는 동안 본질은 레드-블랙 트리 (추측, STL은 레드-블랙 트리), 복잡성 O (logn)이어야합니다 .dict는 유사합니다. to key 해시를 수행 한 다음 검색 할 해시에서 red-black 트리를 생성하며 검색의 복잡성은 소위 O (1)가 아니라 실제로 O (logn)입니다. O (1)은 이상적인 구현 일 뿐이며 실제로 많은 해시 구현이 이산화되어 있습니다. dict는 set보다 해시 프로세스가 하나 더 많으므로 set보다 느리지 만 차이는 크지 않습니다.
————————————————
저작권 성명 :이 기사는 CSDN 블로거 "Icoding_F2014"의 원본 기사이며 CC 4.0 BY-SA 저작권 계약을 따릅니다. 원본 소스를 첨부하세요. 링크 및 재 인쇄에 대한이 진술..
원본 링크 : https://blog.csdn.net/jmh1996/article/details/78481365

 

추신

1. 목록을 사용하여 노드 저장

# 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을 사용하여 노드를 저장하십시오.

# 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 

 

 

추천

출처blog.csdn.net/authorized_keys/article/details/104819202