- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给出一个数据序列(有重复项),沿着数据序列移动一个固定大小的窗口,并在每次迭代时在窗口中查找模式,其中最旧的数据被删除,新数据被插入到窗口中。
我在这里找不到更好的解决方案。
我的想法:使用哈希表,key就是数据,key的数据就是数据在窗口中出现的频率。
第一次迭代时,遍历窗口中的每条数据并放入hashtable,同时计算每条数据出现的频率。之后遍历哈希表,返回出现频率最高的数据。对于接下来的每次迭代,搜索哈希表中最旧的数据,如果它在 hahstable 中,则将其频率减 1,如果它变为 0,则使用新数据替换旧数据。否则,只需将新数据插入 hahstable 即可。遍历表并返回模式。
它是 O(n * m),其中 n 是数据序列大小,m 是窗口大小。缺点是:散列表的大小不固定,可能会有调整大小的开销。每次迭代都要遍历表,效率不高。
可以用 O(n lg m) 或 O(n) 来完成吗?
感谢任何帮助。
谢谢
另一种解决方案:在第一次迭代中,建立一个哈希表,其中数据作为键,其频率作为与键关联的值。在哈希表的基础上,构建一个以频率为键、关联数据为值的多重图。
之后,在每次迭代中,在窗口中,删除最旧的数据并更新哈希表,然后用哈希表中最新更新的数据更新 multimap。如果map key有多个数据,只用频率不变的数据替换新的。但是,添加具有新频率和数据的新对。
在窗口中,获取新数据并更新哈希表,用哈希表中最新更新的数据更新 multimap 。
位于 multimap (二叉搜索树)最右侧的条目是模式,因为它的值是当前窗口中的最高频率。
时间 O(m + m * lg m + n * lg m) 如果 n >> m,O(n lg m)。空间:O(m)
还有更好的主意吗?
最佳答案
空间 O(M):
及时更新O(lg M):
O(1)
, O(lg M)
,O(lg M)
O(1)
O(lg M)
,O(lg M)
O(1)
您可以通过添加指向 BST 结构的 nextItem
指针来摆脱环形缓冲区,并保留指向最旧项目的外部指针。这通过一次 BST 查找加快了它的速度,如果值大小大于指针大小,则可能是一个空间胜利。但是该算法的编码变得更加复杂。
关于c++ - 在具有重复项的一长串数据的滚动窗口中查找模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9845206/
我正在尝试创建一个程序,其中字符串的前三个字符重复给定次数,如下所示: foo('Chocolate', 3) # => 'ChoChoCho' foo('Abc', 3) # => 'AbcAbcA
我有以下字符串: std::string str = "Mode:AAA:val:101:id:A1"; 我想分离一个位于 "val:" 和 ":id" 之间的子字符串,这是我的方法: std::st
DNA 字符串可以是任意长度,包含 5 个字母(A、T、G、C、N)的任意组合。 压缩包含 5 个字母(A、T、G、C、N)的 DNA 字母串的有效方法是什么?不是考虑每个字母表 3 位,我们可以使用
是否有一种使用 levenstein 距离将一个特定字符串与第二个较长字符串中的任何区域进行匹配的好方法? 例子: str1='aaaaa' str2='bbbbbbaabaabbbb' if str
使用 OAuth 并使用以下函数使用我们称为“foo”(实际上是 OAuth token )的字符串加密 key public function encrypt( $text ) { // a
我是一名优秀的程序员,十分优秀!