这是来自亚马逊的采访问题。
鉴于在u
天内访问过w
个网页的d
客户列表,设计了一个数据结构,以吸引那些在k
天内访问过该网站的客户至少访问了m
个不同页面。
假设u
,w
和d
是大数字。
我们如何存储这些信息?也许我们可以使用哈希映射,树等等。
答案 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)
使用两个哈希映射实现:
hash map<customerId,HashSet<webpages>>
hash map<customerId,HashSet<days>>
如果有新的客户ID,则在其中创建新的哈希集插入,否则将当天或网页放入现有客户的哈希集中。
对于每个客户ID,请参阅第一个哈希映射中的set length>=m
和第二个哈希映射集length=k
输出该客户。