L'unione delle siepi è sempre veloce quanto la divisione e la conquista?


8

Adams descrive un algoritmo di divisione e conquista per trovare l'unione di due insiemi (rappresentati come alberi di ricerca binari bilanciati in base al peso). Descrive quindi un nuovo algoritmo "hedge union" che sostiene migliorare su quello di divisione e conquista. Tuttavia, non offre una prova, o addirittura una vera spiegazione, del perché dovrebbe essereO(m+n), figuriamoci perché dovrebbe essere più veloce della divisione e conquista.

Blelloch, Ferizovic e Sun dimostrano che l'algoritmo Adams divide and conquer raggiunge effettivamente il teoricamente ottimaleΘ(mlog(n/m+1)) dove mn. Tuttavia, non affrontano l'algoritmo hedge union.

L'hedge union, infatti, è efficace quanto il divide-and-conquistare? La parte meno ovvia è il rivestimento interno. Sembra, almeno superficialmente, duplicare il lavoro tra i sottotitoli sinistro e destro che la divisione completa condivide tra loro. Forse questo va bene per qualche motivo, ma non so perché.

Un'ulteriore richiesta: Haskell's Data.Sete Data.Mapusa varianti di siepe di intersezione e differenza, nonché unione. Non ho trovato alcuna discussione pubblicata su tali algoritmi. Domande simili si applicano anche a queste.

Risposte:


3

Mentre devo ancora vedere o produrre un'analisi teorica degli algoritmi di copertura, ho alcune prove empiriche che sono peggiori degli algoritmi di divisione e conquista degli alberi binari.

A partire dal codice nel containerspacchetto Haskell , ho ottimizzato l'algoritmo hedge union applicando manualmente la specializzazione del modello di chiamata per ridurre l'allocazione intermedia. Ciò ha migliorato le sue prestazioni di circa il 10%, dandogli una buona dose.

A partire dal codice di divisione e acquisizione in Adams, ho ottimizzato l'algoritmo del sindacato aggiungendo casi speciali quando uno degli input è un singleton (il codice del hedge union ottimizza un lato in questo modo, e non è chiaro se l'altro lato può essere ottimizzato allo stesso modo).

Ho testato ogni implementazione usando una raccolta di parametri operativi impostati insieme containers. La divisione e la conquista erano in genere più veloci della siepe, a volte due volte più veloci. Quando è stato più lento, è stato solo leggermente.

Benchmark simili di altre operazioni stabilite hanno dato risultati simili.


Speculazione:

Gli algoritmi di copertura possono essere utili quando si utilizzano alberi con grandi fattori di ramificazione, che possono essere più costosi da dividere in modo ricorsivo. Possono anche essere utili per i piccoli sottoalberi, dove possono risparmiare abbastanza allocazione per valere il lavoro extra.


Hai effettivamente modificato l'implementazione in Data.Setbase a queste osservazioni?
Joachim Breitner il

@JoachimBreitner, sì, l'ho fatto. Ho anche usato lo stesso approccio per le nuove utility di unione sicura, sebbene caratterizzare le loro precise caratteristiche prestazionali sia sicuramente troppo difficile da prendere in considerazione.
Dfeuer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.