2017-03-12 63 views
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,但它似乎不是,爲什麼?

回答

3

這不是空間複雜性,而是時間複雜性。具體而言,查找數組中的元素(include?)是N次操作,因爲它需要檢查每個元素直到匹配。哈希查找[]是恆定時間。

這樣的回答解釋了爲什麼散度爲O(1)搜索時間:https://stackoverflow.com/a/4363602/1034681

+0

在試驗條件下,它說:「預計最壞情況下的時間複雜度爲O(N);預計最壞情況下的空間複雜度爲O( 1);」。這就是爲什麼我認爲空間是問題所在。由於測試在數組情況下返回超時,這意味着數組搜索可能比O(N)最差? – Jirico

+0

不幸的是我不知道。 –

+1

@Jirico:談論「O(N)期望的最壞情況時間複雜度」沒有意義,沒有指定a)「N」表示什麼,b)「時間」表示什麼。一般來說,當談論算法複雜性時,您總是需要指定一個機器模型(它告訴您哪些操作是允許的)和一個成本模型(它告訴您每個允許的操作是多麼昂貴)。您還需要指定您可以對數據進行哪些假設,最後,您需要指定如何定義「輸入大小」。例如:在圖靈機中,複製一個列表需要O(n2)個步驟,而不是O(n)。 ... –