C++ 在包含重复数据的长序列的滚动窗口中查找模式
给出一个数据序列(具有重复项),沿数据序列移动一个固定大小的窗口,并在每个iteraion的窗口中查找模式,其中删除最旧的数据并向窗口插入新数据 我在这里找不到更好的解决办法 我的想法是: 使用哈希表,key是数据,key的数据是窗口中数据出现的频率 在第一次迭代中,迭代窗口中的每个数据并将其放入哈希表,同时计算每个数据的频率。之后,遍历哈希表并返回频率最高的数据。 对于下面的每次迭代,搜索哈希表中最旧的数据,如果它在hahstable中,则将其频率降低1如果它变为0,则使用新数据替换旧数据。否则,只需将新数据插入数据库即可。遍历表并返回模式 它是O(n*m),其中n是数据序列大小,m是窗口大小。 缺点是:哈希表的大小不是固定的,它可能有调整大小的开销。每次迭代都要遍历表,这是不高效的 可以用O(n lgm)或O(n)来做吗 感谢您的帮助 谢谢 另一个解决方案: 在第一次迭代中,建立一个哈希表,其中数据作为键,其频率作为与键关联的值。在哈希表的基础上,建立以频率为键、关联数据为值的多重映射 之后,在每次迭代中,在窗口中删除最旧的数据并更新哈希表,然后使用哈希表中最新更新的数据更新多重映射。如果映射键有多个数据,则仅将其替换为频率未更改的数据。但,添加一对新的频率和数据 在窗口中,获取新数据并更新哈希表,使用哈希表中最新更新的数据更新多重映射 位于multimap(二元搜索树)最右侧的条目是模式,因为它的值是当前窗口中的最高频率 时间O(m+m*lgm+n*lgm)如果n>>m,O(n lgm)。 空格:O(m)C++ 在包含重复数据的长序列的滚动窗口中查找模式,c++,algorithm,data-structures,hash,mode,C++,Algorithm,Data Structures,Hash,Mode,给出一个数据序列(具有重复项),沿数据序列移动一个固定大小的窗口,并在每个iteraion的窗口中查找模式,其中删除最旧的数据并向窗口插入新数据 我在这里找不到更好的解决办法 我的想法是: 使用哈希表,key是数据,key的数据是窗口中数据出现的频率 在第一次迭代中,迭代窗口中的每个数据并将其放入哈希表,同时计算每个数据的频率。之后,遍历哈希表并返回频率最高的数据。 对于下面的每次迭代,搜索哈希表中最旧的数据,如果它在hahstable中,则将其频率降低1如果它变为0,则使用新数据替换旧数据。否
还有更好的主意吗 回顾前一个问题的解决方案 维护数据值的环形缓冲区。创建一个频率/数据值对类型 维护一张地图,将数据键入这些对;制作一个多重映射,键入频率,也包含这样的对 在通过数据前进的每一步中,模式都是地图上的最后一个输入项,输入频率。可能会有一条领带——如何处理这条领带是读者的一个练习。报告模式后,需要使用映射查找属于要删除的值的对;然后从多重映射中检索所有具有删除频率的条目,并找到具有正确值的条目。删除、更改和重新将节点插入地图和多重地图,以处理删除的数据;使用类似的过程来处理添加的数据。根据您的预期数据,可能需要首先检查要插入的值是否与要删除的值匹配。空格O(M):
- 一个用于保存M值的环形缓冲区李>
- 一个BST,包含M{值,PQ指针}对李>
- 一个优先级队列包含M个计数
- 在环形缓冲区中找到偏离值
O(1)
- 在BST
中找到相同的值O(lg M)
- 调整链接PQ节点中的计数。
- 在该节点上调整优先级
O(lg M)
- 在该节点上调整优先级
- 将旧的环形缓冲区条目替换为新的
O(1)
- 在BST
中查找新值O(lg M)
- 调整链接PQ节点中的计数。
- 在该节点上调整优先级
O(lg M)
- 在该节点上调整优先级
- 首先在PQ上查找模式
O(1)
nextItem
指针,并保留一个指向最旧项的外部指针,来摆脱环形缓冲区。这将通过一次BST查找来加快速度,如果值大小大于指针大小,则可能是一次空间胜利。但是编码算法变得更加复杂。您应该提到您的