42desix   5년 전

안녕하세요, 한참 고민하다가 도저히 답이 안 나와서 질문 올립니다.

힙 구현하기가 너무 싫어서 바이너리서치로 구현해봤습니다. 삽입시 재귀 이진탐색을 통해 배열리스트에서 들어가야 할 위치를 찾고, 삭제시 배열리스트의 처음이나 끝에 있는 값을 제거합니다.

삭제 연산은 정렬된 배열리스트의 처음이나 끝을 출 O(1)의 시간이 걸립니다.  삽입연산은 이진탐색을 동반하며, 32비트 정수가 입력으로 주어지므로 삽입연산의 시간복잡도는 최악의 경우 log_2(2^32) = 32가 될 것입니다. 이는 두 개의 힙을 썼을 때의 최악의 경우인 2 * log_2(100만) = 40보다 오히려 작은 값입니다. 결국 최악의 경우 100만 * log(2^32) = 3200만번 정도의 연산을 수행하게 될 것으로 예상합니다.

채점을 돌려보면 1%는 통과가 되고, 3%에 가자마자 시간초과가 납니다. 혹시 Operation 객체 생성하는 데 시간이 오래 걸리나 싶어서 배열리스트 2개로도 돌려봤지만 결과는 같았습니다. 어디에서 문제가 생기는걸까요?

42desix   5년 전

add 연산이 O(N)이 걸리는 걸 간과해서 시간초과 난 것 같습니다. ㅠㅠ

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