python - Python 中的性能改进基础知识

标签 python algorithm performance big-o

所以这是我在 HackerRank 上解决的算法问题。它通过了除一个测试用例之外的所有测试用例,因为它超时。

我尝试进行了一些改进,但它仍然会超时。我想了解您如何查看自己的代码并找到它运行缓慢的地方。

请注意,我并不是在寻找解决问题的替代逻辑。这是我想到的解决方案,我想尝试并加快它的速度。

题目如下:

问题陈述

给定一个包含 N 个整数的列表,您的任务是从列表中选择 K 个整数,以使其不公平性最小化。

如果(x1,x2,x3,…,xk)是从列表N中选出的K个数,则不公平定义为

max(x1,x2,…,xk)−min(x1,x2,…,xk) 其中max表示K的元素中最大的整数,min表示K的元素中的最小整数。

输入格式

第一行包含一个整数N。 第二行包含一个整数 K。 接下来是 N 行。每行包含一个属于列表 N 的整数。

问题链接:https://www.hackerrank.com/challenges/angry-children/copy-from/11910253

第一次尝试:

n, k = int(input()), int(input())
num = sorted([ int(input()) for i in range(0,n) ])
lower, min_unfairness, upper = 0, 0, k

while upper <= len(num):
    current    = num[lower:upper]
    unfairness = current[-1] - current[0]
    if lower == 0: 
        min_unfairness = unfairness
    else: 
        if unfairness < min_unfairness:
            min_unfairness = unfairness 

    if min_unfairness == 0:
        break

    lower += 1
    upper += 1

print (min_unfairness)

第二次尝试:通过从循环中删除对 lower == 0 的检查进一步改进,因为这只发生在第一次迭代中。

n, k = int(input()), int(input())
num = sorted([ int(input()) for i in range(0,n) ])
lower, min_unfairness, upper = 0, 0, k

#Finding the unfairness of the 1st set and assigning it as min
current    = num[lower:upper]
unfairness = current[-1] - current[0]
min_unfairness = unfairness
lower += 1
upper += 1

while upper <= len(num) and min_unfairness != 0:

    #Finding unfairness of current set
    current    = num[lower:upper]
    unfairness = current[-1] - current[0]

    #Set it as min if it is lower than current minimum
    if unfairness < min_unfairness:
        min_unfairness = unfairness 

    lower += 1
    upper += 1

print (min_unfairness)

我不确定在尝试分析这个问题时应该采用什么方法。欢迎提出任何建议。

最佳答案

您做的最慢的事情是复制列表的一部分:current = num[lower:upper]。这使得这一步的复杂度从 O(n) 上升到 O(n•k)。

你真正应该做的只是获取元素,这些元素直接通过它们的索引定义了这个子列表的不公平性:

min_unfairness = min(num[i+k-1] - num[i] for i in range(n-k+1))

说明:当某个选择的第一个元素的索引为i时,最大元素的索引为i+k-1,所以这个选择的不公平等于num[i+k-1] - num[i]。代码 (num[i+k-1] - num[i] for i in range(n-k+1)) 给出了相关选择的不公平性的迭代器。所以 min(num[i+k-1] - num[i] for i in range(n-k+1)) 找到这个迭代器中最小的不公平性。

关于python - Python 中的性能改进基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30667894/

相关文章:

python - 如何向上/向下舍入 float

algorithm - 用外行的话来说是摊销的复杂性吗?

Java 高效改进代码

performance - Taurus JSON 正文帖子

python - 有没有办法用python从网页下载视频?

python - 返回最长的字母子串

python - 在 Pandas Dataframe 中搜索动态单词数

c++ - boost中rtree中的打包算法

javascript - 如何获取一个数在矩阵中的位置?

html - HTML 头部中样式表声明的属性顺序差异