0
我在codility做了一個試驗:https://codility.com/programmers/lessons/2-arrays/odd_occurrences_in_array/我注意到兩種不同的解決方案之間的性能差異:Codility性能差異:陣列VS散列
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%的成績。這是爲什麼?我試圖推送一個Hash會導致O(n)空間複雜度像一個List,但它似乎不是,爲什麼?
在試驗條件下,它說:「預計最壞情況下的時間複雜度爲O(N);預計最壞情況下的空間複雜度爲O( 1);」。這就是爲什麼我認爲空間是問題所在。由於測試在數組情況下返回超時,這意味着數組搜索可能比O(N)最差? – Jirico
不幸的是我不知道。 –
@Jirico:談論「O(N)期望的最壞情況時間複雜度」沒有意義,沒有指定a)「N」表示什麼,b)「時間」表示什麼。一般來說,當談論算法複雜性時,您總是需要指定一個機器模型(它告訴您哪些操作是允許的)和一個成本模型(它告訴您每個允許的操作是多麼昂貴)。您還需要指定您可以對數據進行哪些假設,最後,您需要指定如何定義「輸入大小」。例如:在圖靈機中,複製一個列表需要O(n2)個步驟,而不是O(n)。 ... –