Bir miktar toplamı 'varsayılmamak' için verimli algoritma


24

Çok sayıda doğal sayının X olduğu göz önüne alındığında, olası tüm toplamların kümesini düşünün:

sums(X)={iAi|AX}

Örneğin, toplamları({1,5})={0,1,5,6} , toplamları({1,1})={0,1,2} .

Ters işlemi hesaplamak için en etkili algoritma hangisidir (toplam girdilerin boyutuna göre ölçülür)? Özellikle aşağıdakilerden herhangi birini etkin bir şekilde hesaplamak mümkündür:

  1. Belirli bir kümenin geçerli bir toplamlar kümesi olup olmadığı. (Örneğin, {0,1,2} geçerlidir ancak {0,1,3} değil.)
  2. Verilen kümeye toplanan bir çoklu ayar.
  3. En küçük Verilen setine multiset o meblağlar. (Örneğin, {1,2} ve {1,1,1} her ikisi de toplamına sahiptir ,{0,1,2,3} ancak eskisi daha küçüktür.)

1
Muhtemelen bize verebilir misiniz MultiSet toplamlarının ziyade setini toplamlarının? Bu hoş bir simetri yaratacaktır (çok değerli bir değere başladığınızda görmek).
DW

1
Başka bir soru - en çok teorik sonuçlarla (örneğin, asimptotik karmaşıklık) veya pratik çözümlerle (pratikte iyi çalışabilecek şemalar) ilgileniyor musunuz? İkincisi, parametreler için tipik değerler hakkında bir fikriniz var mı: örneğin, multiset X'in boyutu, multiset X'deki en büyük öğenin boyutu, en yüksek çokluğun boyutu? Bu, bir ILP çözücü veya SAT çözücü gibi "büyük bir çekiç" uygulamasının makul olup olmadığını etkileyebilir.
DW

@DW Kesinlikle multiset yerine toplamlar kümesini kullanmakla ilgileniyorum (yine de ilginç bir problem olabilir). Ayrıca, bu aslında bir eğlence matematiği problemiydi, bu yüzden pratik bir çözümden ziyade karmaşıklık sınırlarıyla ilgileniyorum.
Uri Granta

3
Toplamların çokluğu verilirse , bunu daha hızlı yapmak oldukça basittir (örneğin, math.stackexchange.com/questions/201545/… ).
jschnei

@UriZarfaty giriş olarak verilen küme zaten sıralandı mı? Sonunda bu ayarlanmış mı, multiset mi? Yorum hala saf set istediğinizi önerir.
Evil

Yanıtlar:


9

Çözüm

Çözüm iki bölümden oluşmaktadır. Önce minimal seti keşfettik, sonra güç toplamını temsil edebileceğini ispatladık. Çözüm programlama uygulaması için ayarlandı.

Minimal küme algoritması

  1. Maksimal elemanının Bul toplamı (çoklu) kümesinden. P , potansiyel minimum (çoklu) set başlangıçta boştur.birmP

  2. Sadece bir grup, temsil olmadığı sürece kadar ekleyin toplamları bir çift olarak mümkün olan tüm yollarla bir m , S i j = { ( a i , bir j ) | a i + a j = a m }birmbirmSbenj={(birben,birj)|birben+birj=birm}

  3. Toplamlar kümesindeki tüm öğelerin dahil edildiğini kontrol edin.

  4. Maksimal elemanı Bul tüm S ı j aşağıdaki özelliği ile (birlikte anlam): her biri için S ı j , bir s ya olduğu S i j , ya da bulabilirsiniz bir p böylece toplamlarının kümesinden bir p + bir s olan S i j .birsSbenjSbenjbirsSbenjbirpbirp+birsSbenj

  5. Bu durumda ise, içermeyen bir s , sadece toplam bir s + bir p , kaldırma bir p + a s gelen S i j (veya sadece göz ardı bir işareti ayarlanır) ve ekleme , bir p ve a s olarak S i j yerine.Sbenjbirsbirs+birpbirp+birsSbenjbirpbirsSbenj

  6. Eğer her bir element varsa, onu tüm S i j'den bir kez çıkarın (ya da yok saymak için bir işaret koyun ve daha fazla dokunmamaya dikkat edin) ve onu potansiyel olarak ayarlanmış en az ayarlanmış P elementlerinin listesine ekleyin .SbenjSbenjP

  7. Tüm boşalana kadar tekrarlayın.Sbenj

  8. kısmı boş kalırsa ve devam edemezsek , tüm S i j'nin maksimum değeri ile tekrar deneyin .SbenjSbenj

  9. Özyinelemeli adımları silmeden yeniden yaratın ve üzerinden güç ayar kapsama algoritmasına devam edin . (Bundan önce, P'nin iki öğenin toplamı olarak temsil edilemeyen tüm öğeleri içerdiğinden emin olarak kesin olarak ayarlanmış olmaları gerektiği için güvenli bir kontrol yapabilirsiniz. Örneğin, minimum öğe P'de olmalıdır .)PPP

(10. Algoritmanın amacı olan minimal bir set çözümünün aynı sayının birden fazla tekrarını içeremediğini gözlemleyin.)

Örnek:

{2,3,5,7,8,10,12,13,15}

Toplamı, iki kümenin toplam sayısından iki sayının toplamı olarak tüm olası şekillerde temsil eder.

(13,2),(12,3),(10,5),(8,7)

Tüm gruplarda bulunan veya toplam olarak gösterilebilecek maksimum sayıyı bulmaya çalışın. Belli ki 8'den aramaya başlayabiliriz, bunun üzerinde bir nokta yok.

Birinci gruptan 13, 13 = 8 + 5'tir, yani 13 iyidir, fakat ikinci gruptan 12'si iyi değildir çünkü toplamlarda 12 = 8 + 4 yapacak 4 yoktur. Daha sonra 7 ile deniyoruz. Fakat hemen 13'ü kaplayamıyoruz, 6 yok.

Daha sonra 5. deneyin. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5 ve sonuncusu için 8 = 5 + 3 veya 7 = 5 + 2 ama ikisi için değil. Gruplar şimdi:

((5,8),2),((5,7),3),((5,5),5),((5,3),7)

5 tüm gruplarda tekrar ediyor, bu yüzden . Her gruptan sadece bir kez 5 çıkartıyoruz.P={5}

(8,2),(7,3),(5,5),(3,7)

Açıkçası, 5'ten daha yükseğe çıkmanın bir anlamı olmadığı için tekrar 5'i deniyoruz. 8 = 5 + 3, 7 = 5 + 2, yani her şey yolunda

((5,3),2),((5,2),3),(5,5),(3,(5,2))

Yinelediği için tüm gruplardan bir 5'i tekrar alın. (Bu yaygın değil, ancak durumumuz kasıtlı olarak, tekrarlarımız olması durumunda ne yapacağımızı göstermek için yaratılmıştır.) P={5,5}

(3,2),(2,3),(5),(3,2)

Şimdi 3'ü denedik ve 5 = 3 + 2'ye sahibiz. Gruba ekle.

(3,2),(2,3),(3,2),(3,2)

Şimdi 3 ve 2'yi çıkarın çünkü her yerde tekrar ediyorlar ve biz iyiyiz ve gruplar boş.P={5,5,3,2}

(),(),(),()

Şimdi, bu basitçe yapmak demektir, kaldırma olmadan özyinelemeli adımları yeniden oluşturmanız gerekir gerçekten öğeler çıkarmadan yukarıda sadece onları yerleştirerek P ve artık bunu değiştirmek için değil işaretleme.SbenjP

( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7

(13,2),(12,3),(10,5),(8,7)
( ( 5 , ( 5 , 3 ) ) , 2 ) , (( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
((5,8),2),((5,7),3),((5,5),5),((5,3),7)
((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))

Güç seti kapsama

Bu bölümün amacı, bulunan minimum setin güç toplamı setini kapatabildiğini kontrol etmektir. Bulunan bir çözümün verilen tüm toplamları kapsayabileceği, ancak bunların güç seti toplamları olmadığı mümkündür. (Teknik olarak, sadece bulunan minimum kümeden bir güç toplamı kümesi oluşturabilir ve güç toplamının belirttiği gibi her toplamın başlangıç ​​toplamı kümesinde olup olmadığını kontrol edebilirsiniz. Bu, zaten sahip olduklarımızla birleştirilenlerin hepsidir, yani hiçbir şey boşa harcanmaz Özyinelemeyi geri alırken bu bölümü yapabilirsiniz.)

  1. Minimal kümedeki tüm elemanları 2 ardışık güç kullanarak kodlayın. Sipariş önemli değil. Aynı öğeyi, tekrar ettiği sayıda, yeni bir değerle kodlayın. C = 1'den başlayın, sonraki her eleman C = 2C'ye sahip.

(2=[1],3=[2],5=[4],5=[8])
  1. Geri yüklenen özyineleme listesindeki öğeleri değiştirin,

((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))

kodlamada: 2 ile 1, 3 ile 2, 5 ile 4 ve bir de 5 ile 8.

((4,(8,2)),1),((4,(8,1)),2),((4,(2,1)),8),((8,2),(4,1))
  1. Şu anda sahip olduğumuz tüm ara toplamları toplayın (1,2,4,8)

((4,(10)),1),((4,(9)),2),((4,(3)),8),((10),(5))

Ara toplamlar (1,2,3,4,5,8,9,10)

((14),1),((13),2),((7),8),(15)

Ara toplamlar (1,2,3,4,5,8,9,10,13,14,15)

{(15),(15),(15),(15)}
  1. 2m-1mm=4

  2. eksik sayıları topla12m-1

(6,7,11,12)

  1. Yokluğunu aşağıdaki şekilde belirtin: her sayıyı ikili biçimde temsil edin

(6=01102) (7=01112) (11=10112) (12=10102)

601102(2=[1],3=[2],5=[4],5=[8]){2,3,5,7,8,10,12,13,15}, yani her şey yolunda.

701112(2=[1],3=[2],5=[4],5=[8])

1112 , 3 + 5 ve 8 ise listede.

Herhangi bir ikili gösterimi bulunamayan toplamaya karşılık gelirse, çözüm olmadığını bildiriniz.

(2,3,5,5)

Tartışma

Toplamların, ikili genişlemede gizlenmiş olan güç setinin tamamlanıp tamamlanmadığını kontrol eden algoritmayı sağlamak gerekiyordu. Örneğin, ilk örneği 8 ve 7'yi hariç tutarsak, ilk bölüm yine de çözümü sunar, yalnızca ikinci bölüm eksik toplamlar kombinasyonunu bildirir.

mnlOg(m)mgünlük2(m)mngünlük(m) , ikili bir arama.

mgünlükmmgünlük2(m) .

mgünlük3(m)

Algoritmanın bazı kısımları, toplam çiftini lineer zamanda bulabileceğimizi varsaymaktadır ve bu da sıralama gerektirmektedir.

Yanlış başlangıç

2,3,4,5,6,7,8,9,10,11,12,13,152,3,4,6Sbenj . Bu yüzden başarısızlık durumunda oradan başlamayı önerdik.

Başka bir örnek, 5'ten algoritmayı kaçırır ve başlatırsanız, elde edersiniz.5,4,3,3 ancak bu 2 içermez.

2,2,3,4,42,3,4,6 . Bu sürümleri kapsayan özel kurallar vardır.

Bu algoritmanın amacı, hepsini doğru bir şekilde başlattıktan sonra bir çözüm sunmaktır.

İyileştirmeler

4. Adım, bu şekilde yükseltilebilecek olandır: maksimal yerine, her koşulu, verilen koşulu sağlayan azalan düzende deneyebiliriz. Her biri için ayrı bir şube oluşturuyoruz. Bazı dallar bir çözüm vermezse, iptal edin.

2,3,4,5,6,7,8,9,10,11,12,13,157,6,5,4hepsi ilk testten geçtiklerinden beri ayrı şekillerde. (2 veya 3'ü kullanmak için hiçbir neden yoktur, çünkü bunların altında yatan grupta olmaları gerektiğini biliyoruz.) Ve sonuna kadar ulaşabilecek tüm sürümleri toplayana kadar bu şekilde devam edin. Bu, birden fazla altta yatan seti keşfedebilecek tam kapsamlı bir çözüm yaratacaktır.

Başka bir şey, eğer durum minimumsa birden fazla tekrar yapamayacağımızı bildiğimiz için bunu algoritmamıza dahil edebiliriz.

Genel olarak, 4. adımdaki koşul, her grupta bir sayının tekrarlanması veya toplam yaratma kabiliyetine sahip olmamız şartı, bizi doğrudan üssel sulardan kurtaracak kadar güçlüdür; bu, her kombinasyonu denemek ve gücü oluşturmak için bir algoritma olacaktır Bir eşleşme bulana kadar her birini ayarladık.


1
Daha genel olarak: Bir algoritmanın yazılı bir tanımını görüyorum, ancak (a) sözde kod yok ve (b) doğruluk kanıtı yok. Bu yaklaşımın neden tüm girdilerde doğru çalışacak bir algoritma sağladığını düşünüyorsunuz? Gerekçe nedir? Bunun için bir doğruluk kanıtı var mı?
DW

Bence bu problem hep beraber yaklaşık 30 saat sürüyor (30 saatte bir, işte ...). Ancak ücretli bir seçenek yoktur.

Sonunda cevabı hak ettiği detayda okuyun. Harika iş!
Uri Granta

1

NOT: Bu genel olarak pek işe yaramıyor, bkz. Uri'nin aşağıdaki örnek örneği.

YY

  • 0Y
  • yYyXY
  • z1<<znYY'Y=Y'+{0,y}0Y'ben=1,...,nzben+yYzbenY'zben-yYzben+yYzben+yYzbenY' .
  • Y'y,y',...

1yO(n)O(n2) toplam karmaşıklık (aritmetik işlemler için varsayarak birim maliyetleri).

Y={0,1,3,4,5,6,7}{0,1,3,4,6}{0,1,3,5,6}yY{bir+ky}YY'


Y 'nin çıkmaza yol açmadığı açık mı? Sonuçta, Y = Y '+ {0, y} olacak şekilde birçok Y olabilir. Örneğin, {0,1,2,3,4} = {0,2,3} + {0,1} = {0,1,2,3} + {0,1} fakat önceki ayrışma bir çıkmaz sokak.
Uri Granta

Bu doğru ve gerçek bir problem. Düzeltilip düzeltilemeyeceğini görmem gerekecek. Teşekkürler!
Klaus Draeger

Y'kY=Y'+{0,y,...,y}{0,y,...,y}kyY'
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.