Etiketler benzersiz ise, N
boyutunda bir grafik için, O(N^2)
kenarları vardır; her köşe çifti arasında kendiliğinden döngüler veya çoklu kenarlar olmadığı varsayılır. Kenar sayısı için E
kullanalım. Üst grafikte grubu kenarları karma durumunda (ve istenirse uygun bir miktarda)
, her bir karma tablo olup olmadığını kontrol etmek, alt grafiğini kenarlarından ilerleyebilir. Bunu her kenar için bir kere yapıyorsunuz, bu nedenle, O(E)
.
en (
N
köşeler ile) grafiği
G
ve (
M
köşeler ile) mümkün subgraph
G_1
diyelim ve
G_1 is in G
bulmak istiyorum. etiketler benzersiz olmadığından
, sen, Dinamik Programlama ile, örneğin bunun yerine altproblemleri inşa edebilirsiniz - yerine O(2^N)
altproblemleri, her alt grafiği için bir sahip, sen O(M 2^N)
altproblemleri var - G_1
her köşe için bir (M
ile olası alt grafiklerin her biri ile). temel durum index = M
olmak
isSubgraph(index, bitmask) =
for all vertex in G
if G[vertex] is not used (check bitmask)
and G[vertex]'s label is equal to G_1[index]'s label
and isSubgraph(index + 1, (add vertex to bitmask))
return true
return false
ve bit maskesi (ve örtük etiketlemeyi verilen kenarlar eşitlik için kontrol edebilirsiniz:
G_1 is in G = isSubgraph(0, empty bitmask)
ve devletler gibi ayarlanır eşleme). Alternatif olarak, eğer kontrol etme işlemini if (if) ifadesi içinde de yapabilirsiniz - sadece geçerli index
no.lu geçerli kontrol G_1[0..index]
'un G[bitmask]
(aynı örtük etiket eşlemeyle) olduğunu tekrar kontrol etmeden önce kontrol edin.
N = 20
için, bu yeterince hızlı olmalıdır.
(notunuzu ekleyin ya da aşağıdakini DP kullanarak yeniden yazabilirsiniz).
Bahsettiğiniz bu çizgi grafiği nedir? Küçük grafiğin her zaman basit bir yol olduğunu mu söylüyorsunuz? – polygenelubricants
@Jeeyoung: Sadece fyi, buna subgraph isomorphism problemi denir. Etiketlerle, etiketli altyazı izomorfizm problemi olarak adlandırılır. –