链表中的频率计数
Frequency count in a linked list
我有以下链表结构体:
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]++;
这就得到了频率的索引。然后你只需要把它转换成一个有序的序列——我会用二叉树,但如果你真的需要的话,你也可以用链表。
您是否可以将原始链表本身排序?
相关文章:
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 使用std::list创建循环链表
- 链表的泛型函数remove()与成员函数remove)
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 我们可以删除链表中静态内存中的节点吗
- C++,指针数组,指向双链表中的条目
- 链表中写入访问冲突的未知原因
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 打印所有链表的元素 (C++)
- 错误:需要类名(链表c++)
- 为什么C中的通用链表中存储的数据已损坏
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 链表c++插入,所有情况都已检查,但没有任何工作
- 链表,将列表复制到另一个列表
- 链表中的频率
- 链表中的频率计数