pre_f_86   2년 전

위상 정렬 문제를 q를 이용해 풀어보려 했습니다. 

시간초과는 약 8~12퍼에서 나옵니다.

아래는 시간복잡도를 계산하는 과정인데 맞는지 한번 확인 후 피드백 부탁드리겠습니다.

f함수의 시간복잡도를 계산해보았습니다.

countenter 배열은 진입 간선의 갯수를 파악하는 배열입니다.

...1 에서는 간선들을 모두 확인하며 진입간선들의 갯수를 파악 //O(m)

...2 에서는 진입간선이 없는 정점들을 q에 추가 //O(n)

---3 간선들 중에서 q에 front에 있는 정점의 진출간선을 checkq에 추가 //o(m)

...4 checkq 에 추가된 정점들이 각각 진입간선이 없다면 해당 정점을 q에 추가 //최악의경우 o(n)

...3과 ...4가 모든 정점에서 한번씩 반복되므로 O(n(n+m)) = O(n^2+nm);

따라서 f의 시간 복잡도는 O(n^2+nm+m+n)이다.

이 때 O(mn) > o(m+n) (m n이 충분히 크다고 가정할때) 이므로 

f의 시간 복잡도는 O(n^2+mn)으로 보아도 된다.

혹시나 괜찮으시다면 다음 두 질문도 답해주시면 감사하겠습니다.

1. 이 문제 풀이가 잘못되었는가?  아예 접근을 다시 해야하는가?

2.어떻게하면 시간복잡도를 줄일 수 있는가?

ryute   2년 전

인접 리스트를 공부하시면 모든 문제가 자연히 해결될 것으로 기대됩니다. 풀이 접근 방향은 맞습니다.

pre_f_86   2년 전

위의 접근방향 인접리스트를 이용해 ...3에서의 시간복잡도를 줄이는 방향이 맞나요?

ryute   2년 전

인접 리스트를 사용하면

(1) 3번 과정을 모든 정점을 합쳐서 O(m)에 할 수 있습니다.
(2) indegree가 줄어든 정점만을 확인하는 것으로 4번 과정을 큐에 추가되는 정점 당 O(1)에 할 수 있습니다. 

pre_f_86   2년 전

감사합니다 덕분에 잘 해결했습니다!

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