SORU
7 EKİM 2008, Salı


Algoritma eğer dizi n içerip içermediğini belirlemek için...n m?

Reddit bu soruyu gördüm ve olumlu çözümler sunuldu yok, ve burada soru mükemmel bir soru olacağını düşündüm. Bu mülakat soruları ile ilgili bir konu vardı:

Yazmak bir yöntemi alır bir int dizinin boyutu m, ve döndürür (True/False) eğer dizi oluşur numaralar n...n m-1, Tüm numaralar aralığı ve sadece sayı olarak değişir. Dizinin sıralanmış olmasını garanti edilmez. (Örneğin, {2,3,4} true döndürecektir. {1,3,1} false döndürecektir, {1,2,4} false döndürecektir.

Sorun vardı bu sefer benim spiker muhafaza etmemi optimize (daha hızlı O(n), daha az bellek, vb), nokta nerede o iddia yapabileceğini bir pas dizi kullanarak bir sabit bir bellek miktarı. Hiç bir şeyi ayarladı.

Çözümleri ile birlikte lütfen dizi benzersiz öğeleri içeren sanıyorlar belirtiniz. Ayrıca eğer çözüm sırası 1 başlar varsayar belirtiniz. (Biraz soru 2, 3, 4...) nereye gittiğini durumlarda izin vermek için modifiye ettim.

düzenleme:Çiftleri işleyen zaman doğrusal ve uzayda sabit bir algoritması yok olduğunu şimdi düşünüyorum. Herkes bu teyit edebilir mi?

Sorun kaynar olursa dizi O(n) zaman, yinelemeler içerip içermediğini test etmek için aşağı yinelenen O(1) Alanı. Eğer bu sadece ilk test edebilir ve eğer varsa orada yapılabilir eğer yineleme yok algoritmaları gönderildi çalıştırın. Yani O yapay genler(n) test süresi(1) uzay Ç?

CEVAP
7 EKİM 2008, Salı


Varsayımı altında sayılar birden az izin verilmez ve yineleme yok, basit bir toplama kimlik için bu toplam Sayı 1 m aralığı 1 (m * (m 1)) / 2. Sonra dizinin toplamı ve bu kimliği kullanabilirsiniz.

Eğer yukarıdaki garanti altında bir program falan varsa bulabilirsin, garanti hayır sayı m yukarıda veya daha az n daha O(N) işaretli olabilir) artı

Pseudo-kod: fikir
0) N Start = 0
1) listedeki N-inci element.
2) Eğer listede sıralanmış olsaydı doğru yerde Değilse, olması gerektiği gibi kontrol edin.
3) Eğer olması gereken yere zaten aynı sayıda Varsa, Eğer DOĞRU geri DÖNÜN
4) Aksi takdirde, numaralar doğru yerde ilk numara koymak için) takas.
5) Sadece ile takas sayıda, doğru yerde mi?
6) hayır, iki adım geri git.
7) Aksi takdirde, adım at başla N = N 1. Eğer bu listenin sonuna geçmiş olsaydı, hiçbir yapay genler var.

Ve, evet, O O(N ^ 2) gibi görünebilir, ancak O(N) çalışır

Herkes için (bir şeyler yorumlardan toplanan) not

Bu çözüm dizisi değiştirebilirsiniz varsayımı altında çalışır,-Taban sıralama O(N) hıza ulaşır) kullanır.

Diğer mathy-çözümler ortaya koymak olmuştur, ama hiçbirini kanıtlanmıştır emin değilim. Yararlı olabilecek miktarda bir sürü vardır, ama onların çoğu bit sabit ekstra alan garanti ihlal edecek toplamını temsil etmek için gerekli sayısında bir kavga içine çalıştırın. Ben de onlara herhangi bir sayı belirli bir grup için farklı bir sayı üretme yeteneğine sahip olup olmadığını bilmiyorum. Bunu hesaplamak için bilinen bir formülü (Wolfram's) olan kare bir miktar işe yarayabilir bence

Yeni bir bakış açısı (bunu çözmek ama ben de gidip ilginç yatak vardır faydası yok esintiler daha fazla):

Bu yüzden, belki de kareler toplamı sum kullanmak belirtilmiştir. Kimse bu işe yaradı mı yaramadı, ve sadece bir sorun olduğunda (x, y) = (n, m), aslında 2 2 = 1 3 gibi olur farkettim ki biliyordu. Kareler de var bu sorun sayesinde Pythagorean triples (yani 3^2 4^2 25^2 == 5^2 7^2 24^2, ve karelerinin toplamını çalışmıyor). Eğer Fermat's last theorem, kullanırsak bu n^3 için olmayacağını biliyoruz. Ama biz de bunu yapacaksak bile haberim yok sürece) için z = n x y ise yok bilmiyorum. Bu da, sonu gelmez garantisi yok yani - ve eğer bu yolda devam edersek biz çabuk biti tükendi.

Benim neşe içinde, ancak, karelerinin toplamını sonu not etmeyi unuttum, ama bunu yaparken de geçerli değil bu normal bir miktar oluşturun. Her ikisini de yapabileceğini sanmıyorum, ama belirtildiği gibi, bir kanıt ya da yolu yok.


, Counterexamples bazen bir şeyler kanıtlamak daha kolaydır bulma söylemeliyim! 28 ve 140 kareler: bir miktar toplamı aşağıdaki tüm dizileri göz önünde bulundurun

[1, 2, 3, 4, 5, 6, 7]
[1, 1, 4, 5, 5, 6, 6] 
[2, 2, 3, 3, 4, 7, 7]

Veya daha az uzunluğu 6 Bu tür örnekler bulamadım. Eğer uygun min ve max değerleri de olan bir örnek istiyorsanız, bu uzunluğu 8 birini deneyin:

[1, 3, 3, 4, 4, 5, 8, 8]


Daha basit bir yaklaşım (hazzen fikir değiştirme):

Uzunluğu m bir tamsayı dizisi tam olarak ıff bir zamanlar n n tüm numaralarını m-1 içerir

  • her dizi öğesi n ve n arasında m-1
  • kopyaları yok

(Sebep: sadece verilen tamsayı aralığında m değerleri vardır, Eğer dizi bu aralıkta m benzersiz değer varsa, onların her birini bir kez içerir) gerekir

Eğer dizi değiştirmek için izniniz varsa, hazzen algoritması hakkında herhangi bir toplama yapmaya gerek yok) değiştirilmiş bir sürümü ile: liste bir geçer hem de kontrol edebilirsiniz

  • Tüm dizi dizinleri m-1 0 Benim için
    1. Eğer dizi[i] < [i] n dizi >= = ^ n m . RETURN FALSE ("aralık dışında değer bulunamadı")
    2. = Dizi[i] - n (0-tabanlı dizi[i] konumunda a . j hesaplamak ^em>sıralanmışn n m-1) değerleri ile dizi
    3. J ben eşit değil ise
      1. Liste[i] = ^ listesi[j] eşittir . RETURN FALSE ("yinelenen")
      2. Liste[i] [j] takas
      3. = Dizi[i] yeniden j - n
  • DOĞRU DÖNÜN

Eğer orijinal dizi değişiklik en fazla O(1) ek alan izin karşı sayılır mı emin değilim, ama öyle olmasa bile bu Gönderen istedim çözüm olur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HowToBasic

    HowToBasic

    8 Aralık 2011
  • Subscribe!!

    Subscribe!!

    3 EKİM 2009
  • TheJoeycool2010

    TheJoeycool2

    12 Temmuz 2010