我想到,如果你知道有关要分类的数据的分布情况(从统计angular度来说),那么如果考虑到这些信息,sortingalgorithm的性能可能会受益。 所以我的问题是,有没有任何sortingalgorithm考虑到这种信息? 他们有多好? 编辑:一个例子来澄清:如果你知道你的数据的分布是高斯,你可以估计平均和平均在你处理数据。 这会给你估计每个数字的最终位置,你可以用它们把它们放在最后的位置。 编辑#2:我很惊讶的答案是不是一个维基链接到通话页面讨论这个问题。 这不是一个很常见的情况(例如高斯情况)? 编辑#3:我为这个问题增加了一个赏金,因为我正在寻找来源的确切答案,而不是猜测。 就像“在高斯分布数据的情况下,XYZalgorithm平均速度最快,正如史密斯等人所certificate的那样[1]”。 但是,欢迎任何其他信息。 请注意 :我将奖励最高票数的答案。 投票明智!
对于二进制search树型数据结构,我看到大O表示法通常记为O(logn)。 在日志中使用小写“l”,这是否意味着以自然对数描述的对数基数e(n)? 对不起,这个简单的问题,但我一直无法区分不同的暗示对数。
在.NET 4.0+中,类SortedSet<T>具有一个名为GetViewBetween(l, r) ,该方法返回包含指定的两个值之间的所有值的树部分的接口视图。 鉴于SortedSet<T>被实现为红黑树,我自然希望它在O(log N)时间运行。 在C ++中类似的方法是std::set::lower_bound/upper_bound ,在Java中它是TreeSet.headSet/tailSet ,它们是对数的。 但是,这不是事实。 下面的代码在32秒内运行,而等价的GetViewBetween O(log N)版本将使这个代码在1-2秒内运行。 var s = new SortedSet<int>(); int n = 100000; var rand = new Random(1000000007); int sum = 0; for (int i = 0; i < n; ++i) { s.Add(rand.Next()); if (rand.Next() % 2 == 0) { int l = rand.Next(int.MaxValue / […]
我们知道背包问题可以通过dynamic规划解决O(nW)的复杂性。 但是我们说这是一个NP完全问题。 我觉得这里很难理解。 (n是项目数量,W是最大音量)
最近,惠普实验室的Vinay Deolalikar发表了一篇文章 ,声称已经certificateP!= NP 。 有人可以解释一下,这个certificate对我们来说是不是那些有math意义的人呢?
所以我想我会因为问这样一个微不足道的问题而被埋葬,但是我有点困惑。 我已经在Java和C中实现了quicksort,我正在做一些基本的比较。 该graphics是以两条直线出现的,其中C是比Java对应的超过100,000个随机整数更快的4ms。 我的testing代码可以在这里find; Android的基准 我不确定(n log n)行会是什么样子,但我不认为它会是直的。 我只是想检查这是预期的结果,我不应该试图find我的代码中的错误。 我把这个公式固定在excel中,而基数10似乎是一开始就有一个扭曲的直线。 这是因为log(n)和log(n + 1)之间的差异是线性增加的吗? 谢谢, GAV
可能重复: Θ(n)和O(n)有什么区别? 在我看来,当人们非正式地谈论algorithm的复杂性时,他们谈论的很大哦。 但是在正式的情况下,我经常看到偶尔会出现的大屁股。我从math上知道两者之间的区别,但是在英语中,在什么情况下会使用大哦,当你的意思是大的时候不正确,反之亦然(示例algorithm将被赞赏)? 奖金:为什么人们在非正式谈话时似乎总是用得很大?
我很好奇,如果O(N日志)是最好的链表可以做的。
我明天有一个计算机科学中期,我需要帮助确定这些recursion函数的复杂性。 我知道如何解决简单的案例,但是我仍然在努力学习如何解决这些困难的案例。 这些只是我无法弄清的几个例子问题。 任何帮助将不胜感激,并将大大有助于我的学习,谢谢! int recursiveFun1(int n) { if (n <= 0) return 1; else return 1 + recursiveFun1(n-1); } int recursiveFun2(int n) { if (n <= 0) return 1; else return 1 + recursiveFun2(n-5); } int recursiveFun3(int n) { if (n <= 0) return 1; else return 1 + recursiveFun3(n/5); } void recursiveFun4(int n, […]
我最近开始使用LINQ相当多,而且我还没有看到任何LINQ方法的运行时复杂性。 很明显,这里有很多因素,所以让我们把讨论限制在纯IEnumerable LINQ-to-Objects提供程序中。 此外,假设任何作为select器/增变器等传入的Func都是便宜的O(1)操作。 似乎很明显,所有的单程操作( Select , Where , Count , Take/Skip , Any/All等)都是O(n),因为他们只需要走一次序列; 虽然这是懒惰。 对于更复杂的操作,情况会更加恶劣。 集合类运算符( Union , Distinct , Except等)默认使用GetHashCode (afaik),所以假设他们在内部使用哈希表似乎是合理的,也使得这些操作O(n)一般来说。 那么使用IEqualityComparer的版本呢? OrderBy需要sorting,所以很可能我们看O(n log n)。 如果它已经分类? 如果我说OrderBy().ThenBy()并提供相同的密钥? 我可以看到GroupBy (和Join )使用sorting或哈希。 这是哪个? Contains在List O(n),但O(1)在HashSet – 是否LINQ检查底层容器,看看它是否可以加快速度? 而真正的问题 – 到目前为止,我一直坚信这个操作是高性能的。 但是,我可以在这个银行? 例如,STL容器清楚地说明了每个操作的复杂性。 .NET库规范中的LINQ性能有没有类似的保证? 更多的问题(回复评论): 没有真正考虑开销,但我没想到对于简单的Linq-to-Objects来说还有很多。 CodingHorror文章谈论Linq到SQL,在那里我可以理解parsing查询,并使SQL会增加成本 – 对象提供者也有类似的成本? 如果是这样,如果你使用声明性或function性语法,它是不同的?