python - 减少时间消耗

时间:2016-04-04 12:29:51

标签: python list python-2.7

我正在为this problem编写代码:

  

给定具有N个元素的阵列A.求出总数(i,j),使得j <1。我和Aj =艾。

这是我的代码:

raw_input()

l = list(map(int, raw_input().split()))

count = 0

for a in range(len(l)):
    count = count + l[a+1:].count(l[a])

print(count)

但不幸的是,代码花了很多时间。你有什么建议我可以减少时间消耗吗?我的意思是,如何减少for循环所消耗的时间。我觉得list.count方法需要花费很多时间,所以你有什么想法可以替代它。

5 个答案:

答案 0 :(得分:1)

您可以使用比.count()更快的方式检查成员资格来加快速度。例如,dict查找非常快:

from collections import defaultdict

raw_input()

l = list(map(int, raw_input().split()))

keys = defaultdict(list)

for i, v in enumerate(l):
    keys[v].append(i)

for value, keys in keys.items():
    print("Value %d appears at indices %s." % (k, ", ".join(keys)))

然后你只需要计算对的数量。

答案 1 :(得分:1)

我终于得到了答案。它将时间消耗减少到非常低的量。 对不起造成的干扰。

raw_input()

l = list(map(int, raw_input().split()))

dictionary = {}

for value in l:
    if value in dictionary:
        dictionary[value] += 1
    else:
        dictionary[value] = 0

def sum_till_n(iterable):
    return [x*(x+1)/2 for x in iterable]

print(sum(sum_till_n(dictionary.values())))

我希望您了解代码的作用。我以数学的方式看待这个问题。字典dictionary存储第一个value之后value的数量。 sum_till_n函数是一个函数,它找到n之前的数字总和。与n=3类似,它会返回1+2+3

答案 2 :(得分:0)

python代码中的微优化不会使当前的O(n ^ 2)复杂度大幅降低。 我建议看看产生较低复杂性的实现。 此链接可以帮助您find total number of (i,j) pairs in array such that i<j and a[i]>a[j]

答案 3 :(得分:0)

让我们花点时间看看问题,而不是实施!

任务是:

  

给定具有N个元素的阵列A.查找对的总数(i,j)   这样j&lt;我和Aj =艾。

查找数组中的所有重复内容相同!

查找所有重复项是一项非常常见的任务。

我可以很快想到一个解决方案:

  • 排序元组数组(值,索引)(O(N)= N * log(N))
  • 遍历数组一次以找到连续的重复项

以下是结果数据的示例:

input = [2.0, 1.0, 3.0, 1.0]
# create and sort tuples (I will leave this task to you)
sorted_tuples = [(1.0, 1), (1.0, 3), (2.0, 0), (3.0, 2)]
# find consecutive duplicates (I will leave this task to you)
solution = [(3, 1)]

答案 4 :(得分:-1)

这可能更快,因为使用生成器和切片:

l = [1, 2, 1, 3]

count = 0
for idx, value in enumerate(l):
    count += sum(1 for v in l[:idx] if v == value)

print(count)
assert count == 1