ddhhyy2000   1년 전

merge sort 방식이 시간복잡도가 가장 낮다고 하여 c언어로 구현한 코드입니다. merge sort를 활용하였는데도 시간초과가 나오는데, 위 코드에서 무엇이 시간초과의 원인이 되는 것인지 알려주시면 감사하고, 왜 그 원인이 되는 것인지도 알려주시면 감사합니다. 추가적으로 다른 지적사항이 있어도 가감없이 말씀해주시면 감사히 받겠습니다.

wnwoghd22   1년 전

merge sort는 확실히 시간복잡도에서 가장 우수한 편에 속하긴 하지만, 그건 어디까지나 분할 정복이 제대로 이루어질 때의 얘기입니다.

분할되는 태스크는 그 크기가 작아져야하는데, 위 코드에선 분할되어 작아지는 태스크 안에서 크기 N짜리 배열을 두 개나 만들고 초기화하고 있어 실제로는 전혀 작아지지 않고 있습니다.

위 정렬 방식의 시간복잡도를 보다 엄밀히 분석해보면, 실제 시간복잡도는 N^2 혹은 그 이상입니다.

그리고 재귀로 몇 단계씩 호출되어 들어가는 함수 내에서 저렇게 배열을 크게 만들면 스택 터질 것 같습니다... 

dontsaymyid   1년 전

merge()에서 a와 b를 초기화하는데 각각 1000000번의 대입 연산이 필요하고, 이를 999999번 호출하므로 결과적으로는 O(N^2)와 다를 게 없습니다.

a와 b의 크기를 감당 가능할 정도로 줄이든, 전역 변수로 빼든 해서 초기화 연산을 줄이세요.

ddhhyy2000   1년 전

함수가 여러 번 호출되면서 변수도 여러 번 선언되는 부분을 간과했군요! 두 분 다 정말 감사합니다. 덕분에 해결했습니다!!

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