Bashに配列はあります。ただ、とても遅いです。
white spaceで区切って()で括ると配列になります。
#!/bin/bash a=(1 2) a+=(3) echo ${a[@]} # 1 2 3
a+=(3)は、見た通り要素を追加しています。
これは本当に追加なのでしょうか。多くの要素を追加して、経過時間を調べればだいたいわかります。
#!/bin/bash N=$1 a=() for n in `seq 1 $N`; do a+=($n) done
これを、引数を変えてtimeで時間計測すると
arg 100000 1000000 10000000 real 0m0.656s 0m6.357s 1m4.420s
線形のようですね。
ちなみに、構築だけならこのほうが速いです。
#!/bin/bash N=$1 a=(`seq 1 $N`)
3倍くらい速かったです。
参照は、次のようにします。
a=(1 2 3 4 5) echo ${a[0]} # 1
他の参照方法は、
echo ${a[@]} # 1 2 3 4 5 echo ${a[@]:1:3} # 2 3 4
2つ目は、0-baseの開始位置と長さを指定しています。
値の代入は、
a[1]=3
これで、Problem 7が解けます。エラトステネスの篩のややこしいバージョンになっていますが。
続きを読む