贪心算法 vs 动态规划:活动选择问题的效率比较
上述代码生成了一个比较贪心算法和动态规划算法在不同活动数量下的执行时间的折线图。x轴表示活动数量,y轴表示执行时间。由于时间复杂度的关系,贪心算法和动态规划算法的执行时间都是线性增长的,因此折线图呈现的是一条直线。
import random
import time
import matplotlib.pyplot as plt
def generate_activities(n):
activities = []
for i in range(n):
start_time = random.randint(0, 100)
end_time = start_time + random.randint(1, 10)
activities.append((start_time, end_time))
return activities
def greedy_activity_selection(activities):
activities.sort(key=lambda x: x[1]) # 按结束时间排序
selected_activities = []
current_end_time = 0
for activity in activities:
if activity[0] >= current_end_time:
selected_activities.append(activity)
current_end_time = activity[1]
return selected_activities
def dynamic_programming_activity_selection(activities):
n = len(activities)
activities.sort(key=lambda x: x[1]) # 按结束时间排序
dp = [1] * n
for i in range(1, n):
for j in range(i):
if activities[i][0] >= activities[j][1]:
dp[i] = max(dp[i], dp[j] + 1)
max_activities = max(dp)
selected_activities = []
current_end_time = float('-inf')
for i in range(n - 1, -1, -1):
if dp[i] == max_activities and activities[i][1] >= current_end_time:
selected_activities.append(activities[i])
current_end_time = activities[i][0]
max_activities -= 1
return selected_activities[::-1]
def compare_execution_time():
n_values = [8, 16, 32, 64, 128]
greedy_times = []
dp_times = []
for n in n_values:
activities = generate_activities(n)
start_time = time.time()
greedy_activity_selection(activities)
end_time = time.time()
greedy_times.append(end_time - start_time)
start_time = time.time()
dynamic_programming_activity_selection(activities)
end_time = time.time()
dp_times.append(end_time - start_time)
plt.plot(n_values, greedy_times, label='Greedy')
plt.plot(n_values, dp_times, label='Dynamic Programming')
plt.xlabel('Number of activities')
plt.ylabel('Execution time')
plt.legend()
plt.show()
compare_execution_time()
在这段代码中,generate_activities 函数用来生成随机的活动集合,greedy_activity_selection 和 dynamic_programming_activity_selection 分别实现了贪心算法和动态规划算法,compare_execution_time 函数则比较了两种算法在不同活动数量下的执行时间。
由于贪心算法的时间复杂度为 O(n log n)(排序时间),动态规划算法的时间复杂度为 O(n^2),在活动数量较少的情况下,两种算法的执行时间差异并不明显。因此,折线图呈现的是一条直线。
需要注意的是,本例中为了简化问题,活动集合是随机生成的,因此两种算法的执行时间差异并不明显。在实际应用中,活动的特性可能会导致两种算法的效率有较大差异。
原文地址: https://www.cveoy.top/t/topic/fwBn 著作权归作者所有。请勿转载和采集!