Tag: 复杂性理论

如何find任意二叉树中两个节点的最低共同祖先?

这里的二叉树可能不一定是二叉search树。 该结构可以被视为 – struct node { int data; struct node *left; struct node *right; }; 我可以和朋友一起解决的最大的解决scheme就是这样的 – 考虑这个二叉树 : 二叉树http://lcm.csa.iisc.ernet.in/dsa/img151.gif 中序遍历产生 – 8,4,9,2,5,1,6,3,7 而后序遍历产生 – 8,9,4,5,2,6,7,3,1 例如,如果我们想要find节点8和节点5的共同祖先,那么我们在中序树遍历中列出所有在8和5之间的节点,在这种情况下恰好是[4,9 ,2]。 然后我们检查这个列表中的哪个节点在后序遍历中最后出现,这是2.因此,对于8和5的共同祖先是2。 这个algorithm的复杂性,我相信是O(n)(O(n)对于inorder / postorder遍历,其余的步骤再次是O(n),因为它们只不过是数组中的简单迭代)。 但是这是错误的。 🙂 但是这是一个非常粗糙的方法,我不确定是否在某些情况下出现故障。 有没有其他(可能更优化)解决这个问题?

什么是“P = NP?”,为什么这么着名?

P = NP是否可能是计算机科学领域最着名的问题。 这是什么意思? 为什么这么有趣? 哦,为了额外的功劳,请张贴陈述真相或虚假的证据。 🙂

如何构build堆是O(n)时间复杂度?

有人可以帮助解释如何build立一个堆是O(n)的复杂性? 插入一个项目到堆中是O(log n) ,并且插入被重复n / 2次(剩下的是叶子,并且不能违反heap属性)。 所以,这意味着复杂性应该是O(n log n) ,我想。 换句话说,对于我们“heapify”的每个项目,它有可能不得不为每个级别过滤一次堆(迄今为止)。 我错过了什么?

是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这样做呢?

Python字典键。 “在”复杂性

快速的问题主要满足我对这个话题的好奇心。 我正在用SQlite数据库后端编写一些大型的python程序,将来会处理大量的logging,所以我需要尽可能地进行优化。 对于一些function,我正在通过字典中的键进行search。 我一直在使用“in”关键字进行原型devise,并计划在之后的时间内返回并优化这些search,因为我知道“in”关键字通常是O(n)(因为这只是将python遍历整个列表并进行比较每个元素)。 但是,作为一个python字典基本上只是一个哈希映射,是python解释器足够聪明来解释: if(key in dict.keys()): …code… 至: if(dict[key] != None): …code… 它基本上是相同的操作,但顶部将是O(n),底部将是O(1)。 在我的代码中使用底部版本很容易,但是我只是好奇,想我会问。

从数组中获得最小值或最大值的最佳方法是什么?

假设我有一组数字: [2,3,3,4,2,2,5,6,7,2] 在数组中find最小值或最大值的最佳方法是什么? 现在,为了获得最大值,我循环访问数组,如果variables大于现有值,则将其重置为该值: var myArray:Array /* of Number */ = [2,3,3,4,2,2,5,6,7,2]; var maxValue:Number = 0; for each (var num:Number in myArray) { if (num > maxValue) maxValue = num; } 这似乎不是执行此操作的最佳方法(尽可能避免出现循环)。

一个永远不会被任何东西匹配的正则expression式

这可能听起来像一个愚蠢的问题,但我与我的一些开发人员长谈,听起来像是一个有趣的事情想起来。 所以; 你的想法是什么 – 一个正则expression式是什么样的,永远不会被任何string匹配! 编辑 :为什么我要这个? 那么,首先是因为我觉得有意思的是想到这样一个expression,其次是因为我需要一个脚本。 在该脚本中,我将字典定义为Dictionary<string, Regex> 。 如你所见,它包含一个string和一个expression式。 基于这个字典,我创build了一些方法,这些方法全部使用这个字典作为他们应该如何工作的参考,其中一个方法将正则expression式与parsing的日志文件进行匹配。 如果expression式匹配,则另一个Dictionary<string, long>被添加expression式返回的值。 因此,为了捕获任何不符合字典中的expression式的日志消息,我创build了一个名为“unknown”的新组。 对这个组别来说,所有与其他东西不匹配的东西都会被添加 但为了防止“未知”expression错误(偶然)一个日志消息,我不得不创build一个绝对不匹配的expression式,不pipe我给它什么string。 因此,你有我的理由这个“不是一个真正的问题”…

.NET控制台应用程序退出事件

在.NET中,是否有方法(如事件)来检测控制台应用程序何时退出? 我需要清理一些线程和COM对象。 我正在从控制台应用程序运行一个消息循环,没有窗体。 我正在使用的DCOM组件似乎要求应用程序泵送消息。 我已经尝试添加一个处理程序Process.GetCurrentProcess.Exited和Process.GetCurrentProcess.Disposed。 我也尝试添加一个处理程序到Application.ApplicationExit和Application.ThreadExit事件,但他们不是射击。 也许这是因为我没有使用表单。

len()函数的代价

Python内置函数的len()函数的成本是多less? (列表/元组/串/字典)

HashMap获取/放置复杂性

我们习惯于说HashMap get/put操作是O(1)。 但是这取决于哈希实现。 默认对象散列实际上是JVM堆中的内部地址。 我们确定它是否足以说明get/put是O(1)? 可用内存是另一个问题。 正如我从javadocs了解到的, HashMap load factor应该是0.75。 如果我们在JVM中没有足够的内存并且load factor超出限制呢? 所以,看起来O(1)是不能保证的。 这是有道理的,还是我错过了什么?