SORU
13 EKİM 2009, Salı


O(nlogn) - ikili dize içinde üç eşit aralıklı olanları Algoritması Bul

Algoritmalar bir sınavda bu soru dün de vardı, ve cevap bulamıyorum. 40 puan değerinde olduğunu çünkü beni kesinlikle çılgına çeviriyor. Sınıfının en son 24 saat içinde bir çözüm değil çünkü bunun doğru bir çözüm olmadığını düşünüyorum.

Uzunluğu n keyfi ikili bir dizgide, eğer varsa, dize içinde üç eşit aralıklı olanları bulmak. O(n * log(n)) bu sefer çözen bir algoritma yazmak.

Bu gibi dizeleri üç olanlar "eşit aralıklı": 11100000, 0100100100

rastgele bir sayı, herhangi bir sayı için çalışmak gerekir. edit: Göstermek için verdiğim örnekler, "eşit aralıklı" özelliği. 1001011 geçerli bir sayıdır. 1, 4 ve 7 olanları varlık ile eşit aralıklı.

CEVAP
18 EKİM 2009, Pazar


Nihayet! İpuçlarını takip sdcvvc's answer, biz var: O(n log n) problem için algoritma! Bunu anladıktan sonra çok basit. FFT tahmin edenler haklıydı.

Sorun: ikili bir dize uzunluğu . S verilmiştir ^em>nüç eşit aralıklı 1'leri bulmak istiyoruz. *Örnek 2* nerede olabilirn=9. Eşit 1 pozisyon 2, 5 ve 8 aralıklı.

  1. S soldan sağa, ve bir liste 1 pozisyon L tarama yapın. S=110110010 yukarıdaki listeden= L var[1, 2, 4, 5, 8]. Bu adım(n). Sorun şimdi bir bulmaktıruzunluğu 3 aritmetik diziL, yani farklı bulmaka, b, cL gibib-a = c-bya da eşdeğeri=2b c. Yukarıdaki örnekte, ilerlemesi (2, 5, 8)bulmak istiyoruz.

  2. Bir olunpolinomŞartlar pxkher biri içinkL*. Yukarıdaki örnekte, polinom yapıyoruz(x) = (x . p ^sup>2x4x5x8). Bu adım(n).

  3. 10 = * *polinom bulmakp2, Fast Fourier Transform kullanarak. Yukarıdaki örnekte, polinom elde ederizq(x) = x162x132x123x104x9x82x74x62x5x42x3x2.Bu adım(n günlük n).

  4. Bu karşılık hariç tüm koşullar göz ardıx2kbazıları içinkL. Yukarıdaki örnek için bu şartx163x10x8x4x2. Bu adım, eğer bunu yapmayı seçerseniz O(n) ' dir.

Burada önemli olan nokta şu: herhangi bir katsayısıx2biçinbLkesinlikleçiftleri sayısı(a,c)L gibi=2b c. [CLRS, Eski. 30.1-7] böyle Bir çift(b,b)eğer başka bir çift varsa, orada her zaman katsayısı en az 1 () ama(a,c)3, en az ise katsayısı., ^em>(a,c)ve(c,a). Yukarıdaki örnekte, katsayısı varx10AP (2,5,8) nedeniyle 3 hassas olmak. (Bu katsayılarıx2bher zaman tek sayılar olacak, yukarıdaki nedenlerden dolayı. Ve q diğer tüm katsayıları her zaman eşit olacak.)

Yani algoritma bu terimlerin katsayıları bakmaktırx2beğer bunlardan herhangi 1'den büyük ise , ve bakın. Eğer hiçbiri varsa, o zaman hiçbir eşit aralıklı 1'ler var. VarsabirbL kendisi için katsayısıx2b1, Daha sonra bir çift olduğunu biliyoruz . daha büyük ^em>(a,c)— daha başka(b,b)— hangi=2b c. Gerçek çift bulmak için, sadece, her deneyinbirL (ilgilicolur2b-ave eğer konumunda 1 ise2b-aS. Bu adım(n).

Hepsi bu kadar, Millet.

< / ^ hr .

Sorabiliriz: FFT kullanmaya gerek var mı? Bir sürü cevap, gibi beta's, flybywire's rsp's, Öner yaklaşım denetler her çifti 1'ler ve görürse orada bir 1 "üçüncü" pozisyon, bir işe yarayabilir O(n log n), temel sezgi olan varsa çok fazla 1'leri, biz bir üçlü bulmak kolay, ve varsa çok az 1'leri, kontrol tüm çiftleri çok az zaman alır. Bu sezgi doğru olsa da ne yazık ki, ve basit bir yaklaşımiyi O(n . daha ^sup>2), önemli ölçüde daha iyi değil. sdcvvc's answer, "Cantor gibi küme" uzunlukta bir dize . alabiliriz gibi ^em>n=3k, 0'lar ve 1'ler ile 2'li (no 1) Tek olan pozisyonlarda. Böyle bir dize var2k= n(log 2)/(log 3)indirecektir nİse 0, 63içinde olanlar ve eşit 1'ler, 1 sayısının karesi sırası ile tüm çiftleri olurdu kontrolü çok aralıklı: bu4kindirecektir n1.26ne yazık ki sınıfları ve çok daha büyük (n log n) ' dir. Aslında, en kötü durum daha da kötü: 1953 constructed (etkin) olan bu gibi dizeleri Leo Mosern1-c/dan * (log n)Onlara 1'ler ama eşit aralıklı bu dizeleri anlamına gelir 1'leri, basit bir yaklaşım olurΘ(n2-2c/dan * (n log))— sadece birküçükbiraz daha iyiΘ(n2)şaşırtıcı bir şekilde!

< / ^ hr .

Hayır 3 eşit aralıklı olanlarla uzunluğu n bir dize içinde 1'lerin sayısı hakkında yukarıda en azından . gördük ki ( ^em>nİse 0, 63Cantor gibi kolay yapımı ve en azındann1-c/dan * (log n)Moser inşaatı ile) — OEIS A003002. Ayrıca(k) No. n < A065825 A065825 gibi k(k 1) doğrudan OEIS A065825 hesaplanabilir. Bir program bu bulmak için yazdım, ve açgözlü algoritma yaptığı ortaya çıktıdeğiluzun böyle dize verin. Örneğin, içinn=9, 5 1 (110100011) ama açgözlü verir sadece 4 (110110000) alabilirizn=26 11 1 (11001010001000010110001101) alabiliriz ama açgözlü sadece 8 (11011000011011000000000000), ve için verirn=74 22 1 (11000010110001000001011010001000000000000000010001011010000010001101000011) alabiliriz ama açgözlü sadece 16 (11011000011011000000000000011011000011011000000000000000000000000000000000) verir. 50 (örneğin 38 50) kadar epeyce bir yerlerde yine de kabul ediyorlar. Bu OEİS olarak başvuruyor ki, Jaroslaw Wroblewski bu soru ile ilgileniyor gibi görünüyor, ve non-averaging sets Bu bir web sitesi tutar. Tam rakam sadece 194 kadar bilinmektedir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 07cadikiz07

    07cadikiz07

    17 EKİM 2007
  • CodingMadeEasy

    CodingMadeEa

    25 EYLÜL 2010
  • Marques Brownlee

    Marques Brow

    21 Mart 2008