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) 列表

这不应该是一个问题,只需遍历每个值,看看第一个值是否相等,然后只给出第一个值,然后只返回最大的值,但我似乎无法弄清楚那部分。我想我只是无法循环遍历列表并与我正在检查的当前值进行比较。

4

1 回答 1

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) 时间内首先对元素进行排序,然后返回列表中出现次数最多的第一个元素(或几个元素)。

于 2013-10-27T19:35:30.757 回答