Neden sayısal algoritmalarda sayıların tekli gösterimini almıyorsunuz?


15

Yalancı polinom zaman algoritması, giriş değerinde (büyüklük) polinom çalışma süresine, ancak girdi boyutunda (bit sayısı) üstel çalışma süresine sahip bir algoritmadır.

Örneğin , sayısının asal olup olmadığını test etmek , 2 ile n - 1 arasındaki sayılar arasında bir döngü gerektirir ve n mod i'nin sıfır olup olmadığını kontrol edin . Mod O (1) zaman alırsa, toplam zaman karmaşıklığı O (n) olacaktır.nn1n i

Ancak girişi yazmak için gerekli bit sayısı olmasına izin verirsek , x = log n (ikili) böylece n = 2 x ve problemin çalışma süresi üstel olan O ( 2 x ) olacaktır .xx=lognn=2x2x

Sorum şu: girişinin tekli temsilini düşünürsek, her zaman x = n ve sonra sözde polinom zamanı polinom zaman karmaşıklığına eşit olacaktır. Peki neden bunu asla yapmıyoruz?nx=n

Ayrıca sırt çantası için sözde polinom zaman algoritması bulunduğundan, alınarak sırt çantası sonuç olarak P = NP olarak polinom olacaktır.x=n


3
Aslında bunu çok sık yapmıyoruz. Aynı nedenlerden dolayı genellikle tekli dillerle uğraşmıyoruz, ancak bu hayvanlarla ilgili birçok ilginç sonuç var. Buna baktın mı?
André Souza Lemos

2
Evet, eğer büyüklük ve büyüklük arasındaki farkı ortadan kaldırırsanız, o fark üzerine kurulu tüm kavramları kaybedersiniz.
André Souza Lemos

7
Çünkü iblis güzel bir elbise giyiyor. Hiçbir şeyi daha hızlı yapmaz, sadece "çalışma süresi karmaşıklığını" anlamsız hale getirir.
Raphael

4
@Drupalist Tekli sırt çantası sorununun NP-tam olduğu bilinmemektedir, çünkü sırt çantası sorunundaki normal azalma sayıların ikili olarak yazıldığını varsayar. Standart redüksiyonu yapmaya çalışırsanız, ancak sayıları tek tek yazıyorsanız, redüksiyon polinom zamanında hesaplanamaz. Sonuç olarak, polinom zamanda çözülebilir olmaktan tekli sırt çantası sorunu olur değil o P = NP demek.
templatetypedef

2
Sözde polinom , özellikle bu etiketli diğer cevapları kontrol etmek isteyebilirsiniz .
Raphael

Yanıtlar:


17

Bunun anlamı, tekli sırt çantasının P'de olmasıdır. Bu, sırt çantasının (ikili kodlanmış sayılarla) P'de olduğu anlamına gelmez .

Sırt çantasının NP-tam olduğu bilinmektedir. Sırt çantasının P'de olduğunu gösterirseniz, bu P = NP'yi gösterir.

Ancak sırt çantasının P'de olduğunu göstermediniz. Tekli sırt çantasının P'de olduğunu gösterdiniz. Ancak, tekli sırt çantasının NP-tam olduğu bilinmemektedir (aslında, standart şüphe büyük olasılıkla NP-tam değildir ). Bu nedenle, P'ye tekli sırt çantası koymak, P = NP olduğu anlamına gelmez.


Peki, sırt çantası veya tekli sırt çantası hakkında hangi sorunu daha fazla önemsemeliyiz? Motivasyonunuz pratik kaygılara dayanıyorsa, cevap sırt çantası sorununu çözmek istediğiniz sayıların boyutuna bağlı olacaktır: eğer büyükse, sırt çantasıyla tekli sırt çantasından daha çok ilgilenirsiniz. Motivasyonunuz teorik kaygılara dayanıyorsa, sırt çantası tartışmasız daha ilginçtir, çünkü daha derin bir anlayış elde etmemize izin verir - boyut ile büyüklük arasındaki ayrımı yapmamıza izin verir - oysa sırt çantası bu ayrımı yapmamızı engeller.


Sırt çantası sorununun dinamik programlama algoritması hakkındaki takip sorusunu cevaplamak için:

Evet, aynı dinamik programlama algoritması olabilir hem arka çantalar ve tekli çantaya uygulanabilir. Çalışma süresi sayıların büyüklüğünde polinomdur, ancak ikili olarak kodlandığında sayıların uzunluğunda üsteldir (polinom değil). Bu nedenle, çalışma süresi , giriş tekli olarak kodlandığında giriş uzunluğunda polinomdur, ancak giriş ikili olarak kodlandığında giriş uzunluğunda polinom değildir . Biz neden en Yani do tekli sırt çantası için bir polinom zamanlı algoritması olmak için bu dinamik programlama algoritması düşünün, ama yok o (ikili kodlanmış) knapsack için polinom zamanlı algoritması olarak kabul etmekteyiz.

Bir algoritmanın, çalışma süresi en fazla bit uzunluğundaki giriş uzunluğunun bir polinomuysa, polinom zamanında çalıştığını söylediğimizi hatırlayın .


1
Çok teşekkür ederim, aynı algoritmanın tek ve tek olmayan karmaşıklık sınıfının farklı olabileceğini bilmiyordum. Standart sırt çantasının dinamik programlama çözümü neden tekli sırt çantasına uygulanamaz ve farklı bir karmaşıklık sınıfına yol açtı? Sorunların sıradan halini anlamada sorun yaşıyorum.
M ama D

@Drupalist, bu soruyu cevaplamak için sonunda iki paragraf eklemek üzere cevabımı düzenledim.
DW

x=n

x=n

1
@NikosM., Tamam, anladım. Geri dönüşünüz için teşekkür ederiz. Şahsen, ifadenin yanlış olduğuna inanmıyorum, bu yüzden olduğu gibi bırakacağım. (Akıl yürütmem: Girdinin uzunluğu temsil seçimine bağlıdır, bu yüzden yazdığınız hiçbir şeyle çelişmediğine inanmıyorum.) Ancak bakış açımın çok dar veya daha ayrıntılı bir açıklama veya açıklama olması mümkündür. farklı bir bakış açısı değer katabilir. Bu noktanın daha net olabileceğini düşünüyorsanız, ek bir cevap yazabilirsiniz veya düzenleme öneriniz.
DW

6

DW'nin cevabına küçük bir şey eklerdim:

Tekli Knapsack'in P'de olduğu için bunu gören insanları gördüm, bu yüzden en iyi güncel algoritmaların üstel zamana sahip olduğu Knapsack'in yerine kullanabiliriz.

W={w1,,wn}kO(nk)

O(nk)

Tek başına bir sorunu önemsiyorsanız bunu yapabilirsiniz. Aslında algoritmalardaki insanlar genellikle bunu yaparlar. Grafik algoritmalarının karmaşıklığı, genellikle kodlayan dizenin boyutu değil, sayı köşeleri ve kenar sayısı açısından ifade edilir.

Ama bu sadece izole bir sorunla uğraşırken. Farklı girdilerle ilgili problemlerle uğraşırken yararlı değildir. Grafikler için, köşe ve kenar sayısına göre çalışma süresinden bahsedebiliriz. Knapsack için, öğelerin sayısı ve Knapsack'in boyutu hakkında konuşabiliriz. Ama ya ikisinden de bahsetmek istersek? Örneğin, problemler arasındaki azalmaları azaltmak ya da sadece girdi olarak bir grafiğe sahip olanları değil, rasgele problemleri içeren problem sınıfını tartışmak istediğimizde. Evrensel bir girdi parametresine ihtiyacımız var. Genel olarak bir girdi sadece bir dizedir, sembollerini tekli sayılar, ikili sayılar, grafikler vb. Olarak yorumlayan biziz. Algoritmanın ve problemlerin genel bir karmaşıklık teorisini geliştirmek için genel bir girdi parametresine ihtiyacımız var. Girdinin boyutu açık bir seçimdir ve bunun üzerine makul bir teori oluşturabileceğimiz kadar sağlam olduğu ortaya çıkmaktadır. Tek olasılık bu değil. Yapay bir teori için,2

k100100k21001kk21001

nnp(n)kp(n)k2p(n)1kk

nk


Çok teşekkür ederim, bir soru daha, girdiyi tekil temsiline dönüştürerek bir sayının asal olup olmadığını belirleme problemine ne olacak? Bu problem, girdi büyüklüğüne dayalı polinomdur, ancak girdi bitlerine dayalı olarak üsteldir (soruda belirttiğim gibi), bu dönüşüm daha iyi bir şey yapar mı?
M ama D

nO(n)nb=210241210241210241
Kaveh

güzel açıklama, ancak bu yazı ile ilgili DW cevabının altında benim yorum bir göz atın
Nikos M.

2

Kısacası ve basit, size nedenini göstereceğim.

Tally

x = input integer

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

xxO(2n)

Tally/UnaryO(n)x

x = input tallies

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

Giriş gösterimi, kodun daha hızlı çalışmasını sağlamaz. Her ne kadar 2. algoritma gerçekten çok zamanlı olsa da. RSA için faktörleri bulmakta çok pratik değil.


Güzel bir örnek, teşekkürler
M ama D
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.