bash - 优化查找 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})")
为了克服这个问题。
解决方案
找到最大值本质上是一个 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
数组。
推荐阅读
- java - 合并多个 LiveData 源?
- pandas - Pandas:按整数选择数据框中的多列
- c# - 当方法被另一个方法调用时,RabbitMQ Consumer 不检索消息
- javascript - 我想为我的 Quiz React 应用程序启动倒数计时器(小时:分钟:秒),如何仅在选择主题时启动计时器?
- java - 在 JPA 一对多关系中分配给 NULL 的外键
- python - ModuleNotFoundError 即使在 Google Colab 中导入之后
- python - 在 C++ 中使用 Mitsuba2 插件的示例
- python - Pandas:为列中的下 n 个单元格写入相同的值
- android - Firebase 数据库中是否有空地图计数带宽的更新?
- python - 并非所有元素都从列表中删除