Joker karakter dizesinin kümedeki başka bir joker karakter dizisiyle tamamen eşleşip eşleşmediğine karar verme


9

İşte bir süredir beni rahatsız eden bir sorun. Dize diyelim 1s ve 0s dizisidir ve joker karakter dizesi 1, 0 ve? S dizisidir. Tüm dizeler ve joker karakter dizeleri aynı uzunlukta. Bunlar standart UNIX joker karakterleri; 10 ?? 1 maçlar 10011, 10111, vb - a? bu konumda 1 veya 0 ile eşleşir. Eğerv ve w joker karakter dizeleridir, o zaman yazıyoruz vw her dize ile eşleşiyorsa v tarafından da eşleştirildi w.

Sorunlar : bir set verildiS joker dizeleri ve bir sorgu v (ayrıca bir joker karakter dizesi), wS öyle ki vw? Ve eğer değilse, ekleyebilir miyizv için S verimli?

İşte bariz O(kmn) çözüm (nerede k dizelerin boyutu, mRAM'in kelime boyutu (genellikle 32 veya 64)): listenin her bir öğesini gözden geçirin ve koşulu test edin (bit-twiddling kullanılarak 2 veya 3 işlemle yapılabilir). Ayrıca,vw herhangi bir öğe için tutar wbiz tararken. Eğerv testimizi geçemez, sonra ekleyin v ayarlayın ve wişaretledik.

Ama bu yeterince hızlı değil. Bir şey olsaydı gerçekten harika olurduO(logn) çözüm veya mükemmel bir dünyada, bir sayı tabanı ağacına benzer karmaşıklık (O(k)). Ayrıca, sorguların yaklaşık olarak doğru olması da uygundur :vw, sonra evet ya da hayır; ama durum kesinlikle yoksa hayır geri dönün.

Bu en kötü durum karmaşıklığına yardımcı olmasa da, tüm öğelerin Sbir joker karakter dizesiyle sınırlıdır; yani, bazı varv öyle ki herkes için wS, vw.

Denediğim fikirler

  • Joker karakter dizeleri bir birleştirme-yarı-dilimi oluşturur. Joker karakter dizelerini tutan bir n-ary ağacımız olabilir; yapraklar joker karakter dizileri olacak ve dallar tüm çocukların birleşmesini temsil edecekti. Sorgu ve birleştirme karşılaştırılamazsa, o daldaki tüm çocuklarla karşılaştırmaya çalışırken zaman kaybetmek zorunda değiliz. Ayrıca, bir güncelleme yaparsak ve güncelleme bir birleştirmeden daha büyük olursa, tüm şubeyi silebiliriz. Ne yazık ki, bu halaO(n) en kötü durumda ve ağaç eklemek için her zaman "en iyi" birleşimleri bulamıyoruz.
  • Kişi bir sayı tabanı oluşturabilir S. Biz biliyoruz kiSbazı joker karakter dizeleriyle sınırlıdır; varsayalım ki? 0? 0. Daha sonra, trie'nin tüm dalları sadece dizelerin 1. ve 3. bitlerinde olmalıdır. Sorgunun dallandığımız geçerli bit 1 ise,? ve 1 şube; 0 ise,? ve 0 dal; öyleyse ?, biz sadece kontrol? dalı. Potansiyel olarak birden fazla dal almamız gerektiğinden, bu çok iyi görünmüyor (aynı nedenden dolayı üçgeni güncellemek zor). Eşleştirme çok hızlı bir işlem olduğundan, bir ağaçta çok fazla hareket yapmak için naif stratejiye kıyasla acıyor (bir grup işaretçi izlemek bazı OR'ler ve AND'ler yapmaktan çok daha pahalıdır).

Alakalı iş

  • Ağ topluluğunda, bu sorun "paket sınıflandırması" olarak ortaya çıkmaktadır, burada bilinen algoritmaların ve veri yapılarının iyi bir araştırması bulunmaktadır . Ne yazık ki, hemen hemen her zaman joker karakter dizelerinin yalnızca öneklerle eşleştiği varsayılmaktadır ve sorgu bu dizelerin bir demetidir. Tabii ki, genel bir joker karakter dizesini her zaman şu ölçütleri karşılayacak şekilde dönüştürebiliriz: 1? 00? 1 ?? (1,?, 0, 0,?, 1,?,?). Ancak bu etkili olmaz. Diğer varsayım, bu tuple'lerin bir "renk" ile ilişkili olduğudur ve sorgulamanın rengi döndürmesi gerekir (sadece eşleştiği değil). Bu, sorunu daha da zorlaştırır, çünkü tuples'i sipariş etmeliyiz (ya da (0,?) Ve (?, 1) eşleşmelerinden (0, 1) hangisinin belirsiz olduğu).

  • Algoritmalar topluluğunda "umurumda değil" ile eşleşen alt dizeleri bulmakla ilgili birçok sonuç buldum. Bu oldukça zor bir problem ve tekniklerin hiçbirini gerçekten kullanamıyorum.

Sonuç olarak

Herhangi bir yardım için teşekkürler!


1
dizelerin ne kadar büyük olmasına izin verilir? Ve neden karmaşıklıktaki uzunluklarını açıklamıyorsunuz? Açıkçası dizeleri olması gerekirΩ(logn) aksi halde sahip olmazdın nçalışılacak ayrı dizeler. Ayrıca izin verirseniz sezgisel görünüyorO(n)-uzunluk dizeleri, en kötü durumda veri yapınızdaki tüm dizelerinize bakmak zorunda kalacaksınız ... dizginin uzunluğunda sınır var mı? Poly-logaritmik?o(n)?
Artem Kaznatcheev

Anlaşılmadıysa özür dilerim. DizelerO(1)boyut; tüm niyet ve amaçlar için bunları 32 karakter uzunluğunda olarak düşünebilirsiniz. "String" sorunu çerçevelemek için sadece uygun bir soyutlama idi - aslında (integer, bitmask) tuples olarak temsil ediliyorlar, böylece birleştirme vevwsadece birkaç makine işleminde. (Tabii ki, problem, tamsayı ve bitmask alanlarının sayısını artırarak doğal olarak daha büyük sabit boyutlu dizelere genişletilebilir).
Christopher Monsanto

Yukarıdaki yorum muhtemelen bir karmaşıklık argümanı için yararlı değildir :(. Dizelerin boyutunun da değişmesine izin verirseniz, dizelerin boyutu ile kümenin boyutu arasında gerçekten bir ilişki yoktur. varlık hakkında doğru O(n)talihsiz en kötü durum, ama yine de ortalama durumda (veya yaklaşık) çok daha fazla ilgileniyorum.
Christopher Monsanto

Yanıtlar:


3

Sonlu durum otomatı kullanmaya ne dersiniz? DilSsonlu ve dolayısıyla düzenli. Aşağıdaki dönüşümlerden sonra bile yine de düzenli olacaktır. Dolayısıyla, normal ifadeyi deterministik bir sonlu durum otomatına dönüştürmek için olağan adımlardan sonra, içinde çalışmasını istediğiniz şey için bir tanıyıcıya sahip olacaksınız.O(k)saati. Umarım bu fikir aşağıda önerilenlerde hatalar varsa yine de uygulanabilir olacaktır.

Kırışıklık, joker karakter operatörü ile nasıl başa çıkılacağıdır:?. Joker karakter dizesindeki joker karakter, bir test dizesindeki 0 veya 1 ile eşleşir. Ancak joker karakter dizelerini tanımaya çalıştığımız için, joker karakter dizesindeki joker karakter 0, 1 veya? başka bir joker karakter dizesinde. Bu set hala düzenli, bu yüzden? dikey çubuğun olağan dönüşüm operatörü olduğu normal ifadeye (0 | 1 |?). Yani bütün setinizS {10 ?? 1, 0? 1? 0} ise, ortaya çıkan düzenli ifade (10 (0 | 1 |?) (0 | 1 |?) 1 | 0 (0 | 1 |?) 1 (0 | 1 |?) 0)

Makineye dize eklemek için, sonlu durumlu bir otomatı kademeli olarak değiştirme konusunda bazı çalışmalar var. Daciuk ve ark.'nın "Minimal Asiklik Sonlu Durum Otomatasının Artımlı Yapısı" başlıklı bu makaleye bakınız .

Bu yardımcı olur mu?


Ben otomata düşünmüştüm, evet (ben trie ile yaptığım nasıl bir otomata ile bir dize kabul ediyorum benzerdi). Bununla birlikte, bahsedilen otomatanın kademeli olarak oluşturulması üzerinde böyle bir çalışma bulamadım. Bunu kontrol edeceğim, ShyPerson işaretçisi için teşekkürler.
Christopher Monsanto

Daciuk, ve ark. Ancak, problemin Carrasco ve Forcada tarafından keyfi olarak sonlu durumlu otomata için "Minimal Sonlu Durumlu Otomata'nın
ShyPerson

Tamam, bu konudan daha fazlasını alacağımı sanmıyorum, bu yüzden cevabınızı kabul ediyorum. Teşekkürler!
Christopher Monsanto
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.