Assignment 4——Halstead复杂度计算
一. 题目
计算下列代码片段的 Halstead 复杂度的11项内容:
if (month < 3) {
month += 12;
--year;
}
return dayray((int)(day + (month + 1) * 26/10 + year +year/4 + 6 * (year/100) + year/400)% 7);
二. 关于Halstead复杂度的11项内容
1.定义
- Halstead 复杂度 (Maurice H. Halstead, 1977) 是软件科学提出的第一个计算机软件的分析“定律”,用以确定计算机软件开发中的一些定量规律。
- Halstead 复杂度根据程序中语句行的操作符和操作数的数量计算程序复杂性。
- 设 n 1 n_1 n1表示程序中不同的操作符个数, n 2 n_2 n2 表示程序中不同的操作数个数, N 1 N_1 N1 表示程序中出现的操作符总数, N 2 N_2 N2 表示程序中出现的操作数总数。
2. 11项内容
- Halstead 程序词汇表长度 Program vocabulary: n = n 1 + n 2 n_1 + n_2 n1+n2.
- Halstead 程序长度或简单长度 Program length: N = N 1 + N 2 N_1 + N_2 N1+N2.
- 以 N^ 表示程序的预测长度 Calculated program length: N^ =$ n_1 log_2 n_1 + n_2 log_2 n_2$.
- 程序体积或容量 Volume: V = N l o g 2 ( n ) Nlog_2(n) Nlog2(n),表明了程序在词汇上的复杂性。
- 程序级别 Level: L^ = ( 2 / n 1 ) ∗ ( n 2 / N 2 ) (2/n_1) * (n_2/N_2) (2/n1)∗(n2/N2),表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。
- 程序难度 Difficulty: D = 1/L^,表明了实现算法的困难程度。
- 编程工作量 Effort: E = V * D = V/L^ .
- 语言级别: Lʹ = L^ * L^ * V.
- 编程时间 (hours): T^ = E/(S * f),这里 S = 60 * 60, f = 18 .
- 平均语句大小: N/语句数。
- 程序中的错误数预测值: B = V/3000 = $Nlog_2(n)/3000 $.
三. 解答
if (month < 3) {
month += 12;
--year;
}
return dayray((int)(day + (month + 1) * 26/10 + year + year/4 + 6 * (year/100) + year/400)% 7);
从上述代码可以得出以下两个表
Operator 操作符 | Number of Occurrences 出现次数 |
---|---|
if | 1 |
< | 1 |
+= | 1 |
– | 1 |
+ | 6 |
* | 2 |
/ | 4 |
% | 1 |
统计可得 n 1 = 8 n_1 = 8 n1=8, N 1 = 16 N_1 = 16 N1=16
Operand 操作数 | Number of Occurrences 出现次数 |
---|---|
month | 3 |
year | 5 |
dayray | 1 |
day | 1 |
3 | 1 |
12 | 1 |
1 | 1 |
26 | 1 |
10 | 1 |
4 | 1 |
6 | 1 |
100 | 1 |
400 | 1 |
7 | 1 |
统计可得 n 2 = 14 n_2 = 14 n2=14, N 2 = 20 N_2 = 20 N2=20
- Halstead 程序词汇表长度 Program vocabulary: n =
n
1
+
n
2
n_1 + n_2
n1+n2.
- n = 8 + 14 = 22
- Halstead 程序长度或简单长度 Program length: N =
N
1
+
N
2
N_1 + N_2
N1+N2.
- N = 16 + 20 = 36
- 以 N^ 表示程序的预测长度 Calculated program length: N^ =$ n_1 log_2 n_1 + n_2 log_2 n_2$.
- N^ = 8 * l o g 2 8 log_{2}8 log28 + 14 * l o g 2 14 log_{2}14 log214= 77.303
- 程序体积或容量 Volume: V =
N
l
o
g
2
(
n
)
Nlog_2(n)
Nlog2(n),表明了程序在词汇上的复杂性。
- V =37 * l o g 2 22 log_222 log222 = 164.999
- 程序级别 Level: L^ =
(
2
/
n
1
)
∗
(
n
2
/
N
2
)
(2/n_1) * (n_2/N_2)
(2/n1)∗(n2/N2),表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。
- L^ = (2 / 8) * (14 / 20) = 2.8
- 程序难度 Difficulty: D = 1/L^,表明了实现算法的困难程度。
- D = 1 / 2.8 = 0.357
- 编程工作量 Effort: E = V * D = V/L^ .
- E = 164.999 * 0.357 = 58.905
- 语言级别: Lʹ = L^ * L^ * V.
- Lʹ = 2.8 * 2.8 * 164.999 = 1293.592
- 编程时间 (hours): T^ = E/(S * f),这里 S = 60 * 60, f = 18 .
- T^ = 58.905 / (3600 * 18) = 0.000909
- 平均语句大小: N/语句数。
- N / 语句数 = 37 / 5 = 7.4
- 程序中的错误数预测值: B = V/3000 = $Nlog_2(n)/3000 $.
- B = 164.999 / 3000 = 0.055