Bagaimana cara menggunakan argumen musuh untuk seleksi dan penyisipan?

8

Saya diminta untuk menemukan argumen musuh yang diperlukan untuk menemukan batas bawah untuk seleksi dan jenis penyisipan. Saya tidak dapat menemukan referensi di mana pun.

Saya ragu tentang ini. Saya mengerti bahwa argumen musuh biasanya digunakan untuk menemukan batas bawah untuk "masalah" tertentu daripada "algoritma".

Saya mengerti masalah penggabungan. Tapi bagaimana saya bisa menulis satu untuk seleksi dan penyisipan?

pengguna5507
sumber
1
Petunjuk: Jauh lebih mudah bagi musuh untuk mengelabui algoritma yang dikenal daripada semua algoritma.
Raphael
@ Raphael Saya tahu itu sederhana karena musuh tahu algoritma dia tahu kasus terburuk di mana algoritma berperilaku. Jadi dalam hal pemilihan / penyisipan, kompleksitasnya adalah O (n ^ 2), batas bawahnya adalah itu sendiri? Saya sedikit bingung tentang algoritma tertentu. Batas bawah berarti batas bawah dalam kasus terburuk?
user5507
@ user5507: Ya, biasanya argumen permusuhan dibuat untuk membuktikan batas bawah untuk seluruh kelas masalah, bukan algoritma tertentu. Dalam hal ini Anda hanya perlu menentukan strategi untuk musuh yang menghasilkan input kasus terburuk untuk 2 algoritma ini.
Peter
1
"Musuh" berarti "input kasus terburuk" dalam pengaturan ini.
JeffE

Jawaban:

8

Dari komentar Anda, tampaknya Anda membingungkan arti batas bawah, batas atas, dan notasi asimptotik. Misalnya, ambil Jenis Penyisipan. Waktu terbaik untuk menjalankannya adalahΘ(n)(ini terjadi ketika input sudah diurutkan). Waktu lari terburuknya adalahΘ(n2)(ini terjadi ketika input dalam urutan terbalik). Jadi, karena waktu berjalan jatuh di antara fungsi linier darin dan fungsi kuadrat dari n, Anda dapat mengatakan bahwa waktu berjalan Sortasi Penyisipan adalah keduanya Ω(n) dan O(n2). Penting untuk dipahami dalam kasus ini bahwa Anda tidak dapat mengatakan bahwa waktu yang diperlukan sedang berjalanΩ(n2). Mengapa? Karena ada input yang menyebabkan algoritma berjalanO(n). Namun, Anda dapat mengatakan bahwa waktu tayang terburuk adalahΩ(n2), lagi karena ada input yang menyebabkan algoritma berjalan Ω(n2). Kami biasanya menggunakanO notasi untuk kasus terburuk, karena kami tertarik pada batas atas pada jumlah operasi yang dilakukan oleh algoritma.

Sekarang, mari kita pikirkan argumen musuh untuk Sortasi Penyisipan (Anda dapat mencoba untuk mendapatkan satu untuk Sort Sortir dengan menerapkan ide yang sama).

Pertimbangkan algoritme Penyisipan yang dimainkan melawan lawan yang akan kita sebut lawan. Tujuan dari musuh adalah untuk memberikan input X untuk algoritma yang memaksimalkan jumlah perbandingan yang dilakukan oleh algoritma. Ini biasanya dianalisis dalam konteks pohon keputusan . Pohon keputusan menunjukkan semua urutan perbandingan yang mungkin dilakukan algoritma. Setiap simpul interior pohon keputusan mewakili perbandingan tunggal. Dua anak simpul mewakili dua hasil perbandingan (ya / tidak atau benar / salah). Setiap daun mewakili kemungkinan hasil. Untuk menyortir algoritma, daun adalah permutasikunci. Algoritme dimulai pada root dan mengikuti jalan ke daun. Pada setiap simpul internal, jawaban untuk perbandingan yang dilakukan memberitahu algoritma simpul mana yang harus dikunjungi berikutnya. Ketika algoritma mencapai daun, itu menghasilkan permutasi yang sesuai. Waktu berjalan suatu algoritma (dilihat sebagai pohon keputusan) untuk input yang diberikan adalah jumlah perbandingan yang dilakukan di jalur dari root ke daun output. Sekarang, musuh memiliki strategi sederhana yang akan bekerja terhadap setiap algoritma pengurutan berbasis perbandingan, termasuk Jenis Penyisipan: setiap kali algoritma membuat perbandingan, musuh memilih jawaban yang akan menghilangkan permutasi sesedikit mungkin.

Secara umum, karena fakta bahwa dengan n elemen ada n! kemungkinan permutasi, setiap pohon keputusan untuk menyortir harus memiliki setidaknya n! daun, dan karenanya harus memiliki kedalaman Ω(log(n!))=Ω(nlogn)(dengan perkiraan Stirling). Untuk Penyisipan Sortir, musuh dapat membuat input tertentu yang menyebabkan pohon keputusan yang sesuai memiliki kedalaman setidaknyaΩ(n2).

Algoritma menggunakan array A[1..n] untuk menyimpan elemen input dan didasarkan pada invarian berikut:

Pada awal setiap iterasi for for, subarray A[1..j1] terdiri dari elemen - elemen yang aslinya dalam A[1..j1], tetapi dalam urutan.

Dalam setiap iterasi, elemen dalam A[1..j1] Oleh karena itu sudah dalam urutan, dan algoritma memeriksa A[j] dan menyisipkannya di tempat terakhir yang layak, dengan membandingkan nilai A[j] terhadap nilai elemen dalam A[1..j1], mulai dari A[j1] dan melanjutkan kembali ke A[j2] dan seterusnya sampai A[j]bukan lagi yang terbesar dalam perbandingan. Elemen dalamA[j+1..n] berada dalam kondisi yang tidak diketahui (berkenaan dengan urutan pengurutan) dan akan diproses dalam iterasi selanjutnya.

Inilah strategi musuh. Mengetahui bahwa algoritme berfungsi dengan menyisipkanA[j] di tempat yang tepat dengan memindahkan elemen dalam A[1..j1], maka strategi yang jelas adalah memaksimalkan dalam j-Iterasi jumlah elemen yang harus dipindahkan untuk mengakomodasi A[j]. Ini mudah dilakukan dengan memilih input dengan hati-hati sehingga urutannya terbalik . Memang, dalam hal ini, jumlah elemen yang harus dipindahkan dalam setiap iterasi adalahj1. Ini mengarah padaΩ(n2) waktu lari terburuk (ditentukan oleh seri aritmatika yang sesuai).

Massimo Cafaro
sumber
9
tl; dr: Strategi musuh adalah menyajikan array yang diurutkan terbalik sebagai input, lalu pergi jalan-jalan di pantai di suatu tempat, minum-minum, mungkin belajar berselancar.
JeffE