upload@ - במת המפתחים הישראלית  
 
  מציאת מרחק עריכה
 מציאת מרחק עריכה
  מאת: אלכס
 עוד יצירות מאת יוצר זה
3,164 צפיות , 844 הורדות 
12 דירגו יצירה זו  
פופולריות: 10.36 ;  דירוג: 4.17 מתוך 5
פורסם 01/04/2004, עודכן  01/04/2004
 

תקציר

מרחק עריכה הוא מדד אחד מבין רבים הבוחן דמיון בין שתי מחרוזות.
אלגוריתמים אלו שימושיים בתחומים רבים, כגון האיות במעבד תמלילים (Word) אשר מציע הצעות לתיקון מילים שדומות למילה השגויה.
כאשר מתגלה מילה שגויה נחפש במאגר מילים שמרחק העריכה שלהן מהמילה השגויה הוא קטן מערך מסוים קבוע מראש ונציג אותן בתור הצעות לתיקון.
המאמר מתאר אלגוריתם זה ומציג את מימושו בשפת C.
קוד מקור: מלא, שפת/ סביבת פיתוח: שפת C


אילוסטרציה - מציאת מרחק עריכה

תוכן עניינים

  1. הגדרות
  2. מציאת מרחק עריכה
  3. האלגוריתם
  4. זמן ריצה



הגדרות

מחרוזת S היא סדרה של n תווים. התווים יסומנו באופן הבא:

S[1],S[2],...,S[n]

הרישא בגודל k של מחרוזת S היא המחרוזת שמורכבת מ- k התווים הראשונים של המחרוזת. נסמן אותה ב- Sk. לדוגמא, בהינתן המחרוזת abcdef הרישא באורך 3 של המחרוזת הנתונה היא המחרוזת abc. הרישא באורך 0 של כל מחרוזת היא המחרוזת הריקה.

מציאת מרחק עריכה

לפעמים ברצוננו לבחון "דמיון" בין שתי מחרוזות. אפשר להגדיר מדדים רבים לדמיון בין שתי מחרוזות. אחד מהם הוא "מרחק עריכה".

נגדיר 3 פעולות בסיסיות על מחרוזת:

1. הוספת תו למחרוזת - הוספת התו יכולה להתבצע בכל מקום במחרוזת. כל התווים שאחרי המיקום בו הוספנו את התו זזים מקום אחד קדימה. לדוגמא, בהינתן המחרוזת abcde, אם נוסיף את התו z במקום השני במחרוזת נקבל את המחרוזת azbcde.

2. מחיקת תו מהמחרוזת - מחיקת התו ממקום מסוים גורמת להזזה של כל התווים שבאו אחריו מקום אחד אחורה. לדוגמא, בהינתן המחרוזת abcde אם נמחק את התו במקום השלישי במחרוזת נקבל את המחרוזת abde.

3. החלפת תו קיים בתו אחר - דוגמא: בהנתן המחרוזת abcde אם נחליף את התו השלישי במחרוזת בתו p נקבל את המחרוזת abpde.

הגדרה: נתונות שתי מחרוזות S באורך n ו- T באורך m. הכמות המינימאלית של פעולות עריכה בסיסיות שיש לבצע על מנת להפוך את המחרוזת S למחרוזת T נקראת מרחק עריכה של המחרוזת S מהמחרוזת T.

מכאן אפשר לראות כי ככל שמרחק העריכה בין שתי מחרוזות קטן יותר כך הן דומות יותר אחת לשניה. אם מרחק העריכה בין שתי מחרוזות הוא 0, אזי שתי המחרוזות זהות.

ברצוננו למצוא אלגוריתם יעיל שבהינתן שתי מחרוזות יחשב את מרחק העריכה ביניהן. יש לשים לב כי מרחק העריכה של המחרוזת S מהמחרוזת T הוא גם מרחק העריכה של המחרוזת T מהמחרוזת S מפני שהפעולות הבסיסיות שהגדרנו הפיכות. הפעולה ההפוכה לפעולה 1 היא פעולה 2 והפעולה ההפוכה לפעולה 3 היא פעולה 3 - המחזירה חזרה את התו שהיה לפני שהחלפנו אותו בתו אחר.

נגדיר: Di, j הוא מרחק העריכה של המחרוזת Si מהמחרוזת Tj .

אבחנה 1:

מרחק העריכה של המחרוזת הריקה ממחרוזת כלשהי באורך n הוא תמיד n. הדרך היחידה שלנו להגיע ממחרוזת S כלשהי למחרוזת הריקה היא למחוק את כל n התווים שלה. כלומר, דרושות לפחות n פעולות מחיקה על מנת להגיע למחרוזת הריקה, ולכן מרחק העריכה הוא n. מכאן נובעת המסקנה כי לכל i, j מתקיים:

Di,0 = i
D0,j = j

אבחנה 2:

נתונות שתי מחרוזות S ו- T. ברצוננו למצוא את מרחק העריכה בין Si לבין Tj, כלומר לחשב את Di, j. מרחק העריכה יכול להיקבע לפי אחד משלושת המקרים הבאים:

● נבצע Di, j- 1 פעולות על מנת להפוך את המחרוזת Si למחרוזת Tj- 1. לאחר מכן נוסיף בסופה של Tj- 1 את התו T[j] ונקבל את המחרוזת Tj.
במקרה זה נובעת המסקנה: Di,j = Di,j-1 + 1

● נבצע Di- 1, j פעולות על מנת להפוך את המחרוזת  Tj למחרוזת Si- 1. לאחר מכן נוסיף בסופה של Si- 1 את התו  S[i]ונקבל את המחרוזת Si.
במקרה זה נובעת המסקנה: Di,j = Di-1,j+1

● נבצע Di- 1, j- 1 פעולות על מנת להפוך את המחרוזת Si- 1 למחרוזת Tj- 1
- אם [S[i] = T[ j אזי על-ידי ביצוע הפעולות הנ"ל כבר הפכנו את Si ל- Tj.
- אם [S[i] ≠ T[ j אזי יש לעשות פעולות נוספות של החלפת התו S[i] בתו T[j] על-מנת להפוך את Si ל- Tj.
מכאן נובעת המסקנה:

if S[i]=T[j] then
	p = 0
else
	p = 1

Di,j = Di-1,j-1 + p
מרחק העריכה האמיתי בין המחרוזות Si ו- Tj הוא המינימום בין שלושת המקרים.
 


כעת באמצעות אבחנה 1 ואבחנה 2 אפשר לנסח את האלגוריתם הבא:

edit_distance(S,T)

// איתחול
for i = 0 to n do
	Di,0 = i
for j = 0 to m do
	D0,j = j

// שימוש באבחנה 2
for i = 1 to n do
	for j = 1 to m do
		if S[i]=T[j] then
			p = 0
		else
			p = 1
		Di,j = minimum(Di-1,j+1, Di,j-1+1, Di-1,j-1+p)
return Dn,m

זמן ריצה:

האלגוריתם מבצע m+ n איטרציות בזמן האתחול. בנוסף הוא מבצע nm איטרציות בעת השימוש באבחנה 2. לכן זמן הריצה של האלגוריתם הוא (O(nm.

דוגמת הרצה:



נשים לב כי במשבצת הימנית-תחתונה מתקבל המספר 3, לכן מרחק העריכה בין המחרוזת hello ו- hola הוא 3.

לאלגוריתם הנ"ל יכולים להיות שימושים רבים בתחומים רבים. דוגמא טובה לכך מצוייה במעבד התמלילים Word כאשר אנו מבצעים שגיאת איות מעבד התמלילים מציע לנו בתור הצעות לתיקון מילים שדומות למילה השגויה. אחת הדרכים לעשות זאת היא להחזיק מאגר של מילים נכונות, וכאשר מתגלה מילה שגויה לחפש במאגר מילים שמרחק העריכה שלהן מהמילה השגויה הוא קטן מערך מסוים קבוע מראש ולהציג אותן בתור הצעות לתיקון (אפשר להיות מתוחכמים יותר ולקבוע את מרחק העריכה המקסימאלי לפי אורך המילה השגויה).
 

אודות אלכס

סטודנט למדעי המחשב, שנה ב'.
מתעניין באלגוריתמים על מחרוזות, גראפיקה ממוחשבת ועיבוד תמונה.
דרגת ארד : 1-4 יצירות פורסמו  יוצר 

לחץ כאן בכדי לראות את הפרופיל המקוון של אלכס.
לחץ כאן להצגת עוד יצירות פרי עטו.



יצירות פופולריות נוספות בתחום



[לראש הדף] דרג יצירה זו עבורנו!    חלש   מצוין