![]() |
1
61
听起来你要求的是停顿问题的延伸。我认为这样的事情是不可能的,即使在理论上也是如此。
编辑以添加: 尽管一般情况难以解决,但部分解决方案请参见此处: http://research.microsoft.com/apps/pubs/default.aspx?id=104919
|
![]() |
2
39
您可以在各种大小的数据集上运行该算法,然后可以使用曲线拟合得出近似值。(在大多数情况下,只需查看您创建的曲线就足够了,但任何统计数据包都有曲线拟合功能)。
远至 技术是不存在的。但是检测代码以不同的长度运行并输出一个简单的文件(RunSize-RunLength就足够了)应该很容易。生成正确的测试数据可能更复杂(有些算法对偏序数据的效果更好/更差,所以您可能希望生成 代表您的正常用例 ). 由于“什么是大的”的定义存在问题以及性能依赖于数据这一事实,我发现静态分析通常是误导性的。当优化性能并在两种算法之间进行选择时,真实世界的“橡胶上路”测试是我唯一信任的最终仲裁员。 |
![]() |
3
14
这是不可能的,因为常数很重要 .
例如,我可以编写一个在中运行的函数
然而,如果
|
![]() |
4
13
最美好的祝福。 |
![]() |
5
9
我很好奇为什么你想这样做。根据我的经验,当有人说:“我想确定这个算法的运行时复杂性”时,他们并不是在问他们认为他们在问什么。您最可能要问的是,对于可能的数据,这种算法的实际性能如何。计算函数的Big-O具有合理的实用性,但是有太多方面可以改变实际使用中的算法的“实际运行时性能”,没有什么比插装和测试更好。 例如,以下算法具有完全相同的Big-O(古怪的伪代码): 示例a:
例b:
彻底地 不同的实际运行时,尤其取决于数组foo的实际大小。如果算法是内置有某种并发性的软件的一部分,那么它甚至还没有触及算法行为的实际性能特征。 不是消极的耐莉,但big-O是一个范围狭窄的工具。如果你深谙算法分析,或者你正在尝试这样做,那么它是非常有用的 证明 关于一个算法,但是如果你在做商业软件开发,证据就在布丁里,你需要有实际的性能数据来做出明智的决定。 干杯 |
![]() |
6
4
这可能适用于简单的算法,但是O(n^2 lg n)或O(n lg^2 n)呢? 你很容易在视觉上被愚弄。
|
![]() |
7
3
很多人评论说,这在理论上是一个无法解决的问题。这很公平,但除此之外,即使解决除最琐碎的案件以外的任何案件,似乎都是难以置信的困难。 假设您有一个具有一组嵌套循环的程序,每个循环基于数组中的项数。O(n^2)。但是,如果内部循环只在一组非常特定的情况下运行,会怎么样?比如说,平均来说,它是在一个日志(n)案例中运行的。突然,我们的“显然”O(n^2)算法实际上是O(n logn)。编写一个可以确定内部循环是否运行以及运行频率的程序可能比原始问题更加困难。 记住O(N)不是上帝;高常数可以也将改变竞争环境。当然,快速排序算法是O(n logn),但是当递归变得足够小时,比如说减少到20个项目左右,许多快速排序的实现将改变策略为一个单独的算法,因为实际上执行不同类型的排序更快,比如插入排序的O(n)更差,但常数更小。 所以,了解你的数据,做出有根据的猜测,并进行测试。 |
![]() |
8
3
假设我们在_FN(Program,function)中有一个算法暂停_,它决定了一个程序是否在O(f(n))中对所有n,对某些函数f暂停。 设P为以下程序:
由于功能和程序是固定的,因此此输入上的停止时间是恒定的。如果HALTS_IN_FN返回true,程序将永远运行,当然不会在任何f(n)的O(f(n))中停止。如果HOLTS_IN_FN返回false,程序将在O(1)时间内停止。 因此,我们有一个悖论,一个矛盾,因此程序是不可判定的。 |
![]() |
9
2
我认为这几乎不可能自动完成。请记住,O(g(n))是最坏情况的上界,对于许多数据集,许多函数的性能都优于此上界。为了比较它们,您必须找到每一个的最坏情况数据集。对于许多算法来说,这本身就是一项困难的任务。 |
![]() |
10
1
杰弗里·惠特利奇是对的。一个简单的停止问题的简化证明了这是不可判定的。。。 而且,如果我能写这个程序,我会用它来解决P对NP的问题,并且有一百万美元。。。B-) |
![]() |
11
1
在运行此类基准测试时,您还必须小心。某些算法的行为严重依赖于输入类型。 以快速排序为例。这是最坏的情况O(n),但通常是O(nlogn)。对于相同大小的两个输入。 旅行推销员(我想,不太确定)是O(n²)( 这意味着基准结构在大多数情况下都必须在临时基础上进行调整。想象一下为上面提到的两个例子编写一些通用的东西。它将非常复杂,可能无法使用,而且很可能会给出错误的结果。 |
![]() |
12
1
我用的是一个
该软件包通过测量收集的数据相对于每个类增长行为的残差,自动建议最佳拟合类。 签入代码 this answer . 输出示例,
|
![]() |
13
0
|
![]() |
14
0
既然你不能证明一个函数是否停止,我想你的要求有点过分了。
|
![]() |
15
0
我不知道你这样做的目的是什么,但在我教的一门课程中,我们遇到了类似的问题。学生们被要求实现某种在一定复杂度下工作的东西。 为了避免手动查看他们的解决方案并阅读他们的代码,我们使用了@Godeke建议的方法。目标是找到使用链表而不是平衡搜索树的学生,或者实现冒泡排序而不是堆排序的学生(即,在要求的复杂度下不工作的实现,但没有实际阅读代码)。 令人惊讶的是,结果并没有显示作弊的学生。这可能是因为我们的学生是诚实的,想要学习(或者只是知道我们会检查这个;-)。如果输入很小,或者输入本身是有序的,那么可能会错过作弊的学生。对于那些没有作弊,但具有较大常量值的学生来说,也可能是错误的。 但是,尽管可能会出现错误,但这是值得的,因为它节省了大量的检查时间。 |
![]() |
16
0
正如其他人所说,这在理论上是不可能的。但实际上,你 可以 对一个函数是否为O进行有根据的猜测( N N 第一次的算法,运行它对各种输入 N . 在地图上画点 log-log graph N ^ ),在哪里 K 是直线的坡度。 我不是统计学家。你应该对这一切持保留态度。但我实际上是在性能回归的自动测试环境中做这件事的。 The patch here 包含一些JS代码。 |
![]() |
17
-1
|
![]() |
18
-1
很容易得到指示(例如,“函数是线性的?次线性的?多项式的?指数的”) 很难找到确切的复杂性。 例如,这里有一个Python解决方案:提供函数,以及为其创建大小为N的参数的函数。您将返回一个(n,time)值列表以进行绘图或执行 regression analysis . 它乘以一次速度,为了得到一个真正好的指示,它必须多次计时,以尽量减少环境因素的干扰(例如 timeit 模块)。
并使用它进行时间气泡排序:
这是我的机器上打印的:
|
|
Liana78 · 查找和最小化合并排序算法运行时分析 6 年前 |
|
Lamaman · 素数算法的复杂度是多少? 6 年前 |
![]() |
irish Senthil · 声明变量是否对大O表示法有效? 6 年前 |
![]() |
Monk · 为什么大Oh不总是算法的最坏情况分析? 6 年前 |
|
Faisal Alzahrani · 用Java计算程序的Big-O 6 年前 |
![]() |
Dazcii · 如何找到3个嵌套循环的复杂性 7 年前 |
|
svaerth · 使用巨型哈希表在多项式时间内求解数独 7 年前 |