[Python] Nested list time complexity
2608 ワード
Pythonを用いて符号化する場合,Nested listを簡潔な表現やパラメータとして用いることが多い.3つのlistを作成して管理する以上、1つのリストからtupleまで3つのパラメータを含み、インデックスでアクセスするのは簡単です.
しかし、nested listを使って本当にしばらく試してみたのが問題です.白駿10216 Disjoin-set設計アルゴリズムを使用すると、O(n^2)が現れる可能性があるので、タイムアウトが懸念され、予想通りタイムアウトが発生しました.でも問題は...つまり、もう一つの解法は私のアルゴリズムの流れに従います.でも.Pythonの接着剤がなかったので、しばらくCを見ただけで、本当に読めなかったので、簡単にPythonの接着剤を見つけましたが、やはり知らず、悩んでしまいました.
問題は、NestedListの時間がList*Nの時間よりずっと長いことである.次のコードを返すと、nested listは5.42 s、3 listは2.33秒かかります.重複する数が少なければ賞はありません.そうしないと大きな違いがあります.これを探してる...どれくらい時間がかかったか...ぜひ参考にしてください
問題を解くときに参考にしてください.
しかし、nested listを使って本当にしばらく試してみたのが問題です.白駿10216 Disjoin-set設計アルゴリズムを使用すると、O(n^2)が現れる可能性があるので、タイムアウトが懸念され、予想通りタイムアウトが発生しました.でも問題は...つまり、もう一つの解法は私のアルゴリズムの流れに従います.でも.Pythonの接着剤がなかったので、しばらくCを見ただけで、本当に読めなかったので、簡単にPythonの接着剤を見つけましたが、やはり知らず、悩んでしまいました.
問題は、NestedListの時間がList*Nの時間よりずっと長いことである.次のコードを返すと、nested listは5.42 s、3 listは2.33秒かかります.重複する数が少なければ賞はありません.そうしないと大きな違いがあります.これを探してる...どれくらい時間がかかったか...ぜひ参考にしてください
import time
it = 1000000
nest_list = [(i-1, i, i+1) for i in range(1, it)]
a_list = [i-1 for i in range(1, it)]
b_list = [i for i in range(1, it)]
c_list = [i+1 for i in range(1, it)]
start = time.time()
for i in range(it-1):
ans = nest_list[i][0] + nest_list[i][1] + \
nest_list[i][2]
print(f"nest list iteration time {time.time() - start}")
start = time.time()
for i in range(it-1):
ans = a_list[0] + b_list[1] + c_list[2]
print(f"normal 3 list iteration time {time.time() - start}")
問題を解くときに参考にしてください.
# O(n^2) 알고리즘으로 풀어낼 수 있지않을까? disjoint-set과 함께
import sys
DEBUG = True
def log(message):
if DEBUG:
print(message)
def find(i):
if parent[i] != i:
parent[i] = find(parent[i])
return parent[i]
def union(irep,jrep):
if size[irep] < size[jrep]:
parent[irep] = jrep
size[jrep] += size[irep]
size[irep] = 0
else:
parent[jrep] = irep
size[irep] += size[jrep]
size[jrep] = 0
T = int(sys.stdin.readline())
for _ in range(T):
N = int(sys.stdin.readline())
parent = [i for i in range(N)]
size = [1] * (N)
ans = N
x_pos, y_pos, radius = [], [], []
for _ in range(N):
x, y, r = map(int, sys.stdin.readline().split())
x_pos.append(x)
y_pos.append(y)
radius.append(r)
for i in range(N-1):
for j in range(i+1, N):
x_diff = x_pos[i] - x_pos[j]
y_diff = y_pos[i] - y_pos[j]
dist = radius[i] + radius[j]
if (x_diff**2) + (y_diff**2) <= dist **2:
irep = find(i); jrep = find(j)
if irep != jrep:
union(irep,jrep)
# parent[irep] = jrep
ans -= 1
sys.stdout.write(f"{ans}\n")
Reference
この問題について([Python] Nested list time complexity), 我々は、より多くの情報をここで見つけました https://velog.io/@koo82/Python-Nested-list-time-complexityテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol