Değişkenleri değiştirerek benzersiz çıktıların sayısı


9

Bunun gibi bir dizi formül verildi:

bacb
bcab
cbba
abbc

Her formülde her değişken "0" veya "1" yerine ikame edildiğinde elde edebileceğiniz benzersiz sonuçların sayısını bulan bir algoritma verin.

Her (k!)^2biri 2k-1değişken ve k^2terim içeren formüller vardır . Asimtotiklerinizi k.

En hızlı algoritma kazanır. Eşitlik olması durumunda, asimptotik bellek kullanımı düşük olan çözüm kazanır. Eğer hala bir kravat varsa, ilk yazı kazanır.


Yukarıdaki örnek için değişkenler değiştirilerek aşağıdaki sonuçlar elde edilebilir:

1110, 0110, 1001, 0100, 1000, 0000, 0010, 1101, 1111, 0001, 1011, 0111

Yani doğru cevap 12'dir. Diğerlerinin yanı sıra, 1010yukarıdaki formüller kullanılarak yapılamaz.

230 , 12076 ve 1446672 çözümleriyle üç test durumu daha yaptım .


Açıklama: Sorudaki k nedir? Sadece soyut bir sabit midir?
isaacg

@isaacg Evet. Örneğin, daha az ama daha büyük formüller için daha hızlı olan çözümler arasındaki bağları önlemek.
orlp

Yani her harf a,, b... bir değişken midir? Ve her zaman sadece düzensiz sayıda değişkenimiz var mı? Değişkenlerin sırasının ne kadar olduğu ve kaç formülün verildiği önemli değil mi?
flawr

@flawr Değişken sayısı, terim sayısı ve formül sayısı arasındaki kesin ilişki soruda verilmiştir.
orlp

'Olabilir' , $ (k!) ^ 2 $ formülüne kadar ulaşabileceğiniz anlamına mı geliyor yoksa tam olarak $ (k!) ^ 2 $ formülü var mı? Bunun yanı sıra, bu özelliklere sahip bir algoritma başvurunuz var mı? Sadece soruyorum çünkü özellikler oldukça keyfi görünüyor.
flawr

Yanıtlar:


2

Mathematica, O (k ^ 2 (k!) ^ 2) süre

Length[Union@@(Fold[Flatten[{StringReplace[#,#2->"0"],StringReplace[#,#2->"1"]}]&,#,Union[Characters[#]]]&/@#)]&

İnşallah zaman karmaşıklığını doğru hesapladım. Girdi, gibi formüllerin bir listesidir {"bacb","bcab","cbba","abbc"}. Makinemdeki her test durumu için 30 saniyeden daha kısa sürede çalışıyor, ancak mutlak zamanları kimin umurunda?

Açıklama:

  • İlk &olarak, sonunda #, ilk argümana atıf #2, ikinci argüman olmak vb. İle saf bir işlev haline gelir .
  • Length[*..*] içindeki listenin uzunluğunu alır.
  • Union@@(*..*)içerilen listeyi alır ve bağımsız değişken olarak sağlar Union; bu, bağımsız değişkenlerinin herhangi birindeki benzersiz öğelerin listesini döndürür.
  • *..*&/@#saf bir işlevi alır ve onu formül listesi üzerinde eşleştirir, böylece {a,b,c}olur {f[a],f[b],f[c]}. Yuvalanmış saf işlevlerde, #nen içteki argümanlarına atıfta bulunduğunu unutmayın.
  • Fold[*..*&,#,*..*]akümülatör işlevi, başlangıç ​​değeri ve liste alır ve döndürür f[f[...[f[starting value,l_1],l_2],...],l_n].
  • Union[Characters[#]] geçerli formüldeki tüm karakterleri alır ve tüm benzersiz öğeleri alır, bize değişkenleri verir.
  • Flatten[*..*]argümanını düzleştirir, böylece {{{a},b},{{c,{d}}}}olur {a,b,c,d}.
  • {*..*,*..*}yukarıdakileri kullanarak iki sonucu birleştirmenin bir yoludur Flatten.
  • StringReplace[#,#2->"0/1"]Bir önceki sonucunu ve ya değiştirilir akım değişken ile döner alır 0veya 1.

Neden kzamanınızda değişken olarak kullanıyorsunuz ? Yine de, faktöriyel zaman! Uf!
theonlygusti

Operasyon şöyle dedi: "Asimptotiklerinizi ifade edin k." Ayrıca, GeneralUtilities`Benchmarkkullanılan her yöntem için bir yapmak zorunda kaldı .
LegionMammal978

Algoritmanızın açık bir İngilizce açıklamasını eklemek ister misiniz? Mathematica'yı bilmiyorum, bu yüzden çözümünüzü doğrulayamıyorum.
orlp
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.