Sanirim dogru cevap bu olmali (versiyon 3 lokman gokcenin yorumlarda okuyabileceginiz test(ler)i uzerine, stringlerin boylarinin ayni olma zorunlulugunu ekledim)
def izomorf_mu(x,y):
f = lambda x : (x.index(i) for i in x)
return len(x)==len(y) and (all(a==b for (a,b) in zip(f(x),f(y)))
Hiz
(3.editten sonra eklendi)
x.index(i)
methodunun kompleksitesi, kotumser bakarsak x
kelimesinin uzunlugu ile dogru orantili. Bu methodu x
kelimesindeki her harf icin icin cagiriyoruz. Yani fonksiyonun kompleksitesi girdinin uzunlugunun karesi ile orantili. Yanilmiyorsam bu programin calisma suresini girdinin uzunlugu ile orantili yapabiliriz. Nasil ?
from collections import Counter
def izomorf_mu(x,y):
if len(x) != len(y):
return False
x_vars =Counter(x)
y_vars = Counter(y)
if len(set(x_vars.values())) != len(set(y_vars.values())): return False
xy = {i:set() for i in x}
yx = {i:set() for i in y}
for (key,value) in zip(x,y):
xy[key].add(value)
yx[value].add(key)
for (i,j) in zip(x,y):
if x_vars[i] != y_vars[j]: return False
if x_vars[i] != 1 and len(xy[i])!=1 and len(yx[j]) != 1: return False
return True
BURANIN ASAGISI YANLIS. SORUYU YANLIS ANLAMISTIM
def izomorf_mu(x,y):
return len( set( a-b for (a,b) in zip(map(ord,x),map(ord,y)))) == 1
"ord" fonksyonu bir karakterin ascii degerini verir.
"map" fonksyonu bir fonksyonu bir kolleksyonun her elemanina uygular
"zip" fonksyonu iki tane koleksyondan bir tuple kolleksyonu olusturur.
"set" fonksyonu kume olusturmak icin. Kumelerdeki her obje biriciktir.
iki kelimenin karakterleri arasindaki fark hep ayni ise, kelimeler izomorftur diyebiliriz bence.
O zaman kelimelerin karakterlerinin farkindan bir kume yaratalim ve uzunlugu bir mi dize kontrol edelim.
muhtemelen herseyden once kelmielerin uzunlugu ayni mi diye kontrol etmemiz gerekir.
def izomorf_mu(x,y):
return len(x)==len(y) and len( set( a-b for (a,b) in zip(map(ord,x),map(ord,y)))) == 1