联机算法和脱机算法[Alg_001]
一、联机算法
1、定义
也叫在线算法,在算法执行过程中的任意时刻,只对要操作的数据进行一次扫描,扫描完成后便此后不再对已经操作过的数据进行保存和记忆。
这种算法有种特点:如果数据是储存在磁盘或者磁带上,便可以顺序地读取,无需在主存中储存数据的任何部分。
2、举例
在处理最大子序和的问题中,存在一种联机算法,具体实现如下(基于C):
1 int MaxSubsequenceSum(const int A[ ], int N) {
2 int TempSum, MaxSum;
3
4 TempSum = MaxSum = 0;
5 for (int i = 0; i < N; i++) {
6 TempSum += A[i];
7
8 if (TempSum > MaxSum) {
9 MaxSum = TempSum;
10 }
11 else if (TempSum < 0) {
12 TempSum = 0;
13 }
14 }
15
16 return MaxSum;
17 }
可见,该算法的在执行过程中只对序列进行一次扫描,并且无需记忆已经操作过的数据,这就是联机算法,它对已经读入的数据,当即就可以给出最大子序和。
此外可以注意到,该算法的时间复杂度为
,空间复杂度为
,即线性时间常量空间,满足这一条件的联机算法几乎可以认为是完美的算法。
二、脱机算法
1、定义
也叫离线算法,在算法执行前所有的输入数据已知,换句话说,对于一个离线算法,在开始时就需要知道问题的所有输入数据,和需要进行的所有操作,而且在解决一个问题后就要立即输出结果。
2、举例
同样是序列最大子序和的问题,如下采用的算法便是脱机算法,具体实现(基于C):
1 int MaxSubsquenceSum(const int A[], int N) {
2 int TempSum, MaxSum;
3
4 MaxSum = 0;
5 for (int i = 0; i < N; i++) {
6 TempSum = 0;
7 for (int j = 0; j < N; j++) {
8 TempSum = A[j];
9
10 if (TempSum > MaxSum) {
11 MaxSum = TempSum;
12 }
13 }
14 }
15
16 return MaxSum;
17 }
可以看出,在算法执行过程中,需要不止一次地对数据进行扫描,虽然就空间复杂度而言,依然是
,但其需要对数据进行记忆 ,需要把全部数据读入主存中。此外,算法的时间复杂度为
,相较于上文中的联机算法就稍逊一筹。
三、理解
由于对数据的处理方式不同,联机算法在结果的产生上便形成了较为明显的区别:
对联机算法而言,中途每一次读入数据产生的结果都是满足要求的结果,其结果的产生是基于对当前及过去的所有输入,可以理解为:“热炒热卖”、“炒多少,卖多少,炒好一盘上一盘”,相当于炒菜,这也正和“在线算法”中“在线”的意义不谋而合。
而脱机算法则是利用所有的数据参与计算,最终得到一个结果,其时间复杂度是非线性的,需要对数据多次扫描,无法像联机算法一样顺序读入并出结果,可以理解为:“菜全部做好了再开始营业”,相当于自助餐厅,Ready。
联机算法和脱机算法[Alg_001]的更多相关文章
- 算法:KMP算法
算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...
- BF算法与KMP算法
BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...
- Levenshtein Distance算法(编辑距离算法)
编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- ISAP算法对 Dinic算法的改进
ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...
- 文本比较算法Ⅱ——Needleman/Wunsch算法
在"文本比较算法Ⅰ--LD算法"中介绍了基于编辑距离的文本比较算法--LD算法. 本文介绍基于最长公共子串的文本比较算法--Needleman/Wunsch算法. 还是以实例说明: ...
- 文本比较算法三——SUNDAY 算法
SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...
- [算法]检测空间三角形相交算法(Devillers & Guigue算法)
#pragma once //GYDevillersTriangle.h /* 快速检测空间三角形相交算法的代码实现(Devillers & Guigue算法) 博客原地址:http://bl ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
随机推荐
- laravel 5.6 API 接口开发限制接口访问频率
在laravel 5.6及以上版本中框架中已自带ThrottleRequests,但是为了更好的处理消息,我们可以再新加一个中间件,来更方便的处理相应信息 第一步: php artisan make: ...
- think php 3种验证方式
方式一:独立验证 // 验证1.独立验证 //验证的规则 $rule = [ 'name' => 'require|max:25', 'username' => 'require', 'p ...
- ref属性
ref属性 1.被用来给元素或组件注册引用信息(id的替代者) 2.应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc) 3.使用方式: 打标识:<h1 ref=& ...
- Net中事件的高级用法之三
1.事件的高级应用 使用事件可以解除代码耦合 2.事件高级应用实例 using System; using System.Collections.Generic; using System.Linq; ...
- 所有整数型包装类对象值的比较,使用equals方法进行比较
一.整数型包装类对象值的比较,使用equals方法进行比较 题眼:整型包装类.值的比较 注:== :对于基本类型,比较的是值:对于引用类型,比较的是地址值. // 组一Integer i1=new I ...
- Spring MVC 实验2-Bean的几种装配方式及基本用法
实验二:Bean的几种装配方式及基本用法 实验目的: (1)掌握2种基于XML的装配方式:设值注入(Setter Injection)和构造注入(Constructor Injection) . ( ...
- 依图语音API的C#封装以及调用进行语音转写的处理
对于语音识别,一般有实时语音识别和语音文件的识别处理等方式,如在会议.培训等场景中,可以对录制的文件进行文字的转录,对于转录文字的成功率来说,如果能够转换90%以上的正确语音内容,肯定能减轻很多相关语 ...
- Paypal标准支付对接
提醒一下,题主是在快速标准支付做到一半的时候换成了标准支付,所以该文档的快速支付大家做个参考就可以了. 一.两种支付方式 标准支付 优点:纯前端对接,简单方便,适用于非技术开发人员.个人即可用,不用花 ...
- Docker——容器数据卷
为什么需要容器数据卷 角度:遇到问题,尝试以朴素的道理解决问题.问题复杂化,解决的方式也变得复杂 问题的提出:docker将应用和环境打包成一个镜像,但是对于容器内的数据,如果不进行外部的保存,那么当 ...
- centos 在线安装 docker
镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 在新主机上首次安装Docker Engine之前,需要设置Docker存储库.之后,您可以从存储库安装和更新Docker. 设置存储库 安装yu ...