在线算法 & 离线算法

一.概念

  • 离线算法:
    算法设计策略都是基于在执行算法前输入数据已知的基本假设,也就是说,算法在求解问题已具有与该问题相关的完全信息,通常将这类具有问题完全信息前提下设计出的算法成为离线算法( off line algorithms)

  • 在线算法:

  1. 在计算机科学中,一个在线算法是指它可以以序列化的方式一个个的处理输入,也就是说在开始时并不需要已经知道所有的输入。
    相对的,对于一个离线算法,在开始时就需要知道问题的所有输入数据,而且在解决一个问题后就要立即输出结果。例如,选择排序在排序前就需要知道所有待排序元素,然而插入排序就不必。
  2. 因为在线算法并不知道整个的输入,对在线算法的研究主要集中在当前环境下怎么做出选择,在线算法找到的解只是局部最优解而无法保证整体最优。
  3. 对相同问题的在线算法和离线算法的对比分析形成了以上观点。如果想从其他角度了解在线算法可以看一下 流算法(关注精确呈现过去的输入所使用的内存的量),动态算法(关注维护一个在线输入的结果所需要的时间复杂度)和在线机器学习。

二.对称移动算法:

package util;/*** @projName: algorithm* @packgeName: util* @className: SymMoveLine* @author: pentiumCM* @email: 842679178@qq.com* @date: 2020/1/7 19:41* @describe: 对称移动算法-直线上的K服务问题*/
public class SymMoveLine {//直线上的k服务问题中:请求序列和服务车的位置使用横坐标点来表示/*** 初始化k个服务车的横坐标的序列,k服务车的序列是升序排列的** @return 返回初始化后k个服务车的横坐标*/public static int[] initServices() {int[] kServices = {1, 3};return kServices;}/*** 初始化服务请求序列的的横坐标** @param n 服务请求序列的长度* @return 返回初始化后的服务请求序列的横坐标*/public static int[] initRequests(int n) {int[] requests = new int[n];for (int i = 0; i < n; i++) {//给服务请求序列的奇数为赋值0,偶数位赋值1, 即服务请求序列为:0,1,0,1,0,1......requests[i] = (i % 2 == 0) ? 0 : 1;}return requests;}/*** 对称移动算法---解决直线上的k服务问题** @param kServices k个服务车的横坐标* @param requests  服务请求序列的横坐标* @return 返回k个服务车移动的总距离*/public static int symMoveAlgoLine(int[] kServices, int[] requests) {int dists = 0;int reqsNum = requests.length;int kServiceNum = kServices.length;for (int t = 0; t < reqsNum; t++) {int reqT = requests[t];int d = 0;//1. 所有的服务位于Rt的同一侧: 选距Xt最近的服务si向Rt移动距离 d = |si - Rt|//请求在最左边if (reqT < kServices[0]) {//服务车1移动的距离为dd = kServices[0] - reqT;System.out.println("服务车位置移动 s1: " + kServices[0] + " -> " + reqT + " ; s2:不移动" + "  --移动了" + d);//服务1移动到该请求的位置kServices[0] = reqT;}//请求在最右边else if (reqT > kServices[kServiceNum - 1]) {//服务车2移动的距离为dd = kServices[kServiceNum - 1] - reqT;System.out.println("服务车位置移动 s1:不移动 ; s2: " + kServices[kServiceNum - 1] + " -> " + reqT + "  --移动了" + d);//最右边服务移动到该请求的位置kServices[kServiceNum - 1] = reqT;}//2. 请求Rt位于服务si,sj之间: si、sj同时向Rt移动距离 d = min{|si - Rt, sj - Rt|}else {for (int i = 0; i < kServiceNum - 1; i++) {if (reqT > kServices[i] && reqT < kServices[i + 1]) {int dl = Math.abs(kServices[i] - reqT);int dr = Math.abs(kServices[i + 1] - reqT);//左边服务靠请求更近if (dl < dr) {d = dl * 2;int rposi = kServices[i + 1] - dl;System.out.println("服务车位置移动 s1: " + kServices[i] + " -> " + reqT +" ; s2: " + kServices[i + 1] + " -> " + rposi + "  --移动了" + d);//左边的服务移动请求的位置kServices[i] = reqT;//右边的服务向请求移动dkServices[i + 1] -= dl;}//右边服务靠请求近else if (dr > dr) {d = dr * 2;int lposi = kServices[i] + dl;System.out.println("服务车位置移动 s1: " + kServices[i] + " -> " + lposi +" ; s2: " + kServices[i + 1] + " -> " + reqT + "  --移动了" + d);//左边的服务移动请求的位置kServices[i] += dr;//右边的服务向请求移动dkServices[i + 1] = reqT;}//两边服务靠请求一样近else {d = dl + dr;System.out.println("服务车位置移动 s1: " + kServices[i] + " -> " + reqT +" ; s2: " + kServices[i + 1] + " -> " + reqT + "  --移动了" + d);//左边的服务移动请求的位置kServices[i] = reqT;//右边的服务移动请求的位置kServices[i + 1] = reqT;}}}}dists += d;}return dists;}public static void main(String[] args) {//初始化k服务车的初始横坐标int[] kServices = initServices();//请求序列的横坐标int[] requests = initRequests(10);//调用对称移动算法,获取服务车移动的总距离int dist = symMoveAlgoLine(kServices, requests);System.out.println("移动的总距离为:" + dist);}
}

在线算法 离线算法相关推荐

  1. LCA在线算法ST算法

    求LCA(近期公共祖先)的算法有好多,按在线和离线分为在线算法和离线算法. 离线算法有基于搜索的Tarjan算法较优,而在线算法则是基于dp的ST算法较优. 首先说一下ST算法. 这个算法是基于RMQ ...

  2. 强化学习8-时序差分控制离线算法Q-Learning

    Q-Learning和Sarsa一样是基于时序差分的控制算法,那两者有什么区别呢? 这里已经必须引入新的概念 时序差分控制算法的分类:在线和离线 在线控制算法:一直使用一个策略选择动作和更新价值函数, ...

  3. 南京大学赵鹏:动态环境在线学习的算法与理论研究

    不到现场,照样看最干货的学术报告! 嗨,大家好.这里是学术报告专栏,读芯术小编不定期挑选并亲自跑会,为大家奉献科技领域最优秀的学术报告,为同学们记录报告干货,并想方设法搞到一手的PPT和现场视频--足 ...

  4. 浪潮信息更新存储系统功能 在线并发升级算法有效提升升级效率

    企业存储集群在长期运作的过程中,必须要通过持续的升级迭代才能满足业务安全运作的需求.而一般的离线升级方式或串行在线升级对于要求较高的企业而言难以匹配其需求.针对该问题,浪潮信息基于分布式存储平台研发出 ...

  5. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  6. HDU - 2586 How far away LCA+tanjar离线算法

    传送门 题意:求树上的两点的距离,放在一棵树上,而且题目提示只有一条,很明显是这条路线一定会经过他们的最近公共祖先啦,然后就是一个求距离的问题了.如果要采用离线算法的话,就是通过处理所有询问,那么肯定 ...

  7. hdu 3874(树状数组+离线算法)

    解题思路:这道题和之前的题一样,查找[l,r]区间内不重复数字的和.可以利用离线算法,实际上离线算法为了解决在查找时出现的矛盾,因为每次询问的区间大小不同,如果单独处理的话可能会对之后的查询有影响,所 ...

  8. hdu 4417(树状数组+离线算法)

    解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样.关键是如何转换成树状数组的模型,这才是本题的难点. 我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了. ...

  9. HDU 2874 Connections between cities(LCA离线算法实现)

    http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 求两个城市之间的距离. 思路: LCA题,注意原图可能不连通. 如果不了解离线算法的话,可以看我之 ...

  10. 在线编程——排序算法总结

    在线编程--排序算法总结 找实习,阿里一面遇到手写快排,写出来感觉没错(VS2013能通过),但在阿里的测试平台上运行未通过.细思极恐,赶紧总结一波.有幸看到SteveWang的两篇博客:排序算法总结 ...

最新文章

  1. java多线程yield_Java多线程yield
  2. serializable java 规则_Java 序列化Serializable详解(附详细例子)
  3. 2022-02-03--银河麒麟-银河麒麟v4与.netcore安装
  4. 小物件之radio单选列表
  5. 播客#50:Sacha Greif
  6. 澳门大学物联网设计方法研究获“973”立项
  7. 青出于蓝而胜于蓝,超越MixUp、CutMix的样本混合数据增广新算法FMix
  8. 微软紧急修复FIP-FS中的 “Year 2022” 漏洞
  9. 计算机无线网络无法连接网络,笔记本连无线网显示无法连接此网络 怎么处理...
  10. 计算机网络——高效校园网络设计与实现(华为模拟器eNSP实现)
  11. js通过图片url获取图片base64编码
  12. 【TM1640】STM32 TM1640芯片驱动程序
  13. windows服务器系统和专业版差别,Win10专业版和企业版哪个好?教你区分win10企业版和专业版...
  14. 微信小程序地区选择,单级学校选择和省,市,区选择
  15. tflearn的VocabularyProcessor用法:建立中文词汇表和把文本转为词ID序列
  16. HDL4SE:软件工程师学习Verilog语言(十一)
  17. 网络安全应急响应----10、内存分析
  18. python用爬虫制作英汉词典
  19. 对于升级go1.18的goland问题
  20. DDS格式介绍及相关工具

热门文章

  1. ROS launch文档解析
  2. H3C和锐捷如何查看光衰
  3. h5 神策埋点_神策埋点
  4. c++保留有效位和小数位
  5. java 区分中英文_Java 区分文本中的中英文字符函数
  6. mysql 小数点多余0_mysql中如何去除小数点后面多余的0
  7. 千峰JAVA逆战班Day33
  8. 从技术雷达看​DevOps的十年——容器技术和微服务
  9. 今天上班穿了一只拖鞋和一只凉鞋
  10. 计算机设计大赛软件应用开发作品,2019年(第12届)中国大学生计算机设计大赛软件应用与开发类总决赛报道...