آرین سليمان زاده
  • الرئيسية
  • المدونة
  • البودكاست
  • الفيديوهات
  • المكتبة
  • تواصل
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
اللوحة•تواصل سريع

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

احجز موعداً

أرسل رسالة قصيرة — سأرد في أقرب وقت ممكن.

LinkedInاستجابة سريعة
الرئيسية/المقالات/ما هي مسافة Levenshtein؟ شرح Edit Distance باستخدام Dynamic Programming
Algorithmsمقال

ما هي مسافة Levenshtein؟ شرح Edit Distance باستخدام Dynamic Programming

تحسب Levenshtein Distance أقل عدد من عمليات الإدراج والحذف والاستبدال اللازمة لتحويل سلسلة إلى أخرى، وهي من أشهر تطبيقات Dynamic Programming.

١٩ أغسطس ٢٠٢٦7 دقيقة قراءة16 المشاهدات
#Algorithms#Levenshtein Distance#Edit Distance#Dynamic Programming#String Algorithms#TypeScript

Arian Soleimanzadeh

Software Engineer & Researcher

جدول Dynamic Programming لخوارزمية Levenshtein Distance وعمليات Insert Delete Replace

Arian Soleimanzadeh

ذكاء اصطناعي · برمجة · منتج

بحث + هندسة
في هذه الصفحة
مثال مشهورلماذا نستخدم Dynamic Programming؟تنفيذ TypeScriptالتعقيدSpell CheckingFuzzy SearchCRM وDeduplicationاستخدامات أخرىالفرق عن Hamming DistanceWeighted Edit Distanceسؤال مقابلات شائعأخطاء شائعةالخلاصة

تُعرف Levenshtein Distance أيضاً باسم Edit Distance، وهي تقيس مدى اختلاف سلسلتين عن طريق حساب الحد الأدنى من العمليات اللازمة لتحويل إحداهما إلى الأخرى.

العمليات الأساسية هي:

  • Insert
  • Delete
  • Replace

وتكون تكلفة كل عملية عادة 1.

مثال:

Code
1
cat → cut

نحتاج فقط إلى استبدال a بـ u، ولذلك:

Code
1
Distance = 1

مثال مشهور

Code
12
kitten
sitting

يمكن التحويل عبر ثلاث عمليات:

Code
123
kitten → sitten
sitten → sittin
sittin → sitting

إذن:

Code
1
Distance = 3

لماذا نستخدم Dynamic Programming؟

نعرّف:

Code
1
dp[i][j]

ليكون الحد الأدنى من العمليات اللازمة لتحويل أول i أحرف من السلسلة الأولى إلى أول j أحرف من السلسلة الثانية.

إذا كانت إحدى السلسلتين فارغة:

Code
12
dp[0][j] = j
dp[i][0] = i

إذا كان الحرفان الحاليان متساويين:

Code
1
dp[i][j] = dp[i - 1][j - 1]

أما عند الاختلاف:

Code
12345
dp[i][j] = 1 + min(
  dp[i - 1][j],
  dp[i][j - 1],
  dp[i - 1][j - 1]
)

وتمثل الحالات Delete وInsert وReplace.

تنفيذ TypeScript

TypeScript
123456789101112131415161718192021222324252627282930
function levenshteinDistance(a: string, b: string): number {
  const dp = Array.from(
    { length: a.length + 1 },
    () => new Array(b.length + 1).fill(0)
  );

  for (let i = 0; i <= a.length; i++) {
    dp[i][0] = i;
  }

  for (let j = 0; j <= b.length; j++) {
    dp[0][j] = j;
  }

  for (let i = 1; i <= a.length; i++) {
    for (let j = 1; j <= b.length; j++) {
      if (a[i - 1] === b[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1];
      } else {
        dp[i][j] = 1 + Math.min(
          dp[i - 1][j],
          dp[i][j - 1],
          dp[i - 1][j - 1]
        );
      }
    }
  }

  return dp[a.length][b.length];
}

التعقيد

إذا كان طول السلسلتين n وm:

Code
12
Time Complexity: O(n × m)
Space Complexity: O(n × m)

ويمكن تقليل الذاكرة إلى:

Code
1
O(min(n, m))

إذا احتفظنا فقط بالصف الحالي والسابق.

Spell Checking

إذا كتب المستخدم:

Code
1
programing

يمكن مقارنة الكلمة مع كلمات القاموس. المسافة إلى:

Code
1
programming

هي 1 فقط، ولذلك تعد اقتراحاً جيداً.

Fuzzy Search

إذا كانت القيمة المخزنة:

Code
1
Alexander

والبحث:

Code
1
Alexnder

يمكن لـ Edit Distance اكتشاف أن السلسلتين متقاربتان جداً رغم عدم وجود Exact Match.

CRM وDeduplication

في CRM قد نجد:

Code
12
Arian Soleimanzadeh
Arian Soleimanzade

المسافة الصغيرة قد تكون إشارة إلى وجود Duplicate Record.

لكن الأنظمة الحقيقية يجب أن تستخدم أيضاً البريد الإلكتروني ورقم الهاتف ومعرفات أخرى قبل دمج السجلات.

استخدامات أخرى

تظهر Levenshtein Distance في:

  • Spell Checking
  • Fuzzy Search
  • OCR Correction
  • NLP
  • Data Cleaning
  • Record Matching
  • Bioinformatics

الفرق عن Hamming Distance

Hamming Distance تقارن المواضع المتناظرة فقط وتتطلب عادة طولاً متساوياً.

أما Levenshtein فتسمح بالإضافة والحذف.

لذلك:

Code
1
cat → cats

له Levenshtein Distance تساوي 1.

Weighted Edit Distance

يمكن أيضاً إعطاء تكاليف مختلفة للعمليات.

مثلاً:

Code
123
Insert = 1
Delete = 1
Replace = 2

وهذا مفيد عندما لا تكون جميع الأخطاء متساوية الأهمية.

سؤال مقابلات شائع

من أشهر مسائل Dynamic Programming:

احسب أقل عدد من Insert وDelete وReplace لتحويل word1 إلى word2.

مثلاً:

Code
1
horse → ros

والإجابة 3.

أخطاء شائعة

يجب الانتباه إلى أن صف وعمود الصفر يمثلان السلسلة الفارغة، ولذلك نستخدم عادة:

Code
12
a[i - 1]
b[j - 1]

كما يجب عدم إضافة تكلفة عندما يكون الحرفان متساويين.

الخلاصة

Levenshtein Distance تقيس أقل عدد من عمليات Insert وDelete وReplace اللازمة لتحويل سلسلة إلى أخرى.

وهي مثال كلاسيكي على Dynamic Programming بتعقيد:

Code
12
Time: O(n × m)
Space: O(n × m)

وتُستخدم عملياً في البحث التقريبي، وتصحيح الإملاء، وتنظيف البيانات، وإزالة التكرار، وNLP وOCR.

في هذه الصفحة
مثال مشهورلماذا نستخدم Dynamic Programming؟تنفيذ TypeScriptالتعقيدSpell CheckingFuzzy SearchCRM وDeduplicationاستخدامات أخرىالفرق عن Hamming DistanceWeighted Edit Distanceسؤال مقابلات شائعأخطاء شائعةالخلاصة

تفاصيل المقال

بيانات النشر ووقت القراءة وعدد المشاهدات.

تاريخ النشر

١٩ أغسطس ٢٠٢٦

آخر تحديث

٢ نوفمبر ٢٠٢٦

وقت القراءة

7 دقيقة قراءة

المشاهدات

16

الكاتب

Arian Soleimanzadeh

المقال السابق

ما الفرق بين B2B CRM وB2C CRM؟ من عملية المبيعات إلى بنية البرمجيات

المقال التالي

ما هي خوارزمية Kosaraju وما المشكلة التي تحلها؟

آرین سليمان زاده

معرض أعمال شخصي يركز على هندسة الويب الحديثة، وأنظمة الواجهات، ومنتجات الذكاء الاصطناعي العملية — كود نظيف، وتصميم نقي.

روابط سريعة

  • نبذة
  • المدونة
  • المكتبة
  • تواصل

تواصل

  • soleimanzadeh.a.work@gmail.com
  • soleimanzadeh.uni@gmail.com

التوفر: أيام الأسبوع

عادةً يتم الرد خلال 24 ساعة.

النشرة البريدية

احصل على تحديثات حول المقالات، والمشاريع، والإصدارات الجديدة.

© 2026 ariansoleimanzadeh.dev — جميع الحقوق محفوظة.

لينكدإن