【问题标题】:How to make this bash prime generator faster [SPOJ]如何使这个 bash prime 生成器更快 [SPOJ]
【发布时间】:2018-11-27 06:21:00
【问题描述】:

我正在做名为 Prime Generator 的 SPOJ 挑战,但是在 BASH 中,法官说

时间限制 超过

代码给出了请求的结果,这个算法在 C++ 和 Java 中被接受了

#!/bin/bash

read ITERATIONS

for (( i=0; i<$ITERATIONS; i++ ))
do
        read START END

        for (( j=$START; j<=$END; j++ ))
        do
                isPrime=1

                if [ $j -eq 1 ]
                then
                        isPrime=0
                fi

                for (( k=2; k*k<=$j; k++ ))
                do
                        if (($j % $k == 0))
                        then
                                isPrime=0
                                break
                        fi
                done

                if [ $isPrime -eq 1 ]
                then
                        echo "$j"
                fi
        done
done

我的问题是,我怎样才能加快这段代码的速度?我是否做了一些愚蠢的事情来减慢它的速度?

【问题讨论】:

  • 查看wikipedia article,它也使用循环,但增量为 6 而不是 1
  • rosettacode.org上的替代实现
  • 枚举并仅测试您的范围 START...END 中的奇数,并通过从 3 到 END 的 sqrt 的素数对其进行测试,您需要事先单独查找。

标签: bash performance generator primes


【解决方案1】:

是否使用 bc 选项?

read -r ITERATIONS
for ((i = $ITERATIONS; i; --i)); do
        read -r START END
        ((START = START == 1 ? 2 : START))
        echo '
for (j='"$START"'; j<='"$END"'; ++j) {
        isprime=1
        for (k=2; k*k<=j; ++k) {
                if (j%k == 0) {
                        isprime=0
                        break
                }
        }
        if (isprime == 1) {
                j
        }
}
        ' | bc
done

或者可能添加一些并发,但是我们需要同步输出:

tmps=()
read -r ITERATIONS
for ((i = $ITERATIONS; i; --i)); do
        read -r START END
        ((START = START == 1 ? 2 : START))
        tmp=$(mktemp)
        tmps+=($tmp)
        (
        echo '
for (j='"$START"'; j<='"$END"'; ++j) {
        isprime=1
        for (k=2; k*k<=j; ++k) {
                if (j%k == 0) {
                        isprime=0
                        break
                }
        }
        if (isprime == 1) {
                j
        }
}
        ' | bc
        ) > "$tmp" &
done
wait
cat "${tmps[@]}"
rm "${tmps[@]}"

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2023-03-29
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多