Algorithm 确定顶部';m';最常见的k-Page序列
一个网站有几个网页,有很多用户正在访问该网站。 假设-- 列表中还有很多用户,这些用户是有限的和有编号的。 现在的问题是我们必须确定前m个最常见的k-Page序列。 对于上述示例,结果将是:(k=3,m=3)a->b->c,b->c->d,z->a->bAlgorithm 确定顶部';m';最常见的k-Page序列,algorithm,data-structures,Algorithm,Data Structures,一个网站有几个网页,有很多用户正在访问该网站。 假设-- 列表中还有很多用户,这些用户是有限的和有编号的。 现在的问题是我们必须确定前m个最常见的k-Page序列。 对于上述示例,结果将是:(k=3,m=3)a->b->c,b->c->d,z->a->b 我真的无法在这里找到具体的解决办法。无论我使用什么样的数据结构,我都必须遍历所有的节点和列表。也许我可以创建一个哈希表,其中键类似于“abc”,值是它发生的次数。但是,在哈希表中查找最多出现的'm'总是一件痛苦的事情。我会像您描述的那样处理这个
我真的无法在这里找到具体的解决办法。无论我使用什么样的数据结构,我都必须遍历所有的节点和列表。也许我可以创建一个哈希表,其中键类似于“abc”,值是它发生的次数。但是,在哈希表中查找最多出现的'm'总是一件痛苦的事情。我会像您描述的那样处理这个问题,使用
k
-元组作为哈希表的键
然后,通过迭代每个散列键,并对当前的topm
元素和当前元素执行冒泡排序,可以提取topm
元素。这将具有时间复杂度O(m*N)
,其中N
是哈希表中的键数
p[i]
成为用户i
的模式。对于每个模式i
:p[i]
中长度k
的每个子字符串s
:s
inhashmap
)hashmap[s]++
else将s
放入hashmap
k
成为hashmap
中的多个键。按键的值降序排列键。排序后返回m
第一个键O(klogk)
时间复杂性
- 将它们全部放入一个哈希映射(该映射将一个序列映射到多个匹配项)
- 如何在散列映射中找到顶部的
元素?有几种方法:m
- 将它们全部放入一个数组并进行排序。时间复杂度为
,其中O(n log n)
是映射中的条目数n
- 迭代散列映射条目,并使用到目前为止看到的top
元素维护优先级队列。时间复杂度为m
O(nlogm)
- 将它们全部放入一个数组中,并使用quickselect算法选择第m个元素。选择所有不大于该值的项。如果我们需要按排序顺序获取top
条目,则时间复杂度为m
或O(n)
O(n+m*log m)
m
对不起,我的无知,但是k=3和m=3?我看到a->b->c4timesm=3,k=3=>3个最常见的3页序列。使用后缀数据结构会改善空间和/或时间复杂性吗?@ankitG如果我们假设哈希映射是完美的(插入/查找总是在
O(1)
),那么不会。
user 1 has access pattern : x->y->z->a->b->c->d->e->f
user 2 has access pattern : z->a->b->c->d
user 3 has access pattern : y->z->a->b->c->d
user 4 has access pattern : a->b->c->d