算法完美与时间分析:时间复杂度是否每次都很重要?

时间:2013-11-15 14:58:47

标签: algorithm time-complexity

我对算法设计有一个非常基本和普遍的疑问。我已经学会了基本算法,现在学习随机算法。无处不在,我观察到一位教授主要专注于设计最终会尝试降低复杂性的算法。

通常的方法(我观察到的)是学习一些在复杂性方面表现不佳的基本(或较旧)算法,因此目标是使用更新的算法修改旧的算法,该算法应该专注于降低复杂性,不影响输出。

但在我研究的大多数算法中,尤其是分布式算法(在分布式操作系统中),例如分布式互斥算法,分布式死锁检测等,我观察到的是(并且大多数情况下我认为)设计该算法不应只关注复杂性增强,而应该关注算法的完善。

让我们举一个分布式互斥算法的例子。最基本的算法是Lamport算法,其修改版本(通过增强复杂性)是Ricart-Agarwala算法。由于在分布式环境中通信主要是通过消息传递,因此对于分布式互斥,我们有三种消息:a)请求关键资源b)回复请求c)释放关键资源。基本算法使用额外的释放消息(通知所有站点我的站点已释放关键资源,因此您可以输入)。但是在高级版本中,他们所做的就是通过在回复消息中容纳它们来丢弃这些释放消息。因此他们提出了一些复杂度降低的解决方案。

但是当我尝试在java中实现这些算法时,我观察到即使基本算法的复杂性稍微高一点,但它比高级算法更完美。因为通过减少传输的消息数量(在高级解决方案中),本地站点不再意识到远程站点实际上已经释放了资源这一事实,因为在确认发布消息时,只有站点更新其本地数据结构,例如请求如果我们不发送任何明确的发布通知,那么请求在本地站点的请求队列中不必要地挂起以进行整个运行。

So my doubt is that if enhancement of complexity is so important, why can't perfection ? I mean if algorithm is producing perfect results at the cost of bit higher complexity then how does it matters as far as I am getting perfection in output as compared to the enhanced complexity solution which lacks in perfection ?

注意:完美我并不是指正确/错误的结果。结果总是正确的。只有产生结果的完美或准确性才会有所不同。

3 个答案:

答案 0 :(得分:2)

考虑任何NP-complete问题(例如travelling salesman problem)。

对于这些问题,没有已知的非指数精确算法(特殊情况除外),因此,对于这些问题的任何合理大小的版本,确实需要数年(或更长时间)才能找到确切的解决方案。

因此,我们使用启发式和近似(以及可能的一些随机性)来在合理的时间范围内获得非精确解。

NP完全问题只是一个极端的例子 - 我们也可以有几秒钟来获得解决方案(无论出于何种原因),但找到一个精确的解决方案将需要几分钟。所以这一切都归结为平衡我们想要运行算法的时间以及我们希望结果有多好(并且开发时间也肯定起作用)。

我希望我能理解你正确提出的问题并且这会有所帮助。

答案 1 :(得分:2)

主要是对两个产生完全相同输出的算法进行公平的复杂性比较。例如,排序。

在你的情况下它是不同的,你描述具有不同行为的算法。

要选择更适合的算法,许多因素决定:

  • 易于实施(在实践中非常重要)
  • 一个更快的算法,在你的情况下缺乏一些功能,必须更快(在预期的数据量上faktor 10)选择它,或更容易实现。
  • 健壮性:众所周知的算法,自10年以来成功使用,或者来自纸张的新算法,其中机会很高,它只适用于科学家的环境(为算法优化)。 (我知道电信网络算法的这种情况)

答案 2 :(得分:1)

而不是“完美”,也许你应该考虑“适合特定目的”。

对于分布式互斥算法的示例,请考虑来自不同视点的“简单”和“改进”算法。正如另一个答案所指出的,这两种算法表现不同;我的观点是,不同的人对这种行为的不同方面感兴趣。

某人将算法用于特定目的可能并不关心其行为的所有方面。对于您的示例,您担心待处理的资源锁定。但是,如果预期互斥算法一直在运行,则用户可能不关心,因为无论如何都会立即返回锁,同时使用的消息少于简单版本。如果你既想要效率又要及时,那么可能有某种方法可以兼顾两者 - 以更高的复杂性为代价 - 如果你正在寻找实际的“完美”,那么这就是逻辑终点。

计算机科学家不知道如何使用他的算法。一般来说,他无法预测特定技术的所有可能变化,如果可能,你不会想要全部阅读!在发布算法时,表达的清晰度是你所追求的“完美” - 这个想法应尽可能简单地描述。

相关问题