zaman ve mekanda belirli sayının belirlenmesi (en kötü durum)


10

göz önüne alındığında A[1..n] tamsayılardır, öyle ki 0A[k]m tüm 1kn ve her bir oluşum A [1 \ ldotd n] içindeki belirli bir sayı dışındaki sayı A[1..n]tek bir sayıdır. Oluşumu çift sayı olan sayıyı bulmaya çalışın.

Bir Θ(nlogn) algoritması vardır: A[1..n] yi B[1..n] ve B[1..n] 'yi öğelerinin değeri olan birçok parçaya böleriz Bu nedenle, her bir öğenin oluşumunu sayabiliriz.

En kötü durum- O(n) -zaman-ve- O(n) -uzay algoritmasını bulmak istiyorum.

m=Ω(n1+ϵ) ve \ epsilon> 0 olduğunu varsayarsak, ϵ>0sayı tabanı sıralaması kabul edilemez. İkili bitsel işlemler kabul edilebilir, örneğin A[1]xorA[2] .


Aryabhata'nın aşağıdaki cevabı genel davanın iyi olmadığını gösteriyor, ancak belki de başka kısıtlamalarınız var mı? Basit (ancak büyük) bir kısıtlama, dizideki tüm girdilerin boyutunda olmasını zorunlu kılmaktır . Bu oldukça önemsiz bir doğrusal algoritma verecektir. O(n)
Luke Mathieson

1
@LukeMathieson: Alıntıladığım kağıdın herhangi bir değişiklik yapılmadan çalışacağına henüz ikna olmadığım için bu cevabı sildim ve ayrıca OP sadece tek tip maliyetli RAM modeliyle ilgileniyor gibi görünüyor.
Aryabhata

@Aryabhata: hehe, o zaman orada olmayan cevap! İlginç ve belki de Frank için yararlı olan, sonucu gazetede uyarlamanın ne olduğunu düşündünüz? Hızlı bir cimri onun uygulanmasını önerdi, ama açıkçası okumadım.
Luke Mathieson

@LukeMathieson: Mevcut problemde diğer elemanların tek bir kez görünmesi gerektiği gerçeği. O zamandan beri, kanıtı gözden
kaçırdım

Teorik sonuçlarla veya pratik çözümlerle ilgileniyorsanız ilginç olurdu. Bakış teorisi açısından, ilk hızlı tepki sen yani, olabilir daha hızlı tamsayılar listesini sıralamak . Han'ın O ( log log n ) zamanında çalışan deterministik bir algoritması vardır . Rastgele algoritmalar için daha da iyi sonuçlar bilinmektedir, örneğin Han ve Thorup bir O ( n O(nlogn)O(loglogn)beklenen zaman algoritması. Ancak, sorununuzun sıralanması gerekmediğini düşünüyorum. O(nloglogn)
A.Schulz

Yanıtlar:


2

İşte basit bir algoritma için bir fikir; sadece tüm olayları sayın!

  1. Θ ( n )m=maxAΘ(n)
  2. "Tahsis" dizisi . - zaman ¹OC[0..m]O(1)
  3. Yineleme ve artış bir kişi tarafından bulmak her . Eğer idi , eklenti doğrusal listesine . - zamanC [ x ] A [ _ ] = x C [ x ] 0 x L Θ ( n )AC[x]A[_]=xC[x]0xLΘ(n)
  4. üzerinde ve öğesini bile . - zaman .x e[ X e ] O ( n )LxeC[xe]O(n)
  5. Dönüş .xe

Sonuç olarak, bu size çok fazla bellek kullanabilen (ayırma anlamında) doğrusal zaman algoritması sağlar. Burada bağımsız olarak sabit zamanda rastgele erişebilmenin çok önemli olduğuna dikkat edin.mCm

Uzaya bağlı ek bir bu yaklaşımla daha zordur; zaman araması sunan herhangi bir sözlük veri yapısı bilmiyorum . Sen hangi burada birlikte uygulaması şunlardır karma-tabloları kullanabilirsiniz beklenen (arama süresi , tablonun büyüklüğüne saklanan elemanların sayısını) Eğer doğrusal boşluk keyfi iyi alabilirsiniz - beklenti içinde. haritadaki tüm değerler aynı karma değerine eşlerse, vidalanırsınız.O ( 1 ) O ( 1 + k / n ) n k AO(n)O(1)O(1+k/n) nkA


  1. Bir RAM'de bu dolaylı olarak yapılır; tek ihtiyacımız başlangıç ​​konumu ve belki de son konumdur.

0

Bir neredeyse önemsiz çözelti - ancak kullanan alanı - bir karma ilk kullanmaktır. Bir karma haritanın öğeleri eklemek ve aramak için amortisman çalışma zamanı O ( 1 ) olduğunu hatırlayın .Θ(n)O(1)

Bu nedenle, aşağıdaki algoritmayı kullanabiliriz:

  1. Bir karma harita tahsis edin . A üzerinde tekrarlayın . Her bir i A elemanı için , görülen oluşum sayısını arttırın, yani H ( i ) + + .HAiAH(i)++

  2. Karma haritanın anahtar kümesini yineleyin ve hangi anahtarların eşit sayıda gerçekleştiğini kontrol edin.

Şimdi bu gerçekten büyük bir hile kullanmayan basit bir algoritma, ama bazen bile yeterli. Değilse, hangi alan kısıtlamalarını uyguladığınızı belirtmek isteyebilirsiniz.


Polinom boşluğu kullanan randomize olmayan bir zaman algoritması olup olmadığını hala bilmek istiyorum . Özellikle, tek çift olarak meydana gelen öğeyi bulmanın, tek garip öğeyi bulmaktan daha zor olduğuna dair teorik bir kanıt var mı? O(n)
A.Schulz

@ A.Schulz Ben karma tablo kullanarak beklenen zaman algoritması olduğunu düşünüyorum . Birisinin bana bir O ( n ) -algoritması (veya bazı özel durumlar için diyelim ki odd = 1 ve hatta = 2) söylediğini hatırlıyorum, ama hatırlayamıyorum. O(n)O(n)
Yai0Phah

Her karma uygulamanın bu özelliği yoktur; genellikle, arama değil, amortismana tabi tutulmaz (afaik). Aslında, önceki bir tartışma , sürekli zaman araması olan herhangi bir uygulama getirmemiştir. Daha spesifik olabilir misiniz? O(1)
Raphael
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.