2017-12-31 64 views
-4

며칠 전에 인터뷰에서이 문제에 대해 질문을 받았으며 그 동안 해결 해 준 문제를 개선하고 싶습니다. 지금까지 이것이 내가 가진 것입니다. 더 효율적으로 만드는 방법을 모릅니다. 처음에는 다음과 같을 것입니다 :이 함수를 개선하여 소수를 결정하는 방법은 무엇입니까?

1) i % 2 == 0 라인을 추가하면 시간이 절약됩니까?

2) 파이썬에서 % 연산자의 시간 복잡도는 얼마입니까? %를 사용하지 않고 숫자가 더 빠른 방법으로 나눌 수 있는지 확인하는 방법이 있습니까?

3) d < = math.sqrt (i)는 i의 제곱근을지나 제수를 계산할 때 쓸모가 없다는 사실을 이용합니다. d는 d = i가 될 때까지 잘 나눕니다. 이것이 최적의 단계 수를 제시합니까? i가 홀수라고 주어진이기 때문에이 4 점을 간다) 제가

5 홀수 주어진 있기 때문에

4) I는 D에서 시작 = 3, 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

코드 검토 stackexchange에 더 적합 할 수 있습니다. 비슷한 [질문 여기] (https://stackoverflow.com/a/15285588/314291). 예, % 2 == 0은 일반적으로 유용합니다. 이 접근법은 3, 5 등의 더 높은 소수로 확장 될 수 있으며 '6/30/120의 바퀴'등으로 최적화 될 수 있습니다. 최적화로 첫 번째 N 소수의 캐시를 작성할 수도 있습니다. – StuartLC

답변

0

) 이론적으로는 아니지만 실제로는 그렇다. O 표기법의 시간 복잡성을 줄이지 않지만 짝수를 고려하지 않기 때문에 실제로는 줄일 수 있습니다. 따라서이 프로그램은 2 배 빨라질 수 있습니다.

2) 주석에 언급 된대로 일반적으로 유용합니다.

3) 물론. sqrt(i)으로 간주하여 시간 복잡도를 O(i)에서 O(sqrt(i))으로 줄였습니다.

4) 질문이 아닙니다. 그러나 사실입니다.

5) 역시 질문이 아닙니다. 그러나 합리적입니다. 확인한대로 i도 적합하지 않습니다.