【发布时间】:2021-04-30 12:29:07
【问题描述】:
我在 python 中编写了 2 个最近邻算法,我必须通过 O(n) 和 Θ(n) 来分析运行时复杂度。 所以我尝试了几个样本,但我不明白为什么我的一种算法比另一种更快。
这是我的重复最近邻 (RNN) 算法的代码:
def repeated_nn_tsp(cities):
return shortest_tour(nn_tsp(cities, start) for start in cities)
def shortest_tour(self, tours):
return min(tours, key=self.tour_length)
nn_tsp 的运行时复杂度为 O(n^2),每个起点都会创建一个新的 NN Tour。通过所有 NN 巡回演出,我必须找到最好的巡回演出。 这就是为什么我认为 RNN 的时间复杂度必须是 T(n)=O(n^3) 和 T(n)=Θ(n^3)。
所以这是我的更改最近邻 (ANN) 算法的代码:
def alter_tour(tour):
original_length = tour_length(tour)
for (start, end) in all_segments(len(tour)):
reverse_segment_if_better(tour, start, end)
if tour_length(tour) < original_length:
return alter_tour(tour)
return tour
def all_segments(N):
return [(start, start + length) for length in range(N, 2-1, -1) for start in range(N - length + 1)]
def reverse_segment_if_better(tour, i, j):
A, B, C, D = tour[i-1], tour[i], tour[j-1], tour[j % len(tour)]
if distance(A, B) + distance(C, D) > distance(A, C) + distance(B, D):
tour[i:j] = reversed(tour[i:j])
all_segments 的时间复杂度应该是 T(n) = O(1/2 * n^2 - 0.5n) -> O(n^2) 并创建 n^2 个元素。 在循环内通过 all_segments(通过 n^2 个元素)我调用函数 reverse_segment_if_better。我将使用 python 的反转方法,这会导致 O(n) 的时间复杂度。 这就是为什么我认为循环的时间复杂度必须是 O(n^3)。当有更好的游览时,该函数将调用自身递归。我认为改变后的 NN 的时间复杂度为 O(n^4)。对吗?
但是我们遇到了我的问题:我的评估在 100 个城市上运行代码 100 次,结果表明 ANN 平均比 RNN 快,这与我预期的运行时复杂性相反。 (RNN 需要 4.829 秒,而 ANN 只需要 0.877 秒,1x 100 城市。)
那么我在哪里做错了?
提前致谢!
【问题讨论】:
-
我可以建议使用 Cprofiler 来获取函数调用的计数和时间。
标签: python algorithm time-complexity big-o traveling-salesman