每个元素列表中出现的次数

时间:2014-06-08 10:40:06

标签: algorithm functional-programming

给出列表[x_1,x_2,...,x_n]。我正在寻找一个函数的有效实现,该函数将列表作为输入并输出类型[(x_1',n_1),...,(x_m',n_m)]的列表,其中x_i'都是distinct和n_i表示输入列表中x_i'的出现次数。

在没有突变的二次时间内,有一种简单的方法可以做到这一点。但是,在命令式语言中,x_i可以用小数值表示的典型简单方法是使用数组并在每个列表元素上执行数组[x_i] ++,然后扫描数组以获取非零条目并使用该方法构造输出列表。然后运行时是线性的(对于非常小的输入,性能很差)。

有一个明显更好的实现没有突变。如果x_i具有明确定义的排序,则可以构造二叉搜索树。在树中查找(x_i,k)。如果它不在树插入(x_i,1)中,否则从树中删除(x_i,k)并插入(x_i,k + 1)。最后,遍历树将其转换为列表。或者,对列表进行排序,然后以线性时间遍历它。两者都是O(nlog(n))。

是否有更好的算法没有变异?

1 个答案:

答案 0 :(得分:0)

考虑以下问题:给定可比较值的一般列表,确定所有元素是否都是唯一的。

假设您对这些值的所有了解都是比较操作,您可以使用sorting lower bound proof来表明此算法需要O(n log n)步骤。由于你的问题解决了比这个问题更强的问题,它也有O(n log n)作为下限。