Π§ΡΠΎΠ±Ρ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ, Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ, ΠΊΠ°ΠΊ ΡΠΏΠΈΡΠΊΠΈ ΡΡΡΡΠΎΠ΅Π½Ρ Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅. ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ°Ρ CPython Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
ΠΠ΄Π΅ΡΡ ob_item -- ΡΡΠΎ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΠΈΡΠΊΠ°, Π° allocated ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π»ΠΈΠ½Ρ ΠΌΠ°ΡΡΠΈΠ²Π°. ΠΠΎΡ ΠΈ Π²ΡΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΎ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΎΡΡΡΠ΄Π° ΡΡΠ°Π·Ρ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π»ΠΈΠ½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ, Π·Π° O(1), ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ.
len(a) # O(1)
ΠΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π΄Π»ΠΈΠ½Ρ ΡΠΏΠΈΡΠΊΠ° ΠΈΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΌΡ Π½ΠΎΠΌΠ΅ΡΡ ΡΡΠ΅ΠΉΠΊΠΈ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΆΠ΅ Π·Π° O(1). a[10] = 5 # O(1)
Π Π²ΠΎΡ ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΡΠ»ΠΊΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ -- ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π΄ΠΎΡΠΎΠ³Π°Ρ, Π² Ρ
ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ O(n). 5 in a # O(n)
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΊΠΎΠ½Π΅Ρ ΡΠΏΠΈΡΠΊΠ° (ΠΌΠ΅ΡΠΎΠ΄ append()) Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π·Π° O(1). ΠΠΎ Π·Π΄Π΅ΡΡ Π΅ΡΡΡ ΠΎΠ΄Π½Π° Π΄Π΅ΡΠ°Π»Ρ: ΠΌΠ΅ΡΡΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π°Π»Π»ΠΎΡΠΈΡΡΠ΅ΡΡΡ Π·Π°ΡΠ°Π½Π΅Π΅. Π ΠΊΠΎΠ³Π΄Π° Π·Π°Π½ΡΡΡΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΡΡΠΎΡΠ°Π΅ΡΡΡ, ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 15% ΠΎΡ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΌΠ°ΡΡΠΈΠ²Π°. ΠΡΠ° ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΊΡΠΏΠ°Π½ΡΠΈΡ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΡΠΏΠΈΡΠΎΠΊ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ± O(1) ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΡΡΠ»ΠΎΠ²Π½ΠΎ. a.append(5) # ~O(1)
ΠΡΠ΅ ΠΎΠ΄Π½Π° ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½Π°Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ ΡΡΠΎ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° +. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π΄Π»ΠΈΠ½Ρ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°: Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° 100 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠΎ Π½ΡΠΆΠ½ΠΎ 100 ΡΠ°Π· Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠΎΠ½Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. a + b # ~O(k)
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΡΠ»Π°ΠΉΡΠ° a[i:j], Π½ΡΠΆΠ½ΠΎ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ i ΠΈ j. ΠΠΎΡΡΠΎΠΌΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ O(k), Π³Π΄Π΅ k -- Π΄Π»ΠΈΠ½Π° ΡΠ»Π°ΠΉΡΠ°. Π Π²ΠΎΡ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ»Π°ΠΉΡ ΡΡΠΎ O(n), ΠΈΠ·-Π·Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ΄Π²ΠΈΠ½ΡΡΡ Π²ΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π° ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΌ ΡΡΠ°ΡΡΠΊΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π½Π° Π½ΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΡΠ°, Π·Π΄Π΅ΡΡ n -- Π΄Π»ΠΈΠ½Π° Π²ΡΠ΅Π³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°.a[i:j] # ~O(k)
del a[i:j] # ~O(n)
ΠΠ΅ΡΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΈ ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΠΈΡΠΊΠ° pop(), ΠΈΠΌΠ΅Π΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ O(1), Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ pop(i) ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ· ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΡΠΏΠΈΡΠΊΠ° ΡΡΠ΅Π±ΡΠ΅Ρ O(n). ΠΠΎΡΠ΅ΠΌΡ ΡΠ°ΠΊ? ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π±ΡΠ» ΡΠ΄Π°Π»Π΅Π½ ΠΈΠ· ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΠΈΠ»ΠΈ Π½Π°ΡΠ°Π»Π°, Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π²ΠΈΠ½ΡΡΡ Π²ΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π° Π½ΠΈΠΌ Π½Π° 1 ΠΏΠΎΠ·ΠΈΡΠΈΡ Π²ΠΏΠ΅ΡΡΠ΄. Π ΠΊΠΎΠ³Π΄Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π±ΡΠ» ΡΠ΄Π°Π»Π΅Π½ ΠΈΠ· ΠΊΠΎΠ½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π°, ΡΡΠΎΠ³ΠΎ Π΄Π΅Π»Π°ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ. ΠΠΎ ΡΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Π΅ Π²ΡΡΠ»Π΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ(pop) ΠΈΠ»ΠΈ Π²ΡΡΠ°Π²ΠΊΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΡΠΏΠΈΡΠΊΠ° ΡΠΎΠΆΠ΅ Π΄ΠΎΡΠΎΠ³Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ O(n) ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
a.pop() #O(1)
a.pop(i) #O(n)
a.insert(i, item) #O(n)
ΠΠ±ΠΎΠ±ΡΠΈΠΌ:ΠΠΏΠ΅ΡΠ°ΡΠΈΡ Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ
----------------------
len(a) O(1)
a[i] O(1)
a[10] = 5 O(1)
5 in a O(n)
a.append(5) ~O(1)
a + b O(k)
a[i:j] O(k)
del a[i:j] O(n)
a.pop() O(1)
a.pop(i) O(n)
a.insert(i, item) O(n)
Π ΠΎΠ±ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΎ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΡΡΡΠΎΠ΅Π½Ρ Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅. Π‘Π°ΠΌΡΠ΅ Π΄ΠΎΡΠΎΠ³ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ -- ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΡΡΡ ΠΎΠ±Ρ
ΠΎΠ΄Π° ΡΠ°ΡΡΠΈ ΠΈΠ»ΠΈ Π²ΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠΈΡΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΡΠΏΠΈΡΠΊΠ΅, ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ, ΡΠ»Π°ΠΉΡΠΈΠ½Π³, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² Π½Π°ΡΠ°Π»ΠΎ ΡΠΏΠΈΡΠΊΠ°. Π‘Π°ΠΌΡΠ΅ ΡΠΊΠΎΠ½ΠΎΠΌΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ -- ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ ΡΠΏΠΈΡΠΊΠ°, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΌΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ. Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΡΠΏΠΈΡΠΎΠΊ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΠ³ΠΎ, Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ. ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² Π½Π°ΡΠ°Π»ΠΎ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΡΠΏΠΈΡΠΊΠ° ΡΡΠΎ O(n), Π½ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ
append() ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ O(1)π