代码之家  ›  专栏  ›  技术社区  ›  Rewind

同时搜索最大值/最小值的操作顺序

  •  0
  • Rewind  · 技术社区  · 5 月前

    以下同时求数组最大值/最小值的方法的O(n)阶是多少?哪个最好?有更好的方法吗?

    如果我因为另一个原因必须提前循环数组(例如将每个元素乘以10),最好使用选项2,在将每个元素相乘的同时找到最大/最小值forEach吗?

    选项1:

    // This is surely 2n
    let a = [...Array(1000000)].map(() => Math.round(1000000 * Math.random()));
    let max = Math.max(...a);
    let min = Math.min(...a);
    

    选项2:

    // What order is this?
    let a = [...Array(1000000)].map(() => Math.round(1000000 * Math.random()));
    let max = Number.MIN_SAFE_INTEGER, min = Number.MAX_SAFE_INTEGER;
    a.forEach(v => {max = Math.max(max, v); min = Math.min(min, v);});
    

    选项3:

    // Is this 3n/2?
    let a = [...Array(1000000)].map(() => Math.round(1000000 * Math.random()));
    a.sort((x,y) => x - y);
    let max = a[a.length - 1];
    let min = a[0];
    
    1 回复  |  直到 5 月前
        1
  •  2
  •   smallpepperz    5 月前

    大O符号不包括系数,因为它只处理系数的缩放方式。 O(n) 随着n的增加,具有相同的行为 O(2n) 会的。你可以把它看作是嵌套循环。如果你必须为每个元素做点什么,那就是 O(n) 如果你必须为每一对元素做点什么,那就是 O(n^2)

    大O不允许你直接比较函数的性能,你可以有两个 O(n) 速度差异很大的函数(想象一下,一个元素每睡10秒,另一个元素睡1秒)。同样,在较小的尺度上 O(n^2) 函数可能优于 O(n) 功能,但 O(n) 功能将足够高 n 优于时间复杂度较高的函数

    选项1是 O(n) (即使重复两次,也可以在不嵌套的情况下迭代每个元素)

    选项2是 O(n) (迭代每个元素而不嵌套)

    选项3取决于JavaScript引擎的实现 Array.prototype.sort ,但肯定高于保证值 O(n) .最坏情况 O(nlogn) ,但一些实现将利用已经排序的数据(您没有)进行更有效的排序。 See this answer for more detail