آرایه السیپی
آرایه السیپی | ||
---|---|---|
نوع | آرایه | |
اختراع شده توسط | (Manber و Myers 1990) | |
زمان اجرای الگوریتم در نماد O بزرگ | ||
متوسط | بدترین حالت | |
حافظه | ||
ساخت |
در علوم رایانه، آرایه بلندترین پیشوند مشترک (آرایه السیپی) (به انگلیسی: LCP array) یک دادهساختار کمکی برای آرایه پسوندی است. در این آرایه، طولانیترین پیشوند مشترک بین هر دو پسوند متوالی موجود در آرایه پسوندی ذخیره میشود.
تاریخچه
[ویرایش]آرایه السیپی توسط Udi Manber و Gene Myers در سال ۱۹۹۰ به همراه آرایه پسوندی و برای بهبود سرعت الگوریتم جستجوی الگو در متن ارائه شد.[۱]
تعریف
[ویرایش]فرض کنیم آرایه پسوندی رشته بوده و نشاندهندهٔ طولانیترین پیشوند مشترک رشتههای و باشد. هم چنین زیررشتهٔ از حرف ام تا حرف ام را با نشان میدهیم. در این صورت آرایه السیپی یک آرایه با اندازهٔ از اعداد صحیح است که تعریف نشدهاست و به ازای هر . با توجه به اینکه نشاندهندهٔ جایگاه شروع امین کوچکترین پسوند رشتهٔ از نظر لغتنامهای است، پس طول بلندترین پیشوند مشترک امین و امین پسوند رشتهٔ از نظر لغتنامهای است ().
مثال
[ویرایش]رشتهٔ را در نظر بگیرید:
i | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
---|---|---|---|---|---|---|---|
S[i] | b | a | n | a | n | a | $ |
و آرایهٔ پسوندی مرتبشدهٔ متناظر با آن:
i | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
---|---|---|---|---|---|---|---|
A[i] | ۷ | ۶ | ۴ | ۲ | ۱ | ۵ | ۳ |
پسوندهای رشتهٔ که به صورت ستونی و مرتبشده نوشته شدهاند:
i | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
---|---|---|---|---|---|---|---|
A[i] | ۷ | ۶ | ۴ | ۲ | ۱ | ۵ | ۳ |
1 | $ | a | a | a | b | n | n |
2 | $ | n | n | a | a | a | |
3 | a | a | n | $ | n | ||
4 | $ | n | a | a | |||
5 | a | n | $ | ||||
6 | $ | a | |||||
7 | $ |
آرایهٔ السیپی با مقایسهٔ پسوندهای متوالی از نظر لغتنامهای برای مشخص کردن بزرگترین پیشوند مشترک آنها محاسبه میشود:
i | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
---|---|---|---|---|---|---|---|
H[i] | ⊥ | ۰ | ۱ | ۳ | ۰ | ۰ | ۲ |
برای مثال، طول بزرگترین پیشوند مشترک بین و یعنی رشته است.
استفاده از آرایه السیپی برای جستجوی یک الگو در متن
[ویرایش]فرض کنید میخواهیم تعداد رخدادهای یک الگوی (به طول ) در یک متن (به طول ) را بیابیم. میتوان با دو بار استفاده از جستجوی دودویی، مکان اولین و آخرین رخداد در آرایه پسوندی را بدست آورد و در نتیجه تعداد رخدادهای رشته در متن بدست میآید. در هر کدام از جستجوهای دودویی مقایسه نیاز است و با توجه به اینکه در هر مقایسه رشتهٔ را با یکی از عناصر آرایه پسوندی مقایسه میکنیم، در بدترین حالت ممکن است نیاز به مقایسهٔ کامل دو رشته باشد که به معنی مقایسهٔ کاراکتر است؛ بنابراین زمان اجرای این الگوریتم از است.
با استفاده از آرایه السیپی، الگوریتمی با زمان اجرای ارائه میدهیم.[۱] به ازای هر ، را برابر تعریف میکنیم؛ در واقع برابر امین کوچکترین پسوند است. ابتدا فرض کنیم به ازای هر مقدار از قبل محاسبه شدهاست. در هر مرحله از جستجوی دودویی، یک بازه در آرایه پسوندی به همراه نقطه میانی آن را در نظر میگیریم. سپس با مقایسهٔ و مشخص میکنیم که جستجو را در بازهٔ ادامه دهیم یا بازهٔ . فرض کنیم بزرگتر از باشد و اولین حرفی از و که متفاوت اند حرف ام باشد؛ یعنی . پس در مرحلهٔ بعدی جستجو، بازه با نقطه میانی را در نظر میگیریم. با توجه به فرضی که کردیم، مقدار از قبل محاسبه شدهاست و در زمان قابل دسترس است. سه حالت ممکن است پیش بیاید:
- حالت ۱: ، یعنی طولانیترین پیشوند مشترک و کمتر از طولانیترین پیشوند مشترک و است؛ بنابراین امین حرف و یکسان است و چون در نتیجه . بنابراین جستجو را در بازهٔ ادامه میدهیم.
- حالت ۲: ، یعنی و پیشوند مشترک بیشتری نسبت به و دارند. با توجه به اینکه آرایه پسوندی با ترتیب لغتنامهای مرتب شدهاست، پس . از آنجا که اولین حرفی که و در آن متفاوت اند حرف ام است و رشتههای و در این حرف یکسان اند، پس و در نتیجه جستجو در بازه ادامه مییابد.
- حالت ۳: ، یعنی رشتههای و در حرف اول با رشتهٔ یکسان اند. برای مقایسه رشتههای و ، این دو رشته را از حرف ام به بعد مقایسه میکنیم تا به اولین حرف متفاوت برسیم. به این ترتیب در مرحلهٔ بعدی الگوریتم جستجوی دودویی، مقدار را داریم و میتوانیم به همین صورت الگوریتم جستجوی را ادامه دهیم.
در الگوریتم بالا هر کاراکتر از رشتهٔ حداکثر یک بار با کاراکترهای متن مقایسه میشود؛ بنابراین زمان اجرای این الگوریتم است.
اما فرض کرده بودیم به ازای هر مقدار از قبل محاسبه شدهاست. توجه کنیم که همهٔ بازههای ممکن در الگوریتم جستجوی دودویی ظاهر نمیشوند. به ازای هر نقطهٔ ، دقیقاً یک بازه با نقطهٔ میانی وجود دارد که در الگوریتم جستجوی دودویی ممکن است ظاهر شود. این بازه را با نشان میدهیم و به ازای هر تعریف میکنیم:
با توجه به الگوریتم گفته شده، فقط به مقادیر آرایههای و نیاز داریم که حافظهای از اشغال میکنند. همچنین از روی آرایه السیپی و در زمان میتوان مقادیر و را محاسبه کرد.
ساختن آرایه السیپی
[ویرایش]در سال ۱۹۹۰ Manber و Myers الگوریتمی از دادند که در کنار آرایه پسوندی، آرایه السیپی را نیز محاسبه میکند.[۱] در سال ۲۰۰۳ الگوریتمی از برای ساختن همزمان آرایه پسوندی و آرایه السیپی ارایه شد.[۲]
در سال ۲۰۰۱ الگوریتمی ارایه شد که در آرایه السیپی را از روی متن و آرایه پسوندی محاسبه میکند.[۳]
جستارهای وابسته
[ویرایش]منابع
[ویرایش]- ↑ ۱٫۰ ۱٫۱ ۱٫۲ Manber, Udi; Myers, Gene (1990). Suffix arrays: a new method for on-line string searches. First Annual ACM-SIAM Symposium on Discrete Algorithms. pp. 319–327.
- ↑ Kärkkäinen, Juha; Sanders, Peter (2003). Simple linear work suffix array construction. Proceedings of the 30th international conference on Automata, languages and programming. pp. 943–955. Retrieved 2012-08-28.
- ↑ Kasai, T.; Lee, G.; Arimura, H.; Arikawa, S.; Park, K. (2001). Linear-Time Longest-Common-Prefix Computation in Suffix Arrays and Its Applications. Proceedings of the 12th Annual Symposium on Combinatorial Pattern Matching. Lecture Notes in Computer Science. Vol. 2089. pp. 181–192. doi:10.1007/3-540-48194-X_17. ISBN 978-3-540-42271-6.