Saya terjebak pada masalah ini:
Diberikan larik dari asli pertama yang diijinkan secara acak, larik dibangun, sehingga adalah jumlah elemen dari hingga yang lebih kecil dari .
i) Mengingat bisakah Anda menemukan dalam waktu ? ii) Mengingat dapatkah Anda menemukan dalam waktu ?
Di sini, . Untuk contoh konkret:
Ada yang bisa bantu saya? Terima kasih.
algorithms
arrays
permutations
terkutuk
sumber
sumber
Jawaban:
Algoritma naif untuk menentukan dari :AB A
Algoritma ini membandingkan dengan yang lainnya ( kali), hingga lainnya, dll. Sehingga jumlah total perbandingan adalah . Tapi itu bukan yang terbaik yang bisa kita lakukan. Sebagai contoh, melihat , kita tidak perlu melakukan perbandingan! karena ini adalah alami pertama , dan dijamin (terlepas dari permutasi) bahwa bilangan alami lebih rendah akan ada di sana. Bagaimana dengan ? Alih-alih memeriksa hingga , kita bisa memeriksa . Itu adalah:A(1) n−1 A(2) n−2 (n−1)(n−2)2 B(n) B(n)=A(n)−1 n n−1 B(n−1) A(1) A(n−2) A(n)
Ini akan memakan waktu langkah, yang masih . Perhatikan juga bahwa dalam membangun dari , jika maka .2×(n2−1)(n2−2)2=(n−2)(n−4)4 O(n2) A B B(n)=A(n)−1 A(n)=B(n)+1
Tapi sekarang untuk lebih pintar. Jika kami diizinkan ruang tambahan atau mengurutkan di tempat, kami dapat mengurutkan angka saat kami membandingkannya. Sebagai contoh:
Alih-alih memeriksa semuanya (atau memeriksanya secara berurutan), kita bisa menggunakan pencarian biner untuk menentukan masing-masing . Namun, pengurutan masih membutuhkan waktu .B(k) O(nlogn)
sumber
Daripada menentukan masing-masing satu per satu, kita bisa melihat ke depan dan hanya melewati setiap angka dalam sekali ! Tapi kami akan menggunakan ruang :B(k) A n
Kami dapat menghemat lebih banyak waktu dengan tidak memperbarui yang sudah ditentukan (yaitu, tidak ada gunanya memperbarui setelah langkah pertama), tetapi dalam kasus terburuk, kami masih harus memperbarui kali8 (n)(n+2)2
sumber
I dan II dapat dipecahkan menggunakan #next_greater_element yang saya jelaskan di sini . tetapi ini sedikit lebih sulit daripada hanya masalah tetapi sebelum solusi Anda perlu mempelajari elemen selanjutnya yang lebih besar:
Bagian kedua juga mirip dengan catatan bahwa kita bisa mendapatkan nilai elemen yang paling tepat di EDIT: solusi saya salah sepertinya tidak ada solusio ( n )O(1) o(n)
sumber