Sırt çantası problemi neden sözde polinomdur?


90

KnapsackDP ile çözülebilirken bunun NP-tamamlandığını biliyorum . pseudo-polynomial"Girdi uzunluğu" (yani girdiyi kodlamak için gereken bit sayısı) açısından üssel olduğu için DP çözümünün öyle olduğunu söylerler . Maalesef anlamadım. Bu pseudo-polynomialşeyi bana yavaşça açıklayan var mı?


Yanıtlar:


92

N öğe ve W boyutunda sırt çantasıyla sınırlanmamış sırt çantası problemi için çalışma süresi O (NW) 'dır. W giriş uzunluğunda polinom değildir, bu da onu sözde polinom yapan şeydir.

W = 1.000.000.000.000 olarak düşünün. Bu sayıyı temsil etmek yalnızca 40 bit alır, bu nedenle girdi boyutu = 40, ancak hesaplama çalışma zamanı O (2 40 ) olan 1.000.000.000.000 faktörünü kullanır .

Bu nedenle, çalışma zamanının daha doğru bir şekilde üstel olan O ( W cinsinden N.2 bit ) olduğu söylenir .

Ayrıca bkz:


1
"0-1 sırt çantası sorunu için dinamik programlamanın karmaşıklığı" na atıfta bulunan 3 numaralı bağlantı öldü.
dev_nut

1
Maalesef anlamadım. Diyelim ki zaman karmaşıklığı O (N) olan bir algoritmamız varsa, o zaman üstel olan O (2 ^ (bitler N'de)) var mı? Teşekkürler ~
Lusha Li

3
@LushaLi Bu bana yardımcı oldu: youtube.com/watch?v=9oI7fg-MIpE . N, her öğenin sabit bir maksimum boyut girdisine sahip olduğu bir diziyse (dizideki her öğenin 32 bitten fazla olmadığını söyleyin) ve bu dizide bir kez bir for döngüsü çalıştırırsanız, bu, girdide bir polinom zaman algoritmasıdır. dizinin boyutu N. Bununla birlikte, N bir tamsayı ise ve N üzerinde bir döngü çalıştırırsanız, o zaman N sınırsızdır ve onu temsil etmek için gereken bit sayısında üssel olarak artar. Dolayısıyla, N üzerindeki basit bir for döngüsü aslında üsteldir. Dizi durumunda, dizideki her öğenin boyutunun üst sınırlara sahip olduğuna dikkat edin.
max_max_mir

Ben ikna olmadım. Aynı özelliklere sahip "sözde polinom" olmayan birçok algoritma vardır. Eratosthenes Sieve'in (veya herhangi bir asal sayı bulucunun) karmaşıklığı nedir?
Ofir A.

31

Sorunlarımızın çoğunda, standart int / float veri türlerine rahatça uyan büyük sayı listeleri ile uğraşıyoruz. Çoğu işlemcinin, ek bir maliyet olmaksızın bir seferde 4-8 baytlık sayıları işleyecek şekilde inşa edilme şekli nedeniyle (sayılara göre, örneğin 1 baytlık), çalışma süresinde, sayılarımızı büyütme veya gerçek problemlerde karşılaştığımız aralıklar dahilinde - bu nedenle baskın faktör, yalnızca veri noktalarının miktarı, alıştığımız n veya m faktörleri olarak kalır.

(Big-O gösteriminin, veri başına 32 veya 64 biti bölen sabit bir faktörü gizlediğini ve sayılarımızın her biri bu kadar bit veya daha azına sığdığında yalnızca veri noktalarının sayısını bıraktığını hayal edebilirsiniz. )

Ancak, temsil etmesi için 8 bayttan fazla gerektiren sayılar olan büyük tamsayı içeren veri kümeleri üzerinde işlem yapmak için diğer algoritmalarla yeniden çalışmayı deneyin ve bunun çalışma zamanına ne yaptığını görün. İlgili sayıların büyüklüğü, ikili sıralama gibi diğer algoritmalarda bile her zaman bir fark yaratır, bir kez güvenlik tamponunun ötesine geçtiğinizde, geleneksel işlemciler 4-8 baytlık yığınları işleyerek bize "ücretsiz" verir.

Tartıştığımız Knapsack algoritmasının püf noktası, belirli bir parametrenin (W) büyüklüğüne (diğer algoritmalara göre) alışılmadık derecede hassas olmasıdır. W'ye bir bit ekleyin ve algoritmanın çalışma süresini ikiye katlarsınız. Bundan önce diğer algoritmalardaki değer değişikliklerine bu tür dramatik bir tepki görmedik, bu yüzden Knapsack'e farklı davranıyormuşuz gibi görünebilir - ancak bu, polinom olmayan bir şekilde nasıl tepki verdiğinin gerçek bir analizi giriş boyutundaki değişikliklere.


9

Sırt çantası algoritmasının çalışma süresi yalnızca girdinin boyutuna (n - öğelerin sayısı) değil, aynı zamanda girişin büyüklüğüne (W - sırt çantası kapasitesi) O (nW) bağlıdır ki bu nasıl olduğu konusunda üsteldir. Bilgisayarda ikili olarak temsil edilir (2 ^ n). Hesaplama karmaşıklığı (yani işlemin bir bilgisayarda bitler aracılığıyla nasıl yapıldığı) büyüklükleri / değerleri ile değil , yalnızca girdilerin boyutuyla ilgilidir .

Değer / ağırlık listesini bir an için göz ardı edin. Diyelim ki sırt çantası kapasitesi 2 olan bir örneğimiz var. W giriş verilerinde iki bit alacaktır. Şimdi geri kalan girdiyi koruyarak sırt çantası kapasitesini 4'e çıkaracağız. Girdilerimiz yalnızca bir bit arttı, ancak hesaplama karmaşıklığı iki kat arttı. Kapasiteyi 1024'e yükseltirsek, W için 2 yerine sadece 10 bit girişimiz olur, ancak karmaşıklık 512 kat artmıştır. Zaman karmaşıklığı, ikili (veya ondalık) gösterimde W boyutunda üssel olarak büyür. .

Sözde polinom kavramını anlamama yardımcı olan bir başka basit örnek, saf asallık test algoritmasıdır. Belirli bir n sayısı için, 2..√n aralığındaki her tam sayıya eşit olarak bölünüp bölünmediğini kontrol ediyoruz, bu nedenle algoritma √ (n − 1) adım atıyor. Ama burada n, girdinin büyüklüğü değil büyüklüğüdür.

                     Now The regular O(n) case

Buna karşılık, belirli bir eleman için bir dizi araması şu polinom zamanında çalışır: O (n). En fazla n adım alır ve burada n, girdinin boyutudur (dizinin uzunluğu).

[buraya bakın]

Ondalık sayıyı saklamak için gerekli bitleri hesaplama


3
Öyleyse, son arama örneğiniz için, neden n'yi de ikili olarak düşünmüyorsunuz? n = 1024 ise, aynı zamanda sadece 10 bit alır, bu yüzden sözde polinom olması gerekmez mi?
user1024

7

Bunu anladığım kadarıyla, kapasite girdisi bir W boyutuna sahip [1,2, ..., W] dizisi olsaydı, kapasite O (W) olurdu. Ancak kapasite girdisi değildir bir sayı dizisi, bunun yerine tek bir tam sayıdır. Zaman karmaşıklığı hakkında ilişkiye için büyüklük girişinin. Boyutu , bir tam sayı bir tamsayı değeri, ancak temsil eden bitlerin sayısı değil. Daha sonra bu W tamsayısını algoritmada bir diziye [1,2, ..., W] dönüştürüyoruz, insanları yanlışlıkla W'nin boyut olduğunu düşünmeye yönlendiriyoruz, ancak bu dizi girdi değil, tamsayının kendisi.

Girdiyi "bir şeyler dizisi" ve boyutu "dizide kaç tane öğe" olarak düşünün. Öğe girişi aslında dizideki n öğeden oluşan bir dizidir, bu nedenle size = n. Kapasite girişi bir W sayı dizisi DEĞİLDİR , ancak bir dizi günlük (W) bitiyle temsil edilen tek bir tam sayıdır . Boyutunu 1 artırın (1 anlamlı bit ekleyerek), W iki katına çıkar, böylece çalışma süresi iki katına çıkar, dolayısıyla üstel zaman karmaşıklığı oluşur.

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.