【问题标题】:Number of pairs of users who are onsite at the same time. Solve in O(nlogn)同时在现场的用户对数。求解 O(nlogn)
【发布时间】:2021-07-08 21:31:14
【问题描述】:

我正在尝试给出的问题:

新朋友。 n 个用户中的每一个都会在社交媒体网站上花费一些时间。对于每个 i = 1, ..., n,用户 i 在时间 ai 进入站点并在时间 bi ≥ ai 离开。您对以下问题感兴趣:
网站上同时有多少对不同的用户? (这里,(i,j)对与(j,i)对相同)。 示例:假设有 5 个用户,其进出时间如下:
用户 EnterTime LeaveTime

User Enter Time Leave Time
1 1 4
2 2 5
3 7 9
4 9 10
5 6 10

那么,同时在网站上的不同用户对的数量是四对:这些对是 (1, 2), (3, 4), (4, 5), (3, 5) .注意:如果一个用户的离开时间与另一个用户的进入时间相同,这将被视为重叠。比如用户 3 的离开时间是 9,用户 4 的进入时间是 9,这算重叠。

我在 b 部分遇到了麻烦,即: 给定输入 (a1, b1), (a2, b2), ..., (an, bn) 如上所述。给出一个 O(n log(n)) 时间的算法来完成相同的任务并分析它的运行时间。 (提示:考虑按时间对相关事件进行排序)。 试过下面的代码,但答案似乎不对。

count = 0
def merge(left, right):
    global count
    result = []
    i = 0
    j = 0
    while i < len(left) and j < len(right):
        if left[i][0] == right[j][0] or left[i][1] == right[j][1]:
                count += 1
        if left[i][1] < right[j][1]:
            if right[j][0] <= left[i][1]:
                count += 1
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    while i < len(left):#the only left element should be compared with the rest of the elements
        result.append(left[i])
        i += 1
    while j < len(right):
        result.append(right[j])
        j += 1
    return result

def mergeSort(lst):
    if len(lst) < 2:
        return lst
    else:
        mid = len(lst) // 2
        left = mergeSort(lst[:mid])
        right = mergeSort(lst[mid:])
        return merge(left, right)
lst = [(1, 4), (2, 5), (7, 9), (9, 10), (6, 10)]
print(mergeSort(lst))
print("Number of pairs online: ", count)
# gives 3, should be 4

如果可能,请指导我。提前致谢。

【问题讨论】:

  • 你好,纳比尔!寻找区间交叉口问题的细节,有助于理解原理并自己想出解决方案。
  • 非常感谢您向我展示了路径。自从你发表评论以来,我一直在寻找。但我仍然不明白如何在 O(nlogn) 时间内做到这一点。截止日期快到了,我真的需要解决这个问题。

标签: python algorithm sorting merge time-complexity


【解决方案1】:

我猜他们是有这样的想法的。

lst = [(1, 4), (2, 5), (7, 9), (9, 10), (6, 10)]
events = []
for enter, leave in lst:
    events.append((enter, "enter"))
    events.append((leave, "leave"))
# At the same time, enter is before leave, which is what we want.
events.sort()
pairs = 0
onsite = 0
for _time, kind in events:
    if kind == "enter":
        pairs += onsite
        onsite += 1
    elif kind == "leave":
        onsite -= 1
    else:
        assert False
print(pairs)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多