آرایه پسوندی
در علوم رایانه یک آرایهٔ پسوندی آرایهای مرتبشده از همهٔ پسوندهای یک رشته است. این داده ساختار در الگوریتمهای فشرده سازی و بیوانفورماتیک کاربرد دارد.
آرایهٔ پسوندی در سال ۱۹۹۰ توسط (Manber و Myers 1990) بهعنوان جایگزینی سادهتر و همچنین از نظر حافظه بهینه تر برای درخت پسوندی معرفی شد. همچنین در سال ۱۹۸۷ به طور مستقل توسط Gaston Gonnet با نام PAT کشف شده بود.
آرایهٔ پسوندی | ||
---|---|---|
نوع | آرایه | |
اختراع شده توسط | (Manber و Myers 1990) | |
زمان اجرای الگوریتم در نماد O بزرگ | ||
متوسط | بدترین حالت | |
حافظه | ||
ساخت |
تعریف
اگر رشتهٔ
آرایهٔ پسوندی
مثال
اگر داشته باشیم$banana
i | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
---|---|---|---|---|---|---|---|
b | a | n | a | n | a | $ |
در انتهای رشته یک حرف $ اضافه میکنیم که از نظر الفبایی کوچکترین حرف الفباست.
پسوندهای رشته به شرح زیر است:
Suffix | i |
---|---|
$banana | ۱ |
$anana | ۲ |
$nana | ۳ |
$ana | ۴ |
$na | ۵ |
$a | ۶ |
$ | ۷ |
پسوندها را به ترتیب الفبایی و به صورت نزولی مرتب میکنیم:
Suffix | i |
---|---|
$ | ۷ |
$a | ۶ |
$ana | ۴ |
$anana | ۲ |
$banana | ۱ |
$na | ۵ |
$nana | ۳ |
آرایهٔ پسوندی
i | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
---|---|---|---|---|---|---|---|
۷ | ۶ | ۴ | ۲ | ۱ | ۵ | ۳ |
اگر در آرایهٔ پسوندی پسوندهای هر عدد را به صورت عمودی زیر آن بنویسیم بدین شکل خواهد بود:
i | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
---|---|---|---|---|---|---|---|
۷ | ۶ | ۴ | ۲ | ۱ | ۵ | ۳ | |
۱ | $ | a | a | a | b | n | n |
۲ | $ | n | n | a | a | a | |
۳ | a | a | n | $ | n | ||
۴ | $ | n | a | a | |||
۵ | a | n | $ | ||||
۶ | $ | a | |||||
۷ | $ |
برای مثال،$ana
.
ارتباط به درخت پسوندی
آرایهٔ پسوندی ارتباط نزدیکی با درخت پسوندی دارند:
- آرایهی پسوندی را میتوان با یک جستجو اول عمق بر روی درخت پسوندی ساخت.
- درخت پسوندی را میتوان در زمان خطی با استفاده از ترکیبی از آرایهٔ پسوندی و آرایهٔ LCP ساخت.
و همچنین نشان داده شده است که هر الگوریتم درخت پسوندی را میتوان با یک الگوریتم که از آرایهٔ پسوندی تغییر یافته (برای مثال با استفاده از آرایهٔ LCP) استفاده کند جایگزین کرد به طوری که همان مسئله را در همان پیچیدگی زمانی حل کند.
بهینگی حافظه
آرایهٔ پسوندی برای پیشرفت در بهینگی حافظه نسبت به درخت پسوندی معرفی شد: آرایههای پسوندی
با این حال در بعضی از کاربردها میزان حافظهٔ مورد نیاز برای آرایهٔ پسوندی میتواند هزینه بر باشد. درحالت کلی آرایهٔ پسوندی به
الگوریتم ساخت
یک درخت پسوندی را میتوان در
راه حل سادهٔ ساخت آرایههای پسوندی استفاده از الگوریتمهای مرتبسازی مقایسهای است، این الگوریتمها به
و الگوریتمهای پیشرفتهتر با استفاده از این موضوع که رشتههایی که باید مرتب شوند، رشتههای دلخواهی نیستند و به هم ارتباط دارند روشهایی با زمان
کاربردها
از آرایهٔ پسوندی میتوان برای پیدا کردن سریع همهٔ تکرارهای یک رشتهٔ
با توجه به ترتیب الفبایی پسوندها در آرایهٔ پسوندی این پسوندها پشت سر هم قرار گرفتهاند و میتوان آنها را به راحتی با استفاده از ۲ بار اجرای جستجوی دودویی پیدا کرد. جستجوی اول نقطهٔ شروع بازه را پیدا میکند و جستجوی دوم نقطهٔ پایانی را مشخص میکند:
def search(P):
l = 0; r = n
while l < r:
mid = (l+r) / 2
if P > suffixAt(A[mid]):
l = mid + 1
else:
r = mid
s = l; r = n
while l < r:
mid = (l+r) / 2
if P < suffixAt(A[mid]):
r = mid
else:
l = mid + 1
return (s, r)
با توجه به این که هر پسوند نیاز به مقایسهٔ
و این الگوریتم را میتوان با استفاده از آرایهٔ LCP به
منابع
- ↑ Abouelhoda, Kurtz & Ohlebusch 2002.
- ↑ Abouelhoda, Mohamed Ibrahim; Kurtz, Stefan; Ohlebusch, Enno (2002). The Enhanced Suffix Array and Its Applications to Genome Analysis. Algorithms in Bioinformatics. Lecture Notes in Computer Science. 2452. p. 449. doi:10.1007/3-540-45784-4_35.
- Manber, Udi; Myers, Gene (1993). "Suffix arrays: a new method for on-line string searches". SIAM Journal on Computing. 22: 935–948. doi:10.1137/0222058.
- "Replacing suffix trees with enhanced suffix arrays". Abouelhoda, Mohamed Ibrahim; Kurtz, Stefan; Ohlebusch, Enno (2004).