Judul menyatakan pertanyaan.
Kami memiliki sebagai input daftar elemen, yang dapat kami bandingkan (menentukan mana yang terbesar ). Tidak ada elemen yang bisa sama.
Poin-poin penting:
- Perbandingannya bukan transitif (pikirkan gunting kertas batu): ini bisa benar: A> B, B> C, C> A (perhatikan ini bukan input yang valid karena tidak ada jawaban yang valid di sini, saya hanya menjelaskan apa " perbandingan non-transitif "berarti)
- Setiap input array akan dijamin memiliki jawaban
- terbesar berarti elemen harus lebih besar daripada setiap elemen lainnya
- Properti Converse memegang yaitu A> B menyiratkan bahwa B <A
Contoh:
Input: [A,B,C,D]
A > B, B > C, C > A
D > A, D > B, D > C
Output: D
Saya tidak dapat menemukan cara untuk melakukan ini dalam waktu O (n), solusi terbaik saya adalah O (n ^ 2).
Saya terjebak pada setiap pendekatan karena fakta bahwa untuk memastikan jawaban, elemen tersebut harus secara eksplisit dibandingkan dengan setiap elemen lainnya, untuk membuktikannya memang jawabannya (karena perbandingannya tidak transitif).
Ini mengesampingkan penggunaan tumpukan, penyortiran, dll.
algorithms
time-complexity
sets
transitivity
James Wierzba
sumber
sumber
Jawaban:
Algoritma standar untuk menemukan maksimum masih berfungsi. Mulailah dengan dan pergi ke elemen, jika Anda melihat nilai yang lebih besar, memperbarui maksimal menjadi nilai itu. Alasan ini berfungsi adalah bahwa setiap elemen yang Anda lewati lebih kecil dari setidaknya satu elemen, dan dengan demikian tidak dapat menjadi maksimum.a1
Agar lebih jelas, dengan "algoritma standar" yang saya maksud adalah sebagai berikut:
Untuk kelengkapan, saya akan membahas di sini masalah yang diangkat dalam komentar. Pengaturan dalam diskusi di atas adalah menemukan maksimum relatif terhadap relasi simetris anti , di mana sebuah i adalah maksimum jika untuk semua j ≠ i kita memiliki sebuah i< ai j≠i . Algoritme di atas bekerja dengan asumsi bahwa ada maksimum, tetapi jika ini tidak diketahui, seseorang dapat menggunakannya untuk memverifikasi keberadaan maksimum (memeriksa apakah elemen yang dikembalikan memang lebih besar dari semua elemen lain, ini disebutkan dalam komentar Chi dan jawaban Ilmari Karonen).ai>aj
Jika belum tentu anti simetris, maka algoritma di atas gagal (seperti yang disebutkan Emil dalam komentar). Jika < adalah hubungan yang arbitrer (yaitu kita bersantai baik transitivitas dan anti simetri), maka tidak sulit untuk menunjukkan bahwa menemukan maksimum dalam waktu linear tidak mungkin. Dilambangkan dengan # yang saya jumlah kali sebuah i berpartisipasi dalam query, kita mendefinisikan sebuah hubungan bermusuhan dengan cara yang maksimal tidak dapat diungkapkan tanpa permintaan yang cukup. Mengingat permintaan sebuah i > ? a j , menjawab sebuah i > a j jika # sebuah i< < #ai ai ai>?aj ai>aj ) , maka maksimum belum terlihat, dan dapat diatur menjadi salah satu elemen dalam himpunan.#ai<n−1 dan sebaliknya. Jika jumlah kueri adalah o ( n 2ai<aj o ( n2)
sumber
n
perbandingan Anda , maks Anda saat ini harus menjadi jawabanmax
hanya bisa maksimum subarray. Namun, bahkan tanpa asumsi 2, seseorang dapat menemukan maksimum tentatif, dan kemudian memverifikasi pada seluruh array menggunakan pemindaian kedua, dalam batas O (n).Seperti yang dicatat Ariel , algoritma pencarian maksimum standar yang diberikan di bawah ini:
sebenarnya akan bekerja tanpa modifikasi selama:
(Asumsi pertama di atas sebenarnya dapat dilonggarkan, bahkan tanpa harus memodifikasi algoritme, asalkan kita mengasumsikan bahwa elemen maksimal sebanding dengan setiap elemen lainnya dan itu
x > y
selalu salah jika elemenx
dany
tidak .)Secara khusus, klaim Anda bahwa:
tidak benar berdasarkan asumsi yang diberikan di atas. Bahkan, untuk membuktikan bahwa algoritma di atas akan selalu menemukan elemen maksimal, cukup untuk mengamati bahwa:
x
akan menjadi elemen maksimal;m
akan menjadi elemen maksimal; danm
tidak akan berubah pada iterasi berikutnya.Oleh karena itu, pada akhir loop,
m
akan selalu menjadi elemen maksimal, jika inputnya mengandung satu.Ps. Jika input tidak selalu selalu mengandung elemen maksimal, maka memverifikasi fakta itu memang akan membutuhkan pengujian jawaban kandidat terhadap setiap elemen lainnya untuk memverifikasi bahwa itu benar-benar maksimal. Namun, kami masih dapat melakukannya dalam waktu O ( n ) setelah menjalankan algoritma pencarian maksimum di atas:
(Saya berasumsi di sini bahwa hubungannya
>
tidak refleksif, yaitu tidak ada elemen yang bisa lebih besar dari dirinya sendiri. Jika itu belum tentu demikian, perbandinganx > m
pada langkah 2 harus diganti denganx ≠ m and x > m
, di mana≠
menunjukkan perbandingan identitas. Atau kita bisa menerapkan optimasi tercantum di bawah ini.)Untuk membuktikan kebenaran variasi algoritma ini, pertimbangkan dua kemungkinan kasus:
m
. Tidak masalah elemen mana itu, karena dalam hal apa pun akan menjadi non-maksimal, dan karenanya langkah 2 akan mendeteksi itu dan kembaliNone
.Jika kita disimpan indeks dari
m
dalam array masukana
, kita bisa benar-benar mengoptimalkan langkah 2 hanya memeriksa unsur-unsur yang datang sebelumm
dia
, karena setiap elemen kemudian telah dibandingkan denganm
pada langkah 1. Tapi optimasi ini tidak mengubah kompleksitas waktu asimptotik dari algoritma, yang masih O ( n ).sumber
if x > m:
tidak didefinisikan."Terbesar berarti elemen harus lebih besar daripada setiap elemen lainnya" adalah petunjuk besar tentang bagaimana melakukan ini di .O(n)
Jika Anda menelusuri daftar elemen pembanding, elemen apa pun yang "kehilangan" perbandingan dapat segera dibuang karena, agar menjadi yang terbesar, elemen tersebut harus lebih besar daripada SEMUA elemen lainnya sehingga kerugian tunggal mendiskualifikasi itu.
Solusi ini diaktifkan oleh kehalusan: "Tidak ada elemen yang bisa sama" dikombinasikan dengan fakta bahwa akan selalu ada elemen terbesar. Jika kita memetakan hubungan win sebagai grafik terarah, jelas bahwa kita dapat mencapai elemen terbesar hanya dengan mengikuti kemenangan.
sumber
Saya berasumsi bahwa hubungan antisimetris untuk setidaknya satu elemen (yang menjamin keberadaan elemen terbesar), jika tidak tugas itu tidak mungkin. Jika semua elemen dalam himpunan terbatas dapat diperbandingkan, maka prosedur penemuan-maksimum biasanya berfungsi.
Jika beberapa elemen tidak sebanding maka prosedur berikut ini akan berhasil
sumber
else if
diperlukan. Tidak dapat dipicu jikamax
maksimum, dan jika maksimum belum ditemukan tidak peduli berapa nilainyamax
.if
tanpa tanpaelse
? Itu hanya kebiasaan: denganelse
kita bahkan tidak bisa dibandingkan. :)max
ke elemen daftar dan, di dalam loop, lakukanif max and a[i] are comparable and max < a[i] then max = a[i]
(di mana bagian pertama dari kondisi dapat dihilangkan jika kita berasumsi bahwa mencoba membandingkan dua elemen yang tak tertandingi selalu menghasilkan false)?(Perhatikan bahwa argumen tidak tergantung pada apa yang sebenarnya dilakukan algoritma dengan informasi yang didapatnya tentang elemen, karena itu menjelaskan bahwa ia tidak dapat mengetahui bahwa suatu elemen sudah maksimal sebelum membuatn2 pertanyaan.)
Untuk sebagian besar algoritma, musuh akan memastikan untuk selalu mengembalikan true untukSEBUAHsaya< Aj sampai permintaan terakhir Anda diberikan j . Perhatikan bahwa Anda tidak dapat mengetahui bahwa satu elemen yang diberikan adalah maksimal sampai Anda membandingkannya dengan semua elemen lainnya. Hanya untuk elemen terakhir yang Anda selesaikan semua relasi musuh akan mengembalikan true untuk elemen terakhir juga.
Relasi yang dihasilkan akan selalu sedemikian rupa sehingga ada beberapaj0 untuk itu SEBUAHsaya< Aj0∀ saya dan untuk semua lainnya j akan ada beberapa sayaj seperti yang SEBUAHsaya< Aj∀ i ≠ ij dan kita tidak akan punya SEBUAHsayaj< Aj . Musuh memilihj0 dan sayaj tergantung pada algoritma Anda.
Saya harap ini agak bisa dimengerti. Jangan ragu untuk bertanya dalam komentar atau mengedit.
Ide dasarnya adalah bahwa Anda tidak dapat mengumpulkan informasi tentang elemen yang tersisa dari yang sudah Anda ketahui jika Anda mengizinkan hubungan yang sepenuhnya sewenang-wenang.
Argumen itu masih berfungsi jika kita tidak mengizinkanA < A . Kami hanya akan menghematn pertanyaan seperti itu dan masih perlu n2- n .
sumber
Saya akan menipu dan memanggil nomorn dan Anda perlu melihat setiap entri setidaknya sekali.
A > B
entriDengan cara itu Anda dapat mengulangi hanya entri dan menghapus elemen yang kurang dari yang lain dari sekumpulan solusi yang mungkin. Dengan hashset atau yang serupa ini dimungkinkan diO ( n )
sumber