تبدیل باروز-ویلر: تفاوت میان نسخه‌ها

از ویکی‌پدیا، دانشنامهٔ آزاد
محتوای حذف‌شده محتوای افزوده‌شده
Msaberi (بحث | مشارکت‌ها)
جز اصلاح نویسه‌های عربی، اصلاح ارقام، اصلاح سجاوندی، اصلاح املا
Msaberi (بحث | مشارکت‌ها)
کاربرد
خط ۶۵: خط ۶۵:
برای درک اینکه این الگوریتم چگونه به کمتر کردن حجم کمک می‌کند، متنی را در نظر بگیرید که در آن یک لغت خاص زیاد تکرار شده باشد مثلاً کلمه بیا، بعد از اجرا این تبدیل تمامی موارد تکرار شدن این کلمه در کنار هم مرتب می‌شوند و قرار میگیرند مثلاً به صورت «اب» که در این صورت می‌دانیم «ی» مربوط به این زیر رشته در آخر جمله است. پس تعداد زیادی ی پشت سر هم در آخر رشته تکرار می‌شود که این امر، کار فشرده‌سازی را برای بعضی الگوریتم‌های فشرده‌سازی متدوال ساده‌تر می‌کند.
برای درک اینکه این الگوریتم چگونه به کمتر کردن حجم کمک می‌کند، متنی را در نظر بگیرید که در آن یک لغت خاص زیاد تکرار شده باشد مثلاً کلمه بیا، بعد از اجرا این تبدیل تمامی موارد تکرار شدن این کلمه در کنار هم مرتب می‌شوند و قرار میگیرند مثلاً به صورت «اب» که در این صورت می‌دانیم «ی» مربوط به این زیر رشته در آخر جمله است. پس تعداد زیادی ی پشت سر هم در آخر رشته تکرار می‌شود که این امر، کار فشرده‌سازی را برای بعضی الگوریتم‌های فشرده‌سازی متدوال ساده‌تر می‌کند.
{{روش‌های فشرده‌سازی}}
{{روش‌های فشرده‌سازی}}

==کاربردها==
همان طور که پیش از این نیز ذکر شد، الگوریتم BWT در فشرده سازی کاربرد زیادی دارد. اما می توان در کاربردهای دیگری هم از آن استفاده کرد که یکی از آن ها [[تطبیق الگو]] می باشد. <ref>{{cite book |author=Adjeroh |title=Other applications of the Burrows-Wheeler Transform |url=https://doi.org/10.1007/978-0-387-78909-5_8 |location=Boston, MA |publisher= Springer US|page=265--303 |date=2008 |isbn=978-0-387-78909-5}}</ref>


== منابع ==
== منابع ==

نسخهٔ ‏۲۴ ژوئیهٔ ۲۰۱۹، ساعت ۱۳:۱۰

تبدیل باروز-ویلر (به انگلیسی: Burrows–Wheeler transform or BWT) یک الگوریتم است که چیدمان حروف در کلمات را تغییر می دهد. ان روش برای فشرده‌سازی داده‌ها بسیار مناسب است. اگر متنی که می خواهیم آن را فشرده کنیم شامل حروف تکراری ترجیحاً پشت سر هم باشد می توان از روش های دیگر فشرده سازی نظیر کدبندی طول اجرا (به انگلیسی: Run-length encoding) استفاده کرد. اما در حالات دیگر روش BWT بسیار مناسب می باشد مخصوصاً اینکه BWT الگوریتمی برگشت‌پذیر است. یعنی میتوان متن فشرده سازی شده را به متن اولیه تبدیل کرد. در حقیقت این کار روشی است که فارغ از هر الگوریتم فشرده سازی که در آن استفاده می شود، با کمی محاسبات بیشتر میزان فشرده سازی را افزایش دهد. BWT توسط مایکل باروز و دیوید ویلر در سال ۱۹۹۴ معرفی شد، زمانی که باروز در یک شرکت به نام DEC Systems Research Center مشغول به کار بود.

الگوریتم بدست آوردن BWT

روش به دست آوردن BWT برای کلمهٔ EXAMPLE در شکل زیر نشان داده شده است. در ابتدا یک علامت مانند $ در انتهای آن قرار می دهیم تا بتوانیم کلمه را شیفت دورانی دهیم. خروجی های مربوط به شیفت در ستون سمت چپ آورده شده است. سپس در ستون سمت راست کلمات به دست آمده را به ترتیب حروف الفبا (Lexicographical order) مرتب می کنیم. ستون آخر که در شکل زیر به رنگ قرمز نمایش داده شده است، یعنی EXL$PAME همان (BWT(EXAMPLE می باشد.

مثالی برای بدست آوردن ماتریس BWT

شبه کد مربوط به این الگوریتم به شکل زیر می باشد:

 function BWT (string s)
    create a table, rows are all possible rotations of s
    sort rows alphabetically
    return (last column of the table)

الگوریتم BWT معکوس

تا قبل از این روشی که گفته شد برای فشرده سازی استفاده می شود. حال اگر BWT یک کلمه را داشته باشیم چگونه باید بفهمیم اصل آنچه بوده است؟ برای این کار ابتدا حروف را شماره گذاره میکنیم. چون ممکن است در متن حروف تکراری داشته باشیم. مثلاً در مثال خودمان خواهیم داشت: E1-X1-A1-M1-P1-L1-E2 و ۱$. برای بدست آوردن ماتریس مرتب شدهٔ اولیه ستوان آخر را که از نتیجهٔ فشرده سازی داریم. ستوان اول هم با مرتب کردن ستوان آخر بر اساس حروف الفبا به دست می آید. در ادامه به سطر اول نگاه می کنیم که ۱$ است. باید بفهمیم در کلمه اصلی بعد از این حرف چه حرفی قرار می گرفته است. با توجه به اینکه ما ماتریس را از طریق شیفت دورانی ساخته ایم پس اگر حرف ۱$ را در ستون آخر پیدا کرده و ببینیم در مقابل آن در سطر اول چه حرفی قرار دارد آن حرف، حرف بعدی ما در کلمه نهایی خواهد بود. همین کار را مدام انجام می دهیم تا کلمهٔ کامل به دست آید.[۱] برای درک بهتر به مثال زیر توجه کنید: همان‌طور که در بالا توضیح داده شد حرف بعد از ۱$ که X1 است را به دست آوردیم. حال به طریق مشابه می بینیم که X1 در کجای ستون آخر آمده است و حرف نظیر آن در ستون اول چیست؛ بنابراین می بینیم که مقابل آن A1 قرار دارد.

مثال معکوس BWT

سپس A1 را در ستون آخر پیدا میکنیم و حرف نظیر آن در ستون اول را به عنوان حرف بعدی انتخاب می کنیم:

نحوه پیدا کردن حرف ها در معکوس BWT

همین‌طور پیش می رویم تا سطر اول کامل شود:

پایان الگوریتم معکوس BWT

سپس اعداد را حذف می کنیم و سطر اول را شیفت دورانی می دهیم تا $ در انتهای کلمه قرار بگیرد. اینگونه ما به کلمهٔ اولیه رسیده ایم:$EXAMPLE

شبه کد مربوط به این الگوریتم به شکل زیر است:

function inverseBWT (string s)
    create empty table
    '''repeat''' length(s) '''times'''
        // first insert creates first column
        insert s as a column of table before first column of the table
        sort rows of the table alphabetically
    return (row that ends with the 'EOF' character)

نمونه پیاده‌سازی

کد مربوط به ساخت BWT به زبان پایتون در زیر آورده شده است:(برای درک بیشتر ۰۰۲\ , ۰۰۳\ به اسکی (استاندارد) مراجعه کنید. این دو کاراکتر مشخص کننده انتها و ابتدای کلمه هستند)

def bwt(s):
    """Apply Burrows-Wheeler transform to input string."""
    assert "\002" not in s and "\003" not in s, "Input string cannot contain STX and ETX characters"
    s = "\002" + s + "\003"  # Add start and end of text marker
    table = sorted(s[i:] + s[:i] for i in range(len(s)))  # Table of rotations of string
    last_column = [row[-1:] for row in table]  # Last characters of each row
    return "".join(last_column)  # Convert list of characters into string

برنامهٔ مربوط به معکوس BWT هم به شکل زیر می باشد:

def ibwt(r):
    """Apply inverse Burrows-Wheeler transform."""
    table = [""] * len(r)  # Make empty table
    for i in range(len(r)):
        table = sorted(r[i] + table[i] for i in range(len(r)))  # Add a column of r
    s = [row for row in table if row.endswith("\003")][0]  # Find the correct row (ending in ETX)
    return s.rstrip("\003").strip("\002")  # Get rid of start and end markers

چگونگی فشرده سازی

برای درک اینکه این الگوریتم چگونه به کمتر کردن حجم کمک می‌کند، متنی را در نظر بگیرید که در آن یک لغت خاص زیاد تکرار شده باشد مثلاً کلمه بیا، بعد از اجرا این تبدیل تمامی موارد تکرار شدن این کلمه در کنار هم مرتب می‌شوند و قرار میگیرند مثلاً به صورت «اب» که در این صورت می‌دانیم «ی» مربوط به این زیر رشته در آخر جمله است. پس تعداد زیادی ی پشت سر هم در آخر رشته تکرار می‌شود که این امر، کار فشرده‌سازی را برای بعضی الگوریتم‌های فشرده‌سازی متدوال ساده‌تر می‌کند.

کاربردها

همان طور که پیش از این نیز ذکر شد، الگوریتم BWT در فشرده سازی کاربرد زیادی دارد. اما می توان در کاربردهای دیگری هم از آن استفاده کرد که یکی از آن ها تطبیق الگو می باشد. [۲]

منابع

  1. Pavel Pevzner, Neil Jones (2004). An Introduction to Bioinformatics Algorithms. The MIT Press.
  2. Adjeroh (2008). Other applications of the Burrows-Wheeler Transform. Boston, MA: Springer US. p. 265--303. ISBN 978-0-387-78909-5.