Some Tips before learning algorithms and data structures | অ্যালগোরিদম এবং ডাটা স্ট্রাকচার শেখার আগের কিছু কথা !
অনেকেই আছেন, সি/সি++
প্রোগ্রামিং এর বেসিক শিখে অল্পকিছু প্রবলেম সলভ করেই অ্যালগোরিদম শিখার পিছনে ছোটেন।
যার ফলে এলগরিদমটাও খুব বেশী গভীর ভাবে শেখা হয় না৷ অথবা কোডফোর্সেস কন্টেষ্ট করতে
গিয়ে ভালো সফলতা পান না। পরিশেষে শুরু হয় আমার মত হতাশায় ডুবে থাকা 😪। তাই
আজ অল্পকিছু পরামর্শ বিগেনার প্রোগ্রামারদের জন্য।
প্রথমেই আমাদের যা শিখতে হবে তা
হচ্ছে যেকোন একটা প্রোগ্রামিং লেংগুয়েজ যা আমরা সবাই জানি (কমন সেন্স 🤣).
প্রোগ্রামিং লেংগুয়েজ এর বেসিক কতটা পাকাপোক্ত সেটা যাচাই
করার জন্য, বা
বেসিক পাকাপোক্ত করার জন্য বেশকিছু সমস্যার সমাধান করতে হবে৷ এক্ষেত্রে সহজ কিছু
সমস্যা নির্বাচন করা যেতে পারে৷ যেমনঃ কোডফোর্সেসে সর্বাধিক সংখ্যক সমাধানকৃত
সমস্যা গুলো নির্বাচন করতে পারি আমরা। ৫০-৬০টা সমস্যা সমাধান করলেই বুঝতে পারবো
আমরা কতটা পটু বেসিকে৷ অথবা UVa
ইজি ১০০ প্রবলেম লিষ্ট লিখে গুগল করলেই লিষ্ট পাওয়া যাবে সেগুলো চেষ্টা করা
যেতে পারে।
তারপরই হুট করে ডাটা স্ট্রাকচার কিংবা অ্যালগোরিদম
লাফিয়ে পরি আমরা যা আমাদের চরম ভুল। কেননা,
তখন অবধী আমরা ভালো চিন্তা করা শিখিনি,
যার কারণে ডাটা স্ট্রাকচার কিংবা এলগরিদমটি শিখে কাজে লাগানোর উপায় চিন্তা করে
বের করতে পারিনা। ফলে কয়েকটা এলগরিদম শিখে ফেলার পরেও আমরা কোডফোর্সেস এর A,B সলভ করতে
হিমশিম খাই।
আসলে সত্যিকার অর্থে কোডোফোর্সেস কন্টেষ্টে Div 2 এর A,B,C (কখনো কখনো D) সলভ করতে কোন
অ্যালগোরিদম বা জটিল কোন ডাটা স্ট্রাকচার ব্যাবহার করতে হয় না। শুধুমাত্র D,E,F কিংবা তার
পরের জটিল সমস্যা সমাধান করতেই কেবল এলগরিদম প্রয়োজন হয়। তাই আমাদের উচিৎ প্রথমেই
এলগরিদম বা জটিল কোন ডাটা স্ট্রাকচারের উপচে না পরে A,B,C সলভ করার
জন্য যা যা প্রয়োজন তার দিকে বেশী নজর দেয়া।
যখন আমরা A,B,C
লেভেলের প্রবলেম সলভ করতে পারবো কেবল তখনই ধরে নিতে পারি যে আমাদের চিন্তা
করার ক্ষমতা কিছুটা হলেও বৃদ্ধি পেয়েছে এবং এখন আমরা চাইলে এলগোরিদম বা ডাটা
স্ট্রাকচার যেতে পারি।
তাহলে এখন আমরা আমরা আসি এলগরিদম বা ডাটা
স্ট্রাকচারের আগে আমাদের কি কি শেখা উচিৎঃ
১। আমরা যদি সি/সি++ কোডার হই
তাহলে যত তারাতাড়ি সম্ভব STL
শিখে ফেলা উচিৎ। কারন এতে অনেক ডাটা স্ট্রাকচার বিল্টিং পাওয়া যায় যা টাইম এবং
মেমরি লিমিটের কথা চিন্তা করলে বেষ্ট। সাথে আরও পাওয়া যাবে ডায়নামিক ডাটা টাইপ, অনেক
ডায়নামিক অপারেশনস। মজার বিষয় যদি কেউ শুধু STL
এ বস হয় সেও কোডফোর্সেসে A,B
C(কখনো কখনো D) সলভ
করা যায়। তাহলে বুঝাই যাচ্ছে STL
কতটা পাওয়ারফুল ☺ । আর আমাদের STL জানলেই হবে
না। প্রতিটা কন্টেইনার এর কোড এবং Complexity
সম্পর্কে জানতে হবে। যেমনঃ বাইনারী সার্চ , আপার বাউন্ড ,
লোয়ার বাউন্ট এর কোড জানতে হবে । তাছাড়া Set এর ভিতর ইনসার্টের কমপ্লিক্সিটি কত তাও জানতে হবে। এমন
খুটিনাটি সব জানার চেষ্টা করতে হবে ।
২। বেসিক কিছু টেকনিকস শিখে ফেলা
উচিৎ যা কন্টেষ্ট টাইমে প্রায়ই কাজে লাগে৷
যেমনঃ
- Window Sliding Technique
- Two Pointer Technique
- Cumulative Sum/Prefix Sum
- Array Compressions
- Maximum Subarray Sum
- Binary Search, upper_bound,lower_bound (এগুলা মূলত STL এ শিখে ফেলবো)
- Largest Sum Contiguous Subarray Technique.
- Counting * Counting Inversion
৩। Amortize লুপ চালানো
জানতে হবে৷
যেখানে Nested লুপ চলবো
কিন্তু অভার-অল কম্পিলিক্সিটি হবে O(n).
যেমনটা আমরা Z-Algorithm
এ করি।
মোটামুটি এটা একটা লিষ্ট হতে
পারে। তবে আরও অনেক কিছু আছে বেসিক শেখার।
ধরা যায়, এই কয়েকটা
টেকনিকস এবং STL শিখা
হয়ে গেলে প্রোগ্রামিং দক্ষতা কিছুটা হলেও বৃদ্ধি পাবে। সেই সাথে চিন্তা করার শক্তি
বাড়বে। তখন আমরা অ্যালগোরিদম শিখতে পারবো এবং সঠিক ভাবে চিন্তা করে এলগোরিদম বা ডাটা
স্ট্রাকচারকে প্রবলেমে ব্যাবহার করতে পারবো।
সেই সাথে একটা কথা বলে নেই, আগে অ্যালগোরিদম
লিষ্ট আকারে ধরে শিখে তারপর প্রবলেম সলভ করার পক্ষপাতী আমি না। আমি সমস্যায় পরে
উপায় বেড় করার পক্ষপাতী।
যেকোন সমস্যা পড়বো, সলভ করার
চেষ্টা করবো। না পাড়লে আবার পড়বো। তখনও না সলভ হলে টিউটোরিয়াল দেখবো। তখন যদি দেখি
কোন অ্যালগোরিদম বা ডাটা স্ট্রাকচার ব্যাবহার করেছে। ঠিক তখন সেটা শিখবো। তাহলে সেটা
মাথায় দীর্ঘ স্থায়ী হয় বলে আমি মনে করি।
এগুলো জানার পর ভালো কিছু প্রবলেম সল্ভ করে
ফেলতে হবে। UVa তে
মোটামুটি ২০০-৩০০ সল্ভ হয়ে গেলে এলগরিদম এবং ডাটা স্ট্রাকচারের দিকে যেতে হবে।
তবেই কেবল গভীর ভাবে অ্যালগোরিদম ফিল করা যাবে ।
চিন্তা করে কাজে লাগানোর উপার বের করা যাবে।
[ আরও কিছু মাথায় আসলে লিষ্টে যুক্ত করা হবে 🙂 ]
হ্যাপি কোডিং 🙂
আমাদের এই ব্লগ টি কেমন লাগলো সেটা জানাতে নিচের কমেন্ট বক্সে মতামত জানিয়ে দিতে পারো ,আমাদের সকল আপডেট সবার আগে পেতে আমাদের ওয়েবপেজের ডান পাশে সাবস্ক্রাইব বাই ইমেইল বক্সে ইমেইল সাবমিট করতে পারো ।
লেখকঃ
মাসুদ পারভেজ
Department of Computer Science & Engineering,
Z. H. Sikder University of Science & Technology
Department of Computer Science & Engineering,
Z. H. Sikder University of Science & Technology
Very Help Full
ReplyDeleteThanks a lot