【问题标题】:Largest values on array数组中的最大值
【发布时间】:2010-09-20 06:33:23
【问题描述】:

有人知道我如何从以下数组的第三列中获取两个最大的值吗?

$ar = array(array(1, 1,   7.50,   'Hello'),
              array(1, 2,  18.90,   'Hello'),
              array(3, 5,  11.50,   'Hello'),
              array(2, 4,  15.90,  'Hello'));

输出应该是:

15.90
18.90

提前致谢

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    如果您确定值(二)永远不会改变,只需遍历数组并跟踪两个最大的数字。如果不是,请使用usort() 对数组进行排序并提供适当的回调。然后取前两个值:

    function cmp($a, $b) {
        $a = $a[2];
        $b = $b[2];
        return $a == $b ? 0 : $a < $b ? 1 : -1;
    }
    
    usort($ar, 'cmp');
    

    【讨论】:

      【解决方案2】:

      您从哪里获取数组数据? 数据多久更改一次? 你能得到已经按该字段排序的数组吗? 如果有大量数据项,是否值得进行第二次查询?

      【讨论】:

        【解决方案3】:

        一个更通用的解决方案,用于 n 个最大值(伪代码)

        def maxN(list, n):
            result = []
            curmin = 0
            for number in list:
                if number > curmin:
                    binary insert number into result.    #O(log n)
                    if len(result) > n:  
                        truncate last element            #O(1)
                    curmin = new minimum in result list  #O(1) since list is sorted
        
            return result
        

        整个过程需要... O(m log n),其中 m 是列表的大小,n 是您想要的最大元素数。这比对大 n 需要 O(n log n) 的列表进行排序要好得多。

        但如果你只想要最多两个元素,这也有点过头了。

        【讨论】:

          【解决方案4】:

          排序是 O(n log n),但实际上你可以在 O(n) 内完成(也就是说,如果数组很大,更快)。伪代码如下:

          first  = array[0][2]
          second = array[1][2]
          if second > first
             first, second = second, first
          for tuple in array[2:n]
             if tuple[2] > second
                second = tuple[2]
             if second > first
                first, second = second, first
          

          【讨论】:

          • 很好奇我们如何编写 Python 代码,省略一些冒号,并将其称为伪代码。不是吗?:^)
          【解决方案5】:

          最简单的方法之一是将所有值收集到一个数组中,对数组进行排序,然后打印出前两个值。

          有更有效的方法不涉及对整个数组进行排序,但以上内容应该可以帮助您入门。

          【讨论】:

            猜你喜欢
            • 2016-09-10
            • 2021-01-16
            • 1970-01-01
            • 2012-08-09
            • 1970-01-01
            • 2013-09-02
            • 2011-10-31
            • 2016-07-06
            • 1970-01-01
            相关资源
            最近更新 更多