저는 파이썬의 알고리즘에 대해 설명하고 있습니다. Big-O 표기법으로 약간 고심하고 있습니다. 문제는 k- 가장 작은 수를 찾고 선형 선형이되도록 함수를 개선하는 선형 함수를 만드는 것입니다. 8.463193 초 선형 함수를 기록lineairair가 더 느린 이유를 알아 내려고 시도했습니다.
import random
import timeit
def linear_find_smallest(values):
smallest = len(values)
for i in values:
if smallest > i != 0:
smallest = i
return smallest
def loglinear_find_smallest(values):
values.sort()
smallest = len(values)
for i in values:
if smallest > i != 0:
smallest = i
del values[values.index(i):]
return smallest
if __name__ == '__main__':
values = random.sample([i for i in range(1, 10000)], len(range(1, 10000)))
t = timeit.Timer("linear_find_smallest(%s)" % str(values),
setup="from __main__ import linear_find_smallest")
print("Lineair: found in %f seconds" % t.timeit(number=1000))
t = timeit.Timer("loglinear_find_smallest(%s)" % str(values),
setup="from __main__ import loglinear_find_smallest")
print("Log linear: found in %f seconds" % t.timeit(number=1000))
그러나, 선형 함수가 1.614513 초에서 실행하고, (나는 가정) :이 생산했습니다. 누군가 내가 여기서 뭔가 잘못하고 있다고 말할 수 있습니까?
나는 http://interactivepython.org/courselib/static/pythonds/AlgorithmAnalysis/analysis.html#programming-exercises에서 강의를 진행하고 있습니다. 마지막 질문에서 알고리즘을 개선하여 선형으로 로그 할 수 있는지 물어 보았습니다. 그것은 나 혼란 스러웠지만, 실제로 당신의 대답은 그것을 깨끗하게합니다. – Praetore
@Praetore Ah. 나는 당신이 해결 한 것보다 약간 더 일반적인 문제 ([선택 문제] (https://en.wikipedia.org/wiki/Selection_algorithm))를 해결하는 것이 당신이 연결된 운동 인 것 같습니다. 또한 실제적으로 이론적으로 더 복잡한 알고리즘은 [홀수 - 병합 정렬] (https://en.wikipedia.org/wiki/Batcher_odd%E2%80)과 같은 더 많은 (이론적으로) 최적의 알고리즘을 능가 할 수 있습니다. % 93even_mergesort)는 짝수 - 홀수 버전이 'O (n log^2 n)'이고 일반적으로 정렬을 위해 이론적으로 최적 인 'O (n log n)'인 경우에도 일반 병합 정렬보다 성능이 우수합니다. –
좋아요 tnx! 알고리즘을 정렬하는 과정에 참여할 때 테스트 해 보겠습니다. – Praetore