البحث عن سلسلة فرعية في سلسلة هي واحدة من المهام الرئيسية التي تواجه المطورين في لغة البرمجة ج. من المهم أن تكون قادرا على العثور بشكل فعال على السلاسل الفرعية التي نحتاجها في البيانات النصية الكبيرة من أجل ضمان التشغيل السريع والفعال للبرنامج. في هذه المقالة ، سننظر في طرق مختلفة لتنفيذ خوارزمية البحث الفرعية في سلسلة باستخدام لغة سي.
واحدة من أبسط الطرق وأكثرها شعبية للعثور على سلسلة فرعية في سلسلة هو استخدام وظيفة سترستر المدمج في. تتيح لك هذه الوظيفة العثور على التكرار الأول لسلسلة فرعية في سلسلة وإرجاع مؤشر إلى بداية السلسلة الفرعية التي تم العثور عليها ، أو فارغة إذا لم يتم العثور على السلسلة الفرعية. ولكن نضع في اعتبارنا أن هذه الوظيفة تعمل فقط مع الأحرف ، وليس بايت ، لذلك يقتصر استخدامه على أحرف أسي.
مثال على استخدام وظيفة سترستر:
كونست شار * شارع = "مثال على سلسلة نصية";
كونست شار * سوبستر = "نص";
كونست شار * النتيجة = سترستر (ستر ، سوبستر);
إذا تم العثور على سلسلة فرعية ، سيشير متغير النتيجة إلى أول ظهور لسلسلة فرعية في السلسلة. خلاف ذلك ، سيحتوي متغير النتيجة على قيمة فارغة. بعد ذلك ، يمكننا استخدام مؤشر النتيجة للإجراءات التي نحتاجها ، على سبيل المثال ، لإخراج السلسلة الفرعية التي تم العثور عليها أو إجراء عمليات إضافية عليها.
- سلسلة فرعية ومعناها في البرمجة ج
- الخوارزميات الأساسية للبحث عن سلسلة فرعية في سلسلة
- 1. البحث المباشر (القوة الغاشمة)
- 2. خوارزمية كانوث موريس برات (كانوث موريس برات)
- 3. Алгоритм Рабина-Карпа (Rabin-Karp)
- 4. Алгоритм Бойера-Мура (Boyer-Moore)
- 5. Алгоритм Бойера-Мура-Хорспула (Boyer-Moore-Horspool)
- 6. Алгоритм Ахо-Корасик (Aho-Corasick)
- 7. Алгоритм Ультра-Бояера-Мура (Ultra-Boyer-Moore)
- Метод brute-force поиска подстроки
- Метод Кнута-Морриса-Пратта поиска подстроки
- Метод Бойера-Мура поиска подстроки
- أمثلة على التعليمات البرمجية للبحث عن سلسلة فرعية في سلسلة في ج
- مقارنة واختيار خوارزمية البحث الفرعية المثلى في ج
- 1. البحث الخطي
- 2. خوارزمية كانوث-موريس-برات (كمب)
- 3. خوارزمية بوير مور
- 4. خوارزمية رابين كارب
- 5. شجرة لاحقة
- سؤال وجواب
- كيف يمكنني العثور على سلسلة فرعية في سلسلة باستخدام ج?
- كيف أجد كل تواجدات سلسلة فرعية في سلسلة في ج?
- كيف أجد سلسلة فرعية في سلسلة, تجاهل حالة الأحرف في ج?
- كيفية العثور على فهرس أول ظهور لسلسلة فرعية في سلسلة في ج?
سلسلة فرعية وقيمتها في البرمجة ج
السلسلة الفرعية هي سلسلة من الأحرف الموجودة في سلسلة معينة. البحث عن سلسلة فرعية في سلسلة واحدة من العمليات الأكثر شيوعا في ج البرمجة.
في ج البرمجة ، هناك عدة طرق للعثور على سلسلة فرعية في سلسلة:
- توفير طرق ملائمة للبحث عن سلسلة فرعية في سلسلة.
- خوارزميات البحث: بالإضافة إلى الوظائف القياسية ، يمكن استخدام خوارزميات البحث الفرعية المختلفة ، مثل خوارزمية كانوث-موريس-برات (كمب) ، خوارزمية بوير-مور (بم) وخوارزمية رابين-كارب.
- وظائف أصلية: يمكنك أيضا تنفيذ وظيفة البحث الفرعية الخاصة بك في سلسلة بناء على معرفة خوارزميات البحث الأساسية.
البحث عن سلسلة فرعية في سلسلة يمكن أن تكون مفيدة لمختلف المهام. على سبيل المثال ، يمكنك استخدامه من أجل:
- التحقق من وجود نص معين في سطر;
- استخراج بيانات معينة من سلسلة;
- استبدال سلسلة فرعية بأخرى;
- تقسيم سلسلة إلى سلاسل فرعية.
من المهم أن نتذكر أنه في ج يتم تمثيل سلاسل البرمجة كمصفوفات من الأحرف ، والسلسلة الفرعية هي أيضا مجموعة من الأحرف. يتطلب البحث عن سلسلة فرعية في سلسلة تحديد الموضع الأولي وطول السلسلة الفرعية ، بالإضافة إلى طرق مقارنة الأحرف. والاستخدام السليم للوظائف البحث فرعية والخوارزميات تساعدك على العمل بفعالية مع البيانات النصية في البرمجة ج.
الخوارزميات الأساسية للبحث عن سلسلة فرعية في سلسلة
يعد البحث عن سلسلة فرعية في سلسلة واحدة من أكثر المهام شيوعا عند العمل مع النص. هناك العديد من الخوارزميات الأساسية التي يمكن استخدامها لحل هذه المشكلة.
1. البحث المباشر (القوة الغاشمة)
تتكون أبسط خوارزمية بحث فرعية من المقارنة المتسلسلة لكل حرف من السلسلة مع كل حرف من السلسلة الفرعية التي يتم البحث عنها. إذا تطابق الأحرف ، يتم تنفيذ الانتقال إلى الحرف التالي من كلا الخطين ، وإلا يتم تنفيذ الانتقال إلى الحرف التالي من السطر.
2. خوارزمية كانوث موريس برات (كانوث موريس برات)
تستخدم خوارزمية كانوث-موريس-برات معلومات إضافية حول تطابقات البادئات واللواحق في السلسلة الفرعية المطلوبة لتحسين البحث. تقوم الخوارزمية بإعداد دالة بادئة تحدد أطول طول لاحقة السلسلة الفرعية التي تطابق البادئة الخاصة بها. يمكن بعد ذلك استخدام هذه الوظيفة للبحث بكفاءة عن سلسلة فرعية في سلسلة.
3. خوارزمية رابين كارب
تستخدم خوارزمية رابين كارب التجزئة لمقارنة سلسلة فرعية بسلسلة. أولا ، يتم حساب تجزئة السلسلة الفرعية المطلوبة ، ثم يتم حساب التجزئة لكل سلسلة فرعية من السلسلة ومقارنتها مع تجزئة السلسلة الفرعية المطلوبة. في حالة تطابق التجزئة ، يتم إجراء فحص إضافي لاستبعاد التطابقات الخاطئة.
4. خوارزمية بوير مور
تعمل خوارزمية بوير مور من اليمين إلى اليسار وتستخدم جداول الإزاحة للعثور على سلسلة فرعية بكفاءة. يعتمد على قاعدتين مختلفتين: قاعدة التحول الصحيحة وقاعدة اللاحقة الجيدة. تقوم الخوارزمية بمسح السلسلة من اليمين إلى اليسار وتحويل السلسلة الفرعية المطلوبة وفقا لقواعد الإزاحة.
5. خوارزمية بوير-مور-هورسبول
خوارزمية بوير-مور-هورسبول هي تعديل لخوارزمية بوير-مور التي تستخدم قيد لاحقة. تحسب الخوارزمية آخر ظهور لكل حرف من السلسلة الفرعية المطلوبة وتحول السلسلة الفرعية المطلوبة بهذه القيم.
6. خوارزمية أهو-كوراسيك
يتم استخدام خوارزمية أهو-كوراسيك للبحث عن عينات متعددة في صف واحد في نفس الوقت. وهي مبنية على أساس بنية بيانات البورون (تري) والبحث عن عينات في صف واحد باستخدام إنسان مع عدد محدود من الدول.
7. خوارزمية الترا بوير مور
خوارزمية الترا بوير مور هي نسخة محسنة من خوارزمية بوير مور. يطبق العديد من الاستدلال للعثور على سلسلة فرعية بكفاءة في سلسلة ، بما في ذلك الإبطال والنسخ المتطابق والحساب المسبق لجداول الإزاحة.
| الخوارزمية | تقدير ساعات العمل | Пространственная сложность |
|---|---|---|
| Прямой поиск (Brute force) | O(n*m) | O(1) |
| Алгоритм Кнута-Морриса-Пратта (Knuth-Morris-Pratt) | O(n+m) | O(m) |
| Алгоритм Рабина-Карпа (Rabin-Karp) | O(n+m) | O(1) |
| Алгоритм Бойера-Мура (Boyer-Moore) | O(n+m) | O(k) |
| Алгоритм Бойера-Мура-Хорспула (Boyer-Moore-Horspool) | O(n+m) | O(k) |
| Алгоритм Ахо-Корасика (Aho-Corasick) | O(n+m+k) | O(k) |
| Алгоритм Ультра-Бояера-Мура (Ultra-Boyer-Moore) | O(n+m) | O(k) |
Примечание: ن هو طول السلسلة ، م هو طول السلسلة الفرعية ، ك هو عدد العينات.
اعتمادا على تفاصيل المهمة ومتطلبات الأداء ، يمكنك اختيار إحدى الخوارزميات المذكورة أعلاه للبحث عن سلسلة فرعية في سلسلة.
طريقة القوة الغاشمة للبحث عن سلسلة فرعية
طريقة القوة الغاشمة (أو" طريقة القوة الغاشمة") هي الطريقة الأبسط والأكثر مباشرة للعثور على سلسلة فرعية في سلسلة باستخدام لغة البرمجة ج.
الفكرة الرئيسية لهذه الطريقة هي التكرار من خلال سلاسل فرعية ومقارنتها بحرف سلسلة حسب الحرف. إذا كانت السلسلة الفرعية تتطابق مع جزء من السلسلة ، فسيتم العثور على أول ظهور للسلسلة الفرعية. إذا كانت السلسلة الفرعية لا تتطابق مع أي جزء من السلسلة ، فلا توجد تكرارات لها في السلسلة.
لتنفيذ طريقة القوة الغاشمة ، يجب تنفيذ الخطوات التالية:
- تهيئة اثنين من المؤشرات: يشير أحدهما إلى الحرف الحالي في السلسلة ، والآخر يشير إلى الحرف الحالي في السلسلة الفرعية.
- حتى يتم الوصول إلى نهاية السلسلة أو السلسلة الفرعية ، قارن الأحرف بالمؤشرات الحالية.
- إذا لم تتطابق الأحرف ، حرك المؤشر في السلسلة موضع واحد إلى اليمين ، وأعد المؤشر في السلسلة الفرعية إلى البداية.
- إذا تطابق الأحرف ، انقل كلا المؤشرين إلى اليمين.
- إذا وصل مؤشر السلسلة الفرعية ، نتيجة للتحول ، إلى نهاية السلسلة ، فسيتم العثور على أول ظهور للسلسلة الفرعية في السلسلة ويتم إيقاف تنفيذ الخوارزمية.
يوضح رمز ج التالي تنفيذ طريقة القوة الغاشمة للبحث الفرعي:
# تشمل
# تشمل
إنت سلسلة فرعية البحث (كونست شار* سلسلة ، كونست شار* سلسلة فرعية) {
كثافة العمليات سترينغ_طول = سترلين (سلسلة);
إنت سوبسترينغ_لنغث = سترلين (سوبسترينغ);
ل (إنت أنا = 0 ؛ أنا < = طول السلسلة-طول السلسلة الفرعية ؛ أنا++) {
ي;
إلى عن على (ي = 0 ؛ ي < طول السلسلة الفرعية ؛ ي++) {
إذا (سلسلة [أنا + ي]!= سلسلة فرعية [ي]) {
استراحة;
}
}
إذا (ي = = طول السلسلة الفرعية) {
العودة أنا ؛ / / найдено первое вхождение подстроки
}
}
العودة -1 ؛ / / вхождений подстроки в строку нет
}
كثافة العمليات الرئيسية () {
كونست شار * سلسلة = "Force القوة الغاشمة Force";
كونست شار * سلسلة فرعية = "القوة الغاشمة";
مؤشر كثافة العمليات = البحث الفرعي (سلسلة ، سلسلة فرعية);
إذا (مؤشر != -1) {
برينتف ("تم العثور على سلسلة فرعية في الموضع: ٪ د
"،الفهرس);
} آخر {
برينتف ("لم يتم العثور على سلسلة فرعية
");
}
العودة 0;
}
في هذا المثال ، يتم البحث في السلسلة الفرعية "القوة الغاشمة" في السلسلة "طريقة البحث الفرعية للقوة الغاشمة". إذا تم العثور على سلسلة فرعية ، يقوم البرنامج بإخراج موضع التكرار الأول للسلسلة الفرعية. خلاف ذلك ، يتم عرض الرسالة "سلسلة فرعية غير موجودة".
طريقة القوة الغاشمة سهلة التنفيذ ، لكنها يمكن أن تعمل بشكل غير فعال مع كميات كبيرة من البيانات. هناك خوارزميات بحث فرعية أكثر مثالية ، مثل خوارزمية كانوث موريس برات وخوارزمية بوير مور.
طريقة كانوث-موريس-برات للبحث عن سلسلة فرعية
طريقة كانوث-موريس-برات (خوارزمية كمب) هي واحدة من الخوارزميات الأكثر فعالية للبحث عن سلسلة فرعية في سلسلة. إنه متفوق بشكل ملحوظ على طرق البحث البسيطة مثل طريقة" القوة الغاشمة " بناء على مقارنة متسلسلة لكل حرف.
مبدأ تشغيل خوارزمية كمب هو استخدام جدول التحول المعدة مسبقا. يسمح هذا الجدول للخوارزمية بتخطي عدد معين من الأحرف عند مقارنة سلسلة فرعية بالسلسلة الأصلية ، مما يسرع عملية البحث.
الخطوات الرئيسية لخوارزمية كمب:
- جعل جدول التحولات لسلسلة فرعية معينة. يحدد هذا الجدول عدد الأحرف التي يمكننا تخطيها إذا لم تتطابق الأحرف.
- نبدأ الحلقة باستخدام أحرف السلسلة الأصلية والسلسلة الفرعية.
- إذا لم تتطابق الأحرف ، فابحث عن جدول التحول وانتقل إلى اليمين من خلال العدد المحدد من المواضع.
- كرر الخطوات من 2 إلى 3 حتى نجد جميع تكرارات السلسلة الفرعية في السلسلة.
خوارزمية كمب لديها تعقيد خطي من ا (ن + م) ، أين ن هو طول السلسلة الأصلية ، م هو طول السلسلة الفرعية. لذلك ، فهي فعالة جدا للبحث عن سلاسل فرعية في سلاسل كبيرة.
مثال على استخدام خوارزمية كمب:
| الخط الأصلي | سلسلة فرعية | النتيجة |
|---|---|---|
| "أبفغدابفغد" | "أبفد" | 3 الحوادث |
| "أبكدفغابكدفغابكدفغ" | "اي بي سي" | 3 الحوادث |
| "أبكديفغابديفغ" | "شيز" | 0 تكرارات |
تعد خوارزمية كمب أداة مهمة في مجال خوارزميات البحث الفرعية وتستخدم على نطاق واسع في تطبيقات مختلفة مثل معالجة النصوص والبحث عن الملفات وتجميع البرامج وما إلى ذلك.
طريقة بوير مور للبحث عن سلسلة فرعية
طريقة بوير مور هي واحدة من الخوارزميات الأكثر فعالية للبحث عن سلسلة فرعية في سلسلة. تم تطويره في عام 1977 من قبل روبرت بوير و جيه ستراوتس بواسطة طومسون.
الفكرة الرئيسية لخوارزمية بوير مور هي أن البحث الفرعي لم يعد يبدأ بالحرف الأول من السلسلة ، ولكن بالحرف الأخير. هذا يجعل من الممكن تخطي عدد معين من الأحرف عند المقارنة.
تتكون خوارزمية بوير مور من مرحلتين: المعالجة المسبقة والبحث. في مرحلة المعالجة المسبقة ، يتم إنشاء جدول إزاحة ، حيث يتم تحديد الحد الأقصى للإزاحة للتخطي في حالة عدم التطابق لكل حرف من السلسلة.
في المرحلة الثانية ، عند البحث عن سلسلة فرعية ، تتم مقارنة الأحرف من اليمين إلى اليسار. إذا لم تتطابق الأحرف التي تتم مقارنتها ، فهناك إزاحة بعدد معين من المواضع إلى اليمين ، والتي يتم تحديدها بواسطة جدول الإزاحة.
خوارزمية بوير مور هي ذات كفاءة عالية ، وخاصة إذا كانت سلسلة فرعية المطلوب هو أكثر من 2 حرفا طويلة. تعقيدها هو ا (ن / م) ، أين ن هو طول السلسلة الأصلية ، م هو طول السلسلة الفرعية المطلوبة.
مزايا طريقة البحث الفرعية بوير مور:
- سرعة عالية في البحث في سلاسل كبيرة;
- الكفاءة في البحث عن سلسلة فرعية طويلة;
- القدرة على تخطي الأحرف عند المقارنة ، مما يزيد من سرعة البحث.
ومع ذلك ، فإن الخوارزمية لها بعض العيوب:
- غير فعال عند البحث عن سلاسل فرعية قصيرة;
- يتطلب ذاكرة إضافية لتخزين جدول الإزاحة;
- يمكن أن يكون تعقيد الخوارزمية مرتفعا مع بعض البيانات المشوهة.
على الرغم من بعض العيوب ، فإن خوارزمية بوير مور منتشرة على نطاق واسع وتستخدم في العديد من التطبيقات والأنظمة الحديثة للبحث بكفاءة عن سلاسل فرعية.
أمثلة على التعليمات البرمجية للبحث عن سلسلة فرعية في سلسلة في ج
وفيما يلي بعض الأمثلة التعليمات البرمجية التي تسمح لك للبحث عن سلسلة فرعية في سلسلة في لغة البرمجة ج. يتم تقديم جميع الأمثلة في صيغة ج القياسية ولا تستخدم مكتبات الجهات الخارجية.
1. مثال على استخدام وظيفة سترستر()
يتم استخدام وظيفة سترستر () للبحث عن أول حدوث سلسلة فرعية في سلسلة. فإنه يأخذ وسيطتين: مؤشر إلى سلسلة المصدر ومؤشر إلى سلسلة فرعية ، وإرجاع مؤشر إلى أول حدوث سلسلة فرعية في السلسلة ، أو فارغة إذا لم يتم العثور على سلسلة فرعية.
# تشمل
# تشمل
كثافة العمليات الرئيسية () {
شار شارع [] = "سلسلة سبيل المثال للبحث عن";
شار سوبستر [] = "خطوط";
شار * بتر = سترستر (شارع ، سوبستر);
إذا (بتر != لاغية) {
برينتف ("تم العثور على سلسلة فرعية: ٪ س
"،بتر);
} آخر {
برينتف ("لم يتم العثور على سلسلة فرعية
");
}
العودة 0;
}
2. مثال على استخدام حلقة للبحث عن سلسلة فرعية
هناك طريقة أخرى لحل مشكلة البحث عن سلسلة فرعية في سلسلة وهي استخدام حلقة بمقارنة الأحرف المتسلسلة. في هذا المثال ، نذهب من خلال كل حرف في السلسلة ومقارنتها مع الحرف الأول من السلسلة الفرعية. في حالة تطابق الأحرف ، نتحقق مما إذا كانت الأحرف المتبقية من السلسلة الفرعية تتطابق مع أحرف السلسلة.
# تشمل
# تشمل
البحث الدولي (كونست شار * ستر، كونست شار * سوبستر) {
الباحث سترلين = سترلين ( شارع);
إنت سوبسترلين = سترلين (سوبستر);
ل (إنت أنا = 0 ؛ أنا < = سترلين-سوبسترلين ؛ أنا i) {
ي;
إلى عن على (ي = 0 ؛ ي < التحتية ؛ ي j) {
if (str[i + j] != substr[j]) {
break;
}
}
if (j == substrLen) {
return i;
}
}
return -1;
}
int main() {
char str[] = "Пример строки для поиска";
char substr[] = "строки";
int result = searchSubstring(str, substr);
if (result != -1) {
printf("Подстрока найдена в позиции %d
", result);
} else {
printf("Подстрока не найдена
");
}
return 0;
}
3. Пример использования функции strcasestr()
تبحث وظيفة ستركاسيستر () عن سلسلة فرعية في سلسلة غير حساسة لحالة الأحرف. وهو يعمل على غرار وظيفة سترستر () ، ولكن ليست حساسة لحالة الأحرف. وظيفة ستركاسيستر() بإرجاع مؤشر إلى أول حالة حدوث حساسة أو فارغة إذا لم يتم العثور على سلسلة فرعية.
# تشمل
# تشمل
كثافة العمليات الرئيسية () {
شار شارع [] = "سلسلة سبيل المثال للبحث عن";
شار سوبستر [] = "خطوط";
شار * بتر = ستركاسيستر (ستر ، سوبستر);
إذا (بتر != لاغية) {
برينتف ("تم العثور على سلسلة فرعية: ٪ س
"،بتر);
} آخر {
برينتف ("لم يتم العثور على سلسلة فرعية
");
}
العودة 0;
}
هذه ليست سوى بعض الأمثلة التعليمات البرمجية التي توضح كيف يمكنك البحث عن سلسلة فرعية في سلسلة في لغة البرمجة ج. قد يكون من المفيد لك تحسين الأمثلة لتناسب احتياجاتك الخاصة أو استخدام وظائف وطرق أخرى لحل هذه المشكلة.
مقارنة واختيار خوارزمية البحث الفرعية المثلى في ج
يعد البحث عن سلسلة فرعية في سلسلة إحدى المهام الرئيسية عند العمل مع البيانات النصية. هناك العديد من الخوارزميات في لغة البرمجة ج التي يمكن استخدامها للعثور على سلسلة فرعية. دعونا ننظر إلى أهمها ومقارنة أدائها.
1. البحث الخطي
البحث الخطي هو أبسط خوارزمية بحث فرعية. يقوم بإجراء مقارنة متسلسلة لكل حرف من السلسلة مع أحرف السلسلة الفرعية. إذا تم العثور على تطابق ، يتم تحديد الحرف التالي. إذا كانت السلسلة الفرعية تتطابق تماما مع الجزء الحالي من السلسلة ، تقوم الخوارزمية بإرجاع فهرس هذا الجزء.
المزايا:
- سهولة التنفيذ
- يعمل بشكل صحيح لجميع أنواع السلاسل
العيوب:
- غير فعال للسلاسل الطويلة ، لأنه يتطلب مقارنة الحرف في كل موضع من السلسلة
2. خوارزمية كانوث-موريس-برات (كمب)
خوارزمية كانوث-موريس-برات (كمب) يستخدم معلومات إضافية حول البادئات فرعية لتسريع البحث. وهو يبني وظيفة البادئة التي تسمح لك لتحديد مقدار سلسلة فرعية يمكن أن تحول إذا الأحرف لا تتطابق.
المزايا:
- فعالة للبحث عن سلاسل فرعية في سلاسل طويلة
- تعقيد الخوارزمية هو ا (ن + م) ، أين ن هو طول السلسلة ، م هو طول السلسلة الفرعية
العيوب:
- يتطلب إنشاء وظيفة بادئة ، مما يضيف تكاليف إضافية للذاكرة والوقت
3. خوارزمية بوير مور
تعتمد خوارزمية بوير مور على عملية مقارنة الأحرف من اليمين إلى اليسار. يستخدم جدول إزاحة يشير إلى عدد المواضع التي يمكن إزاحة سلسلة فرعية في حالة عدم تطابق الأحرف.
المزايا:
- فعال في الحالات التي تحتوي فيها السلسلة الفرعية على العديد من الأحرف المتطابقة
- تعقيد الخوارزمية هو ا (ن + م) ، أين ن هو طول السلسلة ، م هو طول السلسلة الفرعية
العيوب:
- مطلوب ذاكرة إضافية لتخزين جدول الإزاحة
4. خوارزمية رابين كارب
تستخدم خوارزمية رابين كارب التجزئة للعثور على سلسلة فرعية. فإنه يحسب قيمة التجزئة من سلسلة فرعية ويقارنها مع قيم التجزئة من شظايا السلسلة. في حالة تطابق قيم التجزئة ، يتم إجراء فحص إضافي لمطابقة كاملة.
المزايا:
- فعالة للبحث عن سلاسل فرعية متعددة في سلسلة واحدة
- تعقيد الخوارزمية هو ا (ن + م) ، أين ن هو طول السلسلة ، م هو طول السلسلة الفرعية
العيوب:
- يمكن أن تنتج تصادمات عند حساب قيم التجزئة
- مطلوب ذاكرة إضافية لتخزين قيم التجزئة
5. شجرة لاحقة
شجرة اللاحقة هي بنية بيانات تعتمد على جميع لاحقات السلسلة. يسمح لك بالبحث بكفاءة عن سلاسل فرعية ، والعثور على جميع تكرارات سلسلة فرعية ، وتنفيذ عمليات أخرى.
المزايا:
- فعالة للبحث عن أنواع مختلفة من سلاسل فرعية
- تعقيد الخوارزمية هو ا (ن) ، أين ن هو طول السلسلة
العيوب:
- يتطلب وقتا إضافيا والذاكرة لبناء شجرة لاحقة
| الخوارزمية | المزايا | العيوب |
|---|---|---|
| البحث الخطي | سهولة التنفيذ | غير فعالة لسلاسل طويلة |
| خوارزمية كانوث-موريس-برات | وهو فعال للبحث عن سلاسل فرعية في سلاسل طويلة | يتطلب بناء وظيفة البادئة |
| خوارزمية بوير مور | وهو فعال في الحالات التي تحتوي فيها السلسلة الفرعية على العديد من الأحرف المتطابقة | مطلوب ذاكرة إضافية لتخزين جدول الإزاحة |
| خوارزمية رابين كارب | وهو فعال للبحث عن سلاسل فرعية متعددة في سلسلة واحدة | يمكن أن تنتج تصادمات عند حساب قيم التجزئة |
| شجرة لاحقة | إنه فعال للبحث عن أنواع مختلفة من السلاسل الفرعية | يتطلب وقتا إضافيا والذاكرة لبناء |
نتيجة لذلك ، يعتمد اختيار خوارزمية البحث الفرعية المثلى في ج على المهمة المحددة وخصائص بيانات الإدخال. إذا كانت السلسلة قصيرة وكانت السلسلة الفرعية قصيرة الطول ، فيمكنك استخدام بحث خطي بسيط. إذا كان طول السلاسل كبيرة ، فإنه يستحق النظر في خوارزميات كمب ، بوير مور ، رابين كارب أو استخدام شجرة لاحقة في حالة البحث سلسلة فرعية معقدة ومعالجة المهام.
سؤال وجواب
كيف يمكنني العثور على سلسلة فرعية في سلسلة باستخدام ج?
في ج ، هناك عدة طرق للعثور على سلسلة فرعية في سلسلة. واحدة من أبسط الطرق وأكثرها شيوعا هي استخدام وظيفة سترستر (). تأخذ هذه الوظيفة سلسلتين كمعلمات وتعيد مؤشرا إلى التكرار الأول للسلسلة الثانية في السلسلة الأولى. إذا لم يتم العثور على السلسلة الفرعية ، ترجع الدالة فارغة. مثال على استخدام الوظيفة:
كيف أجد كل تواجدات سلسلة فرعية في سلسلة في ج?
من أجل العثور على جميع تكرارات سلسلة فرعية في سلسلة في ج ، يمكنك استخدام حلقة و سترستر() وظيفة. بدءا من بداية السلسلة ، ستبحث الوظيفة عن سلسلة فرعية في السلسلة باستخدام حلقة ، وتسجيل كل مرة يتم العثور على حدوثها في مصفوفة أو قائمة خاصة. نموذج التعليمات البرمجية:
كيف أجد سلسلة فرعية في سلسلة, تجاهل حالة الأحرف في ج?
من أجل العثور على سلسلة فرعية في سلسلة ، وتجاهل حالة الأحرف في ج ، يمكنك استخدام وظيفة ستركاسيستر (). تعمل هذه الوظيفة بشكل مشابه لوظيفة سترستر () ، ولكنها تتجاهل حالة الأحرف عند مقارنة السلاسل. مثال على استخدام الوظيفة:
كيف أجد فهرس أول ظهور لسلسلة فرعية في سلسلة في ج?
من أجل العثور على مؤشر أول حدوث سلسلة فرعية في سلسلة ج ، يمكنك استخدام وظيفة سترستر() في تركيبة مع وظيفة سترلين (). بعد استدعاء وظيفة سترستر () ، وحساب الفرق بين المؤشر إلى سلسلة فرعية وبداية السلسلة للحصول على مؤشر حدوث الأول. نموذج التعليمات البرمجية: