Một số nhận xét về điều này mà tôi nhàn rỗi viết lên ...
Cụ thể, đối với phương trình Wikipedia của M = E - N + 2P
Phương trình đó rất sai .
Vì một số lý do, McCabe thực sự sử dụng nó trong bài báo gốc của mình ("Biện pháp phức tạp", Giao dịch của IEEE về Kỹ thuật phần mềm, Vo .. SE-2, số 4, tháng 12 năm 1976), nhưng không biện minh cho nó và sau khi thực sự trích dẫn chính xác công thức trên trang đầu tiên, đó là
v (G) = e - v + p
(Ở đây, các yếu tố công thức đã được dán nhãn lại)
Cụ thể, McCabe tham khảo cuốn sách C.Berge, Đồ thị và Siêu dữ liệu (viết tắt dưới đây là G & HG). Trực tiếp từ cuốn sách đó :
Định nghĩa (trang 27 dưới cùng của G & HG):
Số chu kỳ v (G) của đồ thị (không bị chặn) G (có thể có một số thành phần bị ngắt kết nối) được định nghĩa là:
v (G) = e - v + p
Trong đó e = số cạnh, v = số đỉnh, p = số thành phần được kết nối
Định lý (trang 29 đầu G & HG) (không được McCabe sử dụng):
Số chu kỳ v (G) của đồ thị G bằng số chu kỳ độc lập tối đa
Một chu kỳ là một chuỗi các đỉnh bắt đầu và kết thúc tại cùng một đỉnh, với mỗi hai đỉnh liên tiếp trong dãy liền kề nhau trong biểu đồ.
Theo trực giác, một tập hợp các chu trình là độc lập nếu không có chu trình nào có thể được xây dựng từ các chu kỳ khác bằng cách áp dụng các bước đi.
Định lý (trang 29 giữa G & HG) (như McCabe sử dụng):
Trong đồ thị G được kết nối mạnh, số chu kỳ bằng với số lượng mạch độc lập tuyến tính tối đa.
Một mạch là một chu kỳ không có sự lặp lại của các đỉnh và cạnh được phép.
Một đồ thị có hướng được cho là được kết nối mạnh nếu mọi đỉnh có thể tiếp cận được từ mọi đỉnh khác bằng cách đi qua các cạnh theo hướng được chỉ định của chúng.
Lưu ý rằng ở đây chúng tôi đã chuyển từ các biểu đồ vô hướng sang các biểu đồ được kết nối mạnh mẽ (được định hướng ... Berge không làm cho điều này hoàn toàn rõ ràng)
McCabe hiện áp dụng định lý trên để rút ra một cách đơn giản để tính toán một số phức phức theo chu kỳ của McC McCabe (CCN):
Đưa ra một biểu đồ có hướng đại diện cho cấu trúc liên kết nhảy nhảy của một thủ tục (biểu đồ luồng lệnh), với một đỉnh được chỉ định đại diện cho điểm vào duy nhất và một đỉnh được chỉ định đại diện cho điểm thoát duy nhất (đỉnh của điểm thoát có thể cần phải được xây dựng bằng cách thêm nó trong trường hợp trả về nhiều lần), tạo một biểu đồ được kết nối mạnh bằng cách thêm cạnh có hướng từ đỉnh điểm thoát vào đỉnh điểm vào, do đó làm cho đỉnh điểm vào có thể tiếp cận được từ bất kỳ đỉnh nào khác.
Bây giờ McCabe đặt ra (khá khó hiểu tôi có thể nói) rằng số chu kỳ của biểu đồ luồng lệnh đã sửa đổi "phù hợp với khái niệm trực quan của chúng tôi về 'số lượng đường dẫn tối thiểu'", và vì vậy chúng tôi sẽ sử dụng số đó làm thước đo độ phức tạp.
Thật tuyệt, vì vậy:
Số độ phức tạp chu kỳ của biểu đồ luồng lệnh được sửa đổi có thể được xác định bằng cách đếm các mạch "nhỏ nhất" trong biểu đồ không bị chặn. Điều này không đặc biệt khó thực hiện bởi con người hoặc máy móc, nhưng áp dụng định lý trên cho chúng ta một cách dễ dàng hơn để xác định nó:
v (G) = e - v + p
nếu một người coi thường tính định hướng của các cạnh.
Trong mọi trường hợp, chúng tôi chỉ xem xét một thủ tục duy nhất, do đó chỉ có một thành phần được kết nối trong toàn bộ biểu đồ, và vì vậy:
v (G) = e - v + 1.
Trong trường hợp người ta xem xét biểu đồ ban đầu mà không có cạnh "thoát ra để vào" , người ta chỉ cần lấy:
(G) = ẽ - v + 2
như ẽ = e - 1
Hãy minh họa bằng cách sử dụng ví dụ của McCabe từ bài báo của mình:
Ở đây chúng tôi có:
- e = 10
- v = 6
- p = 1 (một thành phần)
- v (G) = 5 (chúng tôi đang đếm rõ ràng 5 chu kỳ)
Công thức cho số chu kỳ nói:
v (G) = e - v + p
mang lại 5 = 10 - 6 + 1 và đúng như vậy!
"Số phức tạp chu kỳ McCabe" như được nêu trong bài báo của ông là
5 = 9 - 6 + 2 (không có giải thích nào thêm được đưa ra trong bài báo về cách thức)
điều này xảy ra là đúng (nó mang lại v (G)) nhưng vì những lý do sai, tức là chúng ta sử dụng:
(G) = ẽ - v + 2
và do đó (G) = v (G) ... phew!
Nhưng biện pháp này có tốt không?
Trong hai từ: Không phải là rất
- Không hoàn toàn rõ ràng làm thế nào để thiết lập "biểu đồ luồng hướng dẫn" của một thủ tục, đặc biệt là nếu xử lý ngoại lệ và đệ quy nhập vào hình ảnh. Lưu ý rằng McCabe đã áp dụng ý tưởng của mình cho mã được viết bằng FORTRAN 66 , một ngôn ngữ không có đệ quy, không có ngoại lệ và cấu trúc thực thi đơn giản.
- Việc một thủ tục có quyết định và thủ tục có vòng lặp mang lại CCN giống nhau không phải là một dấu hiệu tốt.