Per quanto ne so, il vantaggio principale del mezzo bordo è che l'attraversamento può essere un po 'più semplice a causa della garanzia di bordi con un orientamento coerente all'interno di ciascuna faccia.
Considera il problema di iterare su tutti i vertici o i bordi di una determinata faccia, in senso antiorario. Nella struttura a mezzo bordo, questo può essere fatto iniziando con un mezzo bordo arbitrario di quella faccia e semplicemente seguendo i puntatori "successivi" fino a tornare da dove hai iniziato.
Al contrario, farlo in una struttura a bordo alato è un po 'fastidioso, perché i bordi sono orientati arbitrariamente; qualsiasi dato bordo che incontri potrebbe puntare in senso orario o antiorario rispetto alla faccia che stai cercando di scorrere, quindi devi fare un controllo condizionale aggiuntivo ad ogni passo per vedere se dovresti attraversare il bordo corrente in avanti o indietro.
Altri tipi di query sulla connettività si comportano in modo simile: la versione a metà bordo consente di seguire i collegamenti in una sequenza coerente, mentre la versione a bordo alato richiede controlli di orientamento ad ogni passaggio.
Se i condizionali sono effettivamente un problema di prestazioni per il bordo alato probabilmente dipenderà da altri fattori. Per un'implementazione "ingenua" con puntatori in ogni modo e dati sparsi nella memoria, mi aspetto che la cache miss overhead sommerga qualsiasi effetto dei condizionali. D'altra parte, se si dispone di una struttura di dati molto compatta con tutto ciò che è caldo nella cache, è possibile vedere alcuni effetti dai condizionali a causa di previsioni di diramazione errate, ecc. È difficile da dire.
Lasciando le prestazioni da solo, preferirei il mezzo margine solo perché sembra più facile ragionare e scrivere il codice corretto, anche se si traduce in un leggero sovraccarico di memoria.
A proposito, ci sono un paio di altre scelte di progettazione con strutture dati mesh che spesso sembrano confuse con questa. Un commentatore ha menzionato il collegamento singolo o doppio, ma naturalmente è possibile eseguire il collegamento singolo o doppio con il bordo mezzo o alato. (Anche se non vedo come funzionerebbe anche il collegamento singolo con il bordo alato, poiché come menzionato sopra, potresti dover attraversare i bordi all'indietro o in avanti nel corso di una query.)
Inoltre, c'è la questione se il vertice e le strutture della faccia memorizzano un elenco di tutti i loro bordi, o solo uno (e richiedono di attraversare i bordi per trovare il resto). Avere un elenco di spigoli di lunghezza variabile per vertice / faccia complica notevolmente la logica se si desidera farlo in modo efficiente (cioè non avere un'allocazione di heap separata per vertice / faccia), ma di nuovo questo è indipendente dal fatto che i bordi siano a metà o alato.