رفتن به محتوای اصلی
بازگشت به وبلاگ

داده و اتصال فنی

آهو–کوراسیک؛ همهٔ الگوهای هم‌پوشان را پیدا کنیم

آهو–کوراسیک را با trie،failure و اجتماع خروجی بسازید؛۹رخدادِ متن اصیل و۳۹۶۹کنترل مستقل نشان می‌دهند چرا پسوندها نباید حذف شوند.

آهو–کوراسیک برای یافتن همهٔ رخدادهای یک مجموعه الگوی دقیق در متن، یک ماشین مشترک می‌سازد. نکته فقط یافتن اولین واژه نیست: در پایان یک جایگاه ممکن است چند الگوی پسوندی هم‌زمان تمام شوند. این صفحه ساختِ goto،پیوندِ failure و اجتماعِ خروجی‌ها را روی رشته‌های اصیل اجرا می‌کند؛ جست‌وجوی معنایی یا اجرای مدل زبانی نیست.

چهار الگو،یک متن

الگوهای ما به ترتیب شناسه،«اب»،«باب»،«ب» و«ابا» هستند. متن «بابابا» است و جایگاه‌ها از صفر شمرده می‌شوند. برای مثال در انتهای جایگاه۲،سه رخداد تمام می‌شوند: «اب» از۱،«باب» از۰ و«ب» از۲. گزارش‌کردن فقط طولانی‌ترین الگو،دو پاسخ درست دیگر را حذف می‌کند.

خروجی فایل برای هر رخداد،شناسهٔ الگو،شروع و انتهایِ خارج ازبازه دارد. در کل این متن۹رخداد پیدا می‌شود؛ هم‌پوشانی مجاز است. ترتیب گزارش با انتهای رخداد و سپس شناسهٔ الگو قطعی شده تا مقایسهٔ دو اجرا،به ترتیبِ تصادفیِ مجموعه‌ها وابسته نباشد.

مسیرهای مشترک در trie

ساخت را از ریشه شروع می‌کنیم و نویسه‌های هر الگو را روی یال‌ها جلو می‌بریم. اگر یال از قبل وجود داشته باشد،همان حالت دوباره استفاده می‌شود؛ در غیر این صورت حالت تازه می‌سازیم. پایان هر الگو،شناسهٔ آن را در خروجیِ همان حالت ثبت می‌کند. وجود مسیر با پایان یک الگوی ثبت‌شده یکی نیست.

کد برای همهٔ حالت‌ها،یال‌های next،مقصد fail و فهرست out را در JSON می‌نویسد. بنابراین خروجی فقط لیستِ پیدا‌شده با str.find نیست؛ ساختمانِ ماشین و پیوندهای ساخته‌شده هم قابل بررسی‌اند.

failure همان نویسه را دوباره بررسی می‌کند

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

پیوندها با صفِ BFS ساخته می‌شوند تا پیوندِ حالت کم‌عمق‌تر پیش از نیاز آماده باشد. دفترِ scan،حالتِ قبل،زنجیرهٔ بازگشت،حالتِ بعد و تمام شناسه‌های خروجی را در هر نویسه نشان می‌دهد. در همین متن،هم بازگشتِ واقعی و هم خروجیِ چندعضوی کنترل شده‌اند.

خروجیِ پسوند را به ارث ببریم

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

برای oracle مستقل،هر الگو در تمام شروع‌های ممکن با برشِ مستقیم متن مقایسه می‌شود. همهٔ۶۳زیرمجموعهٔ ناتهیِ شش الگوی a،b،aa،ab،ba،bb را در تمام۶۳متنِ دودویی با طول صفر تا۵ بررسی می‌کنیم؛۳۹۶۹جفتِ واقعی،لیست رخدادِ برابر دارند. این شمار benchmark سرعت نیست.

مرزِ فارسی و قرارداد ورودی

اندیس‌ها code point یونیکدند؛ بایت UTF-8 یا واژهٔ زبانی نیستند. «ی» و«ي» در آزمون جدا،الگوهای متمایز باقی می‌مانند. هیچ نرمال‌سازی،ریشه‌یابی یا مرزبندیِ واژه انجام نمی‌شود. متن خالی خروجی خالی دارد؛ الگوی خالی،تکراری،غیررشته‌ای و بیش از۸نویسه طبق قراردادِ کوچک رد می‌شود.

KMP یک الگوی معلوم را می‌یابد؛ تبدیل NFA به DFA پذیرشِ کل رشته را می‌سنجد. این ماشینِ مشترک،چند شناسه و همهٔ رخدادهایشان را گزارش می‌کند و موتور regex عمومی نیست. ادامه در مبانی هوش مصنوعی؛ برای پاسخ‌گویی به دانش مجاز کسب‌وکار،نیاز را در مسیر چت اپرا جدا مطرح کنید،بدون فرضِ این الگوریتم در محصول.

فایل تمرین و منبع

کد مستقلِ تمرین و کنترل‌ها؛ Python · ورودی‌ها و تمام خروجی واقعیِ همین تمرین؛ JSON

منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثال‌ها و فایل‌های این راهنما آموزشی و ساختهٔ تحریریه‌اند.

برای این نیاز، کدام خدمت مناسب‌تر است؟

تماس و منشی، چت سایت و تحلیل مکالمه سه مسیر متفاوت‌اند. ابتدا خدمت متناسب نیازتان را انتخاب کنید.

انتخاب میان سه خدمتراهنمای شروع با تیم اپرا

برآورد هزینه