Bagaimana cara kerja daftar lewati?


14

Untuk tugas pekerjaan rumah, saya perlu memahami cara kerja daftar lompatan .

Saya sudah pemrograman selama lebih dari 2 tahun sekarang (saya tahu itu tidak terlalu lama dalam kenyataan), dan saya belum pernah mendengar tentang daftar lompatan.

Saya telah melihat-lihat semua panduan yang dapat saya temukan, dan saya masih hampir tidak mengerti bagaimana cara kerjanya. Saya bahkan mencari Peninjauan Kode untuk contoh implementasi, dan hanya menemukan satu ulasan; dan itu bahkan bukan implementasi yang lengkap. Saya melihat penerapan sampel yang disediakan oleh kursus, dan itu benar-benar mengerikan. Antara kurangnya metode yang tepat, dan nama variabel satu huruf, saya tidak tahu cara kerjanya.

Bagaimana cara kerja daftar lewati? Apakah pengetahuan tentang daftar lewati diperlukan untuk memahami struktur data yang lebih maju?



1
Nasihat pendidikan secara eksplisit di luar topik . Mengingat ini tentang struktur data dan bukan pendidikan, saya mengedit pertanyaan Anda untuk menghapus bagian-bagian itu. Saya juga merekomendasikan untuk membaca tautan Wikipedia yang saya sunting dan memperbarui pertanyaan Anda dengan perincian yang lebih spesifik tentang apa yang Anda masih belum mengerti.

@Snowman Terima kasih. Saya hanya menambahkan itu untuk mencegah komentar seperti "tanya gurumu". Saya akan mengingatnya untuk waktu berikutnya. Dan Anda menambahkan suntingan yang mengubah pertanyaan. Pada akhirnya, saya tidak meminta orang untuk menjelaskan bagaimana mereka bekerja karena saya menganggap itu offtopic (walaupun saya tidak akan menentang penjelasan yang baik). Saya hanya ingin tahu betapa pentingnya mereka untuk belajar.
Carcigenicate

1
@Carcigenicate menjelaskan cara kerjanya sebenarnya lebih pada topik daripada menanyakan apakah Anda akan melihatnya di dunia nyata. Kami hanya bisa menebak apa yang akan Anda lakukan dan berbagai bidang. Bertanya apakah kita melihat mereka di dunia nyata adalah polling kita untuk "ya, saya melihat mereka dan menggunakannya" atau "tidak, tidak pernah mendengarnya" - yang tidak membuat untuk jawaban yang baik atau berguna bagi orang lain untuk membaca.

Jawaban:


29

Di masa lalu, di kelas struktur data kami belajar bagaimana pohon AVL bekerja . Saya akan memilikinya di salah satu kelas saya, tetapi instruktur mengatakan "Anda tidak akan pernah benar-benar menggunakan ini" dan sebaliknya meminta kami belajar 2-3 pohon dan b * pohon sebagai gantinya. Itu adalah hari-hari ketika ingatan sedang ketat dan proses-proses tunggal dijalin. Anda tidak menggunakan deque ketika daftar yang terhubung sendiri akan bekerja dengan baik.

Daftar lompatan jauh lebih umum hari ini dengan lebih banyak memori dan konkurensi menjadi masalah (Anda tidak perlu mengunci sama sekali ketika bertindak sebagai penulis dalam daftar lompatan - dibandingkan dengan segala sesuatu dengan pohon AVL).

Terus terang, itu adalah struktur data favorit saya sekarang karena ini sesuatu yang saya dapat dengan mudah beralasan tentang cara kerjanya di bawah dan di mana itu akan menguntungkan atau tidak menguntungkan untuk digunakan.

Anda tidak perlu menulis satu dari awal (kecuali jika Anda mendapatkannya sebagai pertanyaan wawancara - tetapi kemudian Anda kemungkinan akan menerapkan pohon AVL).

Anda yang akan perlu memahami mengapa Anda ingin memilih ConcurrentSkipListMapdi Jawa daripada HashMapatau TreeMapatau salah satu implementasi peta lainnya.


Untuk memahami cara kerjanya, Anda perlu memahami cara kerja pohon biner. Tunggu, biarkan saya mengubah itu. Anda perlu memahami cara kerja pohon biner seimbang . Tanpa menyeimbangkan pohon biner, Anda tidak mendapatkan keuntungan nyata dengan pencariannya.

Katakanlah kita punya pohon ini:

Pohon biner

Dan kami memasukkan '8' ke dalamnya. Sekarang kita punya:

Pohon biner yang tidak seimbang

Dan itu tidak seimbang. Jadi, kami pergi dan melakukan keajaiban menyeimbangkannya melalui beberapa implementasi ...

pohon seimbang

Dan Anda mendapatkan pohon seimbang lagi. Tapi itu adalah banyak sihir yang aku lambaikan tangan.

Mari kita ambil daftar lewati.

daftar lompatan yang ideal

Yang ini kebetulan yang ideal. Sedikit, tetapi ini menunjukkan sifat pohon biner seimbang yang mendekati perkiraan ideal.

Sekarang, kami ingin memasukkan 6 ke sana. Ini memasukkannya seperti daftar tertaut. Namun, kita mulai dari atas dan turun. Poin teratas ke 5. Apakah 6> 5? Iya. Ok, poin teratas sampai akhir sekarang, jadi kita turun tumpukan (kita di 5). Yang berikutnya adalah 7. Apakah 6> 7? Nggak. Jadi kita turun satu level dan kita di level dasar jadi kita masukkan 6 di sebelah kanan 5.

Kami melempar koin - kepala yang kami bangun, kami tinggal. Ekor. Tidak ada lagi yang perlu dilakukan.

lewati daftar setelah disisipkan

Mari kita masukkan 8 itu sekarang. 8> 5? ya. 8> 7? Ya. Dan sekarang kita berada di level bawah lagi setelah mengikuti panah dan tumpukan sekitar dan kita menguji 8> 11? Nggak. Jadi kita masukkan 8 di sebelah kanan 7.

Kami melempar koin - kepala yang kami bangun, kami tinggal. Ekor. Tidak ada lagi yang perlu dilakukan.

lewati daftar setelah memasukkan lainnya

Di pohon seimbang, kita semua akan beres tentang pohon yang tidak seimbang sekarang. Tapi ini bukan pohon - ini daftar lompatan. Kami memperkirakan pohon seimbang.

Sekarang mari kita masukkan 10. Saya akan menghindari semua perbandingan.

Kami melempar koin - kepala yang kami bangun, kami tinggal. Kepala! Dan balik lagi, Kepala lagi! Balikkan lagi, ok, ada buntut. Dua tingkat di atas daftar yang ditautkan basis.

lewati daftar setelah memasukkan lagi

Keuntungannya di sini adalah sekarang jika kita akan memasukkan angka 12, kita dapat melewati dari 5 hingga 10 tanpa melakukan semua perbandingan lainnya. Kita dapat melewati mereka dengan daftar lewati. Dan kita tidak perlu khawatir tentang pohon seimbang - sifat probabilistik dari penumpukan melakukan itu untuk kita.

Mengapa ini sangat berguna? Karena ketika memasukkan 10 saya bisa melakukannya dengan mengunci tulisan pada pointer 5 dan 7 dan 8 daripada seluruh struktur. Dan sementara saya melakukan itu, para pembaca masih bisa melalui daftar lewati tanpa memiliki keadaan yang tidak konsisten. Untuk penggunaan bersamaan, lebih cepat tidak harus mengunci. Untuk iterasi di atas lapisan bawah, ini lebih cepat daripada pohon (kegembiraan algoritma BFS dan DFS untuk navigasi pohon - Anda tidak perlu khawatir tentang mereka).

Apakah Anda akan menemukannya? Anda mungkin akan melihatnya digunakan di beberapa tempat. Dan kemudian Anda akan tahu mengapa penulis memilih yang pelaksanaan daripada TreeMapatau HashMapuntuk struktur.

Banyak dari ini telah dipinjam dari posting blog saya: Daftar Lewati


Terima kasih. Ini bahkan bukan implementasi umum yang tidak saya mengerti; Saya mendapatkan kemiripan dengan BST. Saya mencoba memikirkan bagaimana saya mengimplementasikannya, dan pemikiran mengelola semua petunjuk / referensi terus-menerus membuat saya bingung. Mungkin aku membiarkan diriku terlalu frustrasi. Terima kasih. Saya akan mencoba mengambilnya besok menggunakan jawaban Anda sebagai titik awal.
Carcigenicate

2
@Carcigenicate Anda juga mungkin menemukan kertas asli yang memperkenalkannya bermanfaat - Abaikan Daftar: Alternatif Probabilistik untuk Pohon Seimbang . Ini makalah yang agak dimengerti dibandingkan dengan sebagian besar makalah akademis yang bisa melampaui kepala orang. Tabel 2 adalah alasan Anda akan melihatnya digunakan. Faktor waktu untuk penyisipan atau penghapusan ditambahkan kompleksitas solusi lain .

2
Daftar tertaut adalah "hanya pohon yang sangat tidak seimbang yang telah merosot ". Daftar lewati adalah jenis yang sebagian menambah kembali semacam struktur pohon di atas daftar. Secara pribadi, saya penggemar berat struktur data yang persisten, dan pohon tampaknya lebih mudah untuk dipikirkan dalam konteks tertentu. Saya tidak berpikir itu kebetulan bahwa Clojure, Scala, dkk. tampaknya menyatu pada beberapa jenis Hash mencoba gaya Bagwell sebagai struktur data dasar mereka. (Phil Bagwell bahkan terlibat dalam mendesain ulang kerangka koleksi Scala untuk Scala 2.8.) Namun, daftar lompatan masih bagus.
Jörg W Mittag

Itulah penjelasan terbaik tentang cara kerja daftar lewati yang pernah saya baca.
Gaborous
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.