الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Horspool's algorithm أرجو الافادة ضرووووووووري

بدأه Girl22 في 29 أكتوبر 2012 · 5 رد · 544 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

قمت بعمل برنامج لــ Horspool's algorithm

ويطلع معي خطأ حاولت أعمل debug لكن لم أعرف السبب بالضبط

وبحثت ايضًا ولم أجد العلة

يااليت تفيدوني

ولكم جزيل الشكر .....

Shift Table algorithm

post-269394-092475900 1351515497_thumb.p

Horspool's algorithm

post-269394-016513400 1351515517_thumb.p

الكود .....

import java.util.*;

public class Project {
     static int [] Table=new int[28];
    public static void main(String[] args) {

        char []t=new char[1000];
        char []p=new char[100];
        int x;
        Scanner scan=new Scanner(System.in );
        System.out.println("Enter Text : ");
        String s=scan.nextLine();
        for(int i=0;i<s.length();i++)
        { 
            t=s.charAt(i);
        }            
         System.out.println("Enter pattren : ");
        String str=scan.nextLine();
        for(int i=0;i<str.length();i++)
        { 
            p=str.charAt(i);
        }               
       x=HM(p,t);

       if(x==-1)
            { System.out.println("Not Matching ");}
       else 
            {System.out.println(" Matching ");}
    }

   static int HM(char []p ,char []t)
        {
            int k;
            int m =p.length;
            int n =t.length;
            shiftTable(p);
            int i=m-1;
            while(i<=n-1)
            {
               k=0;
               while(k<=m-1 && p[m-1-k]==t[i-k])
               {
                   k=k+1;
               }
               if(k==m)
               { return (i-m+1);}
               else 
               {i=i+Table[t];}

            }
            return -1;  
        } 
    static int[] shiftTable (char []p)
       {
           int m =p.length;
           for(int k=0;k<=27;k++)
           {
               Table[k]=m;
           }
            for(int j=0;j<=m-2;j++)
            { 
                Table[p[j]]= m-1-j;
            }
            return Table; 
        }
}
المرفقات
s.PNGh.PNG
#2

المشكله هي في ان المصفوفه الــ P هي مصفوفة حروف ، فعندما تقولين

Table[p[j]]

فإن قيمة[p[j ستكون تعتمد على الحرف المدخل فإذا كان مثلا اول حرف في المصفوفه P هو t فإن قيمة[p[j هي 116 وهو ما يسبب ArrayIndexOutOfBoundException

لاحظي ان قيم الحروف ليست من 1 الى 26 في الجافا، ولكن يمكنك جعلها من 1 الى 26 مثلا بطرح الــ Offset لاول حرف من قيمة الرقم

Table[p[j]-offset]

حسب هذا الكود فإن اول حرف يجب ان لايكون اصغر من الــ Offset كما ان الفارق بين اخر حرف والـOffset يجب ان لا يكون خارج المصفوفه

بالتوفيق

تم تعديل هذه المشاركة بواسطة mental-driller في 29 أكتوبر 2012 في 22:07

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#3

لاي غرض نستعمل هاي الخوارزمية ؟؟

556891961.gif

I am learning from you

it is the programmer eye

#4

المشاكـس5550 :

يستخدم هالخوارزم في عمل String matching بين نص ( text ) وعينة (pattern)

تحت تكنيك Space and Time Tradeoffs

mental-driller :

انا فهمت مقصد كلامك لكن لم أفهم عمل offest وكتبتها في البرنامج

 Table[p[j]-offset]= m-1-j;

ويطلع مو عارف ايش هالكلمة offest

كيف استخدمها في الجافا لاني الصراحة ما أستخدمتها قبل ...

#5
Girl22 كتب:

المشاكـس5550 :

يستخدم هالخوارزم في عمل String matching بين نص ( text ) وعينة (pattern)

تحت تكنيك Space and Time Tradeoffs

mental-driller :

انا فهمت مقصد كلامك لكن لم أفهم عمل offest وكتبتها في البرنامج

 Table[p[j]-offset]= m-1-j;

ويطلع مو عارف ايش هالكلمة offest

كيف استخدمها في الجافا لاني الصراحة ما أستخدمتها قبل ...

الــ Offset هو مقدار ازاحه ، يعني انكي تقومين بتعريف متغير من نوع int وتطلقي عليه offset ، لماذا؟

المصفوفه Table سعتها 28 اي ان العنواين فيها هي من 0 الى 27 ، إذا اخذنا حرف a فإن قيمته هي 97 لكي اضع 97 في مكان اول عنصر (0) يجب ان ان اطرح 97 إذا في هذه الحاله الــ Offset هو 97 وعليه:

b->98 - 97 = 1
c->99 - 97 = 2
d->100 - 97 = 3
...
..
.

يعني يمكن للمصفوفه Table احتواء الحروف من 97 الى 97 + 27 = 124 طبعا ليس هناك حاجه لان اقول لكي ان المصفوفه لا تتسع للحروف الصغيره والكبيره ، اما الصغيره و اما الكبيره ، اما اذا اردتي جعل المصفوفه تتسع لمجيع الحروف في الــ Unicode فعليك جعل حجمها 65536

اتمنى ان يكون هذا اوضح

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#6

جزاكـ الله كل خير

ويوفقكـ دنيا وأخره

بالفعل ساعدتني الله يكتب لكـ أجركـ :)

مواضيع مشابهة