首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何降低switch的圈复杂度--附11例

降低switch语句的圈复杂度是通过优化代码结构和逻辑来实现的。下面是11个例子,展示了如何降低switch语句的圈复杂度:

  1. 使用多态:将switch语句中的每个case分别封装成不同的类,并使用多态来执行相应的操作。这样可以将复杂的switch语句转化为简单的对象调用。
  2. 使用策略模式:将switch语句中的每个case分别封装成不同的策略类,并通过一个策略工厂来选择执行相应的策略。这样可以避免使用switch语句。
  3. 使用映射表:将switch语句中的每个case与相应的处理函数建立映射关系,使用一个字典或哈希表来存储这个映射关系。通过查找映射表来执行相应的处理函数。
  4. 使用状态模式:将switch语句中的每个case分别封装成不同的状态类,并通过状态转移来执行相应的操作。这样可以将复杂的switch语句转化为简单的状态转移。
  5. 使用策略+工厂模式:将switch语句中的每个case分别封装成不同的策略类,并通过一个工厂类来选择执行相应的策略。这样可以避免使用switch语句。
  6. 使用函数指针:将switch语句中的每个case与相应的处理函数建立映射关系,使用函数指针来执行相应的处理函数。
  7. 使用模板方法模式:将switch语句中的每个case分别封装成不同的模板方法,并在子类中实现具体的操作。通过调用模板方法来执行相应的操作。
  8. 使用状态机:将switch语句中的每个case分别封装成不同的状态,并通过状态转移来执行相应的操作。这样可以将复杂的switch语句转化为简单的状态转移。
  9. 使用规则引擎:将switch语句中的每个case分别封装成不同的规则,并使用规则引擎来执行相应的规则。这样可以将复杂的switch语句转化为简单的规则执行。
  10. 使用表驱动法:将switch语句中的每个case分别封装成不同的函数,并使用一个表格来存储这些函数的指针。通过查找表格来执行相应的函数。
  11. 使用设计模式:根据具体的业务场景,选择合适的设计模式来替代switch语句,例如工厂模式、观察者模式、责任链模式等。

以上是一些降低switch语句圈复杂度的方法,具体的选择取决于具体的业务需求和代码结构。在实际开发中,可以根据情况选择合适的方法来优化代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 软件架构与系统复杂性

    复杂或复杂性与简单相对立,那么复杂是什么?它是我们大脑中的一个概念,但是我在网上找不到一个给复杂恰当的定义描述,它会有不同的解释。 其中洛克在《人类理解论》中说道:『一些思想是由简单的思想组合而成,我称此为复杂;比如美、感激、人、军队、宇宙等。』 作为研究复杂系统的专家 Melanie Mitchell,也没有给出一个明确的公认的定义。她在《复杂》一书中给出了复杂系统加以定义:『复杂系统是由大量组分组成的网络,不存在中央控制,通过简单运作规则产生出复杂的集体行为和复杂的信息处理,并通过学习和进化产生适应性。』 上述复杂系统中的组分对应软件系统中的组成部分,基于不同粒度可以是对象、函数、类、包、模块、组件和服务等。每一部分都应该是相对单一的职责,细粒度部分之间耦合提供更粗粒度功能,不同组分之间相互协作来提供系统功能,继而组合成我们复杂的软件系统。

    01

    【WWW2021】高效的非抽样知识图谱嵌入

    知识图谱(KG)是一种灵活的结构,能够描述数据实体之间的复杂关系。目前,大多数KG嵌入模型都是基于负采样进行训练的,即模型的目标是最大限度地增加KG内被连接实体的某些相似度,同时最小化被采样的断开实体的相似度。负抽样通过只考虑负实例的子集,降低了模型学习的时间复杂度,这可能会由于抽样过程的不确定性而无法提供稳定的模型性能。为了避免这一缺陷,我们提出了一种新的KG嵌入高效非采样知识图谱嵌入框架(NS-KGE)。其基本思想是在模型学习中考虑KG中的所有负面实例,从而避免负面抽样。框架可应用于基于平方损失的知识图谱嵌入模型或其损失可转换为平方损失的模型。这种非抽样策略的一个自然副作用是增加了模型学习的计算复杂度。为了解决这一问题,我们利用数学推导来降低非采样损失函数的复杂度,最终为我们提供了比现有模型更好的KG嵌入效率和精度。在基准数据集上的实验表明,NS-KGE框架在效率和准确率方面均优于传统的基于负采样的模型,该框架适用于大规模知识图谱嵌入模型。

    03

    【模板小程序】求小于等于N范围内的质数

    关于搜寻一定范围内素数的算法及其复杂度分析                                                       ——曾晓奇     关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信 对大家一定有帮助。     正如大家都知道的那样,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n)--n的开方,那么我们可以用这个性质用最直观的方法 来求出小于等于n的所有的素数。     num = 0;     for(i=2; i<=n; i++)     { for(j=2; j<=sqrt(i); j++)          if( j%i==0 ) break;        if( j>sqrt(i) ) prime[num++] = i; //这个prime[]是int型,跟下面讲的不同。     }     这就是最一般的求解n以内素数的算法。复杂度是o(n*sqrt(n)),如果n很小的话,这种算法(其实这是不是算法我都怀疑,没有水平。当然没 接触过程序竞赛之前我也只会这一种求n以内素数的方法。-_-~)不会耗时很多.     但是当n很大的时候,比如n=10000000时,n*sqrt(n)>30000000000,数量级相当大。在一般的机子它不是一秒钟跑不出结果,它是好几分钟都跑不 出结果,这可不是我瞎掰的,想锻炼耐心的同学不妨试一试~。。。。     在程序设计竞赛中就必须要设计出一种更好的算法要求能在几秒钟甚至一秒钟之内找出n以内的所有素数。于是就有了素数筛法。     (我表达得不清楚的话不要骂我,见到我的时候扁我一顿我不说一句话。。。)     素数筛法是这样的:     1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false.     2.然后:       for( i=3; i<=sqrt(n); i+=2 )       {   if(prime[i])            for( j=i+i; j<=n; j+=i ) prime[j]=false;       }     3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。     原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质 数的倍数筛掉。      一个简单的筛素数的过程:n=30。     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30     第 1 步过后2 4 ... 28 30这15个单元被标成false,其余为true。     第 2 步开始:      i=3; 由于prime[3]=true, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]标为false.      i=4; 由于prime[4]=false,不在继续筛法步骤。      i=5; 由于prime[5]=true, 把prime[10],[15],[20],[25],[30]标为false.      i=6>sqrt(30)算法结束。     第 3 步把prime[]值为true的下标输出来:      for(i=2; i<=30; i++)      if(prime[i]) printf("%d ",i);     结果是 2 3 5 7 11 13 17 19 23 29     这就是最简单的素数筛选法,对于前面提到的10000000内的素数,用这个筛选法可以大大的降低时间复杂度。把一个只见黑屏的算法 优化到立竿见影,一下就得到结果。关于这个算法的时间复杂度,我不会描述,没看到过类似的记载。只知道算法书上如是说:前几年比 较好的算法的复杂度为o(n),空间复杂度为o(n^(1/2)/logn).另外还有时间复杂度为o(n/logn),但空间复杂度为O(n/(lognloglogn))的算法。 我水平有限啦,自己分析不来。最有说服力的就是自己上机试一试。下面给出这两个算法的程序: //最普通的方法: #include<stdio.h> #include<math.h>

    01
    领券