java中时间复杂度怎么算的,java时间复杂度和空间复杂度
什么是圈复杂度?
———————————————————————————————————————
圈复杂度是衡量计算机程序复杂程度的一个尺度。它是根据程序从头到尾的线性独立路径数来计算的。
圈子的复杂程度越高,代码的维护就越复杂和困难。坑越大。
从1开始,一步一步地完成这个程序。
但是遇到以下关键词,或者其他类似的词,就加1: if,while,repeat,for,and,or。
case语句中的每个case加1。
例如,以下函数的圈复杂度为1,这意味着代码只有一条路径。
默认添加(a,b):
退货b
对于带有分支的代码,其圈复杂度为2,例如以下递归计算阶乘的代码:
deffactorial(n):
ifn==0:
返回1
否则:
returnn *阶乘(n-1)
其计算方法很简单:
公式1: V (g)=E-N 2p。其中e表示控制流图中的边数,n表示控制流图中的节点数,p图中的连通分量数(图中的分量数是连通节点的最大集合)。因为所有的控制流图都是连通的,所以p是1。
循环复杂性
代码状态
易测性
维修费用
1-10
清晰且有条理
高的
低的
11-20
复杂的
中间
中间
21-30
非常复杂
低的
高的
30
难以理解的
不可预知的
非常高
如何衡量一个程序的圈复杂度?
———————————————————————————————————————
在Python中,mccabe包可以用来度量程序的圈复杂度。
Mccabe可以用一个简单的命令行安装。
pipinstallmccabe
运行以下命令来检测test.py的圈复杂度
python-mmccabe - min5test.py
其中-min5表示允许的最小圈复杂度,输出大于5的圈复杂度,如下图所示:
第一个输出的结果是一个91行的roundRobin函数,复杂度为7。5%.
除了mccabe,市场上还有很多检测圈复杂度的工具。
工具
类型
系统平台
扫描语言
PMD/方格风格
免费
Windows/Linux/Mac
Java,JS
OClint
免费
苹果个人计算机
指挥官
隐蔽性
商业
Windows/Linux/Mac
C/C,Java,C#,OC/C,JS,Python,Ruby,PHP
源监视器
免费
Windows操作系统
C/C,C#,VB。NET,Java,Delphi,VB6,HTML
反干扰措施(counter-counter measures的缩写)
免费
Windows操作系统
JS、C/C、C#
HFCCA
免费
Windows/Linux/Mac
C/C,OC
蜥蜴
免费
Windows/Linux/Mac
C/C,Java,C#,JS,OC/C,Swift,Python,Ruby,TTCN-3,PHP,Scala,GDScript
代码质量优化
———————————————————————————————————————
将一个子程序的一部分提取到另一个子程序中,并不会降低整个程序的复杂度,只是将决策点移到了其他地方,但这样做可以降低你必须同时注意的复杂度水平。因为重点是减少你需要同时考虑的项目数量,所以降低给定程序的复杂性是有价值的。
1.细化函数(以php为例,以下同):
functiontest($number){
如果($number
{
$ NUMBER=self:MIN _ NUMBER;
}
for($ I=0;$i
//somecode
}
}
您可以用以下模式替换它:
functiontest($number){
$ number=getMin($ number);
for($ I=0;$i
//somecode
}
}
functiongetMin($number){
如果($number
return self:MIN _ NUMBER;
}
返回$number
}
2.替换算法(用另一个更清晰的算法替换复杂的算法):
if($str==China){
$result=中国人;
}
elseif($str==US){
$ result= American
}
elseif($str==France){
$ result= French
}
变成这样:
$people=[
中国=中国人民,
“美国人”,
法国=法国
];
$ result=$ people[$ str];
3.反向表达式(更改条件表达式顺序以简化复杂性):
If((条件1,条件2)!1)条件{
returntrue
}
否则{
返回false;
}
变成这样:
If(条件1!2)条件{
返回false;
}
returntrue
4.分解条件(分解复杂的条件表达式(if,else),提取成独立的函数):
if(do _ some _ 1($ number) do _ some _ 2($ number)){
$number=$number。$someStr1。$someStr2。123456789;
}
否则{
$number=$number。$someStr3。$someStr4。123456789;
}
变成这样:
if(do_some_fun($number)){
$ number=do _ some _ fun 1($ number);
}
否则{
$ number=do _ some _ fun 2($ number);
}
5.合并条件(将这些判断合并为一个条件式,并提取成独立函数):
如果($x
如果(10美元)返回0;
如果($z!=0)返回0;
变成这样:
if(get_result($x,$y,$ z))返回0;
6.移除控制标记(可以使用破裂和返回取代控制标记。):
$ bool=false
foreach($arrsas$arr){
如果(!$bool){
if($arr==1){
某函数();
$ bool=true
}
if($arr==2){
某函数();
$ bool=true
}
}
}
变成这样:
foreach($arrsas$arr){
if($arr==1$arr==2){
某函数();
}
打破;
}
7.以多态取代条件式(将整个条件式的每个分支放进一个子类的重载方法中,然后将原始函数声明为抽象方法。由于服务器端编程语言(专业超文本预处理器的缩写)是弱类型语言,这里体现的有点模糊):
开关(卡特彼勒){
案例"鱼":
吃鱼();
案例“莫斯”:
吃苔藓();
}
functioneatFish(){
回声鲸鱼
}
functioneatMoss(){
回声"鲸鱼大气";
}
变成这样:
接口在{
functioneatFish();
functioneatMoss();
}
classWhaleimplementsEat{
publicfunctioneatFish(){
回声鲸鱼
}
publicfunctioneatMoss(){
回声"鲸鱼大气";
}
}
8.参数化方法(建立单一函数,以参数表达那些不同的值):
$result=min(lastUsage(),100)* 0.03;
if(lastUsage()100){
$result=(min(lastUsage(),200)-100)* 0.05;
}
变成这样:
$result=getMin(0,100)* 0.03;
$result=getMin(100,200)* 0.03;
functiongetMin($start,$end){
if(lastUsage()$start){
return(min(lastUsage(),$ end)-$ start);
}
返回0
}
9.明确函数取代参数(针对该参数的每一个可能值,建立一个独立函数):
if($name==width){
$宽度=$值
}
elseif($name==height){
$ height=$ value
}
变成这样:
functionsetWidth($value){
$宽度=$值
}
functionsetHeight($value){
$ height=$ value
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。