Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在包含重复数据的长序列的滚动窗口中查找模式_C++_Algorithm_Data Structures_Hash_Mode - Fatal编程技术网

C++ 在包含重复数据的长序列的滚动窗口中查找模式

C++ 在包含重复数据的长序列的滚动窗口中查找模式,c++,algorithm,data-structures,hash,mode,C++,Algorithm,Data Structures,Hash,Mode,给出一个数据序列(具有重复项),沿数据序列移动一个固定大小的窗口,并在每个iteraion的窗口中查找模式,其中删除最旧的数据并向窗口插入新数据 我在这里找不到更好的解决办法 我的想法是: 使用哈希表,key是数据,key的数据是窗口中数据出现的频率 在第一次迭代中,迭代窗口中的每个数据并将其放入哈希表,同时计算每个数据的频率。之后,遍历哈希表并返回频率最高的数据。 对于下面的每次迭代,搜索哈希表中最旧的数据,如果它在hahstable中,则将其频率降低1如果它变为0,则使用新数据替换旧数据。否

给出一个数据序列(具有重复项),沿数据序列移动一个固定大小的窗口,并在每个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)


还有更好的主意吗

回顾前一个问题的解决方案

维护数据值的环形缓冲区。创建一个频率/数据值对类型

维护一张地图,将数据键入这些对;制作一个多重映射,键入频率,也包含这样的对

在通过数据前进的每一步中,模式都是地图上的最后一个输入项,输入频率。可能会有一条领带——如何处理这条领带是读者的一个练习。报告模式后,需要使用映射查找属于要删除的值的对;然后从多重映射中检索所有具有删除频率的条目,并找到具有正确值的条目。删除、更改和重新将节点插入地图和多重地图,以处理删除的数据;使用类似的过程来处理添加的数据。根据您的预期数据,可能需要首先检查要插入的值是否与要删除的值匹配。

空格O(M):

  • 一个用于保存M值的环形缓冲区
  • 一个BST,包含M{值,PQ指针}对
  • 一个优先级队列包含M个计数
及时更新O(lg M):

  • 在环形缓冲区中找到偏离值
    O(1)
  • 在BST
    O(lg M)
    中找到相同的值
  • 调整链接PQ节点中的计数。
    • 在该节点上调整优先级
      O(lg M)
  • 将旧的环形缓冲区条目替换为新的
    O(1)
  • 在BST
    O(lg M)
    中查找新值
  • 调整链接PQ节点中的计数。
    • 在该节点上调整优先级
      O(lg M)
  • 首先在PQ上查找模式
    O(1)
您可以通过添加一个指向BST结构的
nextItem
指针,并保留一个指向最旧项的外部指针,来摆脱环形缓冲区。这将通过一次BST查找来加快速度,如果值大小大于指针大小,则可能是一次空间胜利。但是编码算法变得更加复杂。

您应该提到您的