空白で区切られた単語のリストから、互いに一定の数の値が離れているいくつかの値を繰り返す最も効率的な方法を見つけようとしています(配列を使用したくありません)。例えば、
list="1 ant bat 5 cat dingo 6 emu fish 9 gecko hare 15 i j"
そのため、リストを繰り返して1、5、6、9、15にのみアクセスできるようにしたいと思います。
編集する:リストから取得する値がリストの残りの部分と異なる形式である必要はないことを明確にする必要があります。これはリスト内の場所(この場合は場所1、4、7...)でのみ特別です。したがって、リストにすることができますが、1 2 3 5 9 8 6 90 84 9 3 2 15 75 55
まだ同じ数が欲しいです。そして、私はリストの長さがわからないと仮定し、これを行うことができるようにしたいと思います。
今まで私が考えることができる方法は次のとおりです。
方法1
set $list
found=false
find=9
count=1
while [ $count -lt $# ]; do
if [ "${@:count:1}" -eq $find ]; then
found=true
break
fi
count=`expr $count + 3`
done
方法2
set list
found=false
find=9
while [ $# ne 0 ]; do
if [ $1 -eq $find ]; then
found=true
break
fi
shift 3
done
方法3 私は配管がこれを最悪の選択にすると確信していますが、好奇心が強いので、セットを使用せずにこれを行う方法を見つけようとしています。
found=false
find=9
count=1
num=`echo $list | cut -d ' ' -f$count`
while [ -n "$num" ]; do
if [ $num -eq $find ]; then
found=true
break
fi
count=`expr $count + 3`
num=`echo $list | cut -d ' ' -f$count`
done
それでは、最も効率的な方法は何ですか?それとももっと簡単な方法を見逃していますか?
ベストアンサー1
ソフトウェア最適化の最初の規則:いいえ。
問題があることを知るまで、プログラムの速度について考える必要はありません。リストの長さがこの程度であるか、項目が100〜1000個程度の場合は、時間がどれくらいかかるかさえ気付かないでしょう。違いよりも最適化について考えるのにより多くの時間を費やすことができます。
2番目のルール:測定する。
これは確かな方法であり、システムに答えを提供する方法です。特に貝殻は種類が異なり、すべて同じではありません。 1つのシェルに固有の回答があなたのシェルに適用されない場合があります。
大規模なプログラムでは、ここでも分析も行われます。最も遅い部分は、あなたが想像しているものと異なる場合があります。
3. シェルスクリプト最適化の最初の規則:シェルを使用しないでください。
はい、本当にそうです。多くのシェルはすぐに設計されておらず(外部プログラムを起動する必要がないため)、毎回ソースラインを再解析することもできます。
代わりにawkやPerlなどを使用してください。私が行った単純なマイクロベンチマークでは、
awk
I / Oなしで単純なループを実行するのが一般的なシェルよりも数十倍速かったです。ただし、シェルを使用する場合は、外部コマンドではなくシェルの組み込み機能を使用してください。ここでの使用は、
expr
私のシステムで見つけたどのシェルにも組み込まれていませんが、標準算術拡張で置き換えることができます。たとえばi=$((i+1))
、。前の例で使用したものを標準パラメータ拡張で置き換えることもできます。i=$(expr $i + 1)
i
cut
問題に手順1と2を適用する必要があります。