数据结构与算法分析第十章回溯算法之收费公路重建问题

一、  问题描述:

设给定N个点p1, p2,…,pn,它们位于x-轴上。xi是pi点的x坐标。这N个点确定了N(N-1)/2个点间距离。显然,如果给定点集,那么容易以O(N2)事件构造距离集合。收费公路重建问题是从这些距离重新构造出点集。

二、解题思路:

回溯算法:

对于大多数的回溯算法,最方便的实现方法是使用递归,该算法一直沿某条可能路线执行,直至得到确定结果,如果结果是正确的,则成功返回;否则回溯到该路线的上一步,尝试另外一条可能路线。如此程序要么找到正确路线,返回路线;要么不断回溯,尝试所有路线,发现任何路线均不可行,返回失败。

收费公路重建:

1、若给定该问题的一个解,则可以通过对所有的点加上一个偏移量而构建无穷多其他的解,因此将第一个点置于0处;

2、由于距离集合D中最大值为max,因此max处存在一个点,从D中删除max,现在点集X中有两个点位置已确定,起点x,终点max;

3、取D中的最大值m,则新点横坐标只存在两种可能,位于m处,或者(max-m)处;

4、先假定新点位于m处,则该点与X中已确定点的点距d也确定了,如果d中的每个值均在D中,那么说明该位置可能合适,更新D和X,执行步骤3(如果步骤3返回true,执行结束,否则还原D和X,执行步骤5);否则执行步骤5;

5、假定新点位于(max-m)处,重新判断点距,如果点距均在D中,更新D和X,执行步骤3(如果步骤3返回true,执行结束,否则还原D和X,返回false);否则无适合点集满足所需,返回false。

简要总结:

  每次取集合D中的最大值,则新点位置只存在两种可能。每假定新点位置,则该点与集合X中其他点的距离便确定了,首先判断这些距离是否位于D中,如果不都在,则新点位置不合适;否则确定新点在此位置,继续向下执行。新点位置在两处均不合适,说明上一个新点位置选取失败,回溯。

 

三、编程实现:

  1、代码(注:传入的参数dList必须已按从小到大排序,得到的点的横坐标未排序):

 

public class RebuildRoad {

       protected static int maxLen;


       public void start(LinkedList<Integer>dList, int[] pArray) {

              maxLen =dList.removeLast();

              pArray[0] = 0;

              pArray[1] = maxLen;

 

              build(dList, pArray, 2);

       }

 

       private boolean build(LinkedList<Integer> dList, int[] pArray, int left) {

              if (dList.isEmpty()) {//说明已经找到点集,返回

                     return true;

              }

 

              LinkedList<Integer>dCopy = new LinkedList<Integer>();

              dCopy.addAll(dList); // 创建dList的副本,便于恢复dList

 

              int max =dList.getLast();

              boolean res = false;

 

              res = takeStep(dList,dCopy, pArray, left, max);

              if (res)

                     return true;

 

              int lmax = maxLen - max;// max和lmax总是成对出现的

              res = takeStep(dList,dCopy, pArray, left, lmax);

 

              return res;

       }

 

       private boolean takeStep(LinkedList<Integer> dList,

                     LinkedList<Integer>dCopy, int[] pArray, int left, int max) {

 

              int[] dists = newint[left]; // 存放新点与其他个点的距离

              boolean find = true;

              boolean flag = true;

 

              for (int i = 0; i <left; i++) {

                     dists[i] =Math.abs(max - pArray[i]);

                     if(!dList.contains(dists[i])) {

                            flag =false;

                            break;

                     }

              }

 

              if (flag) { // 如果新点放置在max处,与其他各点的距离均在dList中

                     for (int i = 0; i< left; i++) { // 从dList中移除各个距离

                            if(!dList.remove(new Integer(dists[i]))) {

                                   find= false;

                                   break;

                            }

                     }

 

                     if (find) {

                            pArray[left++]= max;

                            find =build(dList, pArray, left);

                            if (find)

                                   returntrue;

                            else //撤销对数组的操作

                                   left--;

                     }

              }

 

              if (flag) { // 执行到这里,说明此路不通,且dList已改变,需要恢复

                     dList.removeAll(dList);

                     dList.addAll(dCopy);

              }

 

              return false;

       }

}

 

2、结果:

    

数据结构与算法分析 ——回溯算法之收费公路重建问题相关推荐

  1. 数据结构与算法分析——排序算法总结

    排序算法总结 常见的十大排序算法: 八大排序算法分类 一.直接插入排序Insertion Sort 插入排序的设计初衷是往有序的数组中快速插入一个新的元素.它的算法思想是:把要排序的数组分为了两个部分 ...

  2. java红黑树 冯舜玺_《数据结构与算法分析》(美)马克·艾伦·维斯(Mark Allen Weiss) 著;冯舜玺,陈越 译著【摘要 书评 在线阅读】-苏宁易购图书...

    出版者的话 前言 章  引论1 1.1  本书讨论的内容1 1.2  数学知识复习2 1.2.1  指数2 1.2.2  对数2 1.2.3  级数2 1.2.4  模运算4 1.2.5  证明的方法 ...

  3. s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...

    <数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...

  4. 【算法设计技巧】贪婪算法与回溯算法

    贪婪算法 在前面的文章中已经见到了3个贪婪算法(greedy algorithm):Dijkstra 算法.Prim 算法和 Kruskal 算法.贪婪算法分阶段地工作.在每个阶段,可以认为所作决定是 ...

  5. 《数据结构与算法分析》回溯算法之博弈——三连棋(tic tac toe)人机对战AI设计(αβ枝减)

    前言: 这次的回溯算法实在是太有意思了,不过刚刚接触的时候确实不容理解,极小极大策略,αβ枝减看了好几遍才明白整个过程.实现的时候又发现还有细节不明白,想明白之后对于整体的认识又加深了一步. 编码的过 ...

  6. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现

    是使用递归方法实现回溯算法的,在第一次使用二维矩阵的情况下,又做了一次改一维的优化 但是算法效率仍然差强人意,因为使用递归函数的缘故 下面提供另一种回溯算法的实现,使用数据结构"栈" ...

  7. java数据结构与算法_清华大学出版社-图书详情-《数据结构与算法分析(Java版)》...

    前 言 数据结构是计算机程序设计重要的理论技术基础,它不仅是计算机学科的核心课程,而且已经成为计算机相关专业必要的选修课.其要求是学会分析.研究计算机加工的数据结构的特性,初步掌握算法的时间和空间分析 ...

  8. 【数据结构与算法】【算法思想】回溯算法

    贪心算法 回溯算法 分治算法 动态规划 回溯算法思想应用广泛,除了用来指导深度优先搜索这种经典算法设计之外,还可以用在如正则表达式匹配,编译原理中的语法分析等. 除此之外,很多经典的数学问题都可以用回 ...

  9. 数据结构与算法分析 收获总结 第1章 数据结构和算法

    这学期学这门课到现在为止,还是感觉难度很大,当然老师可能讲得也有点偏离书本,有时候听得有点蒙. 干脆来根据教材写个总结,用的教材是 <数据结构与算法分析>C++ 第3版 电子工业出版社 第 ...

最新文章

  1. Java 处理 Exception 的 9 个最佳实践!
  2. Latex 中连加符号的上下界问题总结
  3. linux amd显卡下载,下载:AMD显卡Linux催化剂驱动9.10版
  4. 牛客网多校第4场 D Another Distinct Values 【构造】
  5. 机器学习中倒三角符号_机器学习的三角误差
  6. 线性代数应该这样讲(三)-向量2范数与模型泛化
  7. java语言50到100之间素数和_用JAVA语言编写一程序,求100以内的所有素数
  8. java继承的终极奥义_java学习笔记12-继承
  9. BZOJ2957 楼房重建
  10. 创立三年,广受好评:如何评价 ApacheCN ?
  11. Java Excel(jxl)学习笔记
  12. python界面开发工 跨平台具_python GUI开发常用工具
  13. 企业要做好安全遵从的五个实用技巧
  14. rsync+inotify文件变动后自动同步程序
  15. 1.2顺序线性表的归并
  16. linux安装python的拓展包,linux 安装python拓展包pexpect
  17. unity3d在菜单栏,一键设置Player setting及自动打包并设置apk的存储位置
  18. php 回调cache 方案,基于PHP的一种Cache回调与自动触发技术
  19. linux中类似append的命令,Linux技巧:介绍 tar 命令打包、压缩、和加解密的用法
  20. SSM开发书评网25:写短评;

热门文章

  1. 网上搜寻资料的能力严重不足,有何实用经验和方法?
  2. Drools规则引擎demo
  3. 计算机视觉入门-最小二乘法、随机取样法、鲁棒估计、霍夫变换
  4. C语言:统计单词的长度
  5. 百度2020全年财报发布,如何看待百度智能云这一彩蛋?
  6. 【游戏编程扯淡精粹】工作第三年总结
  7. ceph对接nfs-ganesha 安装配置手顺
  8. 字符串排序:oj Problem C: 国家排序
  9. Word2016拼写检查怎么关闭?Word2016关闭拼写检查教程
  10. 处理qml 加载到quickQwidget中没办法切换输入法的问题