2017-03-12 3 views
0

대 배열은 내가 codility에서 시험을했다 : https://codility.com/programmers/lessons/2-arrays/odd_occurrences_in_array/ 나는 두 개의 서로 다른 솔루션 사이의 성능 차이주의 :Codility 성능 차이는 : 해시

1 - 목록 솔루션 :

def solution(list) 
    unmatched_elements = [] 
    list.each{ |el| 
    if unmatched_elements.include? el 
     unmatched_elements.delete el 
    else 
     unmatched_elements.push el 
    end 
    } 
    unmatched_elements[0] 
end 

2 - 해시 솔루션

def solution(a) 
    unmatch = {} 

    a.each do |e| 
    if unmatch[e].nil? 
     unmatch[e] = 1 
    else 
     unmatch.delete e 
    end 
    end 
    unmatch.keys.first 
end 

첫 번째 시도는 일부 시간 초과로 25 %의 성능 점수를 받았습니다. 두 번째 것은 100 % 성능 점수를주었습니다. 왜 그런가요? 나는 해시로 밀어 넣기 만하면 O (n)의 공간 복잡성이 목록과 같은 결과를 낳 겠지만 그렇지 않은 것 같다. 왜 그런가?

답변

3

그것은 공간의 복잡성에 관한 것이 아니라 시간 복잡성에 관한 것입니다. 특히, 배열 (include?)에서 요소를 찾는 것은 일치 할 때까지 각 요소를 검사해야하기 때문에 N 시간 작업입니다. 해시 조회 []은 일정한 시간입니다. 그것이 말하는 시험 조건에서 https://stackoverflow.com/a/4363602/1034681

+0

: 해시 O (1) 검색 시간이 왜

이 대답은 설명, 공간 복잡도는 O 최악의 경우 예상 ("예상되는 최악의 경우 시간 복잡도는 O (N)입니다 1);". 그래서 내가 우주 공간을 확보하는 것이 문제였다. 테스트가 배열의 경우 타임 아웃을 반환했기 때문에 어레이 검색이 O (N)보다 최악이 될 수 있음을 의미합니까? – Jirico

+0

불행히도 나는 모른다. –

+1

@ Jirico : "N"과 "b"가 의미하는 바를 "시간"으로 지정하지 않고 "최악의 경우 예상 시간 복잡도"에 대해 이야기하는 것이 이치에 맞지 않습니다. 일반적으로 알고리즘의 복잡성에 관해 말할 때 항상 허용되는 작업을 알려주는 기계 모델과 허용 된 작업의 비용이 얼마나 많은지를 나타내는 비용 모델을 지정해야합니다. 또한 데이터에 대해 가정 할 수있는 사항을 지정해야하며 마지막으로 "입력 크기"를 정의하는 방법을 지정해야합니다. 예를 들어 튜링 머신 (Turing Machine)에서리스트를 복사하는 것은 O (n)이 아닌 O (n²) 단계를 필요로합니다. ... –