Questions tagged «complexity»

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

5
计算复杂性的概念对软件开发人员重要吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我给人的印象是,时间和记忆的复杂性是compsci课程的毕业生必不可少的,但是在学习工程学后,我不知道是否是这种情况。最近,我很惊讶地采访了一些甚至不知道这个概念的当地大学的毕业生。我想我的问题是: 计算复杂性的概念对软件开发人员重要吗?并且应该在本科课程中教授吗?

10
如何区分普通软件和非普通软件?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 那么真正使程序变得微不足道的是什么呢? 在编程讨论中经常使用“除非其琐碎的软件”。从某种意义上说,我觉得它很模糊,因为我无法真正确定“某物是必不可少的,因为它的非平凡软件”或“它是非平凡的软件,因为某物变得非常必不可少”。 例如,很多时候关于单元测试的问题,我听说“除非您需要进行单元测试这很琐碎”。
11 complexity 

2
处理特征交叉点
我最近目睹了越来越多的问题,这些问题与本文中有关特征交点的解释类似。它的另一个术语是产品线,尽管我倾向于将它们归因于实际上不同的产品,而我通常以可能的产品配置形式遇到这些问题。 这类问题的基本思想很简单:您向产品添加了功能,但是由于其他现有功能的组合,事情变得有些复杂。最终,QA发现了一个罕见的功能组合问题,以前没有人想到过,应该是一个简单的错误修复程序甚至可能变成需要进行重大设计更改的问题。 此特征相交问题的维度令人难以置信。假设当前软件版本具有N功能,并且您添加了一项新功能。让我们通过说每个功能只能打开或关闭来简化事情,那么您已经有2^(N+1)可能要考虑的功能组合。由于缺乏更好的措词/搜索词,我将这些组合的存在称为特征相交问题。(奖励点数包含一个更明确的术语的参考答案。) 现在我要解决的问题是如何在开发过程的每个级别上解决这个复杂性问题。出于明显的成本原因,要想分别解决每个组合问题,直到成为乌托邦式的想法都是不切实际的。毕竟,我们有充分的理由尝试远离指数复杂性算法,但是将开发过程本身变成指数大小的怪物势必会导致彻底失败。 因此,您如何以系统的方式获得最佳结果,而不会花费任何预算,并且以体面,有用和专业上可接受的方式完成。 规范:当您指定一个新功能时,如何确保它与其他所有子功能都能正常使用? 我看到一个人可以结合新功能来系统地检查每个现有功能-但这将隔离其他功能。考虑到某些功能的复杂性,这种孤立的视图通常已经非常复杂,以至于它本身就需要一种结构化的方法,更不用说2^(N-1)由其他功能引起的因素了,而这些功能是一个人们乐意忽略的。 实施:实施功能时-如何确保代码在所有情况下均正确交互/相交。 再次,我想知道纯粹的复杂性。我知道有多种技术可以减少两个相交特征的潜在错误,但是没有任何一种能够以任何合理的方式扩展。不过,我确实认为,在规范制定过程中采取好的策略应该可以在实施过程中解决问题。 验证:在测试要素时-如何处理这个事实,即您只能测试该要素相交空间的一小部分? 很难理解,单独测试一个功能不会保证没有错误的代码,但是当您将其减少到一小部分时2^-N,似乎数百个测试甚至都无法覆盖所有海洋的一滴水。 。更糟糕的是,最有问题的错误是由要素交集引起的,这些错误可能不会导致任何问题-但是,如果您不期望如此强烈的交集,那么如何测试这些错误? 尽管我想听听其他人如何解决这个问题,但我主要对更深入地分析该主题的文学或文章感兴趣。因此,如果您个人遵循某种策略,则在答案中包括相应的来源会很好。

4
减少类的复杂性
我已经查看了一些答案并在Google上进行了搜索,但是找不到任何有用的东西(即不会产生尴尬的副作用)。 总的来说,我的问题是我有一个对象,需要对它执行长时间的操作。我将其视为一种装配线,例如制造汽车。 我相信这些对象将称为“ 方法对象”。 因此,在此示例中的某个点上,我将拥有一个CarWithoutUpholstery,然后需要在其上运行installBackSeat,installFrontSeat,installWoodenInserts(这些操作不会互相干扰,甚至可以并行执行)。这些操作由CarWithoutUpholstery.worker()执行,并产生一个新的对象,该对象将是CarWithUpholstery,然后在其上运行cleanInsides(),verifyNoUpholsteryDefects()等。 单个阶段中的操作已经是独立的,也就是说,我已经在努力应对可以按任何顺序执行的子集(可以按任何顺序安装前排和后排座椅)。 我的逻辑当前使用反射来简化实现。 也就是说,一旦有了CarWithoutUpholstery,该对象就会检查自身是否有名为performSomething()的方法。此时,它执行所有这些方法: myObject.perform001SomeOperation(); myObject.perform002SomeOtherOperation(); ... 同时检查错误和内容。虽然操作的顺序是不重要的,我已经在指定情况下,我曾经发现毕竟一些顺序很重要,一个字典顺序。这与YAGNI矛盾,但是它花费很少-简单的sort()-并且可以节省大量的方法重命名(或引入其他执行测试的方法,例如方法数组)的费用。 一个不同的例子 让我们说,除了要制造汽车外,我还必须编辑某人的秘密警察报告,并将其提交给我的邪恶霸主。我的最后一个对象将是ReadyReport。为了构建它,我首先收集基本信息(姓名,姓氏,配偶...)。这是我的A阶段。根据是否有配偶,我可能不得不进入B1或B2阶段,并收集一两个人的性行为数据。这是由对不同的Evil Minions的几个不同的查询所组成,它们控制着夜生活,街拍,性用品商店的销售收据以及不收什么。等等等等。 如果受害者没有家庭,我什至不会进入GetInformationAboutFamily阶段,但是如果我这样做了,那么我是首先瞄准父亲还是母亲还是兄弟姐妹(如果有)就没有关系了。但是,如果我还没有执行FamilyStatusCheck,那我就无法做到这一点,因此它属于早期阶段。 一切都很棒... 如果我需要一些其他操作,我只需要添加一个私有方法, 如果该操作在多个阶段都是通用的,那么我可以让它从超类继承, 操作简单且自成体系。任何其他操作都不需要从任何操作中获得任何价值(在不同阶段执行的操作), 线下的对象不需要执行许多测试,因为如果其创建者对象首先没有验证这些条件,它们甚至可能不存在。即,在将插入物放入仪表板,清洁仪表板并验证仪表板时,我不需要验证仪表板是否确实存在。 它便于测试。我可以轻松模拟部分对象并在其上运行任何方法,并且所有操作都是确定性的黑匣子。 ...但... 当我在我的方法对象之一中添加最后一个操作时,就会出现问题,这导致整个模块超过了强制性的复杂性指标(“少于N个私有方法”)。 我已经在楼上解决了这个问题,并建议在这种情况下,私有方法的丰富并不是灾难的故事。复杂性是存在的,但它的存在,因为操作是复杂的,实际上它不是那么复杂-它只是长。 以邪恶的霸王为例,我的问题是邪恶的霸王(又名不容否认的他)要求了所有饮食信息,我的饮食奴才告诉我,我需要查询餐馆,小厨房,街头小贩,无牌街头小贩,温室所有者等,以及邪恶的(sub)Overlord(众所周知的也不应被拒绝的他)抱怨我在GetDietaryInformation阶段执行了太多查询。 注意:我知道从多个角度来看这根本不是问题(忽略可能的性能问题等)。发生的一切是,一个特定的指标不满意,对此有充分的理由。 什么我想我能做到 除了第一个以外,所有这些选择都是可行的,而且我认为是可以辩护的。 我已经证实自己可以偷偷摸摸,并声明一半的方法protected。但是我会利用测试程序中的弱点,除了在被抓住时证明自己是合理的之外,我也不喜欢这样。另外,这是权宜之计。如果所需操作次数加倍怎么办?不太可能,但是那又如何呢? 我可以将此阶段任意拆分为AnnealedObjectAlpha,AnnealedObjectBravo和AnnealedObjectCharlie,并使每个阶段要执行的操作占三分之一。我的印象是,这实际上增加了复杂性(增加了 N-1个类),除了通过测试之外没有任何好处。我当然可以认为,CarWithFrontSeatsInstalled和CarWithAllSeatsInstall在逻辑上是连续的阶段。Alpha后来要求使用Bravo方法的风险很小,如果我打得很好的话,风险甚至会更低。但是还是。 我可以将一个远程相似的不同操作组合在一起。performAllSeatsInstallation()。这只是权宜之计,并且确实增加了单个操作的复杂性。如果我需要以不同的顺序执行操作A和B,并且将它们打包在E =(A + C)和F(B + D)内,则必须解开E和F并重新整理代码。 我可以使用lambda函数数组,并完全避开检查,但是我发现这很笨拙。但是,这是迄今为止最好的选择。它会摆脱反思。我遇到的两个问题是,可能会要求我重写所有方法对象,不仅是假设对象,CarWithEngineInstalled而且这虽然是很好的工作安全性,但实际上并没有那么大的吸引力。并且代码覆盖率检查器存在lambda 问题(可以解决,但仍然存在)。 所以... 您认为哪个是我最好的选择? 有没有我没有考虑过的更好的方法?(也许我最好打扫卫生,直接问一下是什么?) 这种设计是否存在绝望的缺陷,我最好承认失败与否-这种体系结构?这对我的职业生涯不利,但是从长远来看,编写错误的代码会更好吗? 我当前的选择是否真的是“唯一的方式”,我需要努力获得更好的质量指标(和/或仪器)?对于这最后一个选项,我需要参考...我不能只在抱怨的同时对@PHB挥手,这不是您要查找的指标。不管我想要多少


6
字段与方法参数
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我刚开始写一些新的类,然后发现我添加了很多严格不需要的方法参数。这是为了避免在某些方法调用特定的类中具有状态,而不是成为类的常规配置或依赖性,这是一种习惯。 这样做意味着许多没有参数的方法最终只能得到一,二或三。 我想听听您对这个折衷方案的看法,以及如何决定在何种情况下采取哪种方法? 由于在描述代码时,代码通常比英语更容易理解,因此我创建了一个包含两个变体的小知识点:https : //gist.github.com/JeroenDeDauw/6525656

3
如何简化我复杂的有状态类及其测试?
我在用Java编写的分布式系统项目中,其中有一些类对应于非常复杂的现实世界业务对象。这些对象具有许多与用户(或某些其他代理)可以应用于该对象的操作相对应的方法。结果,这些类变得非常复杂。 系统通用体系结构方法导致许多行为集中在少数几个类上,并且涉及许多可能的交互方案。 举个例子,为了使事情变得简单明了,假设机器人和汽车是我项目中的类。 因此,在Robot类中,我将采用以下模式提供许多方法: 睡觉(); isSleepAvaliable(); 苏醒(); isAwakeAvaliable(); 步行(方向);isWalkAvaliable(); 射击(方向);isShootAvaliable(); turnOnAlert(); isTurnOnAlertAvailable(); turnOffAlert(); isTurnOffAlertAvailable(); recharge(); isRechargeAvailable(); powerOff(); isPowerOffAvailable(); stepInCar(Car); isStepInCarAvailable(); stepOutCar(Car); isStepOutCarAvailable(); 自毁(); isSelfDestructAvailable(); 死(); isDieAvailable(); 活着(); isAwake(); isAlertOn(); getBatteryLevel(); getCurrentRidingCar(); getAmmo(); ... 在Car类中,它将类似于: 打开(); isTurnOnAvaliable(); 关掉(); isTurnOffAvaliable(); 步行(方向);isWalkAvaliable(); 加油(); isRefuelAvailable(); 自毁(); isSelfDestructAvailable(); crash(); isCrashAvailable(); isOperational(); isOn(); getFuelLevel(); getCurrentPassenger(); ... …

5
使用O(n)中的后缀数组的字符串的最小词典旋转
我将引用ACM 2003中的问题: 考虑一个长度为n(1 <= n <= 100000)的字符串。确定其最小词典编排旋转。例如,字符串“ alabala”的旋转为: 阿拉巴拉 拉巴拉 阿巴拉尔 巴拉拉 阿拉拉卜 拉拉巴 阿拉巴拉 其中最小的是“ aalabal”。 至于解决方案-我知道我需要构造一个后缀数组 -可以说我可以在O(n)中做到这一点。我的问题仍然是,如何找到O(n)的最小旋转度?(n =字符串的长度) 我对此问题非常感兴趣,但仍然不知如何解决。我对概念和如何解决问题更感兴趣,而不对具体实现更感兴趣。 注意:最小旋转的含义与英语词典中的顺序相同-“ dwor”在“ word”之前,因为d在w之前。 编辑:后缀数组构造需要O(N) 最后编辑:我想我找到了解决方案!!!如果我只是合并两个字符串怎么办?因此,如果字符串是“ alabala”,那么新字符串将是“ alabalaalabala”,现在我只需构造一个后缀数组(在O(2n)= O(n)中)并得到第一个后缀?我想这可能是对的。你怎么看?谢谢!
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.