在线和离线算法有什么区别?

时间:2012-07-15 22:03:23

标签: algorithm data-structures

这些术语在我的数据结构教科书中使用,但解释非常简洁且不清楚。我认为这与算法在每个计算阶段有多少知识有关。

(请不要链接到维基百科页面:我已经阅读过了,我仍然在寻找澄清。我的解释就好像我已经十二岁了,和/或一个例子会更有帮助。)

7 个答案:

答案 0 :(得分:61)

维基百科

维基百科页面非常明确:

  

在计算机科学中,在线算法是可以处理它的算法   以连续方式逐个输入,即按照顺序输入   输入被馈送到算法,而没有整个输入   从一开始就可以。相反,给出了离线算法   整个问题数据从一开始就需要输出一个   答案解决了手头的问题。 (例如,选择排序   要求在对列表进行排序之前给出整个列表   插入排序不会。)

让我扩展上述内容:

离线算法在算法启动之前需要所有信息。在维基百科示例中,selection sort 离线,因为第1步是Find the minimum value in the list。要做到这一点,您需要提供整个列表 - 否则,您怎么可能知道最小值是什么?您不能。

相比之下,插入排序是 online ,因为它不需要知道它将排序什么值以及在算法运行时请求信息。简而言之,它可以在每次迭代时获取新值。

还不清楚?

考虑以下示例(适用于四岁儿童!)。大卫要求你解决两个问题。

在第一个问题中,他说:

  

“我,你要给你两个不同质量的球,你需要   从塔楼同时放下它们......只是为了确保伽利略   是正确的。你不能使用手表,我们只会注意它。“

enter image description here

如果我只给你一个球,你可能会看着我并想知道你应该做什么。毕竟,说明很清楚。在问题开始时你需要两个球。这是离线算法。

对于第二个问题,大卫说

  

“好的,那很顺利,但是现在我需要你继续踢   穿过田野的几个球。“

enter image description here

我继续给你第一个球。你踢它。然后我给你第二个球然后你踢它。我也可以给你第三和第四球(你甚至不知道我会把它们交给你)。这是在线算法的示例。事实上,你可能整天都在踢球。

我希望这很清楚:D

答案 1 :(得分:6)

在线算法只是逐个处理输入,并且不知道算法开头的实际输入大小。

一个经常使用的示例是调度:您有一组计算机和一个未知的工作负载。每台机器都有特定的速度。您希望尽快清除工作负载。但由于您从一开始就不知道所有输入(您通常只能看到队列中的下一个),因此您只能估计哪个机器最适合当前输入。这可能导致工作负载的非最佳分配,因为您无法对输入数据做出任何假设。

另一方面,离线算法仅适用于完整的输入数据。在算法开始处理数据之前,必须知道所有工作负载。

实施例

Workload:
   1. Unit (Weight: 1)
   2. Unit (Weight: 1)
   3. Unit (Weight: 3)
Machines:
   1. Machine (1 weight/hour)
   2. Machine (2 weights/hour)

Possible result (Online):
   1. Unit -> 2. Machine  // 2. Machine has now a workload of 30 minutes
   2. Unit -> 2. Machine  // 2. Machine has now a workload of one hour
  either
   3. Unit -> 1. Machine  // 1. Machine has now a workload of three hours
  or 
   3. Unit -> 2. Machine  // 1. Machine has now a workload of 2.5 hours

 ==> the work is done after 2.5 hours

Possible result (Offline):
   1. Unit -> 1. Machine  // 1. Machine has now a workload of one hour
   2. Unit -> 1. Machine  // 1. Machine has now a workload of two hours
   3. Unit -> 2. Machine  // 2. Machine has now a workload of 1.5 hours

 ==> the work is done after 2 hours

请注意,离线算法中的更好结果是可能的,因为我们从一开始就不使用更好的机器。我们已经知道将有一个重型单元(单元3),所以这个单元应该由最快的机器处理。

答案 2 :(得分:2)

离线算法在调用时知道其输入数据的所有内容。另一方面,在线算法可以在运行时获得部分或全部输入数据。

答案 3 :(得分:1)

这是 算法据说是在线的,如果不是 知道它将要执行的数据 预先。离线算法可能会看到 所有数据都提前了。

答案 4 :(得分:1)

在线算法是接收一系列请求并执行立即操作以响应每个请求的算法。

相反,离线算法在执行所有请求后执行操作。

理查德卡普的论文{p> This提供了有关在线离线算法的更多见解。

答案 5 :(得分:1)

我们可以在处理算法之前根据输入的可用性区分离线和在线算法。

离线算法:算法可以使用所有输入信息,并由算法同时处理。通过完整的输入信息集,算法找到了一种有效处理输入并获得最佳解决方案的方法。

在线算法:输入即时出现,即所有输入信息同时不可用于算法,而是逐个部分地作为序列或随时间变化。在输入可用时,算法必须在不知道未来输入信息的情况下立即做出决定。在此过程中,算法会产生一系列决策,这些决策将对其整体绩效的最终质量产生影响。

例如:通讯网络中的路由:

来自不同来源的数据包来到最近的路由器。多个通信链路连接到路由器。当新数据包到达路由器时,路由器必须立即决定将数据包发送到哪个链路。 (假设所有链路都路由到目的地,所有链路带宽都相同,所有链路都是到达目的地的最短路径的一部分)。这里,目标是在不知道未来数据分组的情况下将每个输入数据分组分配给链路之一,使得每个链路的负载将被平衡。不应该重载链接。这是负载平衡问题。

这里,路由器中实现的调度程序不知道未来的数据包,但必须对每个输入数据包进行调度决策。 相比之下,离线调度程序完全了解所有传入数据包,然后它有效地将数据包分配给不同的链路,并且可以最佳地平衡不同链路之间的负载。

答案 6 :(得分:1)

缓存缺失问题:在计算机系统中,缓存是一个内存单元,用于避免速度更快的处理器和最慢的主内存之间的速度不匹配。使用缓存的目的是通过将一些频繁访问的页面保留在缓存中来最小化平均访问时间。假设处理器可能在不久的将来请求这些页面。通常,当处理器发出页面请求时,从主存储器或辅助存储器中取出页面,并将页面的副本存储在高速缓冲存储器中。假设缓存已满,则缓存中实现的算法必须立即决定更换缓存块而不了解未来的页面请求。问题出现了:哪个缓存块必须被替换? (在最坏的情况下,可能会发生更换缓存块的情况,下一刻,处理器请求替换的缓存块)。 因此,必须以这样的方式设计算法,使得它在输入请求到达时立即做出决定,而不需要预先了解整个请求序列。这种算法称为ONLINE ALGORITHM