给定一个数组A=[ai]A = [a_i]A=[ai],求它的最大值或最小值,一般会用遍历查找或排序的方法,但其实可以直接用计算的方法求出数组的最大最小值。
max(A)=limn→∞a1n+⋯+aNnnmax(A) = \lim_{n\rightarrow \infty}\sqrt[n]{a_1^n + \cdots + a_N^n}max(A)=n→∞limna1n+⋯+aNn
max(A)=limβ→∞1βlog(eβa1+⋯+eβaN)min(A)=limβ→−∞1βlog(eβa1+⋯+eβaN)
max(A) =\lim_{\beta\rightarrow \infty}\frac{1}{\beta}\log \left(e^{\beta a_1}+\cdots +e^{\beta a_N} \right)\\
min(A) =\lim_{\beta\rightarrow -\infty} \frac{1}{\beta}\log \left(e^{\beta a_1}+\cdots +e^{\beta a_N} \right)
max(A)=β→∞limβ1log(eβa1+⋯+eβaN)min(A)=β→−∞limβ1log(eβa1+⋯+eβaN)
证明也很简单。
下面用程序来说明:
import numpy as np
def max1(A):
n = 100
return pow(np.sum(A**n),1/n)
def max2(A):
beta = 10
return np.log(np.sum(np.exp(beta*A)))/beta
A = np.array([i for i in range(10)])+0.001
print(A)
print(max1(A))
print(max2(A))
'''
[1.000e-03 1.001e+00 2.001e+00 3.001e+00 4.001e+00 5.001e+00 6.001e+00 7.001e+00 8.001e+00 9.001e+00]
9.001000691258799
9.001004540096037
'''
需要注意的是,这种近似方法容易出现数值溢出,使用时须谨慎

本文介绍了一种不依赖于遍历或排序,直接通过数学计算求解数组最大值和最小值的方法,并提供了Python代码实现。该方法利用极限概念,通过调整参数n或β,逼近数组的真实最大值和最小值。
4236

被折叠的 条评论
为什么被折叠?



