LoginSignup
1
0

More than 5 years have passed since last update.

リストの中の最大値を求める

Last updated at Posted at 2012-12-21

Tclで科学技術計算をする時に、リストに入っているデータから最大値を求めたい時がありますよね。expr max($l) で出来そうなのですが、max関数は引数が,区切りで無いと受け付けてくれません。そこで、全データを調べる方法と、ソートする方法、区切り文字を変えてmax関数を使う方法で、どれが一番速いかを試しました。

max.tcl
# テストデータの作成
set l ""
for {set i 0} { $i<1000000 } {incr i} {
    lappend l [expr rand()]
}

# 方法1 自力で比較
set s0 [clock clicks -milliseconds]
set max [lindex $l 0]
foreach x $l {
    if { $max < $x } {
    set max $x
    }
}
set s1 [clock clicks -milliseconds]
puts "1: max $max time [expr $s1 - $s0] ms"

# 方法2 ソートを使う
set s0 [clock clicks -milliseconds]
set max [lindex [lsort -decreasing -real $l] 0]
set s1 [clock clicks -milliseconds]
puts "2: max $max time [expr $s1 - $s0] ms"

# 方法3 区切りを変えてmax関数を使う
set s0 [clock clicks -milliseconds]
set max [expr max([regsub -all { } $l {,}])]
set s1 [clock clicks -milliseconds]
puts "3: max $max time [expr $s1 - $s0] ms"

実行するとこのようになります。

1: max 0.9999997345730661 time 339 ms
2: max 0.9999997345730661 time 419 ms
3: max 0.9999997345730661 time 4978 ms

区切り文字を変えて組込のmax関数が速いと思ったのですが、自分で計算する方が速いですね。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0