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