首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何改进我的代码以处理大数字?

如何改进我的代码以处理大数字?
EN

Stack Overflow用户
提问于 2017-07-30 21:30:41
回答 1查看 71关注 0票数 1

我正在做一个hackerrank挑战来计算倒数,但我无法通过几个测试用例,因为它显示超时。我在我的系统上运行测试用例,大约需要10秒才能得到正确的结果。

代码如下:

代码语言:javascript
复制
def merge_sort_inversion(listA):
  n=len(listA)
  if n==1 or n==0:
    return listA,0

  left_subArray=listA[:n/2]
  right_subArray=listA[n/2:]

  left_subArray, left_inversion=merge_sort_inversion(left_subArray)
  right_subArray,right_inversion=merge_sort_inversion(right_subArray)
  sorted_list, split_inversion=merge_inversion(left_subArray,right_subArray)


  return sorted_list,left_inversion+right_inversion+split_inversion
#sorted_list=[]
def merge_inversion(left,right):
  sorted_list=[]
  count=0
  if len(left)==0 or len(right)==0:
    return left+right,0

  i=0
  j=0
  for k in range(len(left)+len(right)):
    if len(left)!=i and len(right)!=j:
      if left[i]>right[j]:
        sorted_list.append(right[j])
        count=count+len(left[i:])
        #print right[j], left[i:],count
        j=j+1
      else:
        sorted_list.append(left[i])
        i=i+1
    elif len(left)==i:
      return sorted_list+right[j:],count
    elif len(right)==j:
      return sorted_list+left[i:],count
  return sorted_list,count

t = int(raw_input().strip())
for a0 in xrange(t):
    n = int(raw_input().strip())
    arr = map(int, raw_input().strip().split(' '))
    a,b=merge_sort_inversion(arr)
    print b

有人能给点建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-30 21:43:06

这一行非常慢:

代码语言:javascript
复制
count=count+len(left[i:])

因为它从位置i向上从left的所有元素生成一个新的列表。

由于您只需要结果长度,因此可以通过以下方式更快地完成此操作:

代码语言:javascript
复制
count += len(left) - i

在我的计算机上,这将包含100,000个元素的数组的时间从7.5秒减少到0.5秒。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45400329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档