Saya mencari algoritme untuk menangani masalah berikut, yang saya (untuk saat ini) menyebut algoritma "apel buruk".
Masalah
- Saya memiliki N proses yang berjalan di kotak pasir M, di mana N >> M.
- Tidak praktis untuk memberikan setiap proses kotak pasirnya sendiri.
- Setidaknya salah satu dari proses tersebut berperilaku buruk, dan menjatuhkan seluruh kotak pasir, sehingga membunuh semua proses lainnya di kotak pasir yang sama.
Jika itu adalah satu proses berperilaku buruk, maka saya bisa menggunakan pembelahan sederhana untuk meletakkan setengah dari proses dalam satu kotak pasir, dan setengah di kotak pasir lain, sampai saya menemukan pelakunya.
Pertanyaan
Jika lebih dari satu proses berperilaku buruk - termasuk kemungkinan bahwa mereka semua berperilaku buruk - apakah algoritma naif ini "bekerja"? Apakah dijamin bekerja dalam batas yang masuk akal?
Penyederhanaan
Demi argumen, mari kita asumsikan bahwa proses yang buruk menjatuhkan kotak pasirnya secara instan, dan proses yang baik tidak pernah terjadi.
algorithms
Roger Lipscombe
sumber
sumber
Jawaban:
Jika Anda menemukan satu apel buruk, maka Anda dapat menerapkan algoritme:
Demikian juga, jika Anda menemukan satu apel "baik", maka algoritma yang sama berlaku, tetapi menemukan kelompok yang baik.
Algoritma ini memiliki tingkat kinerja O (log_M (N)) tetapi tergantung pada kenyataan bahwa hanya ada satu apel yang buruk.
Jika Anda tidak tahu berapa banyak apel baik / buruk, maka Anda bisa menggunakan algoritma berikut:
Ini adalah skenario kasus terburuk, tetapi ini berjalan dalam
O(N/M)
waktu (atauO(N)
tergantung pada apakah Anda menganggap lulus tunggal sebagai tes tunggal atau sebagai kumpulan tes yang dilakukan secara paralel). Semua hal dipertimbangkan, ini bukan pendekatan yang buruk dengan cara apa pun.Mungkin ada algoritma yang berkinerja lebih baik dari ini, tetapi mengharuskan Anda tahu berapa banyak apel buruk / apel baik yang ada dalam kelompok. Tidak mengetahui faktor ini, sementara saya tidak dapat membuktikannya, saya berani bertaruh bahwa Anda tidak dapat melakukan lebih baik daripada algoritma yang disebutkan di atas.
Semoga itu bisa membantu!
Sunting : Dari perspektif praktis, saya memahami bahwa beberapa operasi ini tidak mudah dilakukan. Itu benar, bagaimanapun, kenyataan yang disayangkan adalah bahwa Anda tidak dapat menentukan apel buruk hanya dari mana proses berjalan di kotak pasir yang berjalan pada saat itu tanpa setidaknya untuk mengaktifkan atau menonaktifkan proses. Jika pertanyaannya berkaitan dengan algoritma, saya pikir saya telah menjawabnya. Jika pertanyaannya berkaitan dengan bagaimana menghadapi situasi seperti ini, maka mungkin pertanyaannya akan lebih cocok untuk pengguna super SE.
sumber