Halstead复杂度
设n1 表示程序中不同的操作符(程序保留字、运算符、分隔 符、函数调用) 个数,n2 表示程序中不同的操作数(常量、 变量) 个数,N1 表示程序中出现的操作符总数,N2 表示程序 中出现的操作数总数。
Halstead程序词汇表长度Program vocabulary:n= n1+ n2 .
实际Halstead长度或简单长度Program length: N= N1+N2 .
以N^表示程序的预测长度Calculated program length: N^= n1log2n1 + n2log2n2 . ◌ Halstead 的重要结论之一是:程序的实际长度N与预测长度 N^ 非常接近,这表明即使程序还未编写完也能预先估算出 程序的实际长度N。
#include <stdio.h>
#include <math.h>
int main() {
float a, b, c, mean;
scanf("%f %f %f", &a, &b, &c);
mean = a * b * c;
mean = pow(mean, 1.0 / 3.0);
printf("Geometric Mean = %f", mean);
return 0;
}
unique operator:#, include, <>, stdio.h, math.h, int, main, (), {}, float, scanf, &, *, =, pow,/, printf, return.
unique oprands:a, b, c, mean, “%f,%f,%f”,1.0,3.0,”Geometric Mean = %f”,0.
n1=18,n2=9,N1=28,N2=19.
Halstead程序词汇表长度Program vocabulary:n= n1+ n2 =18+9=27
实际Halstead长度或简单长度Program length: N= N1+N2=28+19=47
以N^表示程序的预测长度Calculated program length:
N^= n1log2n1 + n2log2n2=103.5879
- 程序体积或容量Volume: V=Nlog2(n)V=Nlog2(n),表明了程序在词汇上 的复杂性。
V=47log2(27)=223.48V=47log2(27)=223.48 - 程序级别Level: LL^x(n2/N2)(n2/N2),表明了一个程序的最 紧凑形式的程序量与实际程序量之比,反映了程序的效率。
LL^x(n2/N2)=(2/18)∗(9/19)=0.0526(n2/N2)=(2/18)∗(9/19)=0.0526 - 程序难度Difficulty: D=1/LD=1/L^,表明了实现算法的困难程度。
D = 19 - 编程工作量Effort:E=VE=VxD=V/LD=V/L^ .
E = 223.48*19 = 4246.12 - 智能级别:I=LI=L^xEE .
I = 223.35 - 语言级别:^xLL^x .
L‘=0.618L‘=0.618 - 编程时间(hours): TT^ xf)f),这里S = 60x60, f = 18 .
TT^=0.065526 - 平均语句大小:N/语句数
47/10=4.7 - 程序中的错误数预测值:xlog2(n1+n2)/3000log2(n1+n2)/3000 .
B=47B=47xlog2(18+9)/3000=0.0745log2(18+9)/3000=0.0745