存储d天访问过w网页的客户数据的好方法

时间:2013-07-08 10:09:53

标签: algorithm data-structures tree

这是来自亚马逊的采访问题。

鉴于在u天内访问过w个网页的d客户列表,设计了一个数据结构,以吸引那些在k天内访问过该网站的客户至少访问了m个不同页面。

假设uwd是大数字。

我们如何存储这些信息?也许我们可以使用哈希映射,树等等。

3 个答案:

答案 0 :(得分:4)

<强>假设:

我们的查询提供了一些网页j,并要求提供在k天内访问过网页的用户列表,并且至少访问了m个不同的网页总

对于下面的内容,假设“map”=“hashmap”,理想情况下,它会给出恒定的时间查询。人们还可以以对数成本i.t.o元素的数量使用“树图”。类似地,对于“set”,“hashset”,“treeset”。

我假设输入不是静态的,但如果是,我就不会真正改变我的方法。

基本理念:

  • 对于每个用户,都要有一个要计算的网页地图和上次访问日期。我们可以在网页地图上有用户标识符的地图。

  • 每当用户访问某个页面时:

    • 如果是新页面,只需创建一个地图条目,其中该页面的计数为1,上次访问日期为

    • 否则,如果该日与上次访问日相同,则不执行任何操作,

    • 否则,递增计数并更新上次访问的日期。

    • 每次更新的总时间= O(1)

  • 查询:

    • 遍历所有用户 - O(u)

    • 查找该用户的页面并检查计数是否匹配 - O(1)

    • 检查地图的计数是否为>= m - O(1)

    • 每次查询的总时间= O(n)

<强>改进:

我们可以将单独的网页地图设置为唯一ID (然后显然使用唯一ID而不是上述地图的网址)。它不会真正改变复杂性,但应该通过一个恒定的因素来改善空间和时间的复杂性。

以相当多的空间为代价,我们可以执行以下操作(除了拥有Basic idea的地图):

  • 对于每个网页,都有一组用户标识符,其中数组中的索引i是一组完全访问该页面的所有用户{{ 1}}天。

  • 每当用户访问某个页面时:

    • i

    • 中的相同
    • 将用户从该网页的当前访问次数移至新的访问次数(如果是新的,则插入1次访问集)。

    • 每次更新的总时间= Basic idea

  • 查询:

    • 我们可以在O(1)中的k天内找到访问过任意广告页的所有用户。

    • 从这里开始,我们会浏览这个较小的用户列表(比如有O(1)个用户)并检查每个用户的地图计数(p)。

    • 每次查询的总时间= O(1)

如果我遗漏了任何内容,请随时指出。

答案 1 :(得分:1)

最直接的结构是模仿RDBMS会做什么:

1. 拥有一个包含所有基本信息的对象:(客户,天数,不同页数)

2. 然后,添加一个作为索引的树,使用(Days-Count,Distinct-Pages-Count)作为其键(B-tree或类似的东西)< / p>

3. 您还可以拥有另一个带有Customer键的索引类型结构。这样,您可以快速更新信息

4. 最后,您需要了解更详细的信息,以确定被访问的网页是否唯一。这将涉及在客户下存储不同的页面信息(如果这意味着在特定日期或所有日期不同,则不清楚问题)

答案 2 :(得分:1)

使用两个哈希映射实现:

  1. hash map<customerId,HashSet<webpages>>
  2. hash map<customerId,HashSet<days>>
  3. 如果有新的客户ID,则在其中创建新的哈希集插入,否则将当天或网页放入现有客户的哈希集中。

    对于每个客户ID,请参阅第一个哈希映射中的set length>=m和第二个哈希映射集length=k输出该客户。