Jump to content

C# Karp-Rabin Algoritması Yardım?


BLACKFAN
 Share

Recommended Posts

arkadaşlar aşağıdaki koda bakarak algoritmanın çalışma mantıgı hakkında beni bilgilendirebilir misiniz? c# bilgim cok sınırlı programı anlayıp c de yazacagım internette ingilizce olarak acıklama yapılmıs pek istedğim sonuca ulasamadım  kod bilgisi olan arkadaşlardan yardımlarını rica ediyorum
 
 
 
 
 
 
 
 
namespace Rabin_Karp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int i = 0;
        string karakter_tut;
        private int RabinKarp_Arama_Algorithm(int A, int B)
        {
            int n = richTextBox1.TextLength;// girilen metin uzunlugu
            int m = textBox1.TextLength;// Aranılacak dizgi uzunlugu
            int h = (int)(Math.Pow(A, m - 1.0) % B);
 
            int p = 0;
            int t0 = 0;
 
            if (n < m)
            {
                richTextBox2.Text = "Aranılan dizgi girilen metin boyutundan büyük!!";
            }
 
            for (i = 0; i < m; i++)
            {
                p = (int)((A * p + textBox1.Text[i]) % B);
                t0 = (int)((A * t0 + richTextBox1.Text[i]) % B);
            }
            karakter_tut = i.ToString();
            int ts = t0;
 
            for (int s = 0; s <= n - m; s++)
            {
                if (p == ts)
                {
                    if (textBox1.Text == richTextBox1.Text.Substring(s, m))
                    {
                        
                        return s;// karşılaştırma sonucucnu geriye döndür
                        
                    }
                }
 
                if (s < n - m - 1)
                {
                    ts = (int)((A * (ts - (richTextBox1.Text[s]) * h) + (richTextBox1.Text[s + m])) % B);
 
                    if (ts < 0)
                    {
                        ts += B;
                    }
                }
            }
            return -1;
 
        }
        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox2.Text = "--------------------------------  Karp Rabin Arama Algoritma  -----------------------------------\n\n"+"Karakter Yeri: " + RabinKarp_Arama_Algorithm(256, 256).ToString() + ". karakter";
           
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            richTextBox1.Clear();
            richTextBox2.Clear();
        }
    }
}
Link to comment
Share on other sites

Bu algoritmayı hatırlıyorum List <> yapılarını kurcalarken uğraşmıştım çok güvenilir bir algoritma değil en azından performans sağlamıyordu sanırım. Yaptığı iş bir ya da birkaç dizinin daha büyük bir dizi ya da metin içindeki yerinin bulunmasını sağlamak.Yukarıda değişken uzunluklu kodlama yöntemi kullanıldığından n. karakteri bulmak zorlaşır. Verdiğin kodlarda açıklama var zaten richTextBox1 a girilen metin uzunluğunu n de tutuyorsun aynı şekilde textBox1 e girilen dizinin uzunluğunuda m de tutuyorsun sonra n in içinde m değerini arıyor n küçükse m den hata uyarı veriyor sonra sonucu sana geri dönüyor bu kadar buton2 de textleri temizliyor yani :)

 

C de yazacaksan da ;

int dizi[7] = {1, 3, 4, 7, 10, 12, 15};
int aranan = 12;
 
int bas = 0;
int son = 6;
int i;

while (bas <= son)
{
  i = (bas + son)/2;
  if (dizi[i] == aranan)
    return i;
  else if (dizi[i] > aranan)
    son = i - 1;
  else
    bas = i + 1;
}
return (-1); // bulunamadi

Kolay gelsin.

Edited by SimpsoN_Bart
Link to comment
Share on other sites

Bu algoritmayı hatırlıyorum List <> yapılarını kurcalarken uğraşmıştım çok güvenilir bir algoritma değil en azından performans sağlamıyordu sanırım. Yaptığı iş bir ya da birkaç dizinin daha büyük bir dizi ya da metin içindeki yerinin bulunmasını sağlamak.Yukarıda değişken uzunluklu kodlama yöntemi kullanıldığından n. karakteri bulmak zorlaşır. Verdiğin kodlarda açıklama var zaten richTextBox1 a girilen metin uzunluğunu n de tutuyorsun aynı şekilde textBox1 e girilen dizinin uzunluğunuda m de tutuyorsun sonra n in içinde m değerini arıyor n küçükse m den hata uyarı veriyor sonra sonucu sana geri dönüyor bu kadar buton2 de textleri temizliyor yani :)

 

C de yazacaksan da ;

int dizi[7] = {1, 3, 4, 7, 10, 12, 15};
int aranan = 12;
 
int bas = 0;
int son = 6;
int i;

while (bas <= son)
{
  i = (bas + son)/2;
  if (dizi[i] == aranan)
    return i;
  else if (dizi[i] > aranan)
    son = i - 1;
  else
    bas = i + 1;
}
return (-1); // bulunamadi

Kolay gelsin.

teşekkür ederim yardımın için yalnız kafama takılan bu karşılaştırmayı mod alarak yapmış sanırım mod değerini neye göre oluşturuyor onu cıkaramadım?

p ve t0 ile başlayan satırlarda ?

Edited by BLACKFAN
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...