minjun623   3년 전

만약 a개와 b개의 집합을 합칠 경우, 시간 복잡도는 O(min(a, b)) 입니다.

집합 합치는 연산을 10만번까지 할수 있으니, 제가 생각하는 최악의 시간 복잡도를 적어보겠습니다.

s(a) + s(b) 를 집합 크기가 각각 a, b 인 집합을 합치는거라고 정의하면.

s(1) +s(1), ~, s(1) + s(1) 갯수 총 5만개

s(2) + s(2), ~ s(2) + s(2) 갯수 총 2만 5천개

s(4) + s(4) ~ s(4) + s(4) 갯수 총 1만 2500개

~

~

s(50000) + s(50000) 갯수 총 1개


->


1*50000 + 2*25000 + 4*12500 + 8*6250 + ~ 50000*1 << 10^8이라고 생각 됩니다.

왜 시간초과가 뜨는지 이해하지 못했습니다.

도와주세요.

shg9411   3년 전

일단 원소의 개수는 최대 100만개입니다.

minjun623   3년 전

원소의 개수가 100만개이지만, 합하는 연산의 최대수는 10만번 아닌가요?

pichulia   3년 전

memo_size 가 제 역할을 못하고 있습니다.

memo_size[memo_id[a]] += memo_size[memo_id[b]]; 와 같은 방식으로 동작하도록 수정해보세요.

minjun623   3년 전

어떤 말씀을 하신건지는 이해를 하지만 그래도 시간초과가 나네요.....

pichulia   3년 전

memo_id가 제 역할을 못하고 있습니다.

minjun623   3년 전

a -> memo_id[a], b-> memo_id[b] 수정해도 시간초과가 나는데 여기서 더 수정해야 할 부분이 어디있을까요?

pichulia   3년 전

memo_size[memo_id[a]] += memo_size[memo_id[b]]; 만 수정하고 나머진 수정 안하셨네요...

memo_id[a], memo_id[b] 가 사용되어야 하는 곳과 그냥 a,b가 사용되는 곳을 잘 구분해서 구현해보세요.

minjun623   3년 전

그런가요? 죄송합니다. 꼼꼼히 봤어야 하는데..

도움 주셔서 감사합니다.

댓글을 작성하려면 로그인해야 합니다.