数据结构访谈

时间:2016-06-07 06:21:40

标签: algorithm data-structures

给定特定网站的所有用户的登录/注销时间:( userId,登录时间,注销时间)。存储此数据,以查询在给定时间范围内登录和注销的用户总数。

我应该使用哪种数据结构?以及如何实施它?

3 个答案:

答案 0 :(得分:2)

您正在寻找的数据结构称为interval tree,它基本上有一个二进制搜索树,如格式,间隔的开始(登录时间)作为值(在BST中排序) )。

此DS具有以下时间复杂性:

  • 添加间隔(login-logout):O(logN)
  • 删除间隔:O(logN)
  • 给定间隔[start-finish],找到重叠间隔:O(logN)

答案 1 :(得分:0)

如果你想在一个程序中这样做:

只需创建一个包含类用户类型变量的简单数组。

用户类应具有以下属性:userId,loginTime,logoutTime。

检查在给定时间范围内登录和注销的用户总数将类似于:

for (user in userArray)
  if (user.loginTime > inputLoginTime && user.logoutTime < inputLogoutTime)
    count++;

您可以在O(n)时间内检查用户总数。

如果您想在服务器中执行此操作,例如。的MySQL。

使用userId,loginTime,logoutTime作为列创建表User。

SELECT COUNT(*) FROM User WHERE User.loginTime > inputLoginTime AND User.logoutTime < inputLogoutTime;

答案 2 :(得分:0)

我不认为有任何单一数据结构会比下面提到的方法更复杂: -

  1. 准备两个已排序的列表,一个用于登录,另一个用于注销 倍。
    • O(N logN)
  2. 对于每个查询,在两个列表上执行二进制搜索以计算数字 在给定时间之前登录和登出数量。
    • O(log N)
  3. 然后登录的用户数将是(登录 - 注销)。
    • O(1)