2013-10-27 18 views
0

我試圖找到列表的模式,並返回該模式的元組以及它在列表中出現的次數。 我這有一個地步,我可以返回每個數字和之後發生的次數的列表,但它也給我出現過第一,返回更大的元組值

fun counter(_, nil) = 0 
    | counter(a, x::xs) = if a = x then 1+counter(a, xs) 
      else counter(a, xs); 

fun countList(nil) = [] 
    | countList(x::xs) = 
    (x, counter(x, x::xs))::countList(xs); 

val lst = countList([1,2,1,1,3,4,5,2,1,2,1]); 

給我VAL LST = [( 1,5),(2,3),(1,4),(1,3),(3,1),(4,1),(5,1),(2,2),(1, 2),(2,1),(1,1)] :(int * int)list

這不應該是一個問題,只是循環每個值,看看第一個值是否相等,然後給第一個價值,然後只返回最大的一個(s),但我似乎無法弄清楚這一部分。 我想我只是無法遍歷列表,並與我正在檢查的當前值進行比較。

回答

1

在計算了lst列表後,您無需在其中找到匹配的元素。你唯一需要做的就是遍歷這個列表來找到具有最大元組第二個值的元素。

fun findMax l = 
    let fun find (nil, acc) = acc 
    | find ((value, count)::xs, (acc_value, acc_count)) = 
    if count > acc_count then find (xs, (value, count)) 
    else if value = acc_value then (acc_value, acc_count) 
    else find (xs, (acc_value, acc_count)) 
    in find (l, (0, 0)) end; 

findMax lst; 
val it = (1, 5): int * int 

然而,這種解決方案具有爲O(n 2 )的複雜性。或者,您可以首先在O(n * log n)時間內對元素進行排序,然後從列表中返回出現次數最多的第一個元素(或多個元素)。

+0

這很好,現在我只需要弄清楚如何適應這個返回一個列表,因爲如果有兩個值發生最多但具有相同的出現次數,我需要列表中的這兩個值。 – Nexion