In Python, un list ha list.insert(i, x)
in "Inserire un elemento in una determinata posizione". In C++, c'è anche list. In C++, il costo/la complessità di inserire un elemento ovunque è O (1). È lo stesso per una lista Python? Se no, può essere usato qualcos'altro per ottenere O (1) inserire il tempo in Python?Qual è il costo/la complessità dell'inserimento nell'elenco in qualche luogo?
risposta
Il linguaggio Python non specifica l'attuazione di tali operazioni, così diverse implementazioni possono avere un comportamento diverso. Per CPython, la complessità di list.insert
è O (n), come mostrato su this useful wiki page. Non sono a conoscenza di alcuna struttura ad elenco che fornisce prestazioni O (1) per l'inserimento in un indice arbitrario. (Un Dt dà O (1) inserire le prestazioni nel caso medio, ma non è ordinato e non impone una sequenza contigua di indici.) La libreria blist
fornisce un tipo di elenco ottimizzato che ha un inserto O (log n).
Python è una lingua. Esistono implementazioni multiple e possono avere implementazioni diverse per gli elenchi. Quindi, senza guardare il codice di un'implementazione reale, non si può sapere con certezza come vengono implementati gli elenchi e come si comportano in determinate circostanze.
La mia scommessa sarebbe che i riferimenti agli oggetti in una lista sono memorizzati in una memoria contigua (certamente non come una lista collegata ...). Se è così, allora l'inserimento usando x.insert farà sì che tutti gli elementi dietro l'elemento inserito vengano spostati. Questo può essere fatto in modo efficiente dall'hardware, ma la complessità sarebbe comunque O (n).
Per gli elenchi di piccole dimensioni l'operazione di bisect può richiedere più tempo di x.insert, anche se il primo è O (log n) mentre il secondo è O (n). Per lunghi elenchi, tuttavia, azzarderei l'ipotesi che x.insert sia il collo di bottiglia. In questi casi è necessario considerare l'utilizzo di una diversa struttura dei dati.
No, non è la stessa complessità. In base alla pagina ufficiale Time Complexity di Python , l'utilizzo di list.insert
ha sempre la complessità O(n)
(lineare).
Inoltre, un elenco Python non è esattamente lo stesso di un elenco C++. In effetti, una lista Python è più confrontabile con un C++ std::vector
se non altro.
Beh, pagina ufficiale di CPython. Non conosco altre implementazioni come IronPython o Jython.
lista
caso medio assume parametri generati in modo uniforme a caso.
Internamente, una lista è rappresentata come una matrice; i maggiori costi derivano dalla crescita oltre l'attuale dimensione di allocazione (perché tutto deve muoversi), o dall'inserimento o eliminazione da qualche parte vicino all'inizio (perché tutto dopo deve muoversi). Se è necessario aggiungere/rimuovere da entrambe le estremità, prendere in considerazione l'uso di collections.deque.
Così inserito un elemento alla posizione indicata avrà sempre la complessità temporale di O (n) sia come inserto metodo e affettare ha complessità temporale di O (n) e O (k). Solo append quali inserti alla fine dell'elenco hanno O (1) complessità temporale. Da Python Wiki
Lists:
Complexity
Operation | Example | Class | Notes
--------------+--------------+---------------+-------------------------------
Index | l[i] | O(1) |
Store | l[i] = 0 | O(1) |
Length | len(l) | O(1) |
Append | l.append(5) | O(1) |
Clear | l.clear() | O(1) | similar to l = []
Slice | l[a:b] | O(b-a) | l[1:5]:O(l)/l[:]:O(len(l)-0)=O(N)
Extend | l.extend(...)| O(len(...)) | depends only on len of extension
Construction | list(...) | len(...) | depends on lenghth of argument
check ==, != | l1 == l2 | O(N) |
Insert | l[a:b] = ... | O(N) |
Delete | del l[i] | O(N) |
Remove | l.remove(...)| O(N) |
Containment | x in/not in l| O(N) | searches list
Copy | l.copy() | O(N) | Same as l[:] which is O(N)
Pop | l.pop(...) | O(N) |
Pop | l.pop() | O(1) | same as l.pop(-1), popping at end
Extreme value | min(l)/max(l)| O(N) |
Reverse | l.reverse() | O(N) |
Iteration | for v in l: | O(N) |
Sort | l.sort() | O(N Log N) | key/reverse doesn't change this
Multiply | k*l | O(k N) | 5*l is O(N): len(l)*l is O(N**2)
Da here
- 1. Qual è la complessità temporale dell'albero trasversale?
- 2. Qual è la complessità asintotica di List.Add?
- 3. Qual è la complessità dell'aggiunta della matrice?
- 4. Qual è la complessità di OrderedDictionary?
- 5. Qual è la complessità asintotica dell'operazione GroupBy?
- 6. Qual è la complessità peggiore per il tipo di benna?
- 7. Qual è la complessità temporale di HashMap.containsValue() in java?
- 8. Qual è la complessità temporale di questa funzione in Scheme?
- 9. Elimina il tempo di complessità
- 10. Qual è la complessità temporale della mia funzione?
- 11. Qual è la complessità di questo ciclo triplo annidato?
- 12. Qual è la complessità temporale di iterazione TreeSet?
- 13. Qual è la complessità temporale di questo ciclo while?
- 14. Qual è la migliore complessità del puzzle N-Queens?
- 15. Qual è la complessità temporale delle ricerche HTML DOM
- 16. Qual è la complessità di tempo di .NET list.sort()
- 17. Qual è la complessità di questo codice il cui ciclo annidato per ripetutamente raddoppia il contatore?
- 18. database del luogo o del luogo
- 19. Esiste un equivalente di boost :: multi_index per Java in qualche luogo?
- 20. Qual è il costo/complessità di una chiamata di funzione String.IndexOf()
- 21. Intersezione complessità
- 22. Proprietà di Log4j in un luogo personalizzato
- 23. qual è il tempo di esecuzione per l'inserimento di un elemento in qualche indice di arrayList?
- 24. Luogo virgole in JavaScript interi
- 25. Complessità dell'algoritmo
- 26. Qual è la complessità temporale di una chiamata size() su una LinkedList in Java?
- 27. Algoritmo complessità
- 28. qual è la complessità temporale del metodo array # uniq in ruby?
- 29. Qual è la complessità di map/set :: insert se è stato fornito un suggerimento iteratore corretto?
- 30. Come ottenere il contesto da qualsiasi luogo?
Grazie. Lavoro con cPython, non con altre implementazioni. Scrivi "devi considerare l'utilizzo di una diversa struttura dati". - qual è il migliore? – user3654650
Penso che la struttura dei dati più veloce per archiviare e recuperare sia tabelle hash. –