【发布时间】: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