Theo như tôi có thể nói, ưu điểm chính của nửa cạnh là việc di chuyển ngang có thể đơn giản hơn một chút do đảm bảo các cạnh có hướng ổn định trong mỗi mặt.
Xem xét vấn đề lặp trên tất cả các đỉnh hoặc cạnh của một mặt nhất định, theo thứ tự ngược chiều kim đồng hồ. Trong cấu trúc nửa cạnh, điều này có thể được thực hiện bằng cách bắt đầu với một nửa cạnh tùy ý của khuôn mặt đó và chỉ cần làm theo các con trỏ "tiếp theo" cho đến khi bạn quay lại nơi bạn bắt đầu.
Ngược lại, làm điều này trong một cấu trúc cạnh có cánh là một chút khó chịu, bởi vì các cạnh được định hướng tùy ý; bất kỳ cạnh nào bạn gặp có thể chỉ theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ so với khuôn mặt bạn đang cố gắng lặp lại, vì vậy bạn phải kiểm tra thêm có điều kiện ở mỗi bước để xem bạn nên đi qua cạnh hiện tại tiến hay lùi.
Các loại truy vấn kết nối khác hoạt động tương tự: phiên bản nửa cạnh cho phép bạn theo dõi các liên kết theo một trình tự nhất quán trong khi phiên bản có cánh yêu cầu kiểm tra định hướng ở mỗi bước.
Liệu các điều kiện có thực sự là một vấn đề hiệu suất cho cạnh có cánh hay không sẽ phụ thuộc vào các yếu tố khác. Đối với việc triển khai "ngây thơ" với các con trỏ mọi cách và dữ liệu nằm rải rác trong bộ nhớ, tôi hy vọng bộ nhớ cache sẽ bỏ qua bất kỳ tác động nào của các điều kiện. Mặt khác, nếu bạn có cấu trúc dữ liệu được đóng gói chặt chẽ với mọi thứ nóng trong bộ đệm, bạn có thể thấy một số hiệu ứng từ các điều kiện do dự đoán nhánh không chính xác, v.v. Thật khó để nói.
Để lại hiệu suất một mình, tôi thích nửa cạnh chỉ vì lý do dễ dàng hơn để viết và viết mã chính xác, ngay cả khi nó dẫn đến chi phí bộ nhớ nhỏ.
Nhân tiện, có một vài lựa chọn thiết kế khác với cấu trúc dữ liệu lưới thường có vẻ bị nhầm lẫn với cái này. Một nhà bình luận đã đề cập đến liên kết đơn và liên kết đôi, nhưng tự nhiên bạn có thể thực hiện liên kết đơn hoặc đôi với một nửa cạnh hoặc cạnh có cánh. (Mặc dù tôi không thấy cách liên kết đơn với cạnh có cánh thậm chí sẽ hoạt động, vì như đã đề cập ở trên, bạn có thể phải đi qua các cạnh hoặc lùi hoặc tiến trong quá trình truy vấn.)
Ngoài ra, có câu hỏi liệu cấu trúc đỉnh và mặt có lưu trữ một danh sách tất cả các cạnh của chúng hay chỉ một (và yêu cầu bạn đi qua các cạnh để tìm phần còn lại). Có một danh sách các cạnh có độ dài thay đổi trên mỗi đỉnh / mặt làm phức tạp đáng kể logic nếu bạn muốn thực hiện nó một cách hiệu quả (nghĩa là không có phân bổ heap riêng cho mỗi đỉnh / mặt), nhưng một lần nữa, điều này độc lập với việc các cạnh có phải là nửa cạnh không hoặc có cánh cạnh.