ការស្វែងរកការប្រកួត regex ទាំងអស់តែងតែមាន O(n²) | Mewayz Blog Skip to main content
Hacker News

ការស្វែងរកការប្រកួត regex ទាំងអស់តែងតែមាន O(n²)

មតិយោបល់

2 min read Via iev.ee

Mewayz Team

Editorial Team

Hacker News

តម្លៃ​លាក់​នៃ​ការ​ផ្គូផ្គង​លំនាំ

សម្រាប់អ្នកអភិវឌ្ឍន៍ កន្សោមធម្មតា (regex) គឺជាឧបករណ៍ដែលមិនអាចខ្វះបាន កាំបិតកងទ័ពស្វីសសម្រាប់ញែក បញ្ជាក់ និងស្រង់ព័ត៌មានចេញពីអត្ថបទ។ ពីការពិនិត្យមើលទម្រង់អ៊ីមែលរហូតដល់ការលួចទិន្នន័យពីកំណត់ហេតុ regex គឺជាដំណោះស្រាយឆ្ពោះទៅរក។ ទោះជាយ៉ាងណាក៏ដោយ នៅក្រោម facade ដ៏មានអានុភាពនេះ មានអន្ទាក់ដំណើរការ ដែលបានញាំញីប្រព័ន្ធជាច្រើនទសវត្សរ៍មកហើយ៖ ភាពស្មុគស្មាញនៃពេលវេលាដ៏អាក្រក់បំផុតនៃការស្វែងរកការប្រកួតទាំងអស់នៅក្នុងខ្សែអក្សរគឺ O(n²)។ ភាពស្មុគស្មាញនៃពេលវេលាបួនជ្រុងនេះមានន័យថា នៅពេលដែលខ្សែអក្សរបញ្ចូលកើនឡើងតាមបន្ទាត់ ពេលវេលាដំណើរការអាចកើនឡើងជានិទស្សន្ត ដែលនាំឱ្យមានការយឺតយ៉ាវដែលមិននឹកស្មានដល់ ការហត់នឿយធនធាន និងបាតុភូតដែលគេស្គាល់ថាជា ReDoS (ការបដិសេធចំពោះសេវាកម្មធម្មតា)។ ការ​យល់​ដឹង​ពី​ការ​កំណត់​ពី​កំណើត​នេះ​គឺ​ជា​ជំហាន​ដំបូង​ឆ្ពោះ​ទៅ​រក​ការ​បង្កើត​កម្មវិធី​ដែល​កាន់​តែ​រឹងមាំ និង​មាន​ប្រសិទ្ធភាព។

ហេតុអ្វីបានជា Regex ផ្គូផ្គង O(n²)? បញ្ហានៃការតាមដាន

ឫសគល់នៃភាពស្មុគស្មាញ O(n²) ស្ថិតនៅក្នុងយន្តការដែលម៉ាស៊ីន regex ប្រពៃណីភាគច្រើនប្រើ៖ ការតាមដាន។ នៅពេលដែលម៉ាស៊ីន regex ដូចជានៅក្នុង Perl, Python, ឬ Java ព្យាយាមស្វែងរកការផ្គូផ្គងដែលអាចធ្វើបានទាំងអស់ វាមិនគ្រាន់តែស្កេនខ្សែអក្សរម្តងនោះទេ។ វារុករកផ្លូវផ្សេងៗគ្នា។ ពិចារណាគំរូសាមញ្ញដូចជា `(a+)+b` ដែលត្រូវបានអនុវត្តចំពោះខ្សែអក្សរនៃ "a" ភាគច្រើនដូចជា "aaaaaaaaac" ។ ម៉ាស៊ីនផ្គូផ្គង "a" ទាំងអស់ជាមួយ `a+` ដំបូងដោយលោភលន់ បន្ទាប់មកព្យាយាមផ្គូផ្គង "b" ចុងក្រោយ។ នៅពេលដែលវាបរាជ័យ វាដើរថយក្រោយ - ដែលមិនផ្គូផ្គង "a" ចុងក្រោយ ហើយសាកល្បងបរិមាណ `+` នៅលើក្រុមខាងក្រៅ។ ដំណើរការនេះកើតឡើងម្តងទៀត ដោយបង្ខំឱ្យម៉ាស៊ីនសាកល្បងរាល់ការរួមផ្សំគ្នាដែលអាចធ្វើទៅបាននៃរបៀបដែល "a" អាចត្រូវបានដាក់ជាក្រុម ដែលនាំទៅដល់ការផ្ទុះនៃលទ្ធភាពរួមផ្សំ។ ចំនួនផ្លូវដែលម៉ាស៊ីនត្រូវរុករកអាចសមាមាត្រទៅនឹងការេនៃប្រវែងខ្សែ ដូច្នេះ O(n²)។

  • បរិមាណលោភលន់៖ លំនាំដូចជា `.*` ឬ `.+` ប្រើប្រាស់អត្ថបទឱ្យបានច្រើនតាមដែលអាចធ្វើបានដំបូង ដែលនាំទៅដល់ការតាមដានយ៉ាងទូលំទូលាយ នៅពេលដែលផ្នែកជាបន្តបន្ទាប់នៃលំនាំមិនផ្គូផ្គង។
  • Nested Quantifiers៖ កន្សោមដូចជា `(a+)+` ឬ `(a*a*)*` បង្កើតចំនួនអិចស្ប៉ូណង់ស្យែលនៃវិធីដើម្បីបំបែកខ្សែអក្សរបញ្ចូល ដែលបង្កើនពេលវេលាដំណើរការយ៉ាងខ្លាំង។
  • លំនាំមិនច្បាស់លាស់៖ នៅពេលដែលខ្សែអក្សរអាចត្រូវបានផ្គូផ្គងក្នុងវិធីត្រួតគ្នាច្រើន ម៉ាស៊ីនត្រូវតែពិនិត្យមើលលទ្ធភាពនីមួយៗ ដើម្បីស្វែងរកការផ្គូផ្គងទាំងអស់។

ផលប៉ះពាល់ពិភពលោកពិត៖ ច្រើនជាងការយឺតយ៉ាវ

នេះ​មិន​មែន​គ្រាន់​តែ​ជា​ការ​ព្រួយ​បារម្ភ​ផ្នែក​សិក្សា​ទេ។ regex គ្មានប្រសិទ្ធភាពអាចមានផលវិបាកធ្ងន់ធ្ងរនៅក្នុងបរិយាកាសផលិតកម្ម។ ការត្រួតពិនិត្យសុពលភាពទិន្នន័យដែលមើលទៅហាក់ដូចជាគ្មានគ្រោះថ្នាក់អាចក្លាយជាឧបសគ្គនៅពេលដំណើរការឯកសារធំ ឬគ្រប់គ្រងបរិមាណច្រើននៃការបញ្ចូលរបស់អ្នកប្រើប្រាស់។ លទ្ធផលដ៏គ្រោះថ្នាក់បំផុតគឺការវាយប្រហារដោយ ReDoS ដែលតួអង្គព្យាបាទផ្តល់នូវខ្សែអក្សរដែលបានបង្កើតយ៉ាងប្រុងប្រយ័ត្នដែលបង្កឱ្យមានដំណើរការអាក្រក់បំផុតនៅក្នុង regex របស់កម្មវិធីបណ្តាញ ដោយមានប្រសិទ្ធភាពព្យួរម៉ាស៊ីនមេ និងធ្វើឱ្យវាមិនអាចប្រើប្រាស់បានសម្រាប់អ្នកប្រើប្រាស់ស្របច្បាប់។ សម្រាប់អាជីវកម្ម នេះបកប្រែដោយផ្ទាល់ទៅពេលវេលារងចាំ បាត់បង់ប្រាក់ចំណូល និងខូចកេរ្តិ៍ឈ្មោះ។ នៅពេលបង្កើតប្រព័ន្ធស្មុគ្រស្មាញ ជាពិសេសអ្នកដែលដំណើរការទិន្នន័យដែលមិនគួរឱ្យទុកចិត្ត ការដឹងអំពីបញ្ហា regex ទាំងនេះគឺជាផ្នែកសំខាន់នៃសុវត្ថិភាព និងសវនកម្មដំណើរការ។

"យើងធ្លាប់មានការអាប់ដេតការកំណត់រចនាសម្ព័ន្ធតូចតាចដែលណែនាំ regex ដើម្បីញែកខ្សែអក្សរភ្នាក់ងារអ្នកប្រើប្រាស់។ នៅក្រោមការផ្ទុកធម្មតា វាមិនអីទេ។ ប៉ុន្តែក្នុងអំឡុងពេលចរាចរណ៍កើនឡើង វាបណ្តាលឱ្យមានការបរាជ័យដែលដក API របស់យើងអស់ជាច្រើននាទី។ ពិរុទ្ធជនគឺ O(n²) regex ដែលយើងមិនដែលដឹងថាយើងមាន។" - វិស្វករ DevOps ជាន់ខ្ពស់

ការកសាងប្រព័ន្ធឆ្លាតវៃជាងមុនជាមួយ Mewayz

ដូច្នេះ តើ​យើង​ធ្វើ​យ៉ាង​ណា​ឲ្យ​ហួស​ពី​កម្រិត​មូលដ្ឋាន​នេះ? ដំណោះស្រាយពាក់ព័ន្ធនឹងការរួមបញ្ចូលគ្នានៃឧបករណ៍ដែលប្រសើរជាងមុន និងជម្រើសស្ថាបត្យកម្មដ៏ឆ្លាតវៃ។ ទីមួយ អ្នកអភិវឌ្ឍន៍អាចប្រើឧបករណ៍វិភាគ regex ដើម្បីកំណត់អត្តសញ្ញាណគំរូដែលមានបញ្ហា ហើយសរសេរវាឡើងវិញដើម្បីឱ្យមានប្រសិទ្ធភាពជាងមុន (ឧ. ការប្រើឧបករណ៍កំណត់បរិមាណ ឬក្រុមអាតូមិក)។ សម្រាប់ដំណើរការចុងក្រោយ ក្បួនដោះស្រាយជំនួសមានដែលធានាពេលវេលាលីនេអ៊ែរ O(n) សម្រាប់ការផ្គូផ្គងលំនាំ ទោះបីជាវាមិនសូវមាននៅក្នុងបណ្ណាល័យស្តង់ដារក៏ដោយ។

នេះគឺជាកន្លែងដែលប្រព័ន្ធប្រតិបត្តិការអាជីវកម្មម៉ូឌុលដូចជា Mewayz ផ្តល់នូវអត្ថប្រយោជន៍យ៉ាងសំខាន់។ Mewayz អនុញ្ញាតឱ្យអ្នកបែងចែក និងត្រួតពិនិត្យដំណើរការសំខាន់ៗ។ ជំនួសឱ្យការមានកម្មវិធី monolithic ដែល regex យឺតតែមួយអាចធ្វើឱ្យខូចប្រព័ន្ធទាំងមូល អ្នកអាចដាក់ឱ្យប្រើប្រាស់នូវ microservice ដាច់ដោយឡែកសម្រាប់ការញែកទិន្នន័យ និងសុពលភាព។ ប្រសិនបើបញ្ហាដំណើរការកើតឡើង វាត្រូវបានគ្រប់គ្រង និងអាចដោះស្រាយបានដោយមិនប៉ះពាល់ដល់ប្រតិបត្តិការអាជីវកម្មផ្សេងទៀត។ លើសពីនេះ ឧបករណ៍សង្កេតនៅក្នុងវេទិកា Mewayz អាចជួយអ្នកកំណត់ពីភាពគ្មានប្រសិទ្ធភាពទាំងនេះ មុនពេលវាប៉ះពាល់ដល់អតិថិជនរបស់អ្នក ដោយបង្វែរវិបត្តិសក្តានុពលទៅជាកិច្ចការបង្កើនប្រសិទ្ធភាពដែលអាចគ្រប់គ្រងបាន។ តាមរយៈការកសាងមូលដ្ឋានគ្រឹះដែលអាចបត់បែនបាន និងអាចសង្កេតបាន អ្នកធានាថាតក្កវិជ្ជាអាជីវកម្មរបស់អ្នក រួមទាំងដំណើរការអត្ថបទដ៏ស្មុគស្មាញ នៅតែដំណើរការ និងមានភាពធន់។

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

សំណួរដែលគេសួរញឹកញាប់

តម្លៃលាក់កំបាំងនៃការផ្គូផ្គងលំនាំ

សម្រាប់អ្នកអភិវឌ្ឍន៍ កន្សោមធម្មតា (regex) គឺជាឧបករណ៍ដែលមិនអាចខ្វះបាន កាំបិតកងទ័ពស្វីសសម្រាប់ញែក បញ្ជាក់ និងស្រង់ព័ត៌មានចេញពីអត្ថបទ។ ពីការពិនិត្យមើលទម្រង់អ៊ីមែលរហូតដល់ការលួចទិន្នន័យពីកំណត់ហេតុ regex គឺជាដំណោះស្រាយឆ្ពោះទៅរក។ ទោះជាយ៉ាងណាក៏ដោយ នៅក្រោម facade ដ៏មានអានុភាពនេះ មានអន្ទាក់ដំណើរការ ដែលបានញាំញីប្រព័ន្ធជាច្រើនទសវត្សរ៍មកហើយ៖ ភាពស្មុគស្មាញនៃពេលវេលាដ៏អាក្រក់បំផុតនៃការស្វែងរកការប្រកួតទាំងអស់នៅក្នុងខ្សែអក្សរគឺ O(n²)។ ភាពស្មុគស្មាញនៃពេលវេលាបួនជ្រុងនេះមានន័យថានៅពេលដែលខ្សែអក្សរបញ្ចូលកើនឡើងតាមបន្ទាត់ ពេលវេលាដំណើរការអាចកើនឡើងជានិទស្សន្ត ដែលនាំឱ្យមានការយឺតយ៉ាវដែលមិននឹកស្មានដល់ ការហត់នឿយធនធាន និងបាតុភូតដែលគេស្គាល់ថាជា ReDoS (ការបដិសេធនៃសេវាកម្មធម្មតា)។ ការ​យល់​ដឹង​ពី​ការ​កំណត់​ពី​កំណើត​នេះ​គឺ​ជា​ជំហាន​ដំបូង​ឆ្ពោះ​ទៅ​រក​ការ​បង្កើត​កម្មវិធី​ដែល​កាន់​តែ​រឹងមាំ និង​មាន​ប្រសិទ្ធភាព។

ហេតុអ្វីបានជា Regex ត្រូវគ្នានឹង O(n²)? បញ្ហានៃការតាមដាន

ឫសគល់នៃភាពស្មុគស្មាញ O(n²) ស្ថិតនៅក្នុងយន្តការដែលម៉ាស៊ីន regex ប្រពៃណីភាគច្រើនប្រើ៖ ការតាមដាន។ នៅពេលដែលម៉ាស៊ីន regex ដូចជានៅក្នុង Perl, Python, ឬ Java ព្យាយាមស្វែងរកការផ្គូផ្គងដែលអាចធ្វើបានទាំងអស់ វាមិនគ្រាន់តែស្កេនខ្សែអក្សរម្តងនោះទេ។ វារុករកផ្លូវផ្សេងៗគ្នា។ ពិចារណាគំរូសាមញ្ញដូចជា `(a+)+b` ដែលត្រូវបានអនុវត្តចំពោះខ្សែអក្សរនៃ "a" ភាគច្រើនដូចជា "aaaaaaaaac" ។ ម៉ាស៊ីនផ្គូផ្គង "a" ទាំងអស់ជាមួយ `a+` ដំបូងដោយលោភលន់ បន្ទាប់មកព្យាយាមផ្គូផ្គង "b" ចុងក្រោយ។ នៅពេលដែលវាបរាជ័យ វាដើរថយក្រោយ - ដែលមិនផ្គូផ្គង "a" ចុងក្រោយ ហើយសាកល្បងបរិមាណ `+` នៅលើក្រុមខាងក្រៅ។ ដំណើរការនេះកើតឡើងម្តងទៀត ដោយបង្ខំឱ្យម៉ាស៊ីនសាកល្បងរាល់ការរួមផ្សំគ្នាដែលអាចធ្វើទៅបាននៃរបៀបដែល "a" អាចត្រូវបានដាក់ជាក្រុម ដែលនាំទៅដល់ការផ្ទុះនៃលទ្ធភាពរួមផ្សំ។ ចំនួនផ្លូវដែលម៉ាស៊ីនត្រូវរុករកអាចសមាមាត្រទៅនឹងការេនៃប្រវែងខ្សែ ដូច្នេះ O(n²)។

ផលប៉ះពាល់ពិភពលោកពិត៖ ច្រើនជាងការយឺតយ៉ាវ

នេះ​មិន​មែន​គ្រាន់​តែ​ជា​ការ​ព្រួយ​បារម្ភ​ផ្នែក​សិក្សា​ទេ។ regex គ្មានប្រសិទ្ធភាពអាចមានផលវិបាកធ្ងន់ធ្ងរនៅក្នុងបរិយាកាសផលិតកម្ម។ ការត្រួតពិនិត្យសុពលភាពទិន្នន័យដែលមើលទៅហាក់ដូចជាគ្មានគ្រោះថ្នាក់អាចក្លាយជាឧបសគ្គនៅពេលដំណើរការឯកសារធំ ឬគ្រប់គ្រងបរិមាណច្រើននៃការបញ្ចូលរបស់អ្នកប្រើប្រាស់។ លទ្ធផលដ៏គ្រោះថ្នាក់បំផុតគឺការវាយប្រហារដោយ ReDoS ដែលតួអង្គព្យាបាទផ្តល់នូវខ្សែអក្សរដែលបានបង្កើតយ៉ាងប្រុងប្រយ័ត្នដែលបង្កឱ្យមានដំណើរការអាក្រក់បំផុតនៅក្នុង regex របស់កម្មវិធីបណ្តាញ ដោយមានប្រសិទ្ធភាពព្យួរម៉ាស៊ីនមេ និងធ្វើឱ្យវាមិនអាចប្រើប្រាស់បានសម្រាប់អ្នកប្រើប្រាស់ស្របច្បាប់។ សម្រាប់អាជីវកម្ម នេះបកប្រែដោយផ្ទាល់ទៅពេលវេលារងចាំ បាត់បង់ប្រាក់ចំណូល និងខូចកេរ្តិ៍ឈ្មោះ។ នៅពេលបង្កើតប្រព័ន្ធស្មុគ្រស្មាញ ជាពិសេសអ្នកដែលដំណើរការទិន្នន័យដែលមិនគួរឱ្យទុកចិត្ត ការដឹងអំពីបញ្ហា regex ទាំងនេះគឺជាផ្នែកសំខាន់នៃសុវត្ថិភាព និងសវនកម្មដំណើរការ។

ការកសាងប្រព័ន្ធឆ្លាតវៃជាងមុនជាមួយ Mewayz

ដូច្នេះ តើ​យើង​ធ្វើ​យ៉ាង​ណា​ឲ្យ​ហួស​ពី​កម្រិត​មូលដ្ឋាន​នេះ? ដំណោះស្រាយពាក់ព័ន្ធនឹងការរួមបញ្ចូលគ្នានៃឧបករណ៍ដែលប្រសើរជាងមុន និងជម្រើសស្ថាបត្យកម្មដ៏ឆ្លាតវៃ។ ទីមួយ អ្នកអភិវឌ្ឍន៍អាចប្រើឧបករណ៍វិភាគ regex ដើម្បីកំណត់អត្តសញ្ញាណគំរូដែលមានបញ្ហា ហើយសរសេរវាឡើងវិញដើម្បីឱ្យមានប្រសិទ្ធភាពជាងមុន (ឧ. ការប្រើឧបករណ៍កំណត់បរិមាណ ឬក្រុមអាតូមិក)។ សម្រាប់ដំណើរការចុងក្រោយ ក្បួនដោះស្រាយជំនួសមានដែលធានាពេលវេលាលីនេអ៊ែរ O(n) សម្រាប់ការផ្គូផ្គងលំនាំ ទោះបីជាវាមិនសូវមាននៅក្នុងបណ្ណាល័យស្តង់ដារក៏ដោយ។

បង្កើតប្រព័ន្ធប្រតិបត្តិការអាជីវកម្មរបស់អ្នកនៅថ្ងៃនេះ

ពីអ្នកឯករាជ្យរហូតដល់ភ្នាក់ងារ មេវេសផ្តល់ថាមពលដល់អាជីវកម្ម 138,000+ ជាមួយនឹងម៉ូឌុលរួមបញ្ចូលគ្នាចំនួន 208 ។ ចាប់ផ្តើមដោយឥតគិតថ្លៃ ដំឡើងកំណែនៅពេលអ្នករីកចម្រើន។

បង្កើតគណនីឥតគិតថ្លៃ →

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Start managing your business smarter today

Join 6,208+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 6,208+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime