首页 > 解决方案 > 优化查找 BASH 数组中最大元素的索引

问题描述

我正在使用 bash 来即时处理软件响应,并且我正在寻找一种方法来查找数组中最大元素的索引。

输入 bash 脚本的数据如下所示:

25 9
72 0
 3 3
 0 4
 0 7

所以我创建了两个数组。有

arr1 = [ 25 72 3 0 0 ]
arr2 = [ 9   0 3 4 7 ]

我需要的是在arr1中找到最大数的索引,以便将它也用于 arr2。但我想看看是否有一种快速 - 最佳的方法来做到这一点。

对我拥有的数据使用字典结构 [key][value] 会更好吗?这会让这个过程更容易吗?

我还找到了[1](来自用户 jhnc),但我不认为这是我想要的。

我的蛮力方法如下:


function MAX {

   arr1=( 25 72 3 0 0 )
   arr2=( 9   0 3 4 7 )

   local indx=0
   local max=${arr1[0]}
   local flag

   for ((i=1; i<${#arr1[@]};i++)); do

       #To avoid invalid arithmetic operators when items are floats/doubles
       flag=$( python <<< "print(${arr1$[${i}]} > ${max})")    

       if [ $flag == "True" ]; then

           indx=${i}
           max=${arr1[${i}]}

       fi

    done

    echo "MAX:INDEX = ${max}:${indx}"
    echo "${arr1[${indx}]}"
    echo "${arr2[${indx}]}"

}

这种方法显然会奏效,但是,它是最优的吗?有没有更快的方法来执行任务?

arr1 = [ 99.97 0.01 0.01 0.01 0 ]
arr2 = [ 0 6 4 3 2 ]

在这个例子中,如果一个数组包含浮点数,那么我会得到一个

语法错误:算术运算符无效(错误标记为“.97”)

所以,我正在使用

flag=$( python <<< "print(${arr1$[${i}]} > ${max})")

为了克服这个问题。

标签: bash

解决方案


找到最大值本质上是一个 O(n) 操作。但是没有必要在每次迭代时生成 Python 进程来执行比较。而是编写一个awk脚本。

awk 'BEGIN {
   split(ARGV[1], a1);
   split(ARGV[2], a2);
   max=a1[1];
   indx=1;
   for (i in a1) {
     if (a1[i] > max) {
       indx = i;
       max = a1[i];
     }
   }
   print "MAX:INDEX = " max ":" (indx - 1)
   print a1[indx]
   print a2[indx]
}' "${arr1[*]}" "${arr2[*]}"

这两个 shell 数组作为空格分隔的字符串传递给awk,然后将它们拆分回awk数组。


推荐阅读