链表中的频率计数

时间:2011-04-17 06:40:48

标签: c++

我有一个链表的结构:

struct Node {
    int type;
    int otherInfo;
    Node * next;
}

我想创建一个排序(最终)链接列表,跟踪每个“类型”出现的次数。示例节点将是:

struct Node2 {
    int type;
    int frequency;
    //A linked list to keep track of the "otherInfo"
    Node2 * next;
}

我当前的算法是O(n ^ 2),这是不合理的,因为原始链表有时可能有超过30,000个元素。有没有更有效的方法来做到这一点?

注意:类型可以是几乎任何正整数,所以我不能简单地创建一个以类型作为索引的静态数组。

编辑:频率列表不必是链表。我举了这个例子。稍后在程序中,我使用堆对频率列表进行排序。我只需要稍后能够遍历频率列表。

4 个答案:

答案 0 :(得分:2)

迭代原始链表,并建立一个辅助数据结构,这是一个来自type-> count的映射,然后使用该辅助数据结构来构建频率链表(如果你真的需要它作为链表,这似乎很不寻常)。

如果你对辅助地图使用类似哈希映射的东西,那么这应该是O(n)(原始列表的大小),并且你不会渐渐地(或者在实践中如果你的话)做得更好哈希映射很好。)

答案 1 :(得分:2)

听起来你真正需要的是地图或基本的二元搜索树。密钥类型将是您的type值,值类型将保留您的frequency

答案 2 :(得分:1)

排序结构是否还需要成为链表?我使用带有“类型”键和频率值的哈希表。在O(n)时间,您可以在列表中运行:

while(node.next != null)
    hashtable[type]++;

这可以获得频率指数。然后你只是把它转换成一个排序的序列 - 我会使用一个二叉树,但你可以使用一个链表,如果你真的不得不最终得到它。

答案 3 :(得分:0)

您是否可以按原样排序原始链表?