Questions tagged «complexity»

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

3
复杂性和可及性之间是否存在关联?
我最近在uni上研究了循环复杂度(McCabe)和软件的可达性。今天,我的讲师说这两个指标之间没有关联,但事实确实如此吗? 我认为肯定会有一定的相关性,因为较不复杂的程序(从我们看过的很少的程序中)在可访问性方面似乎有“更好”的结果。 有谁知道尝试同时查看这两个指标的情况,如果没有,那么对于找到大量程序的复杂性和可访问性而言,在哪里找到数据的好地方呢?

15
面向对象编程是复杂性的解决方案吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 您是否认为面向对象编程是解决复杂性的一种方法。为什么?这个话题可能有点争议,但是我打算从这里的专家那里了解“为什么”的答案!

16
否则块会增加代码复杂度吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 这是一个非常简化的示例。这不一定是特定于语言的问题,我想请您忽略函数编写的许多其他方式以及可以对其进行的更改。。颜色是一种独特的类型 string CanLeaveWithoutUmbrella() { if(sky.Color.Equals(Color.Blue)) { return "Yes you can"; } else { return "No you can't"; } } 我遇到的很多人,ReSharper和这个人(其评论提醒我我一直想问这个问题已经有一段时间了)建议重构代码以删除else留下的代码块: (我不记得大多数人所说的话,否则我可能不会问这个) string CanLeaveWithoutUmbrella() { if(sky.Color.Equals(Color.Blue)) { return "Yes you can"; } return "No you can't"; } 问题:不包括else块会导致复杂性增加吗? else通过说明两个模块中的代码直接相关的事实,我给人的印象更直接地表明了意图。 另外,我发现我可以防止逻辑上的细微错误,尤其是在以后对代码进行修改之后。 以我的简化示例的这种变化形式为例(or由于这是故意简化的示例,因此请忽略运算符): bool CanLeaveWithoutUmbrella() { if(sky.Color != Color.Blue) { …

2
算法的预期运行时间和平均运行时间是什么意思?
假设我们要分析算法的运行时间。有时我们说我们想在输入大小为n时找到算法的运行时间,在最坏的情况下用O(n)表示它。有时,尽管我看到书籍/论文说我们需要找到算法的预期时间。有时也使用平均运行时间。 什么是“预期时间”?在什么情况下找到期望的时间而不是最坏的情况有用? 编辑:我认为预期的运行时间和平均运行时间之间存在细微的差别,但我不确定。通过这篇文章,我想知道确切的区别。

6
如何控制Web开发的复杂性?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 在我职业生涯的大部分时间里,我一直是服务器端程序员,但直到最近才开始在Web开发上花费更多的时间。我为编写一个像样的Web应用程序需要掌握的东西而感到惊讶。只是列出了我需要学习的一些工具/技术, 服务器端编程语言(Java / JSP,ASP,PHP,Ruby或其他) 体面的Web框架(适用于任何中型到大型应用程序)。 HTML和CSS Java脚本 Javascript库(主要用于AJAX的JQuery / ExtJS等)。很高兴知道,即使没有必要。 至少具有网页设计的基本知识-布局,颜色,字体等。 对网络安全性有很好的了解。 对性能/可伸缩性问题有很好的了解。 测试,浏览器兼容性问题等。 清单继续。 因此,我对经验丰富的Web开发人员的问题是-你们如何设法学习并保持自己在很多事情上的最新动态?在开发Web应用程序时,如何处理这些领域中涉及的复杂性,同时又设法编写设计良好,用户友好,安全,性能良好且可扩展的应用程序。 作为一名Web开发人员,是必须成为所有行业的杰作,还是应该专门从事一两个领域,而将其余的留给团队的其他成员?

4
固定时间和摊销固定时间是否有效地等同?
我需要编写一个RandomQueue,以允许在恒定时间(O(1))中进行追加和随机删除。 我的第一个想法是使用某种Array(我选择ArrayList)来支持它,因为数组可以通过索引进行恒定访问。 虽然查看文档,但我意识到ArrayLists的添加被视为摊销固定时间,因为添加可能需要重新分配基础数组O(n)。 摊销的固定时间和固定时间实际上是否相同,还是我需要查看某种结构,不需要每次添加都进行完全重新分配? 我之所以这样问是因为除了基于数组的结构(据我所知,它将始终具有摊销的固定时间),我想不出任何满足要求的东西: 任何基于树的事物最多都具有O(log n)访问权限 链表可能会增加O(1)(如果保留对尾部的引用),但是随机删除最多应为O(n)。 这是完整的问题;万一我对一些重要细节感到困惑: 设计并实现一个RandomQueue。这是Queue接口的一种实现,其中remove()操作将删除一个元素,该元素是在队列中当前所有元素中随机选择的。(将RandomQueue当作一个包,我们可以在其中添加元素或进入并盲目删除一些随机元素。)RandomQueue中的add(x)和remove()操作每个操作应在恒定的时间内运行。

1
域驱动设计对于不是那么复杂的域有用/有用吗?
在评估工作中的潜在项目时,我建议对它的对象模型使用领域驱动的设计方法可能会更有利。该项目没有一个过于复杂的领域,所以我的同事把这个扔给了我: 有人说,DDD在存在复杂域模型的情况下是有利的(“ ...只要我们在复杂,复杂域中运行,都适用” Eric Evans)。 我所迷惑的是-您如何定义域的复杂性?是否可以通过域模型中聚合根的数量来定义?对象交互中的域是否复杂? 我们正在评估的领域与在线发布和内容管理相关。

8
什么时候应该消除复杂性?
通过在需要之前实施设计模式来过早引入复杂性不是一个好习惯。 但是,如果您遵循所有(或什至大部分)SOLID原则并使用通用的设计模式,那么随着功能或需求的添加或更改,以使您的设计保持所需的可维护性和灵活性,您将引入一些复杂性。 但是,一旦引入了这种复杂性并像冠军一样工作,何时将其删除? 例。我有一个为客户编写的应用程序。在最初创建时,那里有几种向员工加薪的方法。我使用了策略模式和工厂来使整个过程保持整洁。随着时间的流逝,应用程序所有者添加或删除了某些升高方法。 时间流逝,新主人接管了。这个新主人刻薄了鼻子,保持一切简单,只有一种加薪的方法。 不再需要策略模式所需的复杂性。如果我现在按照需求在哪里编写代码,那么我不会介绍这种额外的复杂性(但请确保在需要时我可以花很少的精力或根本不用做任何工作来引入它)。 那我现在要删除策略实施吗?我认为这个新主人不会改变加薪的方式。但是应用程序本身已经证明了这可能发生。 当然,这只是新所有者接管并简化了许多流程的应用程序中的一个示例。我可以删除数十个类,接口和工厂,并使整个应用程序更加简单。请注意,当前的实现确实可以很好地工作,并且所有者对此感到满意(由于所讨论的复杂性,我能够如此迅速地实现她的更改感到惊讶甚至高兴)。 我承认这一怀疑的一小部分是因为新所有者很可能不再使用我了。我真的不在乎其他人会接手这件事,因为它并不是一个巨大的收入来源。 但我确实关心2件(相关的)事情 我有点担心,新维护者在尝试理解代码时将不得不加倍努力。复杂性就是复杂性,我不想激怒追随我的心理狂。 但是,更令我担心的是竞争对手看到了这种复杂性,并认为我只是实施设计模式来增加工作时间。然后散布这个谣言来伤害我的其他生意。(我听说过此事。) 所以... 总的来说,即使以前需要的复杂性行之有效,并且历史上已经证明了对这种复杂性的需求,但是否应该删除它却没有迹象表明将来会需要它呢? 即使上面的问题通常被回答为“否”,如果将项目移交给竞争对手(或陌生人),消除这种“不必要的”复杂性是否明智?

3
克里斯·索耶(Chris Sawyer)用汇编语言编写大多数过山车大亨将涉及多长时间以及哪种类型的复杂性?
关于这个问题,我还有另一个问题…… 克里斯·索耶(Chris Sawyer)用汇编语言编写大多数过山车大亨将涉及多长时间以及哪种类型的复杂性? 为了指定并分解这个问题,我感兴趣; 您估计克里斯大约要花多少工时(有一个猜测)?或者,换句话说,用C / C ++编写整个程序,给出近似的汇编程序编码小时数百分比。 熟悉汇编程序的程序员是否会认为这对于如此低级的语言抽象来说是一项过于复杂的任务?除了性能优势外,这还只是克里斯拥有的一种奇特的自然能力,还是值得学习的技能?我很感兴趣,如果人们认为复杂性/性能值得值得(为了编写)学习汇编程序,或者如果您在汇编程序方面有很多天生的技能(大概是通过使用硬件工作),那么这仅仅是“值得”吗? /硬件驱动程序/电子设备/等)。

8
您如何处理复杂性跳跃?
似乎很少见,但经常遇到的经验是,有时您正在从事一个项目,突然间突然出现一些意外情况,在工作中投入了大量的扳手,并极大地提高了复杂性。 例如,我正在开发一个与其他各种机器上的SOAP服务通信的应用程序。我提出了一个效果很好的原型,然后继续开发常规前端,并以一种不错,相当简单且易于遵循的方式来启动和运行所有东西。直到我们开始在更广泛的网络上进行测试,突然页面开始超时,因为连接的延迟和在远程计算机上执行计算所需的时间导致对Soap服务的请求超时后,它才开始工作。事实证明,我们需要更改架构以将请求转出到自己的线程上并缓存返回的数据,以便可以在后台逐步更新它,而不是根据请求逐个执行计算。 这种情况的细节不是太重要-确实不是一个很好的例子,因为它是可以预见的,并且为这种环境编写过很多此类应用的人可能已经预料到了-除了它说明了一种方式可以从简单的前提和模型开始,然后突然将复杂性升级到项目的开发中。 您有什么策略来应对这些类型的功能更改,这些功能更改的出现通常是环境因素而不是规格更改的结果,而在开发过程的后期或测试的结果是?在避免过早优化/ YAGNI /过度设计设计解决方案的风险之间,如何设计解决方案来缓解可能(但不一定是)可能的问题,而不是开发一个可能更有效但又没有针对此问题准备更简单的解决方案,这两者之间如何平衡?一切可能的事情? 编辑:疯狂的埃迪的答案包括“您吸纳它并找到实现新复杂性的最便宜的方法。” 这让我想到了问题中隐含的东西,但我没有具体提出。 一旦遇到困难,就可以进行必要的更改。您是否执行了使项目尽可能接近进度但可能会影响可维护性的事情,还是回到了体系结构并在更详细的级别上对其进行了重新设计,该级别可能更易于维护,但会在开发过程中推迟一切?

5
指导尴尬的领域特定对象的命名?
我正在为化学系统建模,但是在枚举中命名元素/项目时遇到了问题。 我不确定是否应该使用: 原子公式 化学名称 化学名称的缩写。 例如,硫酸是H2SO4,盐酸是HCl。 对于这两个,我可能会只使用原子公式,因为它们相当普遍。 但是,我还有其他类似Na2SiF6的六氟硅酸钠。 在该示例中,原子式(对我而言)不那么明显,但化学名称长得令人毛骨悚然: myEnum.SodiumHexaFluoroSilicate。我不确定如何才能安全地提出一个具有一致命名模式的缩写化学名称。 我正在尝试通过命名枚举元素来解决一些问题。 首先是可读性,较长的名称会带来问题。 第二个问题是为新的维护者挑选代码很容易,在这里较短的名字带来了问题。 下一个问题是企业主通常使用完整的化学名称,但并非总是如此。“鲜味”化学物质由其化学式表示。 最后要考虑的是确保其一致性。我不需要混合的命名约定,因为将无法记住要使用的命名约定。 从维护的角度来看,您希望查看上述哪个命名选项,为什么? 注意:该行下面的所有内容都是补充| 澄清材料。请不要陷入其中。主要问题涉及命名尴尬的对象。 原子选项 公共myEnum.ChemTypes { 硫酸 盐酸 Na2SiF6 } 化学名称选项 公共myEnum.ChemTypes { 硫酸 盐酸, 六氟硅酸钠 } 以下是有关此问题的评论中的一些其他详细信息: 代码的受众只是程序员,而不是化学家。 我正在使用C#,但是我认为在忽略实现语言时,这个问题会更有趣。 我从10-20种化合物开始,最多可以有100种化合物,因此我不必担心每种可能的化合物。幸运的是,这是一个固定域。 枚举用作查找的关键字,以方便进行常规/通用化学计算-这意味着所有化合物的方程式均相同,但您插入化合物的属性即可完成方程式。 例如,当从化合物的质量(以克为单位)计算摩尔数时,使用摩尔质量(以g / mol为单位)。FWIW,摩尔质量==摩尔重量。 常见计算的另一个示例是理想气体定律及其对特定气体常数的使用 示例函数可能类似于: 公共double GetMolesFromMass(double mass_grams,myEnum.ChemTypes chem) { double moleWeight = …


5
复杂软件应实现多少冗余/鲁棒性?
这个问题的焦点:尽管软件中存在一个或多个内部错误,某些软件执行“额外工作”以增加“最终成功/令人满意”结果的机会,当这些错误发生时,这需要更长的执行时间。如果结果成功,所有这些都会在用户不知情的情况下发生。 复杂软件的定义: 包含超过10个开发人员在其生命周期内编写的代码(由其提供),并且未在同一时间段内编写 依赖于10多个外部库,每个库都带有警告 典型的软件任务(用于生成用户想要的结果)需要10个或更多输入参数,其中大多数具有默认值,但如果用户需要控制,则可以配置。 最重要的是,相对于要执行的任务具有适当复杂性的软件,即不必造成不必要的复杂性。 编辑:什么是复杂的?请参阅复杂和复杂之间有很大的区别。(直接链接) 此问题内的冗余/鲁棒性的定义:(基于注释增加了鲁棒性) 如果在使用当前参数集时软件任务失败,请尝试其他参数。 显然,必须有内部知识,这些“不同”的参数使用不同的代码路径,可能会导致不同的(希望更好)结果。 有时,这些不同的代码路径是基于对外部库的观察而选择的。 最后,如果执行的实际任务与用户的说明略有不同,则用户将收到详细说明差异的报告。 最后,像10余个可配置参数一样,冗余和报告也是可配置的。 此类软件的示例: 数据库迁移 业务数据库 源代码控制数据库等 在Word文档和OpenOffice文档,PowerPoint和OpenOffice Draw等之间进行批量转换。 自动翻译整个网站 自动分析软件包,例如Doxygen,但需要更可靠的分析(即不仅仅是文档工具) 网络通信,其中数据包可能会丢失并且可能会重试 这个问题最初是由您如何处理故意的不良代码启发而来的?但现在仅关注软件膨胀的原因之一。这个问题没有解决软件膨胀的任何其他原因,例如添加新功能。 可能相关: 如何处理(巨大)项目中的复杂代码 人们如何管理和维护极其复杂且难以阅读的代码?

3
在大型软件项目中,如何衡量实践中的复杂性?
在大学中,在我们的算法课程中,我们学习如何精确计算实际使用的各种简单算法(例如哈希表或快速排序)的复杂性。 但是现在在一个大型软件项目中,当我们想使其更快时,我们所要做的只是看各个部分-那里有一些嵌套循环,可以用更快的哈希表代替,这里的慢速搜索可以通过更花哨的技术-但我们从未计算过整个流程的复杂性。 有什么办法吗?还是在实践中人们只是使用快速算法依靠“本地”来使整个应用程序更快,而不是全局地考虑整个应用程序? (因为在我看来,要证明如果您堆积大量已知非常快速的算法,那么最终还是会得到一个整体快速的应用程序。) 我之所以这样问,是因为我的任务是加快别人编写的大型项目的速度,其中许多算法正在交互并处理输入数据,因此我不清楚在单一算法上更快地完成单一算法的影响。整个应用程序。

5
以编程方式找到算法的Landau表示法(Big O或Theta表示法)?
我习惯于手动搜索我的算法的Landau(Big O,Theta ...)表示法,以确保它们已尽可能地优化,但是当函数变得真正又大又复杂时,它就在不断发展。手工做的时间太多。它也容易出现人为错误。 我花了一些时间在Codility(编码/算法练习)上,并注意到它们会为您提交的解决方案(时间和内存使用量)提供Landau表示法。 我想知道他们是怎么做到的...你会怎么做? 除了词法分析或代码解析之外,还有其他方法吗? 这个问题主要涉及PHP和/或JavaScript,但是我对任何语言和理论都开放。

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.