网站有多个网页,有很多用户正在访问该网站。 假设 -
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
和列表继续用于许多有限和编号的用户。 现在的问题是我们必须确定最常出现的k-Page序列。 对于以上示例,结果将是:(k = 3,m = 3)a-> b-> c,b-> c-> d,z-> a-> b。
我无法在这里找到具体的解决方案。无论我使用什么数据结构,我都必须遍历所有节点和列表。也许我可以创建一个哈希表,其中键是“abc”,值是它发生的次数。但是,然后发现哈希表中最常出现的'm'总是很痛苦。
答案 0 :(得分:0)
我会像你所描述的那样使用k
- 元组作为哈希表的键来解决这个问题。
然后,通过迭代每个散列键,并对当前顶级m
元素和当前元素执行冒泡排序,可以执行提取顶级m
元素。这将具有O(m*N)
的时间复杂度,其中N
是哈希表中的键数。
答案 1 :(得分:0)
p[i]
成为用户i
的模式。对于每种模式i
:s
中k
长度p[i]
的每个子字符串s
:hashmap
hashmap[s]++
s
其他hashmap
将k
加入hashmap
。m
成为O(klogk)
中的一些键。按值按降序对键进行排序。排序后返回{{1}}个第一个键。{{1}}时间复杂度。
答案 2 :(得分:0)
如果散列是可行的:
将它们全部放入哈希映射中(将序列映射到多个出现位置)。
如何在哈希映射中查找前m
个元素?有几种方法:
将它们全部放入数组中并对其进行排序。时间复杂度为O(n log n)
,其中n
是地图中的条目数。
迭代哈希映射条目并维护到目前为止看到的顶级m
元素的优先级队列。时间复杂度为O(n log m)
。
将它们全部放入数组中,然后使用quickselect算法选择m
- 元素。选择所有不大于它的东西。如果我们需要按排序顺序获取热门O(n)
条目,则时间复杂度为O(n + m * log m)
或m
。
如果散列不可行,您可以使用后缀数据结构(数组,树,自动机)来计算每个序列的出现次数,然后选择最佳m
,方法与1.