Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 编码:跟踪每个用户最近N天的记录。_Algorithm_Data Structures_Array Algorithms_Data Structure - Fatal编程技术网

Algorithm 编码:跟踪每个用户最近N天的记录。

Algorithm 编码:跟踪每个用户最近N天的记录。,algorithm,data-structures,array-algorithms,data-structure,Algorithm,Data Structures,Array Algorithms,Data Structure,我正在解决一个有趣的问题,对于每个用户,我想保留他最后N天的活动。这可以应用于许多用例,其中一个简单的用例是: 对于每个用户-用户可以在某个随机的日子来健身房-我想得到他在过去90天里去健身房的总次数 这对我来说是个棘手的问题 我的想法:我想存储一个向量,其中每个条目将确定一天,然后一个布尔值可能表示他的访问。要计数,仅对数组中的该部分进行线性处理就足够了 最好的方法是什么 根据您需要的复杂程度,存储每个客户端访问的简单数组就足够了 每次访问时,添加一个包含日期/时间的新条目。每天运行一次检查,

我正在解决一个有趣的问题,对于每个用户,我想保留他最后N天的活动。这可以应用于许多用例,其中一个简单的用例是:

对于每个用户-用户可以在某个随机的日子来健身房-我想得到他在过去90天里去健身房的总次数

这对我来说是个棘手的问题

我的想法:我想存储一个向量,其中每个条目将确定一天,然后一个布尔值可能表示他的访问。要计数,仅对数组中的该部分进行线性处理就足够了


最好的方法是什么

根据您需要的复杂程度,存储每个客户端访问的简单数组就足够了

每次访问时,添加一个包含日期/时间的新条目。每天运行一次检查,查看是否有任何客户端包含超过90天的访问记录。第一条记录不够旧,意味着没有更多的记录要检查,因此您可以安全地移动到下一个客户端


希望这对你有帮助

根据您需要的复杂程度,存储每个客户端访问的简单数组就足够了

每次访问时,添加一个包含日期/时间的新条目。每天运行一次检查,查看是否有任何客户端包含超过90天的访问记录。第一条记录不够旧,意味着没有更多的记录要检查,因此您可以安全地移动到下一个客户端


希望这对你有帮助

你的想法行得通,但它真的节省空间吗

您可以是这样的:一个布尔2D向量(您可以将其想象为一个矩阵),其中每一行都是一个用户,每一列都是一天(已排序),因此这将包括:

大小矩阵
uxn

其中U是用户数

要回答我最初提出的问题,您需要考虑矩阵的密度。如果它会很多,那么你做出了正确的选择,如果不是,那么你浪费了(很多)空间。你可以在这里看到权衡

当然,您必须考虑您的用例。在健身房的例子中,我认为这不会节省空间,因为大多数人不是每天都去健身房(我认为),这会导致矩阵稀疏,这意味着我们浪费了空间


另一个想法是使用一个向量os size
N
,其中对日期进行排序。每个条目都是一个链接列表,其中每个节点都是一个用户

如果在一天的列表中找到一个用户,那么这意味着他那天去了健身房

通过这种方法,我们可以根据需要精确地分配空间,因此无论我在矩阵的例子中提到的密度如何,它都是空间最优的


但是,是这样吗?不,当然不是!我讨论了空间,但是时间效率呢?例如,搜索通常是我们希望数据结构支持的一种常用方法,如果我们希望这种方法快速的话

在矩阵的情况下,搜索将是一个O(1)操作,这是甜蜜的,因为访问矩阵是一个常量操作

然而,在vector+列表的情况下,搜索将采用O(L),其中
L
是我们的vector总共拥有的列表的平均大小


那是哪一个呢?这取决于你的申请


我也会尝试使用哈希表,它不需要排序,而且节省空间()。

你的想法会奏效,但它真的节省空间吗

您可以是这样的:一个布尔2D向量(您可以将其想象为一个矩阵),其中每一行都是一个用户,每一列都是一天(已排序),因此这将包括:

大小矩阵
uxn

其中U是用户数

要回答我最初提出的问题,您需要考虑矩阵的密度。如果它会很多,那么你做出了正确的选择,如果不是,那么你浪费了(很多)空间。你可以在这里看到权衡

当然,您必须考虑您的用例。在健身房的例子中,我认为这不会节省空间,因为大多数人不是每天都去健身房(我认为),这会导致矩阵稀疏,这意味着我们浪费了空间


另一个想法是使用一个向量os size
N
,其中对日期进行排序。每个条目都是一个链接列表,其中每个节点都是一个用户

如果在一天的列表中找到一个用户,那么这意味着他那天去了健身房

通过这种方法,我们可以根据需要精确地分配空间,因此无论我在矩阵的例子中提到的密度如何,它都是空间最优的


但是,是这样吗?不,当然不是!我讨论了空间,但是时间效率呢?例如,搜索通常是我们希望数据结构支持的一种常用方法,如果我们希望这种方法快速的话

在矩阵的情况下,搜索将是一个O(1)操作,这是甜蜜的,因为访问矩阵是一个常量操作

然而,在vector+列表的情况下,搜索将采用O(L),其中
L
是我们的vector总共拥有的列表的平均大小


那是哪一个呢?这取决于你的申请


我也会尝试使用哈希表,它不需要排序,而且节省空间()。

让每个用户都有一个固定大小(90)的访问详细信息的队列怎么样?您可以将其推广到多个用户,关键的优势是您不必担心维护最后90天的数据


您可以将队列转储到列表或数组中,并根据需要在O(n)中持久化。正如您所提到的,对出席人数的检查也将是O(n)。

为每个用户设置一个具有固定大小(90)的访问详细信息的队列怎么样?您可以将其推广到多个用户,关键的优势是您不必担心维护最后90天的数据

Q[ClientIdx].Add(Today)
while (not Q[ClientIdx].Empty) and (Today - Q[ClientIdx].Peek > 90) 
    Q[ClientIdx].Remove  //dequeue too old records
VisitCount = Q.Count