Python menyertakan modul heapq untuk min-heaps, tapi saya perlu heap max. Apa yang harus saya gunakan untuk implementasi max-heap di Python?
python
data-structures
heap
recursive-datastructures
Douglas Mayle
sumber
sumber
heapq
tidak memberikan yang sebaliknya.heapq
, dan tidak ada alternatif yang baik.int
/float
, Anda dapat membalikkan pemesanan dengan membungkusnya di kelas dengan__lt__
operator yang terbalik .Kamu bisa memakai
Jika Anda ingin memunculkan elemen, gunakan:
sumber
_heapify_max
,_heappushpop_max
,_siftdown_max
, dan_siftup_max
.Solusinya adalah dengan meniadakan nilai-nilai Anda ketika Anda menyimpannya di heap, atau membalikkan perbandingan objek Anda seperti:
Contoh tumpukan maksimum:
Tetapi Anda harus ingat untuk membungkus dan membuka nilai-nilai Anda, yang mengharuskan Anda mengetahui apakah Anda berurusan dengan tumpukan minimum atau maksimum.
MinHeap, kelas MaxHeap
Menambahkan kelas untuk
MinHeap
danMaxHeap
objek dapat menyederhanakan kode Anda:Contoh penggunaan:
sumber
list
parameter opsional ke __init__ dalam hal ini saya meneleponheapq.heapify
dan juga menambahkanheapreplace
metode.Solusi termudah dan ideal
Ini dia. Semua angka tertinggi sekarang adalah yang terendah dan sebaliknya.
Ingatlah bahwa ketika Anda memunculkan elemen untuk melipatgandakannya dengan -1 untuk mendapatkan nilai asli lagi.
sumber
Saya menerapkan versi heapq max heapq dan mengirimkannya ke PyPI. (Perubahan sangat kecil pada kode heapq modul CPython.)
https://pypi.python.org/pypi/heapq_max/
https://github.com/he-zhe/heapq_max
Instalasi
Pemakaian
tl; dr: sama dengan modul heapq kecuali menambahkan '_max' ke semua fungsi.
sumber
Jika Anda memasukkan kunci yang sebanding tetapi tidak seperti int, Anda berpotensi menimpa operator perbandingan pada mereka (yaitu <= menjadi> dan> menjadi <=). Jika tidak, Anda dapat mengganti heapq._siftup di modul heapq (pada akhirnya hanya kode Python).
sumber
# If available, use C implementation
) yang melakukan persis seperti yang dijelaskan oleh komentar.Mengizinkan Anda memilih jumlah item terbesar atau terkecil yang sewenang-wenang
sumber
Memperluas kelas int dan mengesampingkan __lt__ adalah salah satu caranya.
sumber
Saya telah membuat heap wrapper yang membalikkan nilai untuk membuat max-heap, serta kelas wrapper untuk min-heap untuk membuat perpustakaan lebih seperti OOP. Inilah intinya. Ada tiga kelas; Heap (kelas abstrak), HeapMin, dan HeapMax.
Metode:
sumber
Jika Anda ingin mendapatkan elemen K terbesar menggunakan max heap, Anda bisa melakukan trik berikut:
sumber
nlargest
sini -> github.com/python/cpython/blob/…Menindaklanjuti jawaban Isaac Turner yang luar biasa , saya ingin memberikan contoh berdasarkan K Poin Terdekat dengan Asal menggunakan max heap.
sumber
Untuk menguraikan tentang https://stackoverflow.com/a/59311063/1328979 , berikut ini adalah implementasi Python 3 yang sepenuhnya didokumentasikan, beranotasi, dan teruji untuk kasus umum.
https://gist.github.com/marccarre/577a55850998da02af3d4b7b98152cf4
sumber
Ini adalah
MaxHeap
implementasi sederhana berdasarkanheapq
. Padahal itu hanya bekerja dengan nilai numerik.Pemakaian:
sumber