Ho scoperto che ci sono molte controversie sulla complessità asintotica di List.Add()
. Sospetto che sia la causa peggiore dello scenario that causes underlying array to resize e logicamente sarebbe l'operazione O(n)
. Tuttavia, lo array grows twice in size ogni elenco di tempo esaurisce lo spazio. Ciò rende la proporzione necessaria per gli elementi n
proporzionale a log(n)
.Qual è la complessità asintotica di List.Add?
Ciò non significa che la complessità asintotica dell'operazione Add
nel caso medio sarà O(n/log(n))
?
Il vero parametro di riferimento per List.Add()
è il seguente. Tuttavia, i benchmark non sono realmente espressivi per tale operazione - potremmo essere a corto di memoria prima che qualsiasi deviazione dalla linea retta (in scala logaritmica) diventi visibile.
Quando la matrice aumenta, gli elementi N/2 esistenti vengono spostati. Ecco perché pensi che sia il registro N. Ma la crescita della capacità, nuova ma inusitata, in modo esponenziale. Ciò neutralizza l'effetto. Il primo elemento viene spostato nel registro N volte. Gli ultimi elementi N/2 vengono spostati 0 o 1 volte. – usr