2017-12-31 96 views
-4

私はこの問題を数日前のインタビューで尋ねられましたが、その間に与えた解決策を改善したかったのです。これまでのところこれが私の持っているものです。より効率的にする方法についてはわかりません。私は初心者のために推測します:この関数を改善して素数を決定するにはどうすればよいですか?

1)i%2 == 0行を追加すると時間が節約できますか?

2)Pythonでの%演算子の時間複雑度はどのくらいですか? %を使用せずに、ある数値がより速く割り切れるかどうかをチェックする方法はありますか?

3)d = 1になるまでdが正しく分割されないため、d < = math.sqrt(i)は、iの平方根を超える除数を計算することは無意味であるという事実を利用しています。これは最適なステップ数を示していますか?

4)私が

5奇数であることを考えるているため、私は、D = 3で開始)4点をオフに行くiが奇数であると仮定されているので、私は、2の代わりに1ずつ増加。

def is_prime(i): 
    if i < 2: 
     return False 
    if i == 2: 
     return True 
    d = 3 
    if i%2 == 0: #skip even numbers 
     return False 
    while d <= math.sqrt(i): 
     if i%d == 0: 
      return False 
     d += 2 
    return True 
+1

Code Review stackexchangeに適している場合があります。同様の[質問はこちら](https://stackoverflow.com/a/15285588/314291)。はい、%2 == 0は一般に有益です。このアプローチは、3,5などのより高い素数に拡張し、 '6/30/120'のホイールなどとして最適化することができます。また、最適化として最初のN個の素数のキャッシュを構築することもできます。 – StuartLC

答えて

0

1)理論的には、実際はそうである。 O表記の時間の複雑さは減少しませんが、偶数を考慮しないため、実際には減少します。したがって、このプログラムは2倍高速になる可能性があります。

2)コメントに記載されているように、一般に有益です。

3)もちろんです。 sqrt(i)と考えると、時間の複雑さをO(i)からO(sqrt(i))に減らすことができます。

4)質問ではありません。しかし、それは本当です。

5)これもまた問題ではありません。しかし、あなたがチェックしたように、それは合理的ですiは偶然ではありません。

関連する問題