求数组最大最小值的数值方法

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

给定一个数组A=[ai]A = [a_i]A=[ai],求它的最大值或最小值,一般会用遍历查找或排序的方法,但其实可以直接用计算的方法求出数组的最大最小值。

max(A)=lim⁡n→∞a1n+⋯+aNnnmax(A) = \lim_{n\rightarrow \infty}\sqrt[n]{a_1^n + \cdots + a_N^n}max(A)=nlimna1n++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
'''

需要注意的是,这种近似方法容易出现数值溢出,使用时须谨慎

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值