时间太复杂的算法示例?

Example of an algorithm that is too time complex?

尽管我在网上搜索了很多,但由于计算时间过长,我找不到在实践中无法解决的算法示例。

我试图想一个例子,比如计算在半人马座阿尔法星之旅中最靠近火箭飞船的每颗恒星的数量、大小和位置。这是一个很好的例子吗?我的意思是,恒星系统距离我们将近 26 万亿英里。

编辑: 我正在做一个关于 Big-O 和 Little-O 表示法的简短介绍,我想想一些不同寻常的事情,为什么问题的解决方案在实践中是可以解决的,但由于极端的原因,它们在原则上可能无法解决大量的时间来计算,因此使用 Big-O 来创建估计。我想和明星一起去的原因是因为它看起来比其他一些科目更有趣。

谢谢!

你的问题并不奇怪,因为它看起来是线性复杂度(O(n) 时间)。如果您将行程长度加倍,则程序执行所需的时间只会加倍。尽管如此,您可能只是在寻找具有指数解决方案的问题,例如旅行商问题,随着城市数量的增加,该问题很快变得几乎无法解决。查找 Time Complexity 了解更多信息。

您可以尝试查看的另一个有趣的事情是停机问题。

假设您有一个表示一副 52 张牌的数组 [AS, 2S, 3S, ... , JH, QH, KH] 并且您想要 return 这些牌的所有不同洗牌方式。

第一张牌有52种可能,第二张牌有51种,第三张有50种,依此类推。一共有52个阶乘(52 * 51 * 50 * ... * 3 * 2 * 1)组合,超过10^67(接近我认为的宇宙原子数)

许多复杂的问题都源于必须以多种不同方式重用相同的数据,而不仅仅是拥有大量数据。

使用截至 2009 年最先进的算法,它需要 two years to factor RSA-768,它有 "only" 232 个十进制数字 -- 这是通过并行使用一堆计算机完成的.

可以推测因数 RSA 2048 需要多长时间,它有 617 个小数位。

您真正应该寻找的不是算法的复杂性,而是潜在问题的复杂性 - 可以使用非常低效的算法进行排序,例如遍历所有可能的 O(n!) 顺序,但它不会'意味着排序在实践中需要很多时间。

让我们考虑最基本的字符串问题之一 Longest common subsequence 两个长度为 n 的字符串。

已知问题可以在 O(n^2) 中使用动态规划 method. On the other hand, it is also proven (paper 解决),对于问题的一般实例,任何算法都需要 Ω(n^2) 操作(更快的算法是在某些特殊情况下可能)。

因此,如果您想解决这个问题的一般实例,处理数百万个字符的字符串(对于现代计算来说不是很大),实际上,任何算法所花费的时间都与 10^12 操作成正比。事实上,在计算生物学中,寻找 DNA 序列的最长公共子序列的问题非常重要,而且这些序列非常长,因此它是您所要求的现实问题的一个很好的例子。

Big-Oh 表示法的主要目的不是估计程序在某些特定输入上的 运行时间。这是为了分析当您增加输入大小时程序变慢的速度。两倍大小的输入需要两倍的时间 运行、四倍还是十六倍?

Big-Oh 最具说明性的例子是问题的输入非常小,但需要很长时间才能 运行。当你稍微增加输入大小时,它需要更长的时间。一些增长最快的算法需要指数或阶乘时间,并且它们通常涉及查看元素的所有排列(所有不同的顺序,或元素的排列方式)。

因此,一个很好的例子是,有人在保险箱上设置了一个 10 位密码(0-9 的数字),你必须猜测它。嗯,有 10^10 种组合,你平均要猜 5*10^9 次才能猜对。但如果它是一个 11 位密码,猜测将花费你十倍的时间。

一名德国黑客正试图登录 NSA 的服务器以找出核导弹发射代码。他知道所有的 NSA 密码都必须至少有 16 个字符,admin 密码是每天午夜随机生成的,而且可以包括所有的 ASCII。他距离第三次世界大战开始还有 26 天。

他应该尝试拯救世界吗?或者去度假。只有大 O 符号会告诉。

我希望这个例子是 "interesting"。

你绝对应该研究 NP-hard 问题,比如 Travelling Salesman Problem。这些都是很好的教学示例,因为它们可以 "solved" 使用不同的策略,我们仍在努力。

正如您所描述的,保证正确答案的算法往往过于耗费资源,无法在现实生活中实施。感谢 Big O,我们知道 O((n^2)*(2^n)) 对于 运行 在机器上对于适当大小的输入是不可行的。

我们被迫与性能更好的算法妥协,但可能无法提供最佳或正确的结果。这些算法妥协可以在许多相关的现实生活示例中看到 - 一个巧妙的案例是生成 Tour of 50 USA Landmarks.