Apa cara terbaik untuk melacak median?

8

Saya membaca sebuah pertanyaan, dan saya mencari masukan tentang bagaimana menyelesaikannya:

Angka-angka secara acak dihasilkan dan disimpan ke dalam array (memperluas), Bagaimana Anda melacak median?

Ada dua struktur data yang bisa menyelesaikan masalah. Satu adalah pohon biner seimbang, yang lain adalah dua tumpukan yang melacak bagian terbesar dan bagian terkecil dari elemen. Saya pikir dua solusi ini memiliki waktu berjalan yang sama O(n lg n), tetapi saya tidak yakin dengan penilaian saya.

Apa cara terbaik untuk melacak median?

Usaha saya:

Dalam pertanyaan ini, saya pikir tumpukan adalah cara terbaik untuk melacak median. Ada dua tumpukan, tumpukan besar dan tumpukan kecil, yang tidak perlu berurutan. Pertama, kami menghitung nilai rata-rata elemen dalam array. Jika elemen kurang dari nilai rata-rata, kami menempatkan num ke tumpukan kecil. Sebaliknya, kami menempatkan num ke tumpukan besar. Jika jumlah tumpukan besar sama dengan jumlah tumpukan kecil, yang terbesar di tumpukan kecil dan yang terkecil di tumpukan besar adalah median. Jika kedua tumpukan memiliki ukuran yang berbeda, kita cukup membuang elemen root dari tumpukan dengan ukuran lebih besar dan mendorongnya ke akar tumpukan ukuran yang lebih kecil. Untuk tumpukan besar, elemen akar adalah yang terkecil, dan untuk tumpukan kecil, elemen akar adalah yang terbesar. Dengan cara ini, jika kedua tumpukan memiliki ukuran yang sama atau perbedaan digital,

Saya pikir solusi ini memiliki waktu berjalan sebagai O (m * n), m berarti waktu kita menyesuaikan tumpukan tidak seimbang.

Apakah ini cara terbaik untuk melacak median?

Steven Mou
sumber
Jika Anda hanya perlu melacak median, keduanya pada dasarnya memiliki kompleksitas yang sama, tetapi pendekatan berbasis tumpukan akan menggunakan lebih sedikit memori (strukturnya implisit daripada membutuhkan pointer) dan umumnya lebih cepat juga (karena biasanya disimpan secara bersamaan, yang biasanya akan meningkatkan penggunaan cache).
Jerry Coffin
2
stackoverflow.com/questions/2579912/… akan menjadi solusi linier jika Anda menginginkannya.
JB King
2
Hehe - std::nth_elementsiapa saja?
Billy ONeal
5
Ini sebenarnya terdengar lebih seperti pertanyaan untuk SO daripada di sini.
Mark B
Nilai rata-rata bisa sangat menipu hingga tidak berarti. Hanya pencitraan Anda memiliki banyak angka kecil (katakanlah 1,999) dan 10 ^ 8. Nilai rata-rata untuk 1000 angka tersebut adalah ~ 10 ^ 5, jadi Anda berakhir dengan meletakkan semuanya kecuali 10 ^ 8 ke dalam tumpukan kecil. Oleh karena itu, algoritma memiliki perilaku kasus terburuk yang buruk.
user281377

Jawaban:

1

Mungkin ada lebih dari 2 struktur data yang mengatasi masalah ini. Lihatlah Perkiraan Median dan Jumlah lain dalam Satu Pass dan dengan Memori Terbatas

Mereka tidak menggunakan dua tumpukan. Saya membayangkan Anda bisa memodifikasi algoritme mereka untuk mendapatkan nilai perkiraan median berjalan secara berkala. Seberapa baik suatu pendekatan tentu saja, tergantung pada banyak faktor, tidak terkecuali berapa banyak data yang telah melewati algoritma.

Bruce Ediger
sumber
0

Solusi yang lebih baik adalah dengan menggunakan daftar lewati. Karena daftar yang akan Anda sisipkan selalu dipertahankan sebagai daftar yang disortir (berdasarkan fakta bagaimana Anda membangunnya), kompleksitas penyisipan adalah O (log n). Anda akan mengambil keuntungan dari fakta bahwa penyisipan pertama memberi Anda median dengan biaya nol (item yang dimasukkan adalah median). Setelah setiap penyisipan tambahan, daftar Anda masih diurutkan, dan median itu sendiri akan melayang naik atau turun dengan indeks tunggal, dan perbandingan ini adalah O (1).

Total kompleksitas = O (log n)

Michael Hays
sumber
Total kompleksitas untuk setiap elemen adalah O(log n)- memasukkan n elemen memiliki kompleksitasO(n log n)
Greg Jackson
1
Tentu saja, tetapi untuk "median berjalan", orang dapat berargumen bahwa Anda memasukkan serangkaian elemen tanpa batas, tetapi tidak masuk akal untuk mengatakan bahwa kompleksitasnya adalah O (infinity log n). ;-)
Michael Hays
Eh ... ok, jawabanku mungkin tidak lebih baik dari tumpukan. Tumpukan Fibonacci memiliki penyisipan O (1) dan penghapusan O (lg n). Saya tidak pernah menggunakannya.
Michael Hays
0

Bahkan Anda dapat menemukan median dalam O (n) operasi hanya melalui menemukan k th jumlah terkecil dalam daftar, :) melihat ke Median dari median algoritma seleksi untuk rincian.

Ruslan Kabalin
sumber
Apakah Anda yakin ini dapat digunakan secara bertahap ?
Joey Adams