Verilene en yakın azalan sekansı bulmak için açgözlü bir algoritma nasıl kullanılır?


20

ile arasında n tamsayı verilir . Her bir tam sayı altında bir tamsayıdır yazmak gerekir arasında ve bu şartı ile sitesindeki bir azalmayan dizisi oluşturur. Böyle bir dizinin sapmasını . Çalışma zamanında O (n \ sqrt [4] {l}) minimum sapmaya sahip b_i 'leri bulan bir algoritma tasarlayın . 0 l a i b i 0 l b i max ( | a 1 - b 1 | , , | a n - b n | ) b i O ( n 4 a1,,an0laibi0lbimax(|a1b1|,,|anbn|)biO(nl4)

Dürüst olmak gerekirse, bu soruyu çözmeye nasıl başlayacağım konusunda hiçbir fikrim yok. Bana dinamik bir programlama sorusu gibi geliyor, ancak profesör bunun açgözlü bir algoritma kullanılarak çözülmesi gerektiğini söyledi. Birisi küçük bir ipucu vererek beni doğru yöne yönlendirebilirse çok takdir edilecektir.

Yanıtlar:


9

Aşağıdaki gözlemle başlayalım:

Let max göstermek dizisi maksimum a1,...,an ve izin min göstermektedirler onun minimum. Eğer a1=max ardından seçerek b1=b2=...=bn=(max+min)/2 isimli optimum.

Neden böyle? Dizi maksimumla başladığından, ya b1 ve dizinin minimum değerinden büyük bir sapmaya maruz kalırız (sonraki b_i'nin b_1'denbi büyük veya ona eşit olması b1 ) ya da b1 ve için sapma max . Ortalama, maksimum sapmayı en aza indirir.

Şimdi bu gözlemi a_1, ..., a_n genel dizilerinde kullanmak üzere genelleştirmeye çalışabiliriz a1,...,an. Örneğin, herhangi bir diziyi alt dizilere ayırabiliriz, böylece her biri ilgili alt dizinin maksimum değeriyle başlar.

Örnek: , , ve .( 2 ) ( 6 , 4 , 1 , 5 , 2 ) ( 8 , 7 , 5 , 1 )(2,6,4,1,5,2,8,7,5,1)(2)(6,4,1,5,2)(8,7,5,1)

Bu bölümleme göz önüne alındığında, şimdi bu her bir alt ayrı ayrı çözebilir ve atamasını alabiliriz , ancak azalan durumu ihlal edebilir. Bu, iyimserliği kaybetmeden düzeltilebilir.bi

Son alt dizinin her zaman tüm dizinin maksimum içerdiğini gözlemleyin (aksi halde, bundan sonra başka bir alt dizilim olacaktır). Let biz atanan değerler subsequences. Şimdi, ulaşmak için arkadan ve öne doğru çalışıyoruz. Eğer daha büyüktür , biz sadece set . Eğer daha küçükse, saklıyoruz. Ardından, ile ve benzerlerini karşılaştırmaya devam ediyoruz . Herhangi bir değerini değerinew , 1 , w , 2 , . . . , A k k a 1 , . . . , A k a k a k - 1 ağırlık k a k - 1 : = ağırlık k ağırlık k - 2 ağırlık k - 1 ağırlık ı w i + 1maxw1,w2,...,wkkw1,...,wkwkwk1wkwk1:=wkwk2wk1wiwi+1 ile atanan maksimum değer her zaman ile atanan maksimum değerin altında olduğundan, sapmayı asla arttırmaz .w i + 1wiwi+1

Bu algoritmanın doğru olması gerektiğini düşünüyorum. Çalışma süresi ile ilgili olarak, önemli bir adım mümkündür alt sıralar için artan maxima, işlem olup ? Emin değilim nerede katkıda bulunur.lO(n)l


2

Burada verdiğiniz ipuçlarını kullanarak yüksek sesle düşüneceğim. İlk önce denemeniz gereken şey olduğunu söyleyen orijinal ipucuna gidelim . O zamana sahip açgözlü bir algoritma düşünebilirim.O(nl)

süresi karmaşıklık parçası her değer her oluşum sayısı bir listesini tutmak anlamına gelir . Yani, her bir in sayısını izleyen bir set oluşturun . Giriş sırasını bir kez tarayarak başlangıç ​​listesini oluşturabilirsiniz.l0..lCount=C0,,Cll

Maksimum ve minimum değeri almak için bu listeyi de tarayabilirsiniz . Tüm listesini bu orta nokta ile doldursaydınız, varyansınız bu değerden ve maks / dak'dan farkı olacaktır. Bu temelde en kötü senaryo, buna .O(l)bbw

Bu yüzden soldan yolunda . Her iki Bu elemeent damla ve max / almak içinde . Şimdi açgözlü olabiliriz. Biz seçmeyin o kuvvetler böylece kalan tüm liste yukarı (azalmayan ihtiyacını karşılamak için) ve varyansı arttırır beri. Seçebileceğimiz minimum değer . Eğer kabul edilebilir aralığında biz eğer kullanım daha aralığında asgari altında, onu seçin. Bu, bilinen kısıtlamalar verildiğinde varyansı en aza indirir .biCountb[i+1]b[n]O(l)bi>bwb[i1]aibi

Bu sadece bir fikir, belki de şanslıyım ve sizi doğru yöne yönlendiriyor. Bu algoritma çalışmayabilir (birkaç basit testim için geçerlidir), ancak verilen ipuçlarıyla eşleşir, bu yüzden belki de yardımcı olur. Eğer doğru ise, parçasının kesinlikle düşürülebildiğini görmek daha kolaydır , daha da emin değilim.O(l)O(logl)


2

İşte o "azaltma" olarak adlandırdığı profesörün çözümdür: Her biri için den 0'a kadar l , biz sapma daha az olduğunu biliyoruz veya eşit ise bir çözüm oluşturmak için deneyin i . Bir çözüm bulunabilen ilk i minimum sapmadır. O ( n ) zamanında sapma göz önüne alındığında bir çözüm bulabiliriz . Böylece çalışma süresi O ( n l ) 'dir . Ardından, doğrusal aramayı kullanmak yerine, bir çözümün mümkün olduğu en küçük sapmayı belirlemek için ikili aramayı kullanabiliriz. Böylece çalışma süresi O ( n log l)i0liiO(n)O(nl) , O gereksinimini karşılar ( n 4 O(nlogl).O(nl4)


4
Yani bir hile oldu ... Ama "O (n) zamanında sapma göz önüne alındığında bir çözüm bulabiliriz" .. daha ilginç ilgimi çekiyor ..bu ilginç kısmınasıldeğil? O(nl4)
jmad

@jmad Verilen , her biri için j , almak b j önceki tüm büyüklüğünde en az olduğu düşük değer olarak b k ve daha fazla olan i uzak bir j . Böyle bir değer bulamazsak, bu ne anlama geliyor? Bu önceki bir olduğu anlamına gelir b t daha fazla ı daha büyük bir j . Bir önceki Yani bir t birden olduğu 2 i daha büyük bir j . Bu yüzden bu i değeri mümkün değildi. Eğer n'den geçersenijbjbkiajbtiajat2iajinbu şekilde takılı kalmadan değerleri , O ( n ) zamanında geri izleme olmadan için bir çözüm buldunuz . iO(n)
jwg

O (n log l), 0 - l aralığında bir ikili arama yapmanız gereken güçlü bir ipucu olurdu.
gnasher729

0

Bence bu O (n) 'de yapılabilir.

Benzer bir sorun ele alalım: Verilen , 1 ≤ i ≤ n ve d ≥ 0, bulmak b ı o düzen böyle olmayan azalan | a i - b i | d tüm i veya gösteri için mümkün olmadığını söyledi. Bu O (n) 'de yapılabilir ve ikili arama kullanılarak orijinal problem O (n log l)' de çözülür.aibi|aibi|d

Şimdi a_i - a_j> 2d olacak şekilde i ≤ j varsa, o zaman çözüm yoktur (çünkü ).biaid,bjaj+d<ai2d+d=aidbi

Ama tüm i ≤ j için a_i - a_j ≤ 2d ise, o zaman her zaman bir çözüm bulunacağını düşünüyorum. Tek yapmamız gereken, tüm i ≤ j için m = max (a_i - a_j) bulmak ve d = kat ((m + 1) / 2) 'yi seçmek. Bu maksimum değer O (n) cinsinden bulunabilir.


İlginç fikir! Böyle bir şeyin işe yarayabileceğine inanabilirim, ancak cevabınızın sonunda büyük bir boşluk var gibi görünüyor ve ayrıntıları doldurmakta zorlanıyorum. Tüm i j için olursa , her zaman bir çözümün var olduğuna dair kanıtınız var mı? Daha da önemlisi, onu nasıl buluruz? Orijinal soru, b i 'leri bulmamız gerektiğini söylüyor . Bir çözüm var olduğunu varsaysak bile, karşılık gelen b i 'leri bulmakta güçlük çekiyorum . Bunu biraz açıklayabilir misin? aiaj2dijbibi
DW
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.