O (n) zamanında 5 tekrarlanan değer nasıl bulunur?


15

Tam olarak beş tekrarlanan ile arasında tamsayılar içeren boyutunda bir diziniz olduğunu varsayalım . zamanında tekrarlanan sayıları bulabilen bir algoritma önermek gerekiyor . Hayatım boyunca hiçbir şey düşünemiyorum. Bence sıralama en iyi mu? Daha sonra dizi boyunca geçiş olur ve sonuçlanır . Ancak, bağlantılı liste, kuyruklar, yığınlar vb.Ile bazı zor şeyler gördüğüm için sıralama gerekli olup olmayacağından gerçekten emin değilim.n61n5O(n)O(nlogn)O(n)O(n2logn)


16
O(nlogn)+O(n) değil . It en . O olurdu sen tür n kere yaptıysam. O(n2logn)O(nlogn)O(n2logn)
Monica'nın Davası


1
@ leftaroundabout Bu algoritmalar burada dizinin boyutu ve girdi kümesinin boyutudur. çünkü bu algoritmalar çalışann k k = n - c o n s t a n t O ( n 2 )O(kn)nkk=nconstantO(n2)
Roma Gräf

4
@ RomanGräf asıl durum şudur: algoritmalar , burada etki alanının boyutudur. Bu nedenle, OP'ler gibi bir sorun için, boyutlu etki alanında böyle bir algoritma veya sınırsız boyutlu bir etki alanında geleneksel bir algoritması kullanmanız aynıdır . Mantıklı da. k n O ( n log n )O(logkn)knO(nlogn)
leftaroundabout

5
İçin , yalnızca izin verilen sayıdır açıklamanıza tarafından. Ama sonra , beş değil, altı kez tekrarlanmalıdır. 1 1n=611
Alex Reinking

Yanıtlar:


22

boyutunda ek bir dizisi oluşturabilirsiniz . Başlangıçta dizinin tüm öğelerini . Daha sonra giriş dizisi boyunca döngü yapın ve her bir için değerini artırın . Sadece bir dizi kontrol Bundan sonra : fazla döngü ve eğer daha sonra tekrarlanır. Sen bunu çözmek ise bellek pahasına zaman ve tamsayılar arasında olduğu için ve .n 0 A B [ A [ i ] ] i B A B [ A [ i ] ] > 1 A [ i ] O ( n ) O ( n ) 1 n - 5Bn0AB[A[i]]iBAB[A[i]]>1A[i]O(n)O(n)1n5


26

Fade2black'ın cevabındaki çözüm standarttır, ancak alanı kullanır . Bunu alanına aşağıdaki gibi geliştirebilirsiniz:O ( 1 )O(n)O(1)

  1. Dizi . İçin , işlem .d = 1 , , 5 σ d = n i = 1 A [ i ] dA[1],,A[n]d=1,,5σd=i=1nA[i]d
  2. Compute ( de ikinci toplamı hesaplamak için iyi bilinen formülleri kullanabilirsiniz ). Not bu , tekrar sayılardır. O ( 1 ) τ d = m d 1 + + m d 5 m 1 , , m 5τd=σdi=1n5idO(1)τd=m1d++m5dm1,,m5
  3. Polinom . Bu polinom katsayıları simetrik işlevleri vardır hesaplanabilir olarak .m 1 , , m 5 τ 1 , , τ 5 O ( 1 )P(t)=(tm1)(tm5)m1,,m5τ1,,τ5O(1)
  4. Tüm olasılıklarını deneyerek polinom nin tüm köklerini bulun .n - 5P(t)n5

Bu algoritma, bit sözcüklerindeki temel aritmetik işlemlerin zaman aldığı RAM makine modelini varsayar .O ( 1 )O(logn)O(1)


Bu çözümü formüle etmenin başka bir yolu aşağıdaki satırlardır:

  1. Hesaplama ve anlamak kullanılarak formül .y 1 = m 1 + + m 5 y 1 = x 1 - n - 5 i = 1 ix1=i=1nA[i]y1=m1++m5y1=x1i=1n5i
  2. Hesaplama olarak aşağıdaki formül kullanılarak O ( n ) x 2 = ( A [ 1 ] ) A [ 2 ] + ( A [ 1 ] + A [ 2 ] ) A [ 3 ] + ( A [ 1 ] + A [ 2x2=1i<jA[i]A[j]O(n)
    x2=(A[1])A[2]+(A[1]+A[2])A[3]+(A[1]+A[2]+A[3])A[4]++(A[1]++A[n1])A[n].
  3. Anlamak kullanılarak formül y 2 = x 2 - 1 i < j n - 5 i j - ( n - 5 i = 1 i ) y 1 .y2=1i<j5mimj
    y2=x21i<jn5ij(i=1n5i)y1.
  4. Hesaplama ve anlamak paralel bir çizgide.y 3 , y 4 , y 5x3,x4,x5y3,y4,y5
  5. Değerleri polinom (işarete) katsayılarıdır , önceki solüsyondan. P ( t )y1,,y5P(t)

Bu çözüm, 5'i değiştirirsek , algoritmasını kullanarak algoritmasını elde ettiğimizi gösterir (bu da bit uzunluğu tamsayılarında aritmetik işlemleri gerçekleştirir , herhangi bir zamanda bunlardan en fazla . (Bu, çoğu yalnızca uzunluğunda bir işlenen içeren gerçekleştirdiğimiz çarpmaların dikkatle analiz edilmesini gerektirir .) Bunun modüler kullanılarak zamanına ve boşluğuna geliştirilebileceği düşünülebilir. aritmetik.O ( d 2 n ) O ( d 2 ) O ( d n ) O ( d log n ) O ( d ) O ( log n ) O ( d n ) O ( d )dO(d2n)O(d2)O(dn)O(dlogn)O(d)O(logn)O(dn)O(d)


Herhangi bir yorumlama ve , , ve böylece? Neden ? τ d P ( t ) m i d { 1 , 2 , 3 , 4 , 5 }σdτdP(t)mid{1,2,3,4,5}
strafor sinek

3
Çözümün arkasındaki içgörü , birçok alıştırmada ortaya çıkan toplama hilesidir (örneğin, eksik öğeyi, numaralarından biri hariç tümünü içeren uzunluk dizisinden nasıl bulabilirsiniz ?). Toplama hilesi, rasgele bir işlev için değerini hesaplamak için kullanılabilir ve soru, çıkarabilmek için hangi . Cevabım, simetrik fonksiyonların temel teorisinden tanıdık numaralar kullanıyor. 1 , , n f ( m 1 ) + + f ( m 5 ) f f m 1 , , m 5n11,,nf(m1)++f(m5)ffm1,,m5
Yuval Filmus

1
@hoffmale Aslında, . O(d2)
Yuval Filmus

1
@hoffmale Her biri makine kelimesi alır . d
Yuval Filmus

1
@BurnsBA Bu yaklaşımla ilgili sorun, den çok daha büyük olmasıdır . Büyük sayılardaki işlemler daha yavaştır. ( n - 4 ) ( n - 5 )(n5)#(n4)(n5)2
Yuval Filmus

8

Ayrıca, matematiksel yaklaşımın iyi çalışmadığı sorunun varyantlarına uygulamayı deniyorsanız daha esnek olabilen, bölümlemeye dayalı doğrusal bir zaman ve sabit alan algoritması da vardır. Bu, altta yatan dizinin değiştirilmesini gerektirir ve matematiksel yaklaşımdan daha kötü sabit faktörlere sahiptir. Daha spesifik olarak, toplam değer sayısı ve kopyalarının sayısı açısından maliyetlerin sırasıyla ve olduğuna inanıyorum; şu an sahip olduğumdan daha fazla zaman ayırıyorum.d O ( n log d ) O ( d )ndO(nlogd)O(d)


Algoritma

İlk çiftin tüm dizi üzerindeki aralık olduğu bir çift listesi ile başlayın veya 1 dizine eklenmişse .[(1,n)]

Liste boşalana kadar aşağıdaki adımları tekrarlayın:

  1. Herhangi bir çifti alın ve listeden kaldırın .(i,j)
  2. Belirtilen alt dizinin minimum ve maksimum ve değerlerini bulun .maksminmax
  3. Eğer , altdizilim sadece eşit olan bir eleman içerir. Biri hariç öğelerini verin ve 4-6 arasındaki adımları atlayın.min=max
  4. Eğer , altdizilim bir çiftleri içerir. 5. ve 6. adımları atlayın.maxmin=ji
  5. Alt diziyi etrafına bölün , böylece dizinine kadar olan öğeler ayırıcıdan daha küçük ve bu dizinin üzerindeki öğeler küçük olmayacak şekilde. kmin+max2k
  6. Listeye ve ekleyin .( k + 1 , j )(i,k)(k+1,j)

Zaman karmaşıklığının üstünkörü analizi.

1 ile 6 arasındaki adımlar zaman alır, çünkü minimum ve maksimum değerleri bulmak ve bölümleme doğrusal zamanda yapılabilir.O(ji)

Listedeki her çift ya ilk çifttir ya da karşılık gelen alt dizinin yinelenen bir eleman içerdiği bir çiftin çocuğudur. Her bir geçiş her bir yinelemenin olabileceği aralığı yarıya , en fazla vardır, bu nedenle çiftler dahil toplamda en fazla toplamı vardır yinelenmeyen alt diziler. Herhangi bir zamanda, listenin boyutu fazla değildir .( 1 , n ) d log 2 , n + 1 2 d log 2 , n + 1 2 d(i,j)(1,n)dlog2n+12dlog2n+12d

Yinelenen herhangi birini bulmak için işi düşünün. Bu, üstel olarak azalan bir aralıktaki bir çiftler dizisinden oluşur, bu nedenle toplam çalışma, geometrik dizinin veya toplamıdır . Bu, kopyalar için toplam çalışmanın olması gerektiği ve cinsinden doğrusal olacağı açık bir sonuç verir .d O ( n, d ) n,O(n)dO(nd)n

Daha sıkı bir sınır bulmak için, en fazla çoğaltılmış kopyaların en kötü senaryosunu düşünün. Sezgisel olarak, arama aşamalı olarak daha küçük parçalar halinde ve her biri tam dizinin geçildiği iki aşama alır ve parçaların den daha küçük olduğu, böylece sadece dizinin bazı kısımları çaprazlanır. İlk aşama yalnızca derin olabilir, bu nedenle maliyet ve ikinci fazın maliyeti dır, çünkü aranan toplam alan tekrar katlanarak azalır . günlüğüdO(ngünlüğüd)O(n)ndlogdO(nlogd)O(n)


Açıklama için teşekkürler. Şimdi anladım. Çok güzel bir algoritma!
DW

5

Bunu bir cevap olarak bırakmak, çünkü bir yorumdan daha fazla alana ihtiyaç duyar.

O(nlogn)O(n2logn)O(f)O(g)O(f+g)=O(maxf,g)

Zaman karmaşıklıklarını çoğaltmak için bir for döngüsü kullanmanız gerekir. uzunluğunda bir döngünüz varsa ve döngüdeki her değer için alan bir işlev yaparsanız , süresi alırsınız .fO(g)O(fg)

Böylece, sizin durumunuzda sıralarsınız ve sonra içinde enine elde edersiniz . Sıralama algoritması her karşılaştırma için size götüren bir hesaplama yapmak olsaydı , daha sonra da alacağını ama bu durum burada değil.O(nlogn)O(n)O(nlogn+n)=O(nlogn)O(n)O(n2logn)


iddiamı merak ediyorsanız, bunun her zaman doğru olmadığını belirtmek önemlidir. Ancak, veya (bir dizi ortak fonksiyon için geçerlidir), tutacaktır. En sık tutma süresi, ek parametrelerin dahil edilmesi ve gibi ifadelerin alınmasıdır .O(f+g)=O(maxf,g)fO(g)gO(f)O(2cn+nlogn)


3

Mağaza olarak elemanların sırasını kullanan ( "bulunan" elemanlar için) boolean dizi tekniğinin belirgin bir yerinde varyantı vardır arr[x] == x. Daha genel olduğu için haklı gösterilebilecek bölüm varyantının aksine, aslında böyle bir şeye ihtiyacınız olduğunda emin değilim, ama basit.

for idx from n-4 to n
    while arr[arr[idx]] != arr[idx]
        swap(arr[arr[idx]], arr[idx])

Bu , daha önce alınmış arr[idx]olan konumu arr[idx]bulana kadar tekrar tekrar konuma koyar ; bu noktada yinelenmesi gerekir. Her takas çıkış koşulunu doğru hale getirdiğinden , toplam takas sayısının ile sınırlandığını unutmayın .n


İç whiledöngünün ortalama olarak sabit zamanda çalıştığı konusunda bir tür argüman vermeniz gerekecek . Aksi takdirde, bu doğrusal zaman algoritması değildir.
David Richerby

@DavidRicherby Ortalama olarak sabit bir süre çalışmaz, ancak dış döngü sadece 5 kez çalışır, bu yüzden iyi. Swapların toplam sayısı ile sınırlı olduğunu Not her takas onun çıkış koşulu doğru yapar beri yinelenen değerlerin sayısı toplam süresini artırır, bu yüzden bile (aka. Tek gereken hala doğrusal n yerine adımlar n d ). nnnd
Veedrac

Hata! Bir şekilde dış halkanın sabit sayıda çalıştığını fark etmedim! (Takas sayısı hakkında notunuzu içerecek şekilde düzenlendi ve böylece aşağı oyumu tersine çevirebildim.)
David Richerby

1

Sahip olduğunuz değerleri toplamdan çıkarın .i=1ni=(n1)n2

Yani, zamanından sonra ( aritmetiğin O (1) olduğunu varsayarsak, bu gerçekten değil, ama farzedelim) 1 ve n arasında 5 tamsayıdan oluşan bir toplam σ 1'e sahipsiniz :Θ(n)σ1

x1+x2+x3+x4+x5=σ1

Sözde, bu iyi değil, değil mi? Bunu 5 farklı sayıya nasıl ayıracağınızı muhtemelen anlayamazsınız.

Ah, ama eğlenceli olması gereken yer burası! Şimdi öncekiyle aynı şeyi yapın, ancak değerlerin karelerini çıkarın . Şimdi:i=1ni2

x12+x22+x32+x42+x52=σ2

Bununla nereye gittiğimi gördün mü? Aynısını 3, 4 ve 5 güçleri için yapın ve 5 değişkente 5 bağımsız denkleminiz olsun. Ben çok sizin için çözebilir eminim .x

Uyarılar: Aritmetik aslında O (1) değildir. Ayrıca, toplamlarınızı temsil etmek için biraz alana ihtiyacınız var; ama değil kadar tahmin edilebileceği gibi - sen, ah, sürece sahip olarak, modüler en her şeyi yapabilirsiniz bitleri; bunu yapmalı.log(5n6)


@YuvalFilmus aynı çözümü önermiyor mu?
fade2black

@ fade2black: Oh, evet, öyle, üzgünüm, çözümünün ilk satırını gördüm.
einpoklum

0

Sorunu çözmek için en kolay yolu orijinal dizideki her sayı için morfolojik görünümlerde saymak ve sonra gelen bütün numarayı çapraz alacağı dizi oluşturmaktır için n - 5 ve sayı bunun için, birden fazla kez karmaşıklığı görünüp görünmediğini kontrol hem bellekte hem de zamanda çözüm doğrusal veya O ( N )1n5O(N)


1
Bu aynı @ fade2black'in cevabı (gözler üzerinde biraz daha kolay olmasına rağmen)
LangeHaare

0

Bir diziyi 1 << A[i]eşleyin ve ardından her şeyi birlikte XOR yapın. Kopyalarınız, karşılık gelen bitin kapalı olduğu sayılar olacaktır.


Beş kopya vardır, bu nedenle xor hilesi bazı durumlarda kırılmaz.
Kötülük

1
Bunun çalışma süresi . Her bitvector n bit uzunluğundadır, böylece her bitvector işlemi O ( n ) zaman alır ve orijinal dizinin her elemanı için toplam O ( n 2 ) süre boyunca bir bit vektör işlemi yaparsınız . O(n2)nO(n)O(n2)
DW

@DW Ancak normalde kullandığımız makinelerin 32 veya 64 bit olarak sabitlendiği ve bunların çalışma zamanında değişmediği (yani sabit oldukları), neden bu şekilde ele alınmaması ve bit işlemleri olan yerine, O ( n ) ? O(1)O(n)
code_dredd

1
@ray, sanırım kendi sorunuzu cevapladınız. Normalde kullanımı 64 bit sabitlenir makineleri, işletim süresi bir ile bir işlem yapmak için göz önüne alındığında bitlik vektörü olan O ( n ) değil, O ( 1 ) . Bu gibi bir şey alır n / 64 tüm üzerinde bazı işlemler yapmak talimatlar n bir bit n bitlik vektörü ve n / 64 olduğunu Ç ( n ) değil, O ( 1 ) . nO(n)O(1)n/64nnn/64O(n)O(1)
DW

@DW Ne aldım önceki. yorumlar, boyutlu dizideki tek bir öğeye atıfta bulunan bir bit vektörünün, bit vektörü, bahsettiğim sabit olan 64-bit olduğu anlamına geliyordu. Açıkçası, boyutta bir dizisi işleme n alacak O ( k , n ) oradayız varsayarsak, zaman k elemanı ve başına -bits n dizideki elemanların sayısı. Ancak k = 64 , bu nedenle sabit bit sayısı olan bir dizi elemanı için bir işlem O ( k ) ve O dizisi yerine O ( 1 ) olmalıdır.nnO(kn)knk=64O(1)O(k)O ( k n ) yerine. Eğer tutuyor k tamlık / doğruluğu uğruna ya ben başka bir şey eksik? O(n)O(kn)k
code_dredd

-2
DATA=[1,2,2,2,2,2]

from collections import defaultdict

collated=defaultdict(list):
for item in DATA:
    collated[item].append(item)
    if len(collated) == 5:
        return item.

# n time

4
Siteye hoş geldiniz. Biz bir bilgisayar bilimi sitesiyiz, bu nedenle belirli bir dilin ve kütüphanelerinin anlaşılmasını gerektiren kod dökümlerini değil, algoritmaları ve açıklamaları arıyoruz. Özellikle, bu kodun doğrusal zamanda çalıştığı iddianız, bunun collated[item].append(item)sabit zamanda çalıştığını varsayar . Bu gerçekten doğru mu?
David Richerby

3
Ayrıca, beş kez tekrarlanan bir değer arıyorsunuz. Aksine, OP her biri iki kez tekrarlanan beş değer arar.
Yuval Filmus
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.