python 有没有找到数组中最大值的最快算法?比O(n)好吗?

rqenqsqc  于 2023-01-16  发布在  Python
关注(0)|答案(3)|浏览(119)

对于竞争性编程,有时我们需要从数组中找到最大值:我找到了一些算法,如下所示
Algorithms
让我知道你有任何参考。或任何解决方案在你的脑海

我尝试将时间复杂度降至最低,如下所示

array = [6, 8, 100, 4, 2]
l = len(array)
max = 0

for i in range(l//2):
  if max<array[i]:
    max = array[i]
  
  if max<array[-1-i]:
    max = array[-1-i]

if l%2!=0:
  if max<array[i+1]:
    max = array[i+1]

print(max)
toiithl6

toiithl61#

不,没有比O(n)更快的东西,也不可能有,证明时间复杂性往往意味着非常高深的数学,但在这种情况下,它非常容易理解:在读取数组中的所有数字之前,您无法知道哪个数字最大(否则,您尚未读取的数字可能比所有其他数字都大)。
而这个运算本身,阅读所有的数字,就是O(n)。
所以不可能存在比O(n)更快的算法。

qojgxg4l

qojgxg4l2#

这段代码已经过优化,技术上需要O(n/2),所以仍然是线性时间。
Python中的max()函数实际上非常快,可能比任何手动实现都要快。
但是如果你问的是一般情况,是否有任何算法可以在小于O(n)的时间内找到***未排序***数组中的最大元素,那么没有,据我所知,你能做的最好是线性时间。

rjzwgtxy

rjzwgtxy3#

简短的回答是no,因为如果不首先检查所有元素,就无法知道一个元素是未排序数组中的最大值。
然而,可以使用一些技巧来使O(n)更快,例如使用多线程方法,减少搜索空间,或者使用某种奇特的方法 *。
如果这里的目标是赢得编程比赛,那么尝试类似这样的方法:
1.使用多个线程查找每个子数组的最大值,然后查找最大值中的最大值。根据数据集的大小和启动线程的时间,这可能会有所帮助。
1.确定数据是否具有一些可以利用的属性,例如知道边界、知道是否存在重复项、知道它是否以任何特定顺序进行结构化。
1.最后一种方法只是我个人的看法,但我认为值得一提的是,在某些情况下,还有一些更奇特的方法在理论上可以比O(n)做得更好,比如Sleep Sort

相关问题