Algorithm 确定顶部';m';最常见的k-Page序列

Algorithm 确定顶部';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'总是一件痛苦的事情。我会像您描述的那样处理这个

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

列表中还有很多用户,这些用户是有限的和有编号的。 现在的问题是我们必须确定前m个最常见的k-Page序列。 对于上述示例,结果将是:(k=3,m=3)a->b->c,b->c->d,z->a->b


我真的无法在这里找到具体的解决办法。无论我使用什么样的数据结构,我都必须遍历所有的节点和列表。也许我可以创建一个哈希表,其中键类似于“abc”,值是它发生的次数。但是,在哈希表中查找最多出现的'm'总是一件痛苦的事情。

我会像您描述的那样处理这个问题,使用
k
-元组作为哈希表的键

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

  • p[i]
    成为用户
    i
    的模式。对于每个模式
    i
  • 对于
    p[i]
    中长度
    k
    的每个子字符串
    s
  • 如果(
    s
    in
    hashmap
    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)

  • 如果哈希不可行,您可以使用后缀数据结构(数组、树、自动机)来计算每个序列的出现次数,然后以与1相同的方式选择最佳
    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