Algoritma waktu linier untuk menemukan shift maks


11

Asumsikan kita diberi larik berisi bilangan bulat tidak negatif (tidak harus berbeda).A[1..n]

Biarkan menjadi diurutkan dalam urutan yang tidak bertambah. Kami ingin menghitung A m = maks i [ n ] B [ i ] + i .BA

m=maxi[n]B[i]+i.

Solusi yang jelas adalah menyortir A dan kemudian menghitung m . Ini memberikan algoritma yang berjalan dalam waktu O(nlgn) dalam kasus terburuk.

Apakah mungkin melakukan lebih baik? Bisakah kita menghitung m dalam waktu linier?


Pertanyaan utama saya adalah yang di atas. Tetapi akan menarik untuk mengetahui tentang generalisasi masalah berikut.

Biarkan B menjadi A diurutkan berdasarkan beberapa perbandingan oracle dan f suatu fungsi yang diberikan oleh oracle. Diberikan A dan nubuat untuk dan f , apa yang bisa kita katakan tentang waktu yang diperlukan untuk menghitung m=maxi[n]f(B[i],i) ?

Kita masih dapat menghitung m dalam waktu O(nlgn) . Tapi bisakah kita membuktikan batas bawah super-linear untuk kasus umum ini?

Jika jawabannya adalah ya, apakah batas bawahnya berlaku jika kita menganggap adalah urutan yang biasa pada bilangan bulat dan f adalah fungsi "baik" (monoton, polinomial, linier, dll.)?

Jawaban:


10

Kita dapat menghitung dalam waktu linier.m

Untuk kesederhanaan anggap bahwa array adalah 0 berbasis: , . Kami ingin menghitung .B [ 0 .. n - 1 ] m = maks i B [ i ] + iA[0..n1]B[0..n1]m=maxiB[i]+i

Biarkan . Jelas .m a x mmax=maxiA[i]maxm

Biarkan menjadi setelah pengurutan. Jika kita memiliki B [ k ] A [ j ] m a x - nA[j]B[k]A[j]maxn

B[k]+kB[k]+(n1)=A[j]+(n1)(maxn)+(n1)=max1<maxm.

Karena itu kita dapat mengabaikan ketika . Kita hanya perlu mempertimbangkan angka dalam kisaran .A [ j ] m a x - n [ m a x - n , m a x ]A[j]A[j]maxn[maxn,max]

Kita dapat menggunakan jenis penghitungan untuk mengurutkan angka dalam yang berada dalam kisaran dalam waktu linier dan menggunakan daftar yang diurutkan untuk menghitung .[ m a x - n , m a x ] mA[maxn,max]m


... mmm ... tapi berapa biaya C [x] = C [x] +1?!?
Marzio De Biasi

1
apakah ada masalah dengan jawaban Anda? karena sepertinya baik-baik saja bagi saya: Anda mengatakan kami hanya peduli dengan elemen array dengan nilai dalam , jadi kami bisa menggunakan jenis penghitungan. Ini berfungsi untuk masalah umum setiap kali untuk semua . | f ( B [ i ] , i ) - B [ i ] | = O ( n )[Mn,M]|f(B[i],i)B[i]|=O(n)i
Sasho Nikolov

Terima kasih @Marzio. :) Saya sedikit mengedit jawaban Anda untuk kejelasan. Jangan ragu untuk memutar kembali edit saya atau mengedit lebih lanjut.
Kaveh

1
Solusi ini tampaknya bekerja juga untuk semua mana untuk semua dan , . x i n | f ( x , i ) - x | = O ( n )f(x,i)xin|f(x,i)x|=O(n)
Kaveh

@Kaveh: sunting tidak apa-apa! Saya menulis jawabannya dengan cepat dan saya bahkan tidak yakin dengan kebenarannya: -S
Marzio De Biasi

-1

Jika array terdiri dari bilangan bulat yang berbeda, maka , karena jarak antara entri yang berdekatan di setidaknya ; situasinya lebih menarik ketika mereka tidak perlu berbeda.m = maks ( A ) + 1 B 1Am=max(A)+1B1

Untuk pertanyaan yang lebih umum, bayangkan situasi di mana hanya "menarik" ketika . Tampaknya mungkin untuk membangun argumen musuh yang memaksa Anda untuk meminta untuk semua yang sebelum Anda tahu , maka Anda perlu mengurutkan untuk temukan jawabannya, yang mengambil perbandingan . (Ada beberapa komplikasi karena mungkin itu kasus yang dapat kita uji apakah dalam waktu konstan daripada linear dengan menanyakan .) Ini adalah kasus bahkan jika adalah polinom (derajat tinggi).i = j f ( B [ i ] , i ) i max i f ( B [ i ] , i ) A Ω ( n log n ) A [ i ] = B [ j ] f ( A [ i ] , j ) ff(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f


1
Bagaimana jika A memiliki nol - 1 nol dan satu nol? Maka jawabannya adalah n, bukan 1.
Grigory Yaroslavtsev

Hai Yuval. Ada dapat diulang angka dalam . Seperti yang dikatakan Grigory solusinya tampaknya tidak berhasil. A
Kaveh

Saya rasa saya melihat ide Anda untuk argumen batas bawah: diberikan kita dapat menghitung dengan cepat menggunakan pasangan kueri yang dibuat untuk oleh algoritma yang menyelesaikan masalah dalam waktu . Kita dapat memastikan algoritme kueri pada semua tetapi kita tidak dapat memastikan algoritma itu tidak menanyakan pasangan lain. Namun kita dapat mengatur untuk pasangan lain menjadi nilai yang dapat dibedakan sehingga kita dapat membuang pasangan tersebut. B f o ( n lg n )ABfo(nlgn)( B [ i ] , i ) ff(B[i],i)f
Kaveh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.