Python 高性能小算法

2021-03-23 17:55:09 +08:00
 going

如何高性能计算出一个列表相近 3 个数据的最大值和最小值?

举例:如下列表临近 3 个数据的最大值和最小值 [1,2,3,4,5,7,8,9,10] 输出 最大值为:27 最小值为:6

2303 次点击
所在节点    Python
15 条回复
hongch
2021-03-23 18:11:42 +08:00
题目应该指明是无序数组吧?
hehe12980
2021-03-23 18:14:45 +08:00
随便给你写了一个
def arr = [1, 2, 3, 4, 5, 7, 8, 9, 10]
if (arr.size() < 3) {
return
}
int min = arr[0] + arr[1] + arr[2]
int max = arr[0] + arr[1] + arr[2]
int prefix = 0
for (int i = 3; i < arr.size(); i++) {
int sum = arr[i] + max - arr[prefix++]
max = Math.max(max, sum)
min = Math.min(max, min)
}
println(min)
println(max)
hehe12980
2021-03-23 18:16:53 +08:00
@hehe12980

上面好像写的不太对

def arr = [1, 2, 3, 4, 5, 7, 8, 9, 10]
if (arr.size() < 3) {
return
}
int min = arr[0] + arr[1] + arr[2]
int max = arr[0] + arr[1] + arr[2]
int prefix = 0
for (int i = 3; i < arr.size(); i++) {
int sum = arr[i] + max - arr[prefix++]
max = Math.max(max, sum)
min = Math.min(min, sum)
}
println(min)
println(max)
ClutchBear
2021-03-23 18:18:39 +08:00
单纯的 o(n)啊
计算每个元素和后面两个元素的和.
然后比较
ClutchBear
2021-03-23 18:19:12 +08:00
data = [1, 2, 3, 4, 5, 7, 8, 9, 10]
max_sum = data[0] + data[1] + data[2]
min_sum = max_sum
temp_list = []
data_length = len(data)

for index, item in enumerate(data):
if data_length == index + 2:
break
temp_list = [item, data[index + 1], data[index + 2]]
temp_list_sum = sum(temp_list)

if temp_list_sum > max_sum:
max_sum = temp_list_sum
if temp_list_sum < min_sum:
min_sum = temp_list_sum
print(max_sum, min_sum)
BBrother
2021-03-23 18:30:40 +08:00
数组顺序不能改的话用滑动窗口
zyb201314
2021-03-23 18:36:01 +08:00
#这咋样?
import heapq
s=[9,2,3,6,10,5,7,1,8]
print(sum(heapq.nsmallest(3,s)))
print(sum(heapq.nlargest(3,s)))
Vegetable
2021-03-23 18:40:20 +08:00
这和遍历一遍找出极值没什么区别吧
going
2021-03-23 19:04:44 +08:00
@hongch 是的
going
2021-03-23 19:15:08 +08:00
@zyb201314 你这个是排序的结果了,数组是无序的
todd7zhang
2021-03-24 09:29:43 +08:00
老老实实遍历就完事,O(n)
princelai
2021-03-24 10:38:34 +08:00
高性能用 numpy 啊,你要是刷题没法引入外部包那就没办法了

```
import numpy as np

w=3
arr = np.array([1,2,3,4,5,7,8,9,10])

x,y = np.ogrid[:arr.shape[0]-w+1,:w]
rolling_sum = arr[x+y].sum(axis=1)
# 上两步替代方法
# np.lib.stride_tricks.sliding_window_view(arr,w).sum(axis=1)

print(f"最小值:{rolling_sum.min()}\t 最大值{rolling_sum.max()}")
```
Pagliacii
2021-03-24 10:46:27 +08:00
livrth
2021-03-24 11:07:59 +08:00
单调队列 滑动窗口 O ( N )
adocder
2021-04-21 17:26:16 +08:00
应该是考察排序吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/764354

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX