确定顶部'm'最常出现的k-Page序列

时间:2015-03-03 19:37:43

标签: algorithm data-structures

网站有多个网页,有很多用户正在访问该网站。 假设 -

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'总是很痛苦。

3 个答案:

答案 0 :(得分:0)

我会像你所描述的那样使用k - 元组作为哈希表的键来解决这个问题。

然后,通过迭代每个散列键,并对当前顶级m元素和当前元素执行冒泡排序,可以执行提取顶级m元素。这将具有O(m*N)的时间复杂度,其中N是哈希表中的键数。

答案 1 :(得分:0)

  1. p[i]成为用户i的模式。对于每种模式i
  2. 对于sk长度p[i]的每个子字符串s
  3. if hashmap hashmap[s]++ s其他hashmapk加入hashmap
  4. m成为O(klogk)中的一些键。按值按降序对键进行排序。排序后返回{{1}}个第一个键。
  5. {{1}}时间复杂度。

答案 2 :(得分:0)

  1. 如果散列是可行的:

    • 将它们全部放入哈希映射中(将序列映射到多个出现位置)。

    • 如何在哈希映射中查找前m个元素?有几种方法:

      1. 将它们全部放入数组中并对其进行排序。时间复杂度为O(n log n),其中n是地图中的条目数。

      2. 迭代哈希映射条目并维护到目前为止看到的顶级m元素的优先级队列。时间复杂度为O(n log m)

      3. 将它们全部放入数组中,然后使用quickselect算法选择m - 元素。选择所有不大于它的东西。如果我们需要按排序顺序获取热门O(n)条目,则时间复杂度为O(n + m * log m)m

  2. 如果散列不可行,您可以使用后缀数据结构(数组,树,自动机)来计算每个序列的出现次数,然后选择最佳m,方法与1.