Maksud saya struktur dengan:
- O (log n) kompleksitas untuk
x.push()
operasi - O (log n) kompleksitas untuk menemukan elemen
- O (n) kompleksitas untuk menghitung
list(x)
yang akan diurutkan
Saya juga punya pertanyaan terkait tentang kinerja list(...).insert(...)
yang sekarang ada di sini .
memcpy
masih merupakan operasi O (n) . Saya tidak yakin bagaimana Python mengimplementasikan daftar persis , tetapi taruhan saya adalah bahwa mereka disimpan dalam memori yang bersebelahan (tentu bukan sebagai daftar tertaut). Jika memang demikian, penyisipanbisect
yang Anda gunakan akan memiliki kompleksitas O (n) .Jawaban:
Daftar Python standar tidak diurutkan dalam bentuk apa pun. Modul heapq standar dapat digunakan untuk menambahkan dalam O (log n) ke daftar yang ada dan menghapus yang terkecil di O (log n), tetapi bukan daftar yang diurutkan dalam definisi Anda.
Ada berbagai implementasi pohon seimbang untuk Python yang memenuhi persyaratan Anda, misalnya rbtree , RBTree , atau pyavl .
sumber
Apakah ada alasan khusus untuk persyaratan O besar Anda? Atau Anda hanya ingin cepat? The sortedcontainers modul murni Python dan cepat (seperti dalam implementasi cepat-sebagai-C seperti blist dan rbtree).
The perbandingan kinerja menunjukkan itu benchmark lebih cepat atau setara dengan blist ini diurutkan daftar jenis. Perhatikan juga bahwa rbtree, RBTree, dan PyAVL memberikan dict dict dan atur tipe tetapi tidak memiliki tipe daftar diurutkan.
Jika kinerja merupakan persyaratan, selalu ingat untuk melakukan tolok ukur. Modul yang mendukung klaim cepat dengan notasi Big-O harus dicurigai sampai ia juga menunjukkan perbandingan benchmark.
Penafian: Saya penulis modul Python diurutkan kontainer.
Instalasi:
Pemakaian:
sumber
0.0845024989976
untuk SortedList.add () vs0.596589182518
untuk bisect.insort (), dengan demikian perbedaan 7x dalam kecepatan! Dan saya berharap kesenjangan kecepatan meningkat dengan panjang daftar karena jenis penyisipan sortcontainers bekerja di O (log n) sementara bisect.insort () di O (n).O(n)
Meskipun saya masih belum pernah memeriksa kecepatan "O besar" dari operasi daftar Python dasar,
bisect
modul standar mungkin juga layak disebutkan dalam konteks ini:PS. Ah, maaf,
bisect
disebutkan dalam pertanyaan yang dirujuk. Tetap saja, saya pikir tidak akan banyak bahaya jika informasi ini ada di sini)PPS. Dan daftar CPython sebenarnya adalah array (bukan, katakanlah, daftar hitam atau lain-lain). Yah, saya kira mereka harus sesuatu yang sederhana, tetapi bagi saya, namanya agak menyesatkan.
Jadi, jika saya tidak salah, kecepatan dua bagian / daftar mungkin akan:
Pembaruan. Setelah diskusi dalam komentar, izinkan saya menautkan di sini pertanyaan SO ini: Bagaimana Daftar Python Diimplementasikan dan Apa kompleksitas runtime dari fungsi daftar python
sumber
sumber
Meskipun tidak (belum) menyediakan fungsi pencarian khusus,
heapq
modul mungkin sesuai dengan kebutuhan Anda. Ini mengimplementasikan antrian tumpukan menggunakan daftar biasa. Anda harus menulis tes keanggotaan efisien Anda sendiri yang menggunakan struktur internal antrian (yang dapat dilakukan di O (log n) , menurut saya ...). Ada satu kelemahan: mengekstraksi daftar yang diurutkan memiliki kompleksitas O (n log n) .sumber
Saya akan menggunakan modul
biscect
atausortedcontainers
. Saya tidak benar-benar berpengalaman, tapi saya pikirheapq
modul ini berfungsi. Berisi aHeap Queue
sumber
Mungkin tidak sulit untuk mengimplementasikan daftar sortir Anda sendiri di Python. Di bawah ini adalah bukti konsep:
========= Hasil ============
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 101]
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 99, 101]
101
3
50
sumber