Saya telah melihat orang mengatakan bahwa set
objek dalam python memiliki O (1) pengecekan keanggotaan. Bagaimana mereka diterapkan secara internal untuk memungkinkan ini? Jenis struktur data apa yang digunakannya? Apa implikasi lain yang dimiliki implementasi itu?
Setiap jawaban di sini benar-benar mencerahkan, tetapi saya hanya bisa menerimanya, jadi saya akan mencari jawaban terdekat dengan pertanyaan awal saya. Terima kasih atas informasinya!
sumber
set
pelaksanaan sebenarnya adalahdict
dengan nilai-nilai boneka, dan itu bisa dioptimalkan kemudian.Ketika orang mengatakan set memiliki O (1) memeriksa keanggotaan, mereka berbicara tentang kasus rata - rata . Dalam kasus terburuk (ketika semua nilai hash bertabrakan) pengecekan keanggotaan adalah O (n). Lihat wiki Python pada kompleksitas waktu .
The artikel Wikipedia mengatakan kasus terbaik waktu kompleksitas untuk tabel hash yang tidak resize adalah
O(1 + k/n)
. Hasil ini tidak secara langsung berlaku untuk set Python karena set Python menggunakan tabel hash yang mengubah ukuran.Sedikit lebih jauh pada artikel Wikipedia mengatakan bahwa untuk kasus rata - rata , dan dengan asumsi fungsi hashing seragam sederhana, kompleksitas waktu adalah
O(1/(1-k/n))
, di manak/n
dapat dibatasi oleh konstantac<1
.Big-O hanya merujuk pada perilaku asimptotik sebagai n → ∞. Karena k / n dapat dibatasi oleh konstanta, c <1, tidak bergantung pada n ,
O(1/(1-k/n))
tidak lebih besar dariO(1/(1-c))
yang setara denganO(constant)
=O(1)
.Jadi dengan asumsi hashing sederhana yang seragam, rata-rata , memeriksa keanggotaan untuk set Python adalah
O(1)
.sumber
Saya pikir ini adalah kesalahan umum,
set
pencarian (atau hashtable dalam hal ini) bukan O (1)dari Wikipedia
Terkait: Apakah Java hashmap benar-benar O (1)?
sumber
Kita semua memiliki akses mudah ke sumbernya , di mana komentar sebelumnya
set_lookkey()
mengatakan:sumber
Untuk lebih menekankan perbedaan antara
set's
dandict's
, di sini adalah kutipan dari bagiansetobject.c
komentar, yang mengklarifikasi perbedaan utama dari himpunan terhadap dikt.sumber di github
sumber