Saya mencoba membangun pohon Umum.
Apakah ada struktur data bawaan di Python untuk mengimplementasikannya?
python
data-structures
tree
Wisnu
sumber
sumber
Jawaban:
anytree
saya merekomendasi https://pypi.python.org/pypi/anytree (saya penulisnya)
Contoh
fitur
anytree juga memiliki API yang kuat dengan:
sumber
anytree
mungkin merupakan perpustakaan yang hebat, ini adalah pertanyaan python, bukan pertanyaan Node.js.Python tidak memiliki cukup banyak struktur data "built-in" seperti halnya Java. Namun, karena Python dinamis, pohon umum mudah dibuat. Sebagai contoh, pohon biner mungkin:
Anda bisa menggunakannya seperti ini:
sumber
class Tree
dari objek saat ituobject
kadang-kadang hanya panduan: Jika suatu kelas mewarisi dari tidak ada kelas dasar lainnya, secara eksplisit mewarisi dari objek. Ini juga berlaku untuk kelas bersarang. Lihat Panduan Gaya Google PythonPohon generik adalah simpul dengan nol atau lebih anak, masing-masing simpul tepat (pohon). Itu tidak sama dengan pohon biner, mereka struktur data yang berbeda, meskipun keduanya memiliki beberapa terminologi.
Tidak ada struktur data bawaan untuk pohon generik di Python, tetapi mudah diimplementasikan dengan kelas.
sumber
Anda dapat mencoba:
Seperti yang disarankan di sini: https://gist.github.com/2012250
sumber
sumber
Tidak ada pohon yang dibangun, tetapi Anda dapat dengan mudah membangunnya dengan mensubklasifikasikan jenis Node dari Daftar dan menulis metode traversal. Jika Anda melakukan ini, saya merasa membagi dua berguna.
Ada juga banyak implementasi pada PyPi yang dapat Anda telusuri.
Jika saya ingat dengan benar, lib standar Python tidak menyertakan struktur data pohon untuk alasan yang sama dengan pustaka kelas .NET tidak: lokalitas memori berkurang, mengakibatkan lebih banyak cache yang hilang. Pada prosesor modern biasanya lebih cepat hanya dengan membawa sebagian besar memori ke dalam cache, dan struktur data "pointer rich" meniadakan manfaatnya.
sumber
Saya menerapkan pohon yang di-root sebagai kamus
{child:parent}
. Jadi misalnya dengan simpul root0
, pohon mungkin terlihat seperti itu:Struktur ini membuatnya cukup mudah untuk naik sepanjang jalur dari sembarang simpul ke root, yang relevan untuk masalah yang sedang saya kerjakan.
sumber
{parent:[leftchild,rightchild]}
.Jawaban Greg Hewgill bagus, tetapi jika Anda membutuhkan lebih banyak node per level, Anda dapat menggunakan daftar | kamus untuk membuatnya: Dan kemudian gunakan metode untuk mengaksesnya baik dengan nama atau pesanan (seperti id)
Sekarang cukup buat root dan bangun: ex:
Itu sudah cukup bagi Anda untuk mulai mencari tahu bagaimana membuat ini bekerja
sumber
berfungsi sebagai kamus, tetapi sediakan banyak dict yang Anda inginkan. Coba yang berikut ini:
akan memberikan dict bersarang ... yang memang berfungsi sebagai pohon.
... Jika Anda sudah memiliki dict, itu akan melemparkan setiap level ke pohon:
Dengan cara ini, Anda dapat terus mengedit / menambah / menghapus setiap level dikt seperti yang Anda inginkan. Semua metode dict untuk traversal dll, masih berlaku.
sumber
dict
alih-alihdefaultdict
? Dari tes saya, memperluasdefaultdict
bukannya dict dan kemudian menambahkanself.default_factory = type(self)
ke bagian atas init harus berfungsi dengan cara yang sama.Saya telah mengimplementasikan pohon menggunakan dicts bersarang. Ini cukup mudah dilakukan, dan itu telah bekerja untuk saya dengan set data yang cukup besar. Saya telah memposting sampel di bawah ini, dan Anda dapat melihat lebih banyak di kode Google
sumber
Saya telah menerbitkan implementasi pohon Python [3] di situs saya: http://www.quesucede.com/page/show/id/python_3_tree_implementation .
Semoga bermanfaat,
Oke, ini kodenya:
sumber
Jika seseorang membutuhkan cara yang lebih sederhana untuk melakukannya, sebuah pohon hanyalah daftar bersarang secara rekursif (karena set tidak dapat di hashable):
Di mana setiap cabang adalah pasangan:
[ object, [children] ]
dan setiap daun adalah pasangan:
[ object, [] ]
Tetapi jika Anda membutuhkan kelas dengan metode, Anda dapat menggunakan pohon anytree.
sumber
Operasi apa yang Anda butuhkan? Seringkali ada solusi yang baik di Python menggunakan dict atau daftar dengan modul bisect.
Ada banyak, banyak implementasi pohon pada PyPI , dan banyak tipe pohon hampir sepele untuk mengimplementasikan diri Anda dengan Python murni. Namun, ini jarang diperlukan.
sumber
Implementasi pohon lain secara longgar didasarkan pada jawaban Bruno :
Dan contoh cara menggunakannya:
Yang seharusnya menghasilkan:
sumber
Saya sarankan perpustakaan networkx .
Contoh membangun pohon:
Saya tidak yakin apa yang Anda maksud dengan " General tree",
tetapi perpustakaan memungkinkan setiap node menjadi objek hashable , dan tidak ada batasan pada jumlah anak yang dimiliki setiap node.
Perpustakaan juga menyediakan algoritma grafik yang terkait dengan pohon dan kemampuan visualisasi .
sumber
Jika Anda ingin membuat struktur data pohon maka pertama-tama Anda harus membuat objek treeElement. Jika Anda membuat objek treeElement, maka Anda dapat memutuskan bagaimana perilaku pohon Anda.
Untuk melakukan ini, berikut adalah kelas TreeElement:
Sekarang, kita harus menggunakan elemen ini untuk membuat pohon, saya menggunakan pohon A * dalam contoh ini.
Anda dapat menambah / menghapus elemen apa pun dari objek, tetapi membuat strukturnya utuh.
sumber
sumber