در این مطلب، جستجوی الگو (Pattern Searching) مورد بررسی قرار میگیرد و یک الگوریتم ساده برای این کار ارائه میشود. متن [txt[0..n-1 و الگوی [pat[0..m-1 موجود است؛ هدف نوشتن تابع جستجویی ([]char pat[], char txt) است که همه وقوعهای []pat در []txt را چاپ کند. میتوان فرض کرد که n > m است. مثالهای زیر در این راستا قابل توجه هستند.
Input: txt[] = "THIS IS A TEST TEXT"
pat[] = "TEST"
Output: Pattern found at index 10
Input: txt[] = "AABAACAADAABAABA"
pat[] = "AABA"
Output: Pattern found at index 0
Pattern found at index 9
Pattern found at index 12
جستجوی الگو، یک مسأله مهم در علوم کامپیوتر است. هنگامی که یک رشته در فایل «نوتپد» (Notepad)، «ورد» (Word)، مرورگر و یا «پایگاهداده» (Database) جستجو میشود از جستجوی الگو برای نمایش نتایج جستجو استفاده میشود.
الگو در متن به این صورت بررسی میشود که از آغاز متن به صورت اسلایدی (کشویی) با متن مطابقت داده میشود. اگر الگویی مطابق با الگوی جستجو شده در متن پیدا شد، فعالیت مجددا ادامه پیدا میکند تا سایر الگوها نیز یافت شوند.
خروجی قطعه کدهای بالا، به صورت زیر است.
Pattern found at index 0 Pattern found at index 9 Pattern found at index 13
بهترین حالت هنگامی به وقوع میپیوندد که اولین کاراکتر از الگو هرگز در متن ظاهر نشود.
txt[] = “AABCCAADDEE”;
pat[] = “FAA”;
تعداد مقایسه ها در بهترین حالت (O(n است.
بدترین حالت الگوریتم جستجوی الگوی ساده در شرایط زیر به وقوع میپیوندد.
۱. هنگامی که همه کاراکترهای متن و الگو مشابه باشد:
txt[] = "AAAAAAAAAAAAAAAAAA"; pat[] = "AAAAA";
۲. همچنین، بدترین حالت هنگامی به وقوع میپیوندد که آخرین کاراکتر متفاوت باشد.
txt[] = "AAAAAAAAAAAAAAAAAB"; pat[] = "AAAAB";
تعداد مقایسهها در بدترین حالت برابر با ((O(m*(n-m+1 است. با وجود اینکه برخی از رشتهها دارای کاراکترهایی هستند که در زبان انگلیسی ظاهر نمیشود، اما این رشتهها ممکن است در دیگر کاربردها به وقوع بپیوندند (برای مثال، در متنهای دودویی). الگوریتم تطبیق KMP، بدترین حالت را به (O(n بهبود میبخشد.
منبع: فرادرس
در این مطلب، روش نوشتن برنامهای که تشخیص میدهد یک گراف قویا همبند است یا خیر، مورد بررسی قرار گرفته است. همچنین، پیادهسازی آن در زبانهای برنامهنویسی گوناگون شامل ++C، «جاوا» (Java) و «پایتون» (Python) انجام شده است. فرض میشود یک گراف جهتدار به عنوان ورودی به برنامه داده شده است. هدف آن است که برنامه بررسی و مشخص کند که آیا گراف قویا همبند است یا خیر. یک گراف جهتدار، قویا همبند است اگر مسیری بین هر دو جفت از راسهای آن وجود داشته باشد. برای مثال، گرافی که در تصویر زیر آمده، قویا همبند محسوب میشود.

انجام چنین کاری در گراف غیرجهتدار آسان است. در این راستا، کافی است که پیمایش «جستجوی اول سطح» (Breadth-First Search | BFS) و «جستجوی اول عمق» (Depth-First Search | DFS) با آغاز از هر راسی انجام شود. اگر در پیمایش BFS یا DFS، همه راسها مشاهده شدند، گراف غیر جهتدار همبند است. این رویکرد برای گرافهای جهتدار پاسخگو نیست. برای مثال، گراف زیر قویا همبند نیست. اگر پیمایش DFS یا BFS با شروع از راس صفر انجام شود، میتوان به همه راسها رسید، اما اگر از هر راس دیگری آغاز شود، نمیتوان به همه راسها رسید.

یک ایده ساده آن است که از همه الگوریتمهای کوتاهترین مسیرها مانند پیدا کردن «بستار تعدی» (Transitive Closure) گراف یا «الگوریتم فلوید-وارشال» (Floyd Warshall) استفاده شود. پیچیدگی زمانی این روش، از درجه (O(v3 است. همچنین، میتوان DFS را به تعداد V مرتبه با آغاز از هر راسی انجام داد. اگر DFS همه راسها را ملاقات نکرد، گراف قویا همبند نیست. این الگوریتم، ((O(V*(V+E زمان میبرد که مشابه با بستار تعدی برای گراف چگال است.
یک ایده بهتر، استفاده از الگوریتم «اجزای قویاً همبند» (Strongly Connected Components | SCC) است. میتوان همه SCCها را در زمان (O(V+E پیدا کرد. اگر تعداد SCCها برابر با یک باشد، گراف قویا همبند است. الگوریتم SCC پس از پیدا کردن همه SCCها، دیگر کاری انجام نمیدهد. در ادامه، الگوریتم ساده و مبتنی بر DFS «کساراجو» (Kosaraju) ارائه شده است که دو پیمایش در گراف انجام و تشخیص میدهد که گراف قویا همبند است یا خیر. روش کار این الگوریتم، در ادامه بیان شده است.
ایده آن است که اگر همه گرهها از راس v دسترسیپذیر باشند، و هر گرهای بتواند به v برسد، گراف قویا همبند است. در گام ۲، بررسی میشود که همه راسها از راس v دسترسیپذیر هستند. در گام ۴، بررسی میشود که آیا میتوان از همه راسها به راس v رسید (در گراف معکوس، اگر همه راسها از راس v دسترسیپذیر باشند، همه راسها میتوانند در گراف اصلی به راس v برسند). پیادهسازی الگوریتم بالا، در ادامه در زبانهای برنامهنویسی گوناگون ارائه شده است.
خروجی قطعه کد بالا، به صورت زیر است.
Yes No
پیچیدگی زمانی روش ارائه شده در بالا، برابر با «جستجوی اول عمق» است و اگر گراف با استفاده از ماتریس مجاورت ارائه شده باشد، از درجه (O(V+E خواهد بود. این رویکرد نیازمند دو بار پیمایش گراف است. میتوان با استفاده از «الگوریتم تارژان مؤلفههای قویا همبند» (Tarjan’s Strongly Connected Components Algorithm)، با یک بار پیمایش گراف این کار را انجام داد.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
منبع: فرادرس
در این نوشته با روش ایجاد یک تابع بازگشتی در ++C آشنا میشویم. تابع بازگشتی تابعی است که خودش را فرامیخواند. چنین فرایندی به طور کلی «بازگشت» (recursion) نامیده میشود. برای مطالعه بخش قبلی این سری مقالات به لینک زیر رجوع کنید:
شکل زیر طرز کار بازگشت را از طریق فراخوانی خودش به صورت مکرر نمایش میدهد.

فرایند بازگشت تا زمانی که نوعی شرط برقرار شود تداوم مییابد.
برای جلوگیری از بازگشت نامتناهی از گزارههای if…else یا رویکردی مشابه استفاده میشود که در آن یک شاخه از گزاره مربوطه موجب بازگشت و شاخه دیگر باعث توقف فرایند بازگشتی میشود.
محاسبه فاکتوریل عدد با استفاده از بازگشت
خروجی
Enter a number to find factorial: 4 Factorial of 4 = 24
در شکل زیر طرز کار مثال فوق را توضیح دادهایم:

فرض کنید که عدد 4 از سوی کاربر برنامه وارد شده است. این مقدار به تابع ()factorial ارسال میشود.
در این مطلب، جستجوی الگو (Pattern Searching) مورد بررسی قرار میگیرد و یک الگوریتم ساده برای این کار ارائه میشود. متن [txt[0..n-1 و الگوی [pat[0..m-1 موجود است؛ هدف نوشتن تابع جستجویی ([]char pat[], char txt) است که همه وقوعهای []pat در []txt را چاپ کند. میتوان فرض کرد که n > m است. مثالهای زیر در این راستا قابل توجه هستند.
Input: txt[] = "THIS IS A TEST TEXT"
pat[] = "TEST"
Output: Pattern found at index 10
Input: txt[] = "AABAACAADAABAABA"
pat[] = "AABA"
Output: Pattern found at index 0
Pattern found at index 9
Pattern found at index 12
جستجوی الگو، یک مسأله مهم در علوم کامپیوتر است. هنگامی که یک رشته در فایل «نوتپد» (Notepad)، «ورد» (Word)، مرورگر و یا «پایگاهداده» (Database) جستجو میشود از جستجوی الگو برای نمایش نتایج جستجو استفاده میشود.
الگو در متن به این صورت بررسی میشود که از آغاز متن به صورت اسلایدی (کشویی) با متن مطابقت داده میشود. اگر الگویی مطابق با الگوی جستجو شده در متن پیدا شد، فعالیت مجددا ادامه پیدا میکند تا سایر الگوها نیز یافت شوند.
خروجی قطعه کدهای بالا، به صورت زیر است.
Pattern found at index 0 Pattern found at index 9 Pattern found at index 13
بهترین حالت هنگامی به وقوع میپیوندد که اولین کاراکتر از الگو هرگز در متن ظاهر نشود.
txt[] = “AABCCAADDEE”;
pat[] = “FAA”;
تعداد مقایسه ها در بهترین حالت (O(n است.
بدترین حالت الگوریتم جستجوی الگوی ساده در شرایط زیر به وقوع میپیوندد.
۱. هنگامی که همه کاراکترهای متن و الگو مشابه باشد:
txt[] = "AAAAAAAAAAAAAAAAAA"; pat[] = "AAAAA";
۲. همچنین، بدترین حالت هنگامی به وقوع میپیوندد که آخرین کاراکتر متفاوت باشد.
txt[] = "AAAAAAAAAAAAAAAAAB"; pat[] = "AAAAB";
تعداد مقایسهها در بدترین حالت برابر با ((O(m*(n-m+1 است. با وجود اینکه برخی از رشتهها دارای کاراکترهایی هستند که در زبان انگلیسی ظاهر نمیشود، اما این رشتهها ممکن است در دیگر کاربردها به وقوع بپیوندند (برای مثال، در متنهای دودویی). الگوریتم تطبیق KMP، بدترین حالت را به (O(n بهبود میبخشد.
منبع: فرادرس
اگر یک توسعهدهنده غیر مبتدی هستید و سیستم یا لپتاپی را که استفاده میکنید، چند سال قبل خریداری کردهاید، مسلماً تاکنون ابزارها و نرمافزارهای زیادی را روی آن نصب کردهاید. احتمال دارد از نرمافزار VS Code به عنوان ادیتور کد خود استفاده می کنید و برخی افزونهها را روی آن نصب دارید. ممکن است بتوانید برخی از مواردی که روی آن نصب کردهاید را به خاطر آورید؛ اما بدیهی است که یادآوری بسیاری از آنها ناممکن است. ما این ابزارها را یک بار نصب میکنیم و دیگر کلاً فراموششان میکنیم.
اما این وضعیت خطرناکی است، چون هر چه قدر هم که مراقب باشید، ممکن است اتفاقی برای لپتاپ شما بیافتد، مثلاً فنجان قهوه روی آن بریزد، روی زمین سقوط کند و یا سیستم عامل آن از کار بیفتد.
در چنین حالتی، پس از این که مشکل را رفع کردید یا مجبور شدید یک سیستم جدید بخرید، با یک لپتاپ جدید مواجه خواهید بود که همه تنظیمات شخصی، افزونهها، برنامههای نصبشده مختلف و ابزارهای پیکربندیشده که موجب سهولت کار توسعه میشدند، از دست رفتهاند. این وضعیت به طور خاص در مورد IDE صدق میکند، چون همه تنظیمات و پیکربندیها به یک چشم بر هم زدن از دست میروند.
دقیقاً در این لحظه است که متوجه میشوید برای همه این تنظیمات و پیکربندیها چه مقدار زمان و زحمت صرف شده است. حتی تصور چنین وضعیتی نیز دردناک است. ما در این مقاله قصد نداریم در مورد روشهای بازیابی وضعیت سیستم به حالت اولیه صحبت بکنیم، بلکه میخواهیم نشان دهیم که چگونه میتوانید تنظیمات IDE ویژوال استودیو کد را بدون شروع همه چیز از صفر و صرف ساعتها از وقت خود مجدداً بسازید.
اگر تاکنون با VS Code کار نکردهاید و یا کلاً نام آن را نشنیدهاید، پیشنهاد میکنیم ابتدا مطلب معرفی جامع ویژوال استودیو کد را مطالعه کنید. ویژوال استودیو کد، یک IDE جالب و رایگان است و تقریباً از هر لحاظ WebStorm را که رایگان نیست مغلوب میکند.
یکی از جالبترین نکتهها در مورد VS Code بازار اکستنشن (+) آن است که پر از افزونههای مفید است که افراد مختلف برای خودشان نوشتهاند و حس کردهاند که ممکن است برای توسعهدهندگان دیگر نیز مفید باشند و بیشتر آنها نیز رایگان هستند.
این اکستنشنها برخی از ویژگیهایی هستند که موجب میشوند کار توسعه در VS Code چنین دلپذیر باشد و همچنین موجب میشوند که توسعهدهندگان هر کدام نسخه خاصی از این ویرایشگر را داشته باشند. هرکس میتواند theme خاص خود، فهرست افزونههای ضروری و نوار کناری با ابزارهای مفید را در اختیار داشته باشد. همچنین قابلیت مهم LiveShare و فهرست فرایندهای از امکاناتی که تیم توسعه VS Code هر ماه اضافه میکند در این IDE قابل حصول هستند.
زمانی که با احتمال از دست دادن تنظیمات VS Code مواجه میشوید، احتمالاً به دنبال روشی برای انتقال این تنظیمات به سیستم دیگر میگردید. پیش از ما نیز توسعهدهندگان دیگری در نقاط مختلف دنیا با چنین موقعیتهایی مواجه شدهاند و راهی برای همگامسازی تنظیمات VS Code روی سیستمهای مختلف ابداع کردهاند. این کار از طریق اکستنشن Settings Sync (+) میسر است.

با استفاده از این اکستنشن میتوانید تنظیمات ویژوال استودیو کد را با استفاده از GIST گیتهاب روی چند سیستم همگامسازی کنید.
این افزونه به صورت رایگان در بازار VS CODE ارائه شده است و دقیقاً همان کاری را که در تعریف فوق دیدید، ارائه میکند. با استفاده از این ابزار میتوانید تنظیمات VS Code را روی هر تعداد سیستم مختلف که دوست دارید همگامسازی کنید. همه اینها به لطف بخش GIST در گیتهاب میسر شده است.
این افزونه موارد زیر را همگامسازی میکند:
همه چیز از نظر تئوری خوب به نظر میرسد، اما آیا در عمل نیز واقعاً به همین سادگی است؟ واقعیت این است که کار به همین سادگی است، چون مستندات بسیار خوبی برای افزونه همگامسازی تنظیمات وجود دارد.
شما میتوانید در طی مدت کوتاهی و با کمی سعی و خطا این افزونه را فعال کنید و در ادامه این موارد و همچنین مشکلاتی که ممکن است با آنها مواجه شوید را توضیح خواهیم داد.
همان طور که قبلاً گفتیم، راهنماییهای ارائه شده از سوی خالق افزونه Settings Sync کاملاً مناسب است؛ اما در این نوشته قصد داریم در طی یک راهنمای گام به گام چند نکته را نیز روشن سازیم که دانستن آنها باعث سهولت هر چه بیشتر کار برای شما خواهد شد.

بدیهی است که گام نخست، نصب افزونه Settings Sync در ترمینال VS Code و از مارکت اکستنشنها است. آیکون این افزونه به صورتی که در تصویر فوق میبینید، در نتایج جستجو ظاهر میشود.
روش کار Settings Sync از طریق گیتهاب است و یک gist شخصی میسازد که اطلاعات VS Code را روی آن ذخیره میکند و سپس این تنظیمات در دسترس هر کسی که کلیدهای دسترسی به gist را داشته باشد، خواهد بود.
بدین ترتیب در گیتهاب به مسیر زیر مراجعه کنید:
Settings / Developer settings / Personal access tokens / Generate New Token**

همان طور که ملاحظه میکنید، ما قبلاً یک توکن vscode-settings-sync به دست آوردهایم؛ اما با توجه به مقاصد این مقاله روی دکمه Generate new token کلیک میکنیم تا گامهای مختلف را همراه با شما بپیماییم.
زمانی که به صفحه تولید توکن رسیدید، نام توکن را چیزی انتخاب کنید که به راحتی در یاد بماند و سپس روی کادر کنار Create gists کلیک کنید. این تنها کاری است که برای تولید توکن لازم است.

پس از این که توکن جدید ایجاد شد، هش توکن را روی کلیپ بورد کپی کنید (میتوانید آن را در جایی ذخیره کنید)، چون در ادامه هرگز امکان دسترسی به آن نخواهید داشت.

زمانی که این کار را انجام دادید، آماده بازگشتن به VS Code هستید.

هنگامی که به VS Code بازگشتید، پالت فرمان را با دستور Ctrl + Shift+ P (ویندوز) یا command + shift + p (مک) باز کنید و عبارت :sync را وارد کنید تا فهرستی از گزینهها را مشاهده کنید. روی گزینه اول یعنی Sync: Update/Upload Settings کلیک کنید تا درخواست افزودن توکن گیتهاب را مشاهده کنید. در این مرحله میتوانید توکنی را که اخیراً ایجاد و کپی کردید وارد نمایید.

اکنون که توکن خود را وارد کردهاید، همه تنظیمات جاری شما روی gist آپلود میشود و ترمینال OUTPUT در VS Code پیامی مانند تصویر زیر نشان میدهد:

میتوانید ببیند که فایلهای settings و extensions همراه با اکستنشنهایی که هم اینک در تنظیمات VS Code ما استفاده میشوند، آپلود شدهاند. همچنین میتوانید به gist خود در گیتهاب بروید و وجود تنظیمات را در آنجا تأیید کنید. این تنظیمات در gist در فایلی با نام cloudSettings ذخیره شدهاند.
پیش از آن که ترمینال output را ببندید، توکن گیتهاب و ID مربوط به gist تولید شده در این آپلود را کپی کنید. شما در ادامه برای دانلود کردن تنظیمات روی سیستمهای دیگر به این موارد نیاز خواهید داشت. این موارد را جایی قرار دهید که بتوانید از روی سیستم جدید به آنها دسترسی داشته باشید و آنها را دانلود کنید. مثلاً میتوانید آنها را روی اسلک، Google Docs و یا موارد مشابه قرار دهید.

اینک آماده رفتن به IDE جدید VS Code خود هستیم و میتوانیم این تنظیمات را با کمترین زحمت آنجا اعمال کنیم.
برای دانلود تنظیمات VS Code روی سیستم خود، نخستین گام شبیه به بخش قبلی و آپلود تنظیمات است. پالت دستورها را با کلیدهای میانبر Ctrl+Shift+P باز کنید و عبارت :sync را وارد کنید. اما این بار باید گزینه Sync: Download Settings را انتخاب کنید.

پس از این که این گزینه را انتخاب کردید، افزونه Sync Settings از شما میخواهد که توکن دسترسی شخصی گیتهاب خود را وارد کنید. این همان توکن است که از خروجی ترمینال در زمان آپلود تنظیمات VS Code کپی کردهاید.

سپس از شما خواسته میشود که Gist ID را وارد کنید. این مورد را نیز از خروجی ترمینال کپی کردهایم. دقت کنید که اگر در گام نخست این مقدار را کپی نکرده باشید، هیچ کار دیگری میسر نیست و باید کل فرایند را ریست کرده و از نو آغاز کنید که گرچه چندان دشوار نیست، ولی به هر حال دوبارهکاری محسوب میشود

پس از آن تنظیمات اصلی شما روی VS Code جدید بدون هیچ مشکلی دانلود میشود.
بدین ترتیب ما به پایان کار رسیدهایم. ممکن است لازم باشد که ادیتور VS Code را کاملاً ببندید و آن را دوباره باز کنید تا همه تغییرات اعمال شوند و این تنها کار موردنیاز است. بدین ترتیب میتوانید به سادگی IDE جدیداً نصب شده خود را به شکلی که دوست دارید دربیاورید.
توجه کنید که اگر میخواهید این تنظیمات و پیکربندیها را میان اعضای مختلف یک تیم و سیستمهای مختلف توزیع کنید، میتوانید یک Gist عمومی ایجاد کنید که همه افراد به آن دسترسی داشته باشند. به این منظور میتوانید از بخش Create Public Gist to Share Settings این راهنما (+) استفاده کنید.
هیچ چیزی برای یک توسعهدهنده لذتبخشتر از دیدن یک IDE کاملاً پیکربندیشده مانند VS Code نیست. هیچ چیزی هم به اندازه تلاش برای به خاطر آوردن همه تنظیمات، افزونهها، پیکربندیها و موارد دیگر که روی یک IDE اعمال کردهاید، دردآور نیست.
اینک به کمک افزونه Settings Sync لازم نیست که همه این چیزها را به خاطر بیاورید و یا ساعتها از وقت خود را صرف ایجاد مجدد آنها را یک سیستم جدید بکنید. میتوانید به سادگی آنها را روی کلود گیتهاب آپلود کرده و از روی هر سیستم جدید و از طریق توکن دسترسی شخصی و Gist ID به آنها دسترسی داشته باشید.
منبع: فرادرس