Questions tagged «complexity»

复杂度涉及各种计算代码复杂度的形式。圈复杂度,n路径复杂度,大O时间和空间复杂度。

10
如何解释为什么多线程很难
我是一个相当不错的程序员,我的老板也是一个相当不错的程序员。尽管他似乎低估了诸如多线程之类的某些任务以及它的难度(我发现,除了运行几个线程,等待所有线程完成然后返回结果之外,其他事情非常困难)。 当您开始担心僵局和比赛条件时,我觉得这很困难,但老板似乎并不喜欢这一点-我认为他从未遇到过。只是打个锁就差不多了。 那么,我如何介绍他,或者解释为什么他可能低估了并发,并行和多线程的复杂性?还是我错了? 编辑:他做了些什么-遍历一个列表,为该列表中的每个项目创建一个线程,该线程根据该项目中的信息执行数据库更新命令。我不确定他如何控制一次执行多少个线程,我想如果运行太多(如果他使用信号量的话),他一定会将它们添加到队列中。

7
如何管理软件项目中的意外复杂性
当问到Murray Gell-Mann时,Richard Feynman如何解决了这么多难题时,Gell-Mann回答说Feynman有一个算法: 写下问题。 认真思考。 写下解决方案。 盖尔曼(Gell-Mann)试图解释说,费曼是另一种类型的问题解决者,研究他的方法没有任何见识。对于管理中型/大型软件项目的复杂性,我有点相同的感觉。优秀的人天生就是擅长的,并且设法以某种方式分层和堆叠各种抽象,以使整个事物易于管理,而不会引起任何不必要的麻烦。 那么,费曼算法是管理意外复杂性的唯一方法,还是软件工程师可以始终如一地应用实际方法来应对意外复杂性?

15
大型软件是否有可能达到绝对零错误状态?
我说的是20-30 +百万行代码,例如Autodesk Maya规模和复杂性的软件。 如果您只要需要就冻结开发,就可以实际修复所有错误,直到没有一个单独的错误为止(如果可以通过计算机验证此错误)?支持和反对无错误系统的存在是什么? 因为有人认为您所做的每个修复都会产生更多的错误,但是我认为那不是真的。 错误是指从用户界面中最简单的错字,到没有解决方法的更严重的预防性错误。例如,特定的脚本功能无法正确计算法线。同样,即使有解决方法,该问题仍必须解决。因此,您可以说可以手动执行此特定操作,而不使用提供的功能,但是该功能仍必须修复。


6
为什么没有开源项目的代码概述?[关闭]
那里有非常复杂的开源项目,我想我可以为其中的一些项目做出一些贡献,我希望我能做出一些贡献,但是进入的门槛太高了,原因有一个:在同一时间更改一行代码大型项目,您必须了解所有内容。 您不需要阅读所有代码(即使您阅读,也不够用)并了解每一行的内容以及原因,因为代码可能是模块化和分区化的,所以有适当的抽象,但是即使如此,你需要获得一个概述该项目,这样你就可以知道哪里是模块,其中确实有另外一个模块接口,究竟各模块做的,为什么,以及其中的目录和文件均对这些事情的发生。 我称此代码概述为开放源代码项目可以在网站或文档中向外部人员解释其代码的部分的名称。我认为这将使潜在的贡献者受益,因为他们将能够确定他们可以建立的地方,所涉及的实际主要编码人员,因为他们将能够在编写所有内容的同时重组他们的思想,并会像他们那样帮助用户。帮助理解并更好地报告他们遇到的错误,甚至可能成为贡献者。 但是我仍然从未见过这些“代码概述”之一。为什么?是否有类似的事情,我想念他们?与我描述的功能相同的事情?还是这是一个完全无用的想法,因为除我之外,每个人都可以轻松理解具有数千行代码的项目?

5
什么时候在akka / erlang中使用actor不好?
我每天与akka合作7-8个月。当我开始时,我将在应用程序上工作,并注意到actor基本上会在actor系统内部的任何地方用于大多数对象之间的通信。所以我也做同样的事情-为x / y / z旋转另一个演员。 在我看来,这可能太过随意了,在不需要的地方增加了复杂性-但是我找不到关于应该使用参与者与普通同步甚至是期货的异步逻辑的讨论。我的同事提到类似的内容后,我开始思考自己的立场。我最近才意识到有几种情况,我在考虑一个任务,然后避免创建另一个参与者,因为我可以在不可变的实现中安全地实现相同的结果-例如,从数据库或文件中获取配置值的地方,而这些地方很少访问并且会等待结果是实际用例。 尤其是在我看来,在任何情况下,如果您正在使用不可变状态,参与者都会造成复杂性并限制吞吐量-例如,对象中的纯函数可以在没有任何并行级别的情况下并发调用,但是演员一次只能处理一条消息。另一个考虑因素是,如果您需要等待结果,除非您开始使用期货,否则就将线程停放,但是在不需要担心异步消息传递或扩展的情况下,聘请演员似乎过大。 所以我的问题是-使用演员的时间不好吗?我很好奇erlang看起来如何并且真的希望别人的见识。或者,如果有一些有关演员使用的原则。

4
过多的抽象会不好吗?
作为程序员,我觉得我们的目标是在给定的域模型和业务逻辑上提供良好的抽象。但是这种抽象应该在哪里停止呢?如何在抽象及其所有优点(灵活性,易于更改等)以及易于理解代码及其所有优点之间进行权衡。 我相信我倾向于写过于抽象的代码,但我不知道它有多好。我经常倾向于将其编写为某种微型框架,包括两部分: 连接在微框架中的微模块:这些模块易于理解,开发和维护为单个单元。这段代码基本上代表了实际执行功能的代码,如需求所述。 连接代码;现在我相信这里是问题所在。该代码趋于复杂,因为它有时非常抽象,一开始很难理解。之所以会出现这种情况,是因为这仅仅是纯粹的抽象,实际上基础和业务逻辑是在所提供的代码1中执行的;因此,该代码一旦经过测试就不会更改。 这是编程的好方法吗?难道说,变更代码在许多模块中非常分散,并且很容易理解,而变更代码与抽象POV相比却非常复杂?如果所有代码都统一地复杂(即代码1更复杂和相互链接,而代码2更简单),以使通过它的任何人都可以在合理的时间内理解它,但是更改很昂贵,或者上述解决方案是好的, “更改代码”非常容易理解,调试,更改,“链接代码”有点困难。 注意:这与代码的可读性无关!1和2处的代码都是可读的,但2处的代码具有更复杂的抽象,而代码1则具有简单的抽象。

4
试图理解P vs NP vs NP Complete vs NP Hard
我试图理解这些分类以及它们为什么存在。我的理解正确吗?如果没有,那怎么办? P是多项式复杂度,或对于某些非负实数(例如)等。如果问题属于P,则至少存在一种可以在多项式时间内从头解决的算法。例如,我总是可以通过遍历并检查每一步是否除以整数来确定某个整数是否为质数。O(nk)kO(1), O(n1/2), O(n2), O(n3)n2 <= k <= sqrt(n)kn NP是不确定的多项式复杂度。我真的不知道不确定性意味着什么。我认为这意味着在多项式时间内进行验证很容易,但是如果我们不知道答案,那么从头开始求解可能不是多项式时间。由于它可以在多项式时间内求解,因此所有P问题也是NP问题。引用整数分解作为NP的示例,但我个人不理解为什么它不是P,因为试验分解需要O(sqrt(n))时间。 NP完全我完全不了解,但是引用了旅行商问题。但是在我看来,TSP问题可能只是NP,因为它需要采取某种措施来验证您是否已预先确定路径。O(2n n2) time to solve, but O(n) 我认为NP-Hard充满未知数。难以验证,难以解决。

2
什么是O(…),如何计算?
救命!我有一个问题需要分析算法或某些代码的Big-O。 我不确定究竟是什么Big-O或Big-O与Big-Theta或与其他分析算法复杂性的方式之间的关系。 我不确定Big-O是指运行代码的时间,还是所需的内存量(空间/时间折衷)。 我有计算机科学作业,需要做一些循环,也许是递归算法,并为此设计出Big-O。 我正在开发一个程序,我可以在两个数据结构或算法之间选择一个已知的Big-O,并且不确定要选择哪个。 我如何了解如何计算Big-O并将其应用到我的程序,作业或计算机科学常识中? 注意:此问题是社区确定的其他Big-O问题的规范重复目标。能够包含许多Big-O问题的大量有用信息的意图是广泛的。请不要使用如此广泛的事实来表示可以接受类似的问题。

5
确定算法是否为O(log n)
我正在刷新我的CS理论,我想知道如何识别算法O(log n)的复杂性。具体来说,有一种简单的方法可以识别它吗? 我知道O(n)通常是一个循环;O(n ^ 2)是一个双循环;O(n ^ 3)是一个三重循环,以此类推。O(log n)怎么样?

9
增加复杂性以删除重复的代码
我有几个类都从通用基类继承。基类包含一些类型为的对象的集合T。 每个子类都需要能够从对象集合中计算插值,但是由于子类使用不同的类型,因此每个类之间的计算差异很小。 到目前为止,我已经在每个类之间复制/粘贴了我的代码,并对每个代码进行了较小的修改。但是现在我试图删除重复的代码,并在我的基类中将其替换为一种通用插值方法。但是,事实证明这非常困难,而且我所想到的所有解决方案似乎都太复杂了。 我开始认为DRY原则在这种情况下不太适用,但这听起来像是亵渎神灵。尝试删除代码重复时有多少复杂性? 编辑: 我能想到的最好的解决方案是这样的: 基类: protected T GetInterpolated(int frame) { var index = SortedFrames.BinarySearch(frame); if (index >= 0) return Data[index]; index = ~index; if (index == 0) return Data[index]; if (index >= Data.Count) return Data[Data.Count - 1]; return GetInterpolatedItem(frame, Data[index - 1], Data[index]); } protected abstract T GetInterpolatedItem(int …

7
大O中的O是什么?
Big O符号中的Big和O是什么?我已经阅读了定义,但并没有说出O的发音是“哦”。例如-我知道O(n)是线性算法的复杂度,其中n可以是操作数。但是什么是O?
23 complexity  big-o 

6
当您更改函数的Big O执行时间时,该怎么称呼?
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 去年关闭。 假设我有一个可以O(n^2)及时对数据库进行排序的函数。我想对其进行重构,以使其能够O(n log(n))及时运行,并且这样做,我将更改操作的基本运行方式,同时保持返回值和输入相等。 我怎么称呼这种重构活动? “加速优化”似乎不太正确,因为您可以在不改变算法执行速度的情况下使算法运行得更快。 “简化”似乎也不对。 我怎么称呼这项活动? 更新资料 我能找到的最佳答案是减少渐近时间的复杂度。
19 complexity  big-o 

3
是否有OOP过度复杂化的术语?
一两年前,我看到了一篇有关OOP(Java)的出色文章,其中展示了一个简单的两行或三行代码的具体记录器的发展,以及经验不足的开发人员在理论上的过度思考过程,基本上说,哦,我应该添加此以防万一我们想要的! 到本文结尾时,这个简单的记录器是一堆乱七八糟的垃圾,原始开发人员几乎无法理解自己。 这种过度并发症是否有一个通用术语?那篇文章(我非常希望我能再次找到它)很好地展示了一个孤立案例的概念,但是我遇到了整个项目,在这些项目中,开发人员实际上是由于过度使用模式,框架,库和程序而陷入困境。其他问题。用它自己的方式,这比我们继承来替换的旧版VB6意大利面条应用程序糟糕(甚至更糟)。 我真正想要的是在面试时提出这个问题。我想知道是否有人意识到并意识到缺乏架构/预先规划就容易陷入这种困境(并且因为他们似乎没有适当的平衡而陷入困境),但这并不是真的我可以找到很多信息。

5
P = NP的影响是什么?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 7年前关闭。 我正在准备测试,但找不到以下问题的明确答案:证明PTIME = NPTIME有什么影响。我检查了维基百科,它刚刚提到它将“对数学,人工智能,算法等产生深远影响”等。 有人可以给我答案吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.