我需要幫助來查找 bash 中陣列元素的所有組合(總和)。這是代碼的摘錄:
#!/bin/bash
array=("31" "-41" "59" "26" "-53" "58" "97" "-93" "-23" "84") # min 1 vlaue
arrLength=("${#array[@]}")
for (( i=0; i < $arrLength; i ))
do
#echo "$i"
for (( j=$i; j > 0; j-- ))
do
summ=$(( array[j] ))
bak=$((array[0] summ))
echo "$summ ; $bak"
done
echo "_____________________________"
done
這會找到單對和雙對。缺少的是三對(例如 31 (-41) 59)、四對的組合……等等。我不想硬編碼它,因為元素的數量可以在我的程式中改變。
尋求幫助,我將不勝感激。謝謝你。
uj5u.com熱心網友回復:
正如其他人所評論的,我們有 10 個數字的 1023 種組合,不包括空集。這些組合可以與 和 之間的位模式相關0000000001聯1111111111。那你試試:
#!/bin/bash
array=("31" "-41" "59" "26" "-53" "58" "97" "-93" "-23" "84")
n=${#array[@]} # number of elements
for (( i = 1; i < (1 << n); i )); do # loop between 1 and 1023
sum=0; list=() # initialize variables
for (( j = 0; j < n; j )); do # loop over the bit slice position
if (( (1 << j) & i )); then # if the bit is set
(( sum = ${array[j]} )) # then pick the element to sum
list =("${array[j]}") # append to an array to report
fi
done
(IFS=,; printf "(%s) = %d\n" "${list[*]}" "$sum")
# report the sum of the set
done
輸出的前幾行:
(31) = 31
(-41) = -41
(31,-41) = -10
(59) = 59
(31,59) = 90
(-41,59) = 18
(31,-41,59) = 49
<snip>
它將總共列印 1023 行。
uj5u.com熱心網友回復:
awk使用遞回函式的一個想法:
array=("31" "-41" "59" "26" "-53" "58" "97" "-93" "-23" "84")
printf "%s\n" "${array[@]}" |
awk '
function find_sum(i, sum, label, j) {
printf "%8s = %s\n",sum,label
for (j=i 1;j<=FNR;j )
find_sum(j, sum item[j], label " " item[j])
}
{ item[FNR]=$1 }
END { for (i=1;i<=FNR;i )
find_sum(i, item[i], item[i])
}
'
注意:由于我們通過一次awk呼叫執行所有操作,我們可以將總運行時間從 ~13 秒(bash回圈結構)減少到 ~0.1 秒(awk)
這會產生:
31 = 31
-10 = 31 -41
49 = 31 -41 59
75 = 31 -41 59 26
22 = 31 -41 59 26 -53
80 = 31 -41 59 26 -53 58
177 = 31 -41 59 26 -53 58 97
84 = 31 -41 59 26 -53 58 97 -93
61 = 31 -41 59 26 -53 58 97 -93 -23
145 = 31 -41 59 26 -53 58 97 -93 -23 84
168 = 31 -41 59 26 -53 58 97 -93 84
154 = 31 -41 59 26 -53 58 97 -23
238 = 31 -41 59 26 -53 58 97 -23 84
261 = 31 -41 59 26 -53 58 97 84
-13 = 31 -41 59 26 -53 58 -93
... snip ...
35 = 58 -23
119 = 58 -23 84
142 = 58 84
97 = 97
4 = 97 -93
-19 = 97 -93 -23
65 = 97 -93 -23 84
88 = 97 -93 84
74 = 97 -23
158 = 97 -23 84
181 = 97 84
-93 = -93
-116 = -93 -23
-32 = -93 -23 84
-9 = -93 84
-23 = -23
61 = -23 84
84 = 84
uj5u.com熱心網友回復:
如果您的記憶體可以容納它,請通過添加新專案來復制每個新專案來將陣列加倍。此解決方案依賴于包含空集(帶有 sum 0)進行初始化。要排除它,請在最后將其剝離。
a=(31 -41 59 26 -53 58 97 -93 -23 84)
b=(0)
for i in ${a[@]}; do for j in ${b[@]}; do b =( $((i j)) ); done; done
$ echo ${#b[@]}
1024
$ printf '%s\n' ${b[@]}
0
31
-41
-10
59
:
:
86
155
186
114
145
相同的方法包括計算步驟:
a=(31 -41 59 26 -53 58 97 -93 -23 84)
b=("0 = 0")
for i in ${a[@]}; do for j in "${b[@]}"; do b =("${j%=*} $i = $((i ${j#*=}))"); done; done
$ echo ${#b[@]}
1024
$ printf '%s\n' "${b[@]}"
0 = 0
0 31 = 31
0 -41 = -41
0 31 -41 = -10
0 59 = 59
:
:
0 31 -41 26 -53 58 97 -93 -23 84 = 86
0 59 26 -53 58 97 -93 -23 84 = 155
0 31 59 26 -53 58 97 -93 -23 84 = 186
0 -41 59 26 -53 58 97 -93 -23 84 = 114
0 31 -41 59 26 -53 58 97 -93 -23 84 = 145
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/443229.html
上一篇:如何在我的JSON的幾列之間過濾()一個值?Javascript
下一篇:php中帶條件的陣列總和
