מרחק לוינשטיין
מרחק לוינשטיין (ברוסית: Левенштейн; מכונה גם מרחק עריכה) הוא מונח במדעי המחשב ובתורת האינפורמציה שמתאר את מידת השונות בין שתי מחרוזות תווים. את המונח טבע ולדימיר לוינשטיין (אנ') ב-1965.
מרחק לוינשטיין בין שתי מחרוזות מוגדר כמספר המינימלי של פעולות עריכה שיש לבצע על מחרוזת אחת כדי להגיע למחרוזת השנייה, כאשר פעולות העריכה המותרות הן: הוספת אות, מחיקת אות או שינוי אות לאות אחרת.
דוגמה
[עריכת קוד מקור | עריכה]מרחק לוינשטיין בין "חיפנים" ל"חיפאיות" הוא 3.
חיפנים -> חיפאים (החלפה של 'נ' ו'א')
חיפאים -> חיפאית (החלפה של 'ם' ו'ת')
חיפאית -> חיפאיות (הוספה של 'ו')
יישומים
[עריכת קוד מקור | עריכה]השוואה בין מחרוזות נדרשת, למשל, בחיפושים במילונים מתוך קלט שגוי "במקצת" לצורך בדיקת איות. לדוגמה אם מוגדר במילון המילה "חיפאיות", קלט המשתמש יהיה "חיפנים" והמרחק המרבי המוגדר הוא 3 אזי תוצאות החיפוש יראו גם את המילה "חיפאיות". יישומים נוספים שמשתמשים בווריאציות שונות של מרחק לוינשטיין הם זיהוי תווים אופטי, ועיבוד שפות טבעיות.
מימוש
[עריכת קוד מקור | עריכה]מימוש יעיל של מציאת מרחק לוינשטיין דורש שימוש בטכניקת תכנות דינמי. סיבוכיות המקום וסיבוכיות הזמן במימוש הטרויאלי הוא (NM)O.
int LevenshteinDistance(char s[1..m], char t[1..n])
{
// d is a table with m+1 rows and n+1 columns
declare int d[0..m, 0..n]
for i from 0 to m
d[i, 0] := i // deletion
for j from 0 to n
d[0, j] := j // insertion
for j from 1 to n
{
for i from 1 to m
{
if s[i] = t[j] then
d[i, j] := d[i-1, j-1]
else
d[i, j] := minimum
(
d[i-1, j] + 1, // deletion
d[i, j-1] + 1, // insertion
d[i-1, j-1] + 1 // substitution
)
}
}
return d[m,n]
}
דוגמת הרצה
[עריכת קוד מקור | עריכה]| ח | י | פ | א | י | ם | ||
|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
| ח | 1 | 0 | 1 | 2 | 3 | 4 | 5 |
| י | 2 | 1 | 0 | 1 | 2 | 3 | 4 |
| פ | 3 | 2 | 1 | 0 | 1 | 2 | 3 |
| נ | 4 | 3 | 2 | 1 | 1 | 2 | 3 |
| י | 5 | 4 | 3 | 2 | 2 | 1 | 2 |
| ו | 6 | 5 | 4 | 3 | 3 | 2 | 2 |
| ת | 7 | 6 | 5 | 4 | 4 | 3 | 3 |