二、实验目的 (1)了解分治策略算法思想及基本原理; (2)掌握使用分治算法求解问题的一般特征; (3)掌握分解、治理的方法; (4)能够针对实际问题,能够正确的分解、治理,设计分治算法; (5)能够分析实验结果,评估算法效率。 三、实验环境 (1) Windows操作系统或Linux操作系统; (2)Python3.x; (3)PyCharm或Sublime或Jupyter Notebook。 四、实验内容 (1)巡回赛日程表 设有n=2k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: • 每个选手必须与其它n-1个选手各赛一次; • 每个选手一天只能比赛一次; • 循环赛一共需要进行n-1天。 请按此要求将比赛日程表设计成有n行和n-1列的一个表。 在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手,其中1≤i≤n,1≤j≤n-1。 举例,当k=2时,比赛日程表指定如下:
(2) 棋盘覆盖问题(选做) 有一个2kx2k(k>0 )的棋盘,恰好有一个方格与其他方格不同,称之为特殊方格,并且称该棋盘为一特殊棋盘。现在要用图(b)的4种不同形状的三格骨牌覆盖除了特殊方格外的其他全部方格,并且任何两个三格骨牌不能重叠。请给出一种覆盖方案。
举例:
五、问题分析
1、 问题的输入描述
输入的数据结构格式,比如 G=(V,E)是无向连通带权图,V是顶点集合V={1,2,…,N},E是边集合E=(Vi,Vj,wij),其中Vi,,Vj∈V,wij是顶点Vi,、Vj边的权值。 蓝色底纹字体看完删除。
2、 问题的输出描述
输出的数据结构格式,比如 T=(V,TE)是最小生成树,TE是最小生成树中的边集合。蓝色底纹字体看完删除。
3、 算法描述(伪代码)
算法:Kruskal输入:图G=(V,E)
输出:最小生成树T将边集合E按照权值wij升序排序。
T ← ∅ j ← 0 //记录加入的边的条数
for i ← to |E| do
e ← E[i] // ctrl + Tab 在表格内缩进
….
if …. then
break;
end
end
…return T4、 算法性能分析
时间复杂度:𝚶(𝒏𝒙)怎么计算得到的?
空间复杂度:𝚶(𝒏𝒙)怎么计算得到的?
任务其他标准上分析(比如排序的稳定性)。
六、可执行代码及程序执行截图
- 完整可执行代码 (包括主函数、算法函数、其他辅助函数 – 不限制语言C、Cpp、Java、Python等) 下面代码格式仅供参考,与测试样例非对应关系。
- #遍历每一条边
- def kruskal(edge_list,vertexs):
- vertex_num = len(vertexs)
- edge_num = len(edge_list)
- tree_mst = []
- if vertex_num <= 0 or edge_num < vertex_num - 1:
- return tree_mst
- edge_list.sort(key=lambda a:a[2])#按照边权由小到大排序
- group = [[i] for i in range(1,vertex_num+1)]#初始化,将图G的顶点看成n个孤立分支
- for edge in edge_list:
- for i in range(len(group)):
- if edge[0] in group[i]:
- m = i
- if edge[1] in group[i]:
- n = i
- if m != n:
- tree_mst.append(edge)
- group[m] = group[m] + group[n]
- group.remove(group[n])
- return tree_mst
- if name == "main":
- #edge_list = [[1,2,6],[1,3,1],[1,4,5],[2,3,5],[2,5,3],[3,4,5],[3,6,4],[3,5,6],[4,6,2],[5,6,6]]
- edge_list = [(1,2,6),(1,3,1),(1,4,5),(2,3,5),(2,5,3),(3,4,5),(3,6,4),(3,5,6),(4,6,2),(5,6,6)]
- vertexs =[1,2,3,4,5,6]
- tree_mst = kruskal(edge_list,vertexs)
- for edge in tree_mst:
- print(edge)
- 2.执行结果与分析(自定义测试数据进行分析。) 至少三组,并附带运行结果。 应具备算法样例自定义验证程序正确性的能力。 输入数据1:(可截图终端窗口) (1,2,6) (1,3,1) (1,4,5) (2,3,5) (2,5,3) (3,4,5) (3,6,4) (3,5,6) (4,6,2) (5,6,6) 输出结果:(截图终端窗口·输出)
七、遇到的问题及解决方案 问题1描述解决方法 问题2描述解决方法
问题3描述解决方法
问题4描述解决方法