آرین سلیمان‌زاده
  • خانه
  • وبلاگ
  • پادکست‌ها
  • ویدیوها
  • تماس با من
العربية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پاسخ سریع
خانه/مقاله‌ها/فاصله همینگ (Hamming Distance) چیست؟ از مفهوم تا پیاده‌سازی و کاربردهای واقعی
Algorithmsمقاله

فاصله همینگ (Hamming Distance) چیست؟ از مفهوم تا پیاده‌سازی و کاربردهای واقعی

فاصله همینگ روشی ساده و سریع برای اندازه‌گیری تفاوت میان دو رشته یا دنباله هم‌طول است. در این مقاله مفهوم، نحوه محاسبه، پیچیدگی، پیاده‌سازی و کاربردهای واقعی آن را بررسی می‌کنیم.

۲۸ مرداد ۱۴۰۵7 دقیقه مطالعه1 بازدید
#Algorithms#Hamming Distance#String Algorithms#Bit Manipulation#TypeScript#Computer Science

Arian Soleimanzadeh

Software Engineer & Researcher

نمایش مفهومی الگوریتم Hamming Distance برای مقایسه رشته‌ها و بیت‌های باینری

Arian Soleimanzadeh

هوش مصنوعی · کد · محصول

پژوهش + مهندسی
در این صفحه
ایده اصلیتعریف رسمیالگوریتم چگونه کار می‌کند؟پیاده‌سازی با TypeScriptپیچیدگی زمانی و فضاییHamming Distance برای اعداد باینریبهینه‌سازی شمارش بیت‌هاکاربردهای واقعی1. تشخیص و تصحیح خطا2. مقایسه کدهای باینری3. شبکه و ارتباطات4. پردازش تصویر و ویژگی‌های باینری5. Machine LearningHamming Distance و Levenshtein Distance چه تفاوتی دارند؟چه زمانی Hamming Distance انتخاب مناسبی است؟یک سؤال رایج مصاحبهاشتباهات رایججمع‌بندی

Hamming Distance یکی از ساده‌ترین معیارهای اندازه‌گیری اختلاف میان دو دنباله است. اگر دو رشته یا دو آرایه هم‌طول داشته باشیم، فاصله همینگ برابر است با تعداد موقعیت‌هایی که مقدار دو دنباله در آن‌ها با یکدیگر متفاوت است.

این مفهوم در الگوریتم‌ها، نظریه کدگذاری، شبکه، تشخیص خطا، پردازش داده و حتی بعضی مسائل Machine Learning کاربرد دارد.


ایده اصلی

دو رشته زیر را در نظر بگیرید:

Code
12
karolin
kathrin

کاراکترها را موقعیت‌به‌موقعیت مقایسه می‌کنیم:

Code
123
k a r o l i n
k a t h r i n
    ↑ ↑ ↑

سه موقعیت متفاوت هستند، بنابراین:

Code
1
Hamming Distance = 3

نکته مهم این است که در تعریف کلاسیک، دو دنباله باید طول یکسان داشته باشند.


تعریف رسمی

اگر دو رشته هم‌طول x و y با طول n داشته باشیم، فاصله همینگ را می‌توان به شکل زیر نوشت:

Code
1
H(x, y) = Σ [x[i] ≠ y[i]]

برای هر موقعیت، اگر عناصر متفاوت باشند مقدار 1 و در غیر این صورت 0 در نظر گرفته می‌شود.

مثلاً:

Code
12
x = 1011101
y = 1001001

مقایسه:

Code
123
1 0 1 1 1 0 1
1 0 0 1 0 0 1
    ↑   ↑

پس:

Code
1
H(x, y) = 2

الگوریتم چگونه کار می‌کند؟

روش محاسبه بسیار مستقیم است:

  1. بررسی می‌کنیم دو ورودی طول یکسان داشته باشند.
  2. یک شمارنده با مقدار صفر ایجاد می‌کنیم.
  3. از ابتدای دنباله تا انتها حرکت می‌کنیم.
  4. هر زمان دو مقدار متفاوت باشند، شمارنده را یک واحد افزایش می‌دهیم.
  5. در پایان مقدار شمارنده همان Hamming Distance است.

شبه‌کد:

JavaScript
1234567891011
function hammingDistance(a, b):
    if length(a) != length(b):
        error

    distance = 0

    for i from 0 to length(a) - 1:
        if a[i] != b[i]:
            distance++

    return distance

پیاده‌سازی با TypeScript

TypeScript
1234567891011121314151617
function hammingDistance(a: string, b: string): number {
  if (a.length !== b.length) {
    throw new Error("Inputs must have the same length.");
  }

  let distance = 0;

  for (let i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) {
      distance++;
    }
  }

  return distance;
}

console.log(hammingDistance("karolin", "kathrin")); // 3

این پیاده‌سازی تنها یک بار روی رشته حرکت می‌کند و به فضای اضافی قابل‌توجهی نیاز ندارد.


پیچیدگی زمانی و فضایی

اگر طول رشته‌ها n باشد:

Code
12
Time Complexity: O(n)
Space Complexity: O(1)

برای محاسبه دقیق باید هر موقعیت حداقل یک بار بررسی شود؛ بنابراین O(n) بهترین مرتبه زمانی معمول برای این مسئله است.


Hamming Distance برای اعداد باینری

یکی از کاربردهای مهم این الگوریتم مقایسه بیت‌ها است.

فرض کنید دو عدد داریم:

Code
12
x = 10  -> 1010
y = 14  -> 1110

فقط یک بیت متفاوت است:

Code
123
1010
1110
 ↑

پس فاصله همینگ برابر 1 است.

برای اعداد، می‌توان از عملگر XOR استفاده کرد:

Code
12345
1010
XOR
1110
----
0100

هر بیت 1 در خروجی XOR نشان‌دهنده یک موقعیت متفاوت است.

در نتیجه:

Code
1
Hamming Distance = تعداد بیت‌های 1 در x XOR y

نمونه TypeScript:

TypeScript
1234567891011
function hammingDistanceBits(x: number, y: number): number {
  let value = x ^ y;
  let distance = 0;

  while (value !== 0) {
    distance += value & 1;
    value >>>= 1;
  }

  return distance;
}

بهینه‌سازی شمارش بیت‌ها

برای شمارش بیت‌های 1 می‌توان از تکنیک Brian Kernighan استفاده کرد:

TypeScript
1234567891011
function hammingDistanceBits(x: number, y: number): number {
  let value = x ^ y;
  let distance = 0;

  while (value !== 0) {
    value &= value - 1;
    distance++;
  }

  return distance;
}

عبارت:

Code
1
value & (value - 1)

در هر مرحله کم‌ارزش‌ترین بیت 1 را حذف می‌کند.


کاربردهای واقعی

1. تشخیص و تصحیح خطا

فاصله همینگ در Error Detection و Error-Correcting Codes بسیار مهم است. اگر داده‌ای هنگام انتقال تغییر کند، اختلاف بیت‌ها می‌تواند برای تشخیص خطا استفاده شود.

2. مقایسه کدهای باینری

در سیستم‌های دیجیتال می‌توان میزان تفاوت دو Binary Code را با Hamming Distance اندازه گرفت.

3. شبکه و ارتباطات

در بعضی پروتکل‌ها و روش‌های انتقال داده، این معیار برای بررسی تغییرات داده در مسیر انتقال استفاده می‌شود.

4. پردازش تصویر و ویژگی‌های باینری

اگر ویژگی‌های یک تصویر به صورت Binary Descriptor ذخیره شوند، Hamming Distance می‌تواند برای مقایسه سریع آن‌ها به کار رود.

5. Machine Learning

برای داده‌های دسته‌ای یا ویژگی‌های باینری، Hamming Distance می‌تواند معیار ساده‌ای برای Similarity یا Distance باشد.

مثلاً:

Code
12
User A = [1, 0, 1, 1, 0]
User B = [1, 1, 1, 0, 0]

فاصله همینگ برابر 2 است.


Hamming Distance و Levenshtein Distance چه تفاوتی دارند؟

این دو مفهوم گاهی با هم اشتباه گرفته می‌شوند.

Hamming Distance فقط جایگزینی در موقعیت‌های متناظر را بررسی می‌کند و ورودی‌ها باید هم‌طول باشند.

اما Levenshtein Distance سه عملیات را در نظر می‌گیرد:

  • Insert
  • Delete
  • Replace

برای مثال:

Code
12
cat
cut

هر دو معیار فاصله 1 می‌دهند.

اما برای:

Code
12
cat
cats

Hamming Distance در تعریف کلاسیک قابل استفاده نیست، زیرا طول‌ها متفاوت‌اند؛ ولی Levenshtein Distance برابر 1 است.


چه زمانی Hamming Distance انتخاب مناسبی است؟

از Hamming Distance زمانی استفاده کنید که:

  • دو دنباله طول یکسان دارند.
  • موقعیت عناصر اهمیت دارد.
  • فقط می‌خواهید تعداد اختلاف‌ها را بدانید.
  • با داده‌های باینری کار می‌کنید.
  • سرعت و سادگی مهم است.

اگر Insert و Delete نیز باید محاسبه شوند، معیارهایی مانند Levenshtein مناسب‌تر هستند.


یک سؤال رایج مصاحبه

صورت مسئله:

دو عدد صحیح x و y داده شده‌اند. تعداد بیت‌هایی را که باید تغییر کنند تا x به y تبدیل شود محاسبه کنید.

راه‌حل:

Code
12
1. x XOR y
2. تعداد بیت‌های 1 در نتیجه

مثلاً:

Code
1234
x = 1  -> 0001
y = 4  -> 0100

XOR     -> 0101

در نتیجه دو بیت باید تغییر کنند:

Code
1
Hamming Distance = 2

اشتباهات رایج

یکی از رایج‌ترین اشتباهات این است که Hamming Distance را روی رشته‌هایی با طول متفاوت اجرا کنیم.

اشتباه دیگر این است که تصور کنیم فاصله همینگ محل جابه‌جایی یا حذف و اضافه شدن کاراکتر را تشخیص می‌دهد. این الگوریتم فقط موقعیت متناظر را مقایسه می‌کند.

همچنین برای اعداد باینری، ابتدا XOR و سپس شمارش بیت‌های 1 معمولاً ساده‌ترین راه‌حل است.


جمع‌بندی

Hamming Distance الگوریتم پیچیده‌ای نیست، اما ایده‌ای بسیار مهم در علوم کامپیوتر است.

اصل آن را می‌توان در یک جمله خلاصه کرد:

فاصله همینگ تعداد موقعیت‌هایی است که دو دنباله هم‌طول در آن‌ها با یکدیگر تفاوت دارند.

برای رشته‌ها معمولاً با یک حلقه ساده و برای اعداد باینری با ترکیب XOR + Bit Counting پیاده‌سازی می‌شود.

سادگی، زمان اجرای O(n) و کاربرد آن در داده‌های باینری باعث شده Hamming Distance در موضوعاتی مانند الگوریتم‌ها، شبکه، کدگذاری، پردازش داده و مسائل مصاحبه برنامه‌نویسی همچنان کاربردی باشد.

در این صفحه
ایده اصلیتعریف رسمیالگوریتم چگونه کار می‌کند؟پیاده‌سازی با TypeScriptپیچیدگی زمانی و فضاییHamming Distance برای اعداد باینریبهینه‌سازی شمارش بیت‌هاکاربردهای واقعی1. تشخیص و تصحیح خطا2. مقایسه کدهای باینری3. شبکه و ارتباطات4. پردازش تصویر و ویژگی‌های باینری5. Machine LearningHamming Distance و Levenshtein Distance چه تفاوتی دارند؟چه زمانی Hamming Distance انتخاب مناسبی است؟یک سؤال رایج مصاحبهاشتباهات رایججمع‌بندی

جزئیات مقاله

اطلاعات انتشار، زمان مطالعه و تعداد بازدید این محتوا.

انتشار

۲۸ مرداد ۱۴۰۵

آخرین ویرایش

۲۹ مرداد ۱۴۰۵

زمان مطالعه

7 دقیقه مطالعه

بازدید

1

نویسنده

Arian Soleimanzadeh

مقاله قبلی

الگوریتم Rabin–Karp چیست؟ جستجوی سریع رشته با Rolling Hash

مقاله بعدی

الگوریتم KMP چیست؟ جستجوی سریع رشته با Knuth–Morris–Pratt

بیایید محصولی هوشمند، دقیق و مقیاس‌پذیر بسازیم.

ارتباط سریع برای همکاری، مشاوره، توسعه محصول یا طراحی سامانه‌های هوشمند کسب‌وکار.

تماس سریعایمیل به من
آرین سلیمان‌زاده

پورتفولیوی شخصی با تمرکز بر Agentic CRM، سامانه‌های هوشمند کسب‌وکار، مهندسی مدرن وب، طراحی سیستم‌های رابط کاربری و توسعه محصولات نرم‌افزاری کاربردی.

لینک‌های سریع

  • درباره من
  • وبلاگ
  • پروژه‌ها
  • تماس

ارتباط

  • info@ariansoleimanzadeh.site
  • soleimanzadeh.a.work@gmail.com

در دسترس: روزهای کاری

معمولاً پاسخ در ۲۴ ساعت

خبرنامه

به‌روزرسانی‌های مربوط به نوشته‌ها، پروژه‌ها و انتشارهای جدید را دریافت کنید.

© 2026 ariansoleimanzadeh.site — تمامی حقوق محفوظ است.

لینکدین