대 배열은 내가 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)의 공간 복잡성이 목록과 같은 결과를 낳 겠지만 그렇지 않은 것 같다. 왜 그런가?
: 해시 O (1) 검색 시간이 왜
이 대답은 설명, 공간 복잡도는 O 최악의 경우 예상 ("예상되는 최악의 경우 시간 복잡도는 O (N)입니다 1);". 그래서 내가 우주 공간을 확보하는 것이 문제였다. 테스트가 배열의 경우 타임 아웃을 반환했기 때문에 어레이 검색이 O (N)보다 최악이 될 수 있음을 의미합니까? – Jirico
불행히도 나는 모른다. –
@ Jirico : "N"과 "b"가 의미하는 바를 "시간"으로 지정하지 않고 "최악의 경우 예상 시간 복잡도"에 대해 이야기하는 것이 이치에 맞지 않습니다. 일반적으로 알고리즘의 복잡성에 관해 말할 때 항상 허용되는 작업을 알려주는 기계 모델과 허용 된 작업의 비용이 얼마나 많은지를 나타내는 비용 모델을 지정해야합니다. 또한 데이터에 대해 가정 할 수있는 사항을 지정해야하며 마지막으로 "입력 크기"를 정의하는 방법을 지정해야합니다. 예를 들어 튜링 머신 (Turing Machine)에서리스트를 복사하는 것은 O (n)이 아닌 O (n²) 단계를 필요로합니다. ... –