Sia V un array di elementi appartenenti a un dominio D (ad esempio numeri interi)numero minimo di operazioni per eseguire un operazioni associative su gruppi sovrapposti
V = {v1, v2, ..., vN}
Sia f (x, y) sia un operatore binario z = f (x, y) definito in [DxD] -> D.
f è associativo e commutativo.
f non supporta inverso sul suo dominio completo, cioè se il risultato z e uno degli argomenti x o y è noto, non è sempre possibile ottenere l'altro argomento.
Data una coppia ordinata di indici (i, j), l'operatore g (i, j) è definito come la riduzione del sottararray {vi, ..., vj} ottenuto con l'operatore f.
Ad esempio, se f è l'operatore di moltiplicazione, cioè f (x, y) = x * y, poi
g(2,5) = v2 * v3 * v4 * v5
devo calcolare la g funzionale su un grande insieme di coppie (i, j), che coinvolgono elementi sovrapposti del vettore V.
Vorrei approfittare dell'associatività dell'operatore f per eseguire questo calcolo con il numero minimo possibile di applicazioni dell'operatore f, perché f è computazionalmente molto costoso .
Ad esempio, attenersi all'esempio sopra, dove f è la moltiplicazione intera, dato un array V con 5 voci e le coppie di indici (1,3), (2,4), (2,5), (1,4), posso calcolare tutte le coppie con 6 multiplicatons:
V={1, 2, 0, 3, 5}
1. V12 = V1 * V2
2. V13 = V12 * V3 // pair (1,3)
3. V14 = V13 * V4 // pair (1,3)
4. V23 = V2 * V3
5. V24 = V23 * V4 // pair (2,4)
6. V25 = V24 * V5 // pair (2,5)
qualcuno può suggerire un algoritmo per ricavare il grafico ottimale calcolo, come ho fatto manualmente sopra? So che la soluzione al problema non è unica. Qualunque soluzione minima farebbe. Anche una soluzione euristica pseudo-ottimale farebbe.
Gli intervalli di alberi sembrano un buon strumento per identificare i calcoli sovrapposti – Rerito