الگوریتم بایتپ

الگوریتم بایتپ الگوریتم بایتپ، الگوریتمی تقریبی برای تشخیص تطابق دو رشته است. الگوریتم پیش رو، مشخص می‌کند که در متن ورودی، زیر رشته‌ای وجود دارد که "تقریبا" با الگوی مورد نظر داده شده، برابر باشد. در این تعریف، با مفهوم فاصله‌ی لونشتین (levenshtein)—در صورتی که زیررشته و الگوی مد نظر، فاصله از یکدیگر داشته باشند، الگوریتم آن‌ها را برابر در نظر می‌گیرد—برابری تقریبی تعریف می‌شود. الگوریتم بایتپ، با پیش پردازش تعدادی ماسک بیتی، که هر کدام دارای یک بیت به ازای هر عضو الگو است، شروع می‌گردد. پس از آن الگوریتم اکثر عملیات خود را با عملگرهای دودویی انجام می‌دهد، که بسیار سریع می‌باشند.
با توجه به ساختمان داده‌ی مورد نیاز الگوریتم، این الگوریتم زمانی که طول الگوی ما، از عدد ثابتی کمتر باشد،(معمولا زمانی که کوچکتر از واحد کلمه‌ی کامپیوتر مورد استفاده باشد) بهترین عملکرد خود را دارد، علاوه بر آن، زمانی که تعداد حروف به کار رفته، کم باشند نیز عملکرد الگوریتم مناسب است. پیچیدگی محاسباتی الگوریتم برای الفبای با تعداد حروف ثابت و کلمه با طول و متنی با طول ، مستقل از ساختار متن و الگو، از می‌باشد.
بالینت دملکی (Bálint Dömölki)، الگوریتم بایتپ در حالت جستجوی دقیق را، در سال ۱۹۶۴ اختراع نمود و شیامسوندر (R. K. Shyamasundar) آن را در سال ۱۹۷۷ تعمیم داد.
جستجوی دقیق
الگوریتم بایتپ، برای جستجوی دقیق الگو در متن، در حالت کلی، در زیر با زبان C پیاده‌سازی شده‌است.
#include
#include
typedef char BIT; /* needs only to hold the values 0 and 1 */
const char *bitap_search(const char *text, const char *pattern)
const char *result = NULL;
int m = strlen(pattern);
BIT *R;
int i, k;
if (pattern0 == \0) return text;
/* Initialize the bit array R */
R = malloc((m+1) * sizeof *R);
R0 = 1;
for (k=1; k
= 1; --k)
Rk = Rk-1 -- (texti == patternk-1);
if (Rm) {
result = (text+i - m) + 1;
break;
free(R);
return result;
الگوریتم بایتپ، همان طور که در برنامه‌ی بالا می‌بینید، به خاطر تطابق طبیعی خود با عملیات دودویی، از دیگر الگوریتم‌های معروف جستجوی رشته، متمایز می‌باشد. توجه کنید که در مورد پیاده‌سازی بالا، بر خلاف تصور، هر بیت با مقدار ۰ نشان دهنده‌ی یک تطابق، و هر بیت با مقدار ۱ نشان دهنده‌ی یک عدم تطابق می‌باشد. می‌توان الگوریتم مشابهی با تصور شهودی از ۰ و ۱ نوشت، اما در این حالت ما باید دستور R |= ۱ را به حلقه‌ی داخلی اضافه کنیم. در این پیاده سازی، ما از این واقعیت که شیفت به چپ یک عدد، در سمت راست آن عدد، صفر اضافه می‌نماید به صورت بهینه استفاده کرده‌ایم.
توجه نمایید در پیاده‌سازی کلی برای تبدیل شرط (texti == patternk-۱) به یک عملگر دودویی نیاز به یک ماسک دودویی CHAR_MAX داریم.
#include
#include
const char *bitap_bitwise_search(const char *text, const char *pattern)
int m = strlen(pattern);
unsigned long R;
unsigned long pattern_maskCHAR_MAX+1;
int i;
if (pattern0 == \0) return text;
if (m> 31) return "The pattern is too long!";
/* Initialize the bit array R */
R = ~1;
/* Initialize the pattern bitmasks */
for (i=0; i
31) return "The pattern is too long!";
/* Initialize the bit array R */
R = malloc((k+1) * sizeof *R);
for (i=0; i <= k; ++i)
Ri = ~1;
/* Initialize the pattern bitmasks */
for (i=0; i <= CHAR_MAX; ++i)
pattern_maski = ~0;
for (i=0; i <m; ++i)
pattern_maskpatterni -= ~(1UL <<i);
for (i=0; texti != \0; ++i) {
/* Update the bit arrays */
unsigned long old_Rd1 = R0;
R0 |= pattern_masktexti;
R0 <<= 1;
for (d=1; d <= k; ++d) {
unsigned long tmp = Rd;
/* Substitution is all we care about */
Rd = (old_Rd1 - (Rd | pattern_masktexti)) <<1;
old_Rd1 = tmp;
if (0 == (Rk - (1UL <<m))) {
result = (text+i - m) + 1;
break;
free(R);
return result;
الگوریتم‌های مشابه
برخی دیگر از الگوریتم‌هایی که برای جستجوی یک الگو در متن استفاده می‌شوند عبارتند از KMP، RKS، BMS.