分治算法实践

38 阅读4分钟

二、实验目的 (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、 算法性能分析 时间复杂度:𝚶(𝒏𝒙)怎么计算得到的? 空间复杂度:𝚶(𝒏𝒙)怎么计算得到的? 任务其他标准上分析(比如排序的稳定性)。 六、可执行代码及程序执行截图

  1. 完整可执行代码 (包括主函数、算法函数、其他辅助函数 – 不限制语言C、Cpp、Java、Python等) 下面代码格式仅供参考,与测试样例非对应关系。
  2. #遍历每一条边
  3. def kruskal(edge_list,vertexs):
  4.     vertex_num = len(vertexs)
  5.     edge_num = len(edge_list)
  6.     tree_mst = []
  7.     if vertex_num <= 0 or edge_num < vertex_num - 1:
  8.         return tree_mst
  9.     edge_list.sort(key=lambda a:a[2])#按照边权由小到大排序
  10.     group = [[i] for i in range(1,vertex_num+1)]#初始化,将图G的顶点看成n个孤立分支
  11.     for edge in edge_list:
  12.         for i in range(len(group)):
  13.             if edge[0] in group[i]:
  14.                 m = i
  15.             if edge[1] in group[i]:
  16.                 n = i
  17.         if m != n:
  18.             tree_mst.append(edge)
  19.             group[m] = group[m] + group[n]
  20.             group.remove(group[n])
  21.     return tree_mst
  22. if name == "main":
  23.     #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]]
  24.     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)]
  25.     vertexs =[1,2,3,4,5,6]
  26.     tree_mst =  kruskal(edge_list,vertexs)
  27.     for edge in tree_mst:
  28.         print(edge)
  29.         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描述解决方法