karisik string
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
karisik string
biraz karişik bir sorunum var içinden çikamadim. yardimci olursaniz çok makbule geçeçek.
memo1 de portakallaşmak diye bir satirim var
yapmak istedigğim memo1 deki portakallaşmak kelimesini memo2 de kendisi varsa kendisini, yoksa kendinden kucuk fakat diğerlerinden en uzun olanini bulsun. memo2 asagidaki gibi sonuç: portakallaş/ olmali.
memo2 de
port/
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
memo1 de portakallaşmak diye bir satirim var
yapmak istedigğim memo1 deki portakallaşmak kelimesini memo2 de kendisi varsa kendisini, yoksa kendinden kucuk fakat diğerlerinden en uzun olanini bulsun. memo2 asagidaki gibi sonuç: portakallaş/ olmali.
memo2 de
port/
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
Re: karisik string
Kod: Tümünü seç
function KelimeAra(const Kelime: string): string;
var
tmp: string;
I: Integer;
begin
Result := '';
if Form2.Memo2.Lines.IndexOf(Kelime + '/') > -1 then
Result := Kelime
else begin
tmp := Kelime;
while (Result = '') and (Length(tmp)<>0) do
begin
tmp := Copy(tmp, 1, Length(tmp)-1);
if Form2.Memo2.Lines.IndexOf(tmp + '/') >- 1 then
Result := tmp + '/';
end;
end;
end;
There's no place like 127.0.0.1
Re: karisik string
tesekkur ederim 2,3 tane sorun var bu functionda
1-memo1 de 5-10 veya daha cok kelimem oldugunda calismadi bu sekilde. memo1 de 1'er satir atlayarak işlem yapiyor kelimeyi
2- stringliste cevirdim hizli olsun diye calismiyor.
var
tmp: string;
memo2:Tmemo;
I: Integer;
sk:Tstringlist;
begin
sk:=Tstringlist.Create;
sk.add(memo2.LineS.text);
Result := '';
if sk.IndexOf(Kelime + '/') > -1 then
Result := Kelime
else begin
tmp := Kelime;
while (Result = '') and (Length(tmp)<>0) do
begin
tmp := Copy(tmp, 1, Length(tmp)-1);
if sk.IndexOf(tmp + '/') >- 1 then
Result := tmp + '/';
end;
end;
1-memo1 de 5-10 veya daha cok kelimem oldugunda calismadi bu sekilde. memo1 de 1'er satir atlayarak işlem yapiyor kelimeyi
2- stringliste cevirdim hizli olsun diye calismiyor.
var
tmp: string;
memo2:Tmemo;
I: Integer;
sk:Tstringlist;
begin
sk:=Tstringlist.Create;
sk.add(memo2.LineS.text);
Result := '';
if sk.IndexOf(Kelime + '/') > -1 then
Result := Kelime
else begin
tmp := Kelime;
while (Result = '') and (Length(tmp)<>0) do
begin
tmp := Copy(tmp, 1, Length(tmp)-1);
if sk.IndexOf(tmp + '/') >- 1 then
Result := tmp + '/';
end;
end;
En son sr1111 tarafından 12 Ağu 2012 07:37 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Re: karisik string
1 - Ben Memo1 ile alakalı birşey yazmadım. Memo1'deki kelimeleri atlayarak yazıyorsa sizin başka biryerde hatanız var demektir.
2 - Memo2'deki kelimeleri StringList'e atmanız hız artışı sağlamaz. Aksine gereksiz birşey yapmış olursunuz. (Memo2.Lines zaten TStrings sınıfından türetilmiştir.)
2 - Memo2'deki kelimeleri StringList'e atmanız hız artışı sağlamaz. Aksine gereksiz birşey yapmış olursunuz. (Memo2.Lines zaten TStrings sınıfından türetilmiştir.)
There's no place like 127.0.0.1
Re: karisik string
1- İfademi duzelteyim tam anlatamadim, şöyle diyeyim.
memo1 e bir kac kelime aldim icinde gecen (aşağıdaki gibi) o zaman doğru calismiyor. ancak memo1 1 atlayarak enterlayarak kelimeleri yazarsam doğru işlem yapiyor. veya memo1 de kendinden kucuk, buyuk benzer kelimelerin olmamasi gerekiyor.
bir test etmenizi istiyorum.
bu sekilde kullandim kelimeara yi.
for i :=0 to Memo1.Lines.Count -1 do
memo3.lines.add(kelimeara(memo1.lines));
test memo2 için
port/
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
elmaların/
memo1 için
farkliyazisa
portakallaşsa
portakalimı
portak
portakallaşmamakmi
elmalarına
portal
2-memo2 yi stringlist yapmak onemli,
memo2 de 15 mb lik bir dosya aciyorum. bunu srtringliste yuklemek daha hizli ve kolay.
memo1 e bir kac kelime aldim icinde gecen (aşağıdaki gibi) o zaman doğru calismiyor. ancak memo1 1 atlayarak enterlayarak kelimeleri yazarsam doğru işlem yapiyor. veya memo1 de kendinden kucuk, buyuk benzer kelimelerin olmamasi gerekiyor.
bir test etmenizi istiyorum.
bu sekilde kullandim kelimeara yi.
for i :=0 to Memo1.Lines.Count -1 do
memo3.lines.add(kelimeara(memo1.lines));
test memo2 için
port/
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
elmaların/
memo1 için
farkliyazisa
portakallaşsa
portakalimı
portak
portakallaşmamakmi
elmalarına
portal
2-memo2 yi stringlist yapmak onemli,
memo2 de 15 mb lik bir dosya aciyorum. bunu srtringliste yuklemek daha hizli ve kolay.
Re: karisik string
Verdiğiniz örnekleri Memo1 ve Memo2'ye girip sonuçları Memo3'e attığımda aşağıdakileri veriyor:
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
elmaların/
porta/
Bunlar da beklenen değerler olmalı. Satır atlama gibi bir sorun varsa Memo1'e attığınız kelimeler yada Memo1'den okuma yapmaya çalıştığınız kodda bir hata vardır.
15 mb'lık bir dosyadaki kelimeleri ekranda göstermeniz gerekmiyorsa Memo1'i hiç kullanmayın. Dosyayı TFileStream yada TMemoStrem ile açın. Dosyadaki kelimeleri göstermeniz gerekiyorsa, o zaman Lines.BeginUpdate ve EndUpdate'i araştırın.
Gönderiğim kod size yol göstermek amaçlıydı. Bundan sonrası biraz araştırma......
farkliyazi/
portakallaş/
portakal/
porta/
portakallaşmamak/
elmaların/
porta/
Bunlar da beklenen değerler olmalı. Satır atlama gibi bir sorun varsa Memo1'e attığınız kelimeler yada Memo1'den okuma yapmaya çalıştığınız kodda bir hata vardır.
15 mb'lık bir dosyadaki kelimeleri ekranda göstermeniz gerekmiyorsa Memo1'i hiç kullanmayın. Dosyayı TFileStream yada TMemoStrem ile açın. Dosyadaki kelimeleri göstermeniz gerekiyorsa, o zaman Lines.BeginUpdate ve EndUpdate'i araştırın.
Gönderiğim kod size yol göstermek amaçlıydı. Bundan sonrası biraz araştırma......
There's no place like 127.0.0.1
Re: karisik string
haklisiniz, tekrar test ettim bendeki sorun / ayraclardan kaynalaniyormus
sonu ayracli ve ayractan sonrasi diye aşağıdaki gibi test etmistim.
memo2 de Ayractan sonrasini gormuyor karistirmisim.
port/dfgdfg
farkliyazi/sdg
portakallaş/dsfdsg
portakal/
porta/sdfgsfdg
portakallaşmamak/
elmaların/sdgdgfdg
functionda sizin memo2 olarak tanimladiginiz alana 15 mb yukleme yapacagim yukaridaki gibi.
memo2 nin gozukmesi gerekmiyor. ve cok yavaş bundan dolayi stringliste veya başka bir seye cevirmeye calistim
sonu ayracli ve ayractan sonrasi diye aşağıdaki gibi test etmistim.
memo2 de Ayractan sonrasini gormuyor karistirmisim.
port/dfgdfg
farkliyazi/sdg
portakallaş/dsfdsg
portakal/
porta/sdfgsfdg
portakallaşmamak/
elmaların/sdgdgfdg
functionda sizin memo2 olarak tanimladiginiz alana 15 mb yukleme yapacagim yukaridaki gibi.
memo2 nin gozukmesi gerekmiyor. ve cok yavaş bundan dolayi stringliste veya başka bir seye cevirmeye calistim
Re: karisik string
yukaridaki fonksiyonu hizlandiracak bir yol var mı. çok yavaş kalıyor 2-3 bin kelimeyi gecince.
Re: karisik string
Optimizasyon dediğimiz şey burada devreye giriyor.
(1) Anlamlı gruplara ayırın. Önce aynı harf ile başlayanları bir stringList'e aktarın. bu size 1000 kelimenin altında bir liste sunar.
(2) Uzunluğu daha kısa olanları bir stringlist'e aynı fonksiyonda diğerlerini diğer stringlist'e ayırın. bu da size %50-%80 kadar kazandırır.
(3) Sonra döngünüzü bu az sayıdaki listelere göre yapılandırın.
- Sürenin ışık hızında olduğunu göreceksiniz
(1) Anlamlı gruplara ayırın. Önce aynı harf ile başlayanları bir stringList'e aktarın. bu size 1000 kelimenin altında bir liste sunar.
(2) Uzunluğu daha kısa olanları bir stringlist'e aynı fonksiyonda diğerlerini diğer stringlist'e ayırın. bu da size %50-%80 kadar kazandırır.
(3) Sonra döngünüzü bu az sayıdaki listelere göre yapılandırın.
- Sürenin ışık hızında olduğunu göreceksiniz

Re: karisik string
Gruplara nasıl ayaricagim 28 harf var. bunlari döngü ile nasıl ayirip aktarabilirim. benim gibi biri için bu 3 madde de çok zor, hocam.
Re: karisik string
Metodoloji anlaymaya çalışıyorum. Amaç optimizasyonun tarifi.
- Sana özetle çok sayıdaki kelimeyi anlamlı gruplara ayırdığında hızlandırmanın mümkün olduğunu anlatmaya çalıştım. Projeni şu şekilde kodla şeklinde değildi ki.
- Senin projenden bi-haberim. Bunu ben bilmemem ki neler yaptın veya yapmadın. Ben olsam, "/" ayracını alır veritabanında iki farklı alana bölerdim mesela. Belki de sen bunu yaptın belki de yapmadın. Veritabanı kullanıyor musun - kullanmıyor musun onu bile bilmiyorum. Çünkü SQL ile çekerken kendiliğinden gruplandırılması söz konusu.
- Veritabanı kullamıyorsan, kelime gruplarını örnekte verdiğin gibi bulundurman da hata. Ana listende böyle bulunabilir ama sıralama algoritmanı kurduğunda sadece kelimeler olmalı. "/" sonraki içerik değil.
- Yaptığın her şey ya yük olarak sana mani olur, ya da kazanç olarak sana zamandan tasarruf. Bunu iyi değerlendirmelisin.
- Sana özetle çok sayıdaki kelimeyi anlamlı gruplara ayırdığında hızlandırmanın mümkün olduğunu anlatmaya çalıştım. Projeni şu şekilde kodla şeklinde değildi ki.
- Senin projenden bi-haberim. Bunu ben bilmemem ki neler yaptın veya yapmadın. Ben olsam, "/" ayracını alır veritabanında iki farklı alana bölerdim mesela. Belki de sen bunu yaptın belki de yapmadın. Veritabanı kullanıyor musun - kullanmıyor musun onu bile bilmiyorum. Çünkü SQL ile çekerken kendiliğinden gruplandırılması söz konusu.
- Veritabanı kullamıyorsan, kelime gruplarını örnekte verdiğin gibi bulundurman da hata. Ana listende böyle bulunabilir ama sıralama algoritmanı kurduğunda sadece kelimeler olmalı. "/" sonraki içerik değil.
- Yaptığın her şey ya yük olarak sana mani olur, ya da kazanç olarak sana zamandan tasarruf. Bunu iyi değerlendirmelisin.
