Bir dizideki her öğe için daha küçük öğelerin sayısını etkin bir şekilde bulma


9

Bu soruna takılı kaldım:

Bir dizi verildi A ilkinin n rastgele rasgele izin verilen doğal sayılar B inşa edilir, öyle ki B(k) öğelerin sayısı A(1) için A(k1) daha küçük A(k).

ben verdim A bulabilir misin B içinde O(n)Zaman?
ii) VerilenB bulabilir misin A içinde O(n) Zaman?

Buraya, B(1)=0. Somut bir örnek için:

|A843172965B000031644|

Biri bana yardım edebilir mi? Teşekkürler.


Bunu buldum: Hesaplama permütasyon kodlamaları verenO(nlogn)bu problemler için algoritmalar. En azından bence aynı problemler.
Realz Slaw

@Merbs, verdiğiniz bu İpucu bir çözümünüz olduğu anlamına mı geliyor?
AJ

1
@AJed, bir algoritmaya sahip olduğum anlamına gelir, ancak O(n2) boşluksuz basit algoritma ve O(nlogn)bize izin verilirse. Şu anda, ikisinde de mümkün değilO(n)ve her ikisi de aynı algoritmadır.
Merbs

@Merbs. İpucunun doğru yola çıkabileceğini hissediyorum. im çok bir çözüm (ipucu aşağıdaki) sahip. Analizde bunu yapan bir hile var sanırımO(n).. Bence hile A 1'den gidiyor:nbir tek.
AJ

2
Bu makale ayrıca bir O(nlogn)algoritması. Var olduğundan emin misinO(n)Bunun için algoritma?
Realz Slaw

Yanıtlar:


1

Belirleme için saf algoritma B itibaren A:

İçin k=1,,ndeğerini belirlemek B(k) her birini karşılaştırarak A(i) için A(k) için i=1,,k ve tatmin olanları saymak A(i)<A(k).

Bu algoritma karşılaştırır A(1) diğerlerine (n1 zamanlar), A(2) için n2 diğerleri, vb. yani toplam karşılaştırma sayısı (n1)(n2)2. Ama bu yapabileceğimiz en iyi şey değil. Örneğin,B(n), karşılaştırma yapmak zorunda değiliz! B(n)=A(n)1çünkü bu ilk n doğal sayılar ve (permütasyondan bağımsız olarak) n1daha düşük doğal sayılar olacak. Ne dersinB(n1)? Kontrol etmek yerineA(1) vasıtasıyla A(n2), kontrol edebiliriz A(n). Yani:

İçin k=1,,n2, yukarıdaki algoritmayı kullanın; için k=n2,,n ters algoritmayı kullanın: B(k) başlangıçta A(n)1 ve sonra çıkarılıyor 1 her giriş için A(i) için i=k+1,,n bu daha az A(k).

Bu sürer 2×(n21)(n22)2=(n2)(n4)4 adımlar, ki bu hala O(n2). Ayrıca,A itibaren B, Eğer B(n)=A(n)1 sonra A(n)=B(n)+1.

Ama şimdi daha fazla incelik için. Biraz ek alana izin verirsek veya yerinde sıralayabilirsek, sayıları karşılaştırırken sıralayabiliriz. Örneğin:

|A843172965S987432165B0000316|

Hepsini kontrol etmek (veya sırayla kontrol etmek yerine), her birini belirlemek için ikili aramayı kullanabiliriz. B(k). Ancak, sıralama hala zaman alırO(nlogn).


Bu benim ilk fikrimdi; sorunun başlangıçta kredi verdiğimden daha ilginç olduğunu anlıyorum. Ve henüz Realz Slaw'ın bulgularını okuma fırsatım olmadı, bu yüzden algoritma kapalı olabilir.
Merbs

0

Her birini belirlemek yerine B(k) birer birer, ileriye bakabiliriz ve yalnızca A bir kez ! Ama kullanacağızn Uzay:

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

Daha önce belirlenmiş olanları güncellemeyerek daha da fazla zaman kazanabiliriz (yani, güncellemenin anlamı yoktur 8 ilk adımdan sonra), ancak en kötü durumda, yine de güncellememiz gerekir (n)(n+2)2 zamanlar


0

hem I hem de II burada açıkladığım #next_greater_element kullanılarak çözülebilir . ama bu sadece problemden biraz daha zor ama çözümden önce bir sonraki büyük unsuru öğrenmeniz gerekiyor:

  1. her element için bir vektörünüz olduğunu düşünün A Adını sen koy Si eleman için i. bir kez sağdan sola başlayarak ancak ayar elemanı hariç bir sonraki büyük algoritmayı çalıştıri içinde A bir sonraki büyük eleman indeksi, Si öğeler i sonra soldan sağa dizi üzerinde yineleme yapar ve sonra B[i]=j=0x(Si[j]+1) nerede x vektörün büyüklüğü Si.ve Onun Θ(n) çünkü bir sonraki büyük algoritma Θ(n) ve ayrıca yineleme Θ(n)

ikinci bölüm de en doğru elemanın değerini alabileceğimize dikkat çekerek O(1) EDIT: benim çözüm yanlış var gibi görünüyoro(n) çözüm

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.