Tag: big o

经验估计大哦时间效率

背景 我想通过基准来评估库中某些方法的大噢performance。 我不需要精确度 – 只要certificateO(1),O(logn),O(n),O(nlogn),O(n ^ 2)或者更糟。 由于大哦表示上限,估计O(logn)是O(log logn)的东西不是问题。 现在,我正在考虑find最适合每个大数据的恒定乘数k(但是会将所有结果置顶),然后select最合适的大数。 问题 有没有更好的办法比我所做的更好? 如果是这样,他们是什么? 否则,任何人都可以指点我的algorithm来估计k为最佳拟合,并比较每条曲线如何适合数据? 注意和限制 鉴于迄今为止的意见,我需要澄清一些事情: 这需要自动化。 我不能“看”数据并做出判断。 我将要用多个n大小来对这些方法进行基准testing。 对于每个规模n ,我将使用经过validation的基准框架,提供可靠的统计结果。 事实上,我事先知道大多数将被testing的方法。 我的主要目的是为他们提供性能回归testing。 代码将用Scala编写,任何免费的Java库都可以使用。 例 这是我想测量的东西的一个例子。 我有这个签名的方法: def apply(n: Int): A 给定一个n ,它将返回一个序列的第n个元素。 在现有的实现中,这个方法可以有O(1),O(logn)或者O(n),而小的修改可以让它错误地使用次优的实现。 或者,更容易的,可以得到一些依赖于它的其他方法来使用它的次优版本。

空algorithmO(0)的时间复杂度是多less?

所以给了以下程序: 这个程序的时间复杂度是O(0)吗? 换句话说,是0 O(0)? 我想在另外一个问题上回答这个问题会让我们看到这个问题 。 编辑:很多好的答案在这里! 我们都同意0是O(1)。 问题是,也是0 O(0)?

为什么插入链表O(1)的中间?

根据链接列表上的维基百科文章 ,插入链表中间被认为是O(1)。 我会认为这将是O(n)。 你不需要find可能接近列表末尾的节点吗? 这个分析是否不考虑节点操作的发现(尽pipe这是必需的),而只是插入本身? 编辑 : 链接列表比数组有几个优点。 在列表的特定位置插入元素是一个常量操作,而在数组中插入可能需要移动一半或更多的元素。 上述说法对我有点误导。 纠正我,如果我错了,但我认为结论应该是: arrays: find插入/删除的地方O(1) 执行插入/删除O(n) 链接列表: find插入/删除的地方O(n) 执行插入/删除操作(1) 我认为你唯一不需要find位置的方法就是保持某种指针(就像某些情况下的头部和尾部一样)。 所以我们不能断然地说链表总是为插入/删除选项敲数组。

为什么即使散列函数不是O(1),也可以通过键O(1)访问字典的元素?

我看你如何通过密钥访问你的collections。 但是,哈希函数本身在幕后有很多操作,不是吗? 假设你有一个非常有效的散列函数,它仍然可能需要很多操作。 这可以解释吗?

实现push_rear(),pop_front()和get_min()都是常量操作的队列

我碰到过这个问题: 实现一个push_rear(),pop_front()和get_min()都是常量操作的队列。 我最初想到使用get_min()具有O(1)复杂度的min-heap数据结构。 但push_rear()和pop_front()将是O(log(n))。 有没有人知道什么是最好的方式来实现这样一个队列,其中有O(1)push(),pop()和min()? 我search了这个,并想指出这个algorithm极客线程 。 但似乎没有任何解决scheme遵循所有3种方法的常量时间规则:push(),pop()和min()。 感谢所有的build议。

这在技术上是“Hello World”的O(1)algorithm吗?

这将被分类为“你好,世界!”O(1)algorithm。 ?? public class Hello1 { public static void Main() { DateTime TwentyYearsLater = new DateTime(2035,01,01); while ( DateTime.Now < TwentyYearsLater ) { System.Console.WriteLine("It's still not time to print the hello …"); } System.Console.WriteLine("Hello, World!"); } } 我正在考虑使用 DateTime TwentyYearsLater = new DateTime(2035,01,01); while ( DateTime.Now < TwentyYearsLater ) { // … } 代码片段作为一个忙碌的循环,当有人要求一个复杂的algorithm时,把它作为一个笑话。 这是正确的吗?

有没有比Bogosort(又名猴sorting)更糟糕的sortingalgorithm?

我的同事们把我赶回大学的时候,今天早上讨论了sortingalgorithm。 我们回想起我们最喜欢的StupidSort ,我们中的一个人确定我们看到了一个sortingalgorithm是O(n!) 。 这让我开始寻找我能find的“最糟糕的”sortingalgorithm。 我们假设一个完全随机的sorting将是非常糟糕的(即随机化元素 – 是否按顺序?再次随机化),我环顾四周,发现它显然被称为BogoSort或Monkey Sort,或者有时候只是随机sorting 。 猴sorting似乎具有O(∞)的最坏情况性能, O(∞) O(n)的最佳情况性能和O(n·n!)的平均性能。 有没有任何命名algorithm的平均性能比O(n·n!) ? 或者只比猴子sorting一般?

O(nlogn)algorithm – 在二进制string中查找三个均匀分布的algorithm

我昨天在一个algorithmtesting中遇到过这个问题,我无法弄清楚答案。 这让我非常疯狂,因为它值得大约40分。 我认为大部分class级都没有正确解决,因为在过去24小时内我还没有提出解决scheme。 给定长度为n的任意二进制string,如果它们存在,则在string内find三个均匀分布的string。 写一个在O(n * log(n))时间内解决这个问题的algorithm。 所以像这样的string有三个“均匀间隔”:11100000,0100100100 编辑:这是一个随机数,所以它应该能够为任何数字工作。 我给的例子是说明“均匀间隔”的属性。 所以1001011是一个有效的数字。 1,4和7是均匀分布的。

八岁的大O?

我更多地询问这对我的代码意味着什么。 我从math的angular度理解了这些概念,我只是很难从概念上理解他们的意思。 例如,如果要在数据结构上执行O(1)操作,那么我知道它所执行的操作数量不会增长,因为有更多的项目。 O(n)操作将意味着您将对每个元素执行一组操作。 有人可以填空吗? 像一个O(n ^ 2)操作到底会做什么? 如果一个操作是O(n log(n)),那么这意味着什么? 还有人不得不抽烟裂口写一个O(X!)?

是list :: size()真的是O(n)?

最近,我注意到有人提到std::list::size()具有线性复杂性。 根据一些 消息来源 ,这实际上是依赖于实现的,因为标准并没有说明复杂性是什么。 在这个博客条目中的评论说: 其实,这取决于你正在使用的STL。 Microsoft Visual Studio V6实现size()为{return(_Size); }而gcc(至less在版本3.3.2和4.1.0)做{return std :: distance(begin(),end()); }第一个是恒定速度,第二个是o(N)速度 所以我的猜测是,对于VC ++人群size() ,Dinkumware自从VC6以来可能不会改变这个事实。 我在吗? 它在gcc看起来像什么? 如果真的是O(n),为什么开发者select这样做呢?