2252번 - 줄 세우기
위상 정렬 문제를 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.어떻게하면 시간복잡도를 줄일 수 있는가?
인접 리스트를 공부하시면 모든 문제가 자연히 해결될 것으로 기대됩니다. 풀이 접근 방향은 맞습니다.
위의 접근방향 인접리스트를 이용해 ...3에서의 시간복잡도를 줄이는 방향이 맞나요?
인접 리스트를 사용하면
(1) 3번 과정을 모든 정점을 합쳐서 O(m)에 할 수 있습니다.(2) indegree가 줄어든 정점만을 확인하는 것으로 4번 과정을 큐에 추가되는 정점 당 O(1)에 할 수 있습니다.
감사합니다 덕분에 잘 해결했습니다!
댓글을 작성하려면 로그인해야 합니다.
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.어떻게하면 시간복잡도를 줄일 수 있는가?