链表中的频率计数

Frequency count in a linked list

本文关键字:频率计 链表      更新时间:2023-10-16

我有以下链表结构体:

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个元素。有没有更有效的方法?

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

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

听起来你真正需要的是一个映射或一个基本的二叉搜索树。键类型将是您的type值,值类型将保存您的frequency

遍历原始链表并构建二级数据结构,该数据结构是type->count的映射,然后使用该二级数据结构构建频率链表(如果您确实需要它作为链表,这似乎不寻常)。

如果你使用类似哈希映射的东西作为二级映射,这应该是O(n)(你的原始列表的大小的n),你不会做得比渐近更好(或者在实践中,如果你的哈希映射是好的)。

是否有理由排序结构也需要是链表?我将使用一个键为"type",值为"frequency"的哈希表。你可以在0 (n)个时间内完成以下操作:

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

这就得到了频率的索引。然后你只需要把它转换成一个有序的序列——我会用二叉树,但如果你真的需要的话,你也可以用链表。

您是否可以将原始链表本身排序?