Beberapa hari yang lalu ada konferensi Hydra . Orang-orang dari Grup JUG.ru mengundang pembicara impian (Leslie Lampport! Cliff Click! Martin Kleppmann!) Dan mengabdikan dua hari untuk sistem dan komputasi terdistribusi. Contour adalah salah satu dari tiga mitra konferensi. Kami berbicara di stan, berbicara tentang fasilitas penyimpanan terdistribusi, bermain bingo, memecahkan masalah.
Ini adalah posting dengan analisis tugas di stand Contour dari penulis teks mereka. Siapa yang menggunakan Hydra adalah alasan Anda untuk mengingat kesan yang menyenangkan, siapa yang tidak - kesempatan untuk meregangkan otak Anda O- notasi besar.
Bahkan ada peserta yang memisahkan flipchart menjadi slide untuk mencatat keputusan mereka. Saya tidak bercanda - mereka menyerahkan untuk memeriksa paket kertas ini:

Total ada tiga tugas:
- tentang memilih replika untuk bobot untuk penyeimbangan beban
- tentang menyortir hasil kueri ke database di memori
- pada transfer negara dalam sistem terdistribusi dengan topologi cincin
Tugas 1. ClusterClient
Itu perlu untuk mengusulkan algoritma untuk pemilihan efisien K dari N replika tertimbang dari sistem terdistribusi:
Tim Anda bertugas mengembangkan perpustakaan klien untuk sekelompok N node yang didistribusikan secara masif. Perpustakaan akan melacak berbagai metadata yang terkait dengan node (misalnya, latensi mereka, tingkat respons 4xx / 5xx, dll.) Dan menetapkan bobot titik mengambang W 1 ..W N kepada mereka. Untuk mendukung strategi eksekusi bersamaan, perpustakaan harus dapat memilih K dari N node secara acak - kesempatan untuk dipilih harus proporsional dengan bobot node.
Usulkan algoritma untuk memilih node secara efisien. Perkirakan kerumitan komputasinya menggunakan notasi O besar.
Mengapa semuanya berbahasa Inggris?Karena dalam bentuk ini, para peserta konferensi bertarung dengan mereka dan karena bahasa Inggris adalah bahasa resmi Hydra. Tugasnya terlihat seperti ini:

Ambil kertas dan pensil, pikirkan, jangan buru-buru membuka spoilernya :)
Pembekalan (video)Mulai pukul 5:53, hanya 4 menit:
Dan inilah bagaimana orang-orang dengan flipchart itu memutuskan keputusan mereka:
Analisis keputusan (teks)Di permukaan, ada solusi seperti itu: jumlah bobot semua replika, hasilkan angka acak dari 0 hingga jumlah semua bobot, lalu pilih replika-i sehingga jumlah bobot replika dari 0 hingga (i-1) kurang dari angka acak, dan jumlah bobot replika dari 0 hingga i-th - lebih dari itu. Ini akan berubah untuk memilih satu replika, dan untuk memilih yang berikutnya, Anda perlu mengulangi seluruh prosedur tanpa mempertimbangkan replika yang dipilih. Dengan algoritma seperti itu, kompleksitas memilih satu replika adalah O (N), kompleksitas memilih replika K adalah O (N ยท K) ~ O (N 2 ).

Kompleksitas kuadrat memang buruk, tetapi bisa diperbaiki. Untuk melakukan ini, buatlah sebuah pohon segmen untuk jumlah bobot. Ini akan menghasilkan pohon dengan kedalaman log N, di mana daun akan ada bobot replika, dan di simpul yang tersisa, jumlah parsial, hingga jumlah semua bobot di akar pohon. Selanjutnya, kami menghasilkan angka acak dari 0 hingga jumlah semua bobot, menemukan replika engan, menghapusnya dari pohon, dan mengulangi prosedur untuk mencari replika yang tersisa. Dengan algoritma seperti itu, kompleksitas membangun pohon adalah O (N), kompleksitas menemukan replika ith dan menghapusnya dari pohon adalah O (log N), kompleksitas memilih replika K adalah O (N + K log N) ~ O (N log N) .

Kompleksitas linear-logaritmik lebih bagus daripada kompleksitas kuadratik, terutama untuk K. besar.
Algoritma ini diimplementasikan dalam kode perpustakaan ClusterClient dari proyek Vostok .
Tugas 2. Zebra
Itu perlu untuk mengusulkan algoritma untuk penyortiran dokumen yang efisien dalam memori oleh bidang non-indeks sewenang-wenang:
Tim Anda ditugaskan untuk mengembangkan basis data dokumen dalam memori yang sharded. Beban kerja yang umum adalah untuk memilih dokumen N atas diurutkan berdasarkan bidang numerik yang sewenang-wenang (tidak diindeks) dari kumpulan ukuran M (biasanya N <100 << M). Beban kerja yang sedikit kurang umum adalah memilih N atas setelah melewatkan dokumen S atas (S ~ N).
Ajukan algoritme untuk menjalankan kueri tersebut secara efisien. Perkirakan kerumitan komputasinya menggunakan notasi O besar dalam kasus rata-rata dan skenario kasus terburuk.
Pembekalan (video)Mulai pukul 34:50, hanya 6 menit:
Analisis keputusan (teks)Solusinya ada di permukaan: urutkan semua dokumen (misalnya, menggunakan quicksort ), lalu ambil dokumen N + S. Dalam hal ini, kompleksitas pengurutan rata-rata adalah O (M lg M), dalam yang terburuk - O (M 2 ).
Jelas, menyortir semua dokumen M untuk kemudian hanya mengambil sebagian kecil dari mereka tidak efisien. Agar tidak mengurutkan semua dokumen, algoritma pemilihan cepat cocok , yang memilih N + S dari dokumen yang diperlukan (mereka dapat diurutkan berdasarkan algoritma apa pun). Dalam hal ini, kompleksitas menurun rata-rata menjadi O (M), dan kasus terburuk tetap sama.
Namun, Anda dapat melakukannya dengan lebih efisien - gunakan algoritma streaming biner tumpukan . Dalam hal ini, dokumen N + S pertama ditambahkan ke tumpukan minimum atau maksimum (tergantung pada arah penyortiran), dan kemudian setiap dokumen selanjutnya dibandingkan dengan akar pohon, yang berisi dokumen minimum atau maksimum saat ini, dan ditambahkan ke pohon jika perlu . Dalam hal ini, kompleksitas dalam kasus terburuk adalah ketika Anda harus terus membangun kembali pohon - O (M lg (N + S)), kompleksitas rata-rata adalah O (M), seperti pemilihan cepat.
Namun, heap streaming lebih efektif karena pada kenyataannya sebagian besar dokumen dapat dibuang tanpa membangun kembali heap, setelah perbandingan tunggal dengan elemen rootnya. Pemilahan semacam itu diimplementasikan dalam basis data dalam dokumen Zebra yang dikembangkan dan digunakan dalam Sirkuit.
Tugas 3. Swap negara
Itu perlu untuk mengusulkan algoritma yang paling efisien untuk shift negara:
Tim Anda bertugas mengembangkan mekanisme pertukaran keadaan mewah untuk sekelompok N yang didistribusikan. Keadaan simpul ke-i harus ditransfer ke simpul (ke + 1) ke-ke-ke-ke-ke-simpul, ke-ke-simpul ke-ke-1 harus ditransfer ke simpul pertama. Satu-satunya operasi yang didukung adalah state swap ketika dua node bertukar statusnya secara atom. Diketahui bahwa swap negara membutuhkan M milidetik. Setiap node dapat berpartisipasi dalam satu state swap pada saat tertentu.
Berapa lama waktu yang dibutuhkan untuk mentransfer status semua node dalam sebuah cluster?
Analisis keputusan (teks)Solusi di permukaan: bertukar status elemen pertama dan kedua, lalu yang pertama dan ketiga, lalu yang pertama dan keempat, dan seterusnya. Setelah setiap pertukaran, keadaan satu elemen akan berada pada posisi yang diinginkan. Anda harus melakukan permutasi O (N) dan menghabiskan waktu O (N ยท M).

Waktu linier adalah waktu yang lama, sehingga Anda dapat bertukar status elemen berpasangan: yang pertama dengan yang kedua, yang ketiga dengan yang keempat, dan seterusnya. Setelah setiap pertukaran, keadaan setiap elemen kedua akan berada di posisi yang diinginkan. Kita harus melakukan permutasi O (log N) dan menghabiskan waktu O (M log N N).

Namun, Anda dapat membuat perubahan lebih efektif - tidak dalam linier, tetapi dalam waktu yang konstan. Untuk melakukan ini, pada langkah pertama, Anda perlu bertukar keadaan elemen pertama dengan yang terakhir, yang kedua dengan kedua dari belakang, dan seterusnya. Keadaan elemen terakhir akan berada pada posisi yang diinginkan. Dan sekarang Anda perlu menukar status elemen kedua dengan elemen terakhir, ketiga dengan kedua dari belakang, dan seterusnya. Setelah putaran pertukaran ini, keadaan semua elemen akan berada di posisi yang tepat. Secara total, permutasi O (2M) ~ O (1) akan dilakukan.

Solusi seperti itu tidak akan mengejutkan seorang ahli matematika yang masih ingat bahwa rotasi adalah komposisi dari dua simetri aksial. Ngomong-ngomong, ini digeneralisasi secara sepele untuk bergeser bukan oleh satu, tetapi oleh posisi K <N. (Tulis di komentar bagaimana persisnya.)
Apakah Anda suka teka-teki? Apakah Anda tahu solusi lain? Bagikan komentar Anda.
Dan inilah beberapa tautan yang bermanfaat pada akhirnya: