【问题标题】:Getting timeout error for some cases in python 3.x在 python 3.x 中的某些情况下出现超时错误
【发布时间】:2020-04-09 08:01:28
【问题描述】:

我正在处理欺诈活动通知问题:https://www.hackerrank.com/challenges/fraudulent-activity-notifications/。我已经写了下面的代码 解决这个问题。此代码在某些测试用例中运行良好,但在某些测试用例中失败,导致超时错误。谁能帮助我了解如何优化 让它变得更好?

def calculate_median(lists):    
    n = len(lists)
    lists.sort()
    if n % 2 == 0: 
        median1 = lists[n//2] 
        median2 = lists[n//2 - 1] 
        median = (median1 + median2)/2
    else: 
        median = lists[n//2] 
    return median


my_list = [2,3,4,2,3,6,8,4,5]
d=5
n = len(my_list)
count = 0
start= 0
end = d
for i in range(0, len(my_list)):
    if end < n:
        seg_list = my_list[start:end]
        check_val = my_list[end]
        median_val = calculate_median(seg_list)
        if check_val >= 2 *median_val:
            count = count +1 
        start = start + 1
        end = end + 1

print(count)

【问题讨论】:

  • 极小优化:由于seg_list始终是新鲜的list(切片产生,其中浅拷贝),不需要按原顺序保存,calculate_median可以替换lists = sorted(lists) 和 lists.sort() 就地排序,而不是创建新的排序副本。或者,您可以将collections.deque 与maxlen 一起使用,以避免使用显式切片手动跟踪start/end(尽管在这种情况下您需要使用sorted,因为您无法排序deque 就位)。
  • Used lists.sort(),对于某些测试用例仍然出现超时错误。
  • 自从你添加它以来,我一直在研究这个问题,你无法使用运行平均平均值对每次迭代进行排序。
  • @ChrisDoyle 如果我使用运行平均值,我将如何获得中位数?
  • @user15051990 抱歉,我的意思是平均运行中位数

标签: python arrays python-3.x optimization median


【解决方案1】:

我使用了 bisect_left 和 insort_left 来解决这个问题。这是优化的方法之一。

from bisect import bisect_left, insort_left
count = 0
listD = sorted(my_list[:d])

def median():
   return listD[d//2] if d%2 == 1 else ((listD[d//2] + listD[d//2-1])/2)

for i in range(d,n):
   if my_list[i] >= 2*median(): 
      count += 1
   del listD[bisect_left(listD, my_list[i-d])]
   insort_left(listD, my_list[i])
print(count)

【讨论】:

  • 非常好,我永远也达不到这样的解决方案
  • 我也遇到过一篇使用这个的文章。
  • 是的,将模块一分为二。这是一种更快的插入排序实现,无法用本机 python 代码替换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2020-03-18
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多