You are on page 1of 253

কন আিম া ািমং িশখেবা?

shafaetsplanet.com /planetcoding/

শাফােয়ত জানুয়াির ২১,


২০১৩

সকােল উেঠই টপেকাডাের এ লখা দখলাম “একিট িশ েক একই আইেফান িদেল স িদনরাত অ াংি বাডস খলেব, িশ িটেক কািডং িশখােল স আইেফানটার জন
সফ ওয় ার তির করেব” দা ণ এই লখাটা দেখ মেন হেলা কন আমরা া ািমং বা কািডং িশখেবা সটা িনেয় বাংলায় িকছু িলিখ। এ লখািট া ািমং িনেয় যােদর কােনা
ধারণা নই বা খুব সামান ধারণা আেছ তােদর আ হী কের তালার একিট ছা েচ া।

কি উটার একিট অস ব মতাবান িক িনেবাধ একিট য । একিট য ৫০জন সাধারণ মানুেষর কাজ একাই করেত পাের িক ৫০িট য একিট অসাধারণ মানুেষর কাজ
করেত পােরনা(Hubbard, Elbert)। া ািমং িশেখ আমরা এেককজন হেয় উঠেত পাির সই মানুষিট য এই য েক ই ামত কথা শানােত পাের। তুিম যা বলেব
যভােব কি উটার তাই করেব, এটাই হেলা সাজা কথায় া ািমং। হয়েতা বলেত পােরা এখনইেতা কি উটার সটা কের, আিম গান নােত বলেল স িনেয় দয়, আিম
গম খলেত চাইেল স আমার সােথ খলেত কের। িক আসল ব াপারটা হেলা একজন া ামার আেগই কি উটারেক বেল রেখেছ য তুিম গান নেত চাইেল স
যন িনেয় দয়। স যিদ বেল রাখেতা গম খলেত চাইেল পড়েত বসার উপেদশ িদেত তাহেল কি উটার তাই করেতা, তামার িকছু করার থাকেতানা। া ামার হেলা স
যার কথায় কি উটার উঠা-বসা কের। দা ণ একটা ব াপার এটা, তাইনা?

িক তুিম কন া ািমং িশখেব? বড় বড় কথা বলার আেগ সবেথেক থম কারণ আিম বলেবা কারণ “ া ািমং দা ণ মজার একিট িজিনস!”। কি উটােরর সােথ অন
যে র বড় পাথক হেলা এটা িদেয় কতরকেমর কাজ করােনা যায় তার সীমা নই বলেল খুব একটা ভুল হেবনা। তাই া ািমং জানেল য কতিকছু করা যায় তার তািলকা
করেত বসেল শষ করা কিঠন। তুিম িদেনর পর িদন া ািমং কেরও দখেব িজিনসটা বািরং হে না, ায় িতিদনই নতুন মজার িকছু িশখেছা, নতুন নতুন টকেনালজী
আিব ােরর সােথ সােথ তুিম আেরা অেনক রকম কাজ করেত পারেছা অথবা তুিমই করেছা নতুন আিব ার! আজ হয়েতা জিটল কােনা সমীকরণ সমাধান করার জন ফাংশন
িলখেছা, কাল এসব ভােলা লাগেছনা বেল লাল-নীল রঙ িদেয় একিট অ ািনেমশন বানােত বেস গেল, তামার সিৃ শীলতার সবটুকুই কােজ লাগােত পারেব া ািমং এর
জগেত।

ছিব: শাহিরয়ার ম ুর, িবে র সবেচেয় স ানজনক া ািমং িতেযাগীতার বাংলােদিশ জাজ

A computer is a stupid machine with the ability to do incredibly smart


things, while computer programmers are smart people with the ability
to do incredibly stupid things. They are, in short, a perfect match. –
Bill Bryson

একিট ু ল-কেলজ পড়ুয়া ছেলেমেয় কি উটার বা মাবাইল িদেয় িক কের? রািশয়া-চীেনর ছেলেমেয়রা অেনেকই হয়েতা অ ােস িলেত কাড িলেখ, িক জিরপ না কেরও
বলা যায় আমােদর দেশ বিশভাগই মুিভ দখা, ফসবুক , গমস ছাড়া খুব বিশ িকছু কেরনা। আসেল কি উটার িদেয় িক করা যায় তার ধারণাও অেনেকর নাই। ছেল বা
মেয়িটেক া ািমং িশিখেয় দয়া হেল তার জগৎটাই পাে যােব। স তখন সারািদন গমস না খেল হয়েতা একিট গমস বািনেয় ফলেব। আিম বাংলােদেশরই িকছু ু ল-
কেলজ পড়ুয়া া ামারেদর জািন যারা বাংলা িকেবাড িনেয় কাজ কের, ওেপন সাস কিমউিনিটেত অবদান রােখ। া ািমং জানেল তুিম বুঝেত পারেব কি উটার ধু
1/3
িবেনাদেনর য নয়, কি উটার তরা করা হেয়িছল এর মতােক ব বহার কের বড় বড় গেবষণা,িহসাব করার জন , তুিম যিদ গেবষণা নাও কেরা অ ত এই মতাটা ব বহার
িশখেব, সিৃ শীল অেনক কাজ করেত পারেব। কি উটােরর জগেত অসাধারণ িকছু অ গিত হেয়েছ খুব কম বেয়সী া ামারেদর িদেয়, িবল গটস ু েল থাকেতই চমেক
দয়ার মত িকছু া াম িলেখিছেলন, া ািমং কনেটে হাইেরেটড কাডারেদর অেনেকই ু ল-কেলজ এখনও শষ কেরিন।

ছিব: মেহিদ হাসান, তির কেরেছন আমােদর সবার ি য় অ িকেবাড, িতিন মিডেকেলর একজন ছা

া ািমং করা মােন আনে র সােথ শখা। এই শখাটা খািল কি উটােরর মধ সীমাব না, অিধকাংশ ভােলা া ামারেদর খুবই ভােলা গািণিতক এবং লিজকাল ান
থােক। দাবা খলার মেতাই া ািমং পুেরাটাই লিজেকর খলা, কান কােজর পর কানটা করেল িক হেব, িকভােব করেল আেরা ত ফলাফল আসেব এইসব িনেয় িচ া
করেত করেত মি ে র লিজকাল স রটা ডেভলপ কের। আমার মেত িচ া করার মত আনে র এবং পূ ণ কাজ ২য়িট নই। িবেশষ কের কম বয়েস া ািমং িশখােল

স িচ াশি বি র যই সুফলটা পােব সটা সারাজীবন কােজ লাগেব, স যিদ া ািমং পের ছেড়ও দয় তারপেরও িচ া করার মতাটা থেক যােব।

া ািমং িক ধু কি উটার সাই যারা পেড় বা পড়েত চায় তারা িশখেব? সটার কােনা যুি নই, তুিম যই িবষয় িনেয়ই পড়েছা বা পড়েত চাও, া ািমং তুিম আনে র
জন ই িশখেত পােরা এবং চাইেল তামার কােজও লাগােত পােরা। তুিম িব ােনর যেকােনা িবষেয় লখাপড়া করেলেতা কথাই নই, তামার গেবষণায় িত মূ েত কি উটার
লাগেব, তুিম িবজেনস, আটস পড়েলও া ািমং কােজ লাগেব। তুিম কা ািনর জন দা ণ একিট ওেয়বসাইট বানােত পােরা, একিট সফটওয় ার বানােত পােরা যটা যসব
কাজ বািরং স েলা য়ংি য় ভােব কের িদেব! আিম অেনক সময় ছােটা-খােটা িক বািরং কাজ করার সময় চট কের একটা ি িলেখ ফিল, তারপর সটােক কাজ করেত
িদেয় ঘুম দই!

া ািমং শখা িক খুব কিঠন? উ র হেলা হ া,যিদ তামার আ হ না থােক এবং কও তামােক জার কের শখায়। যিদ একবার মজা পেয় যান তাহেল এরপর কােরা
শখােনা লাগেবনা, িনেজই সব িশেখ ফলেত পােরা। আমার উপেদশ হেব ২-৩ স াহ া ািমং করার পর যিদ তামার ভােলা না লােগ তাহেল জার কের করার দরকার নাই,
এটা তামার জন না, অন যটা ভােলা লােগ সই কাজ কেরা। যিদ একবার ভােলা লােগ বাজী ধের বলেত পাির কাড িলখেত িলখেত তুিম ায়ই খাবার কথাও ভুেল যােব।
যেকান কােজর জন ই সবেথেক পূ ণ ব াপার হেলা ভােলা লাগা, যটা ভােলা লােগনা সটা করার কােনা অথ আিম দিখনা কারণ ইিদন পর যা িশখিস সব ভুেল যােবা।

ছিব: lightoj, ঢাকা িব িবদ ালেয়র জােন আলম জােনর তির করা অনলাইন জাজ যখােন বেলম সলভ কের সারা পৃিথবীর কাডাররা

িকভােব করেব? তামার যিদ ই ারেনট কােনকশন থােক তাহেল কথাই নই, ই ারেনেট অসংখ িটউেটািরয়াল আেছ। ইংেরজীর পাশাপাশী বাংলা িকছু ভােলা িরেসাসও
তুিম পােব। যমন ে য় রািগব হাসােনর shikkok.com ওেয়বসাইট বা ফািহম ভাইেয়র পাইথন সাইট। এছাড়া খান একােডিমেতও া ািমং এর িভিডও আেছ,
বরাবেরর মতই খুবই সু র কের বুিঝেয়েছন সালমান খান। ই ারেনট না থাকেল তামােক বই জাগাড় করেত হেব, ব াি গত ভােব িবিগনারেদর জন আিম ই ারেনেটর থেক
বইেকই বিশ িদেবা। া ািমং এর বইেয়র অভাব নই দাকােন, তািমম শাহিরয়ার সুিবন ভাইেয়র একিট দা ণ বাংলা বই আেছ। তেব একটা ব াপাের সতক থাকেব
2/3
“৭িদেন া ািমং শখা” এই ধরেণর চটকদার বইেয়র বা সাইেটর ধােরকােছ যােব, এ েলা সবিকছু ঝাপসা ভােব শখােব, হাভাড িশে র বইেয়র মত নামকরা এবং ভােলা বই
দেখ িশেখা, বিসক িজিনস েলা পির ার হেব। এছাড়া লাগেব া ািমং এর জন িকছু সফটওয় ার, এ েলাও সহেজই জাগাড় করেত পারেব। এরপর কের দাও কাড
লখা!! থম ২ স াহ আপনার বশ ঝােমলা লাগেব কারণ িবষয়টা নতুন, একটু পরপর আটেক যােব, তারপর হঠাৎ দখেবন সবিকছু সহজ হেয় িগেয়েছ, মূ েতর মেধ ই ১০০
লাইেনর কাড িলেখ ফেলেছা। া ািমং শখার ধান শত হেলা হাল ছাড়া যােবনা। থম িদেক কােনা কাড কিপ প করেবনা, িনেজর হােত িলখেব।

A good programmer is someone who looks both ways before crossing a one-way street. — Doug
Linder, systems administrator

চাকরী-ক ািরয়ার িনেয় সবার মেধ ই অেনক টনশন থােক। আনে র জন া ািমং িশখেলও এটা তামার ক ািরয়াের খুবই পূ ণ। তুিম া ািমং জানেল িনি ত থাকেত
পােরা কােজর কােনা অভাব জীবেন হেবনা। তুিম কােনা চাকরী না কেরও ি -ল া কাজ করেত পারেব, এমনিক ছােটাখাট একটা কা ািনও খুেল বসেত পারেব। আিম
আেশপােশ অেনকেক দেখিছ কেয়ক ব ু িমেল একিট ছাট কা ািন খুেল াধীনভােব কাজ কের, িক দা ণ একটা ব াপার! া ািমং জানার আেরকিট দা ণ ব াপার হেলা
তুিম ভােলা কােনা কাজ করেল খুব সহেজই সারা িব জেন যােব। পৃিথবীর আেরক াে র মানুষ তামার বানােনা সফটওয় ার িদেয় গান নেব, তামার অপােরিটং িসে ম
বুট করেব, আবার িপিস হ াং করেল হয়েতা আপনােকই গািল িদেব!! গেলর মেতা কা ািনেত কাজ করেত চাইেল তামার িকছু করেত হেবনা, আপনার কােজর খ ািতেত
তারাই তামােক এেস অফার িদেব। তেব া ািমং শখার উে শ কখেনাই গেল চাকরী বা খ ািত অজন হওয়া উিচত নয়, িশখেব আনে র জন , জানার জন ।

িস বা জাভার মেতা া ািমং ল াং েয়জ শখা মােনই িক তুিম া ািমং িশেখ ফেলািন। ল াং েয়জ শখা খুব সহজ কাজ, থেম একটা ক কের িশেখ ফলেল এরপর
যেকােনা ল াং েয়জ শখা যায়। তামােক খুবই ভােলা লিজক ডেভলপ করেত হেব, অ ালেগািরদম আর ডাটা াকচার িনেয় পড়ােলখা করেত হেব, গিণত জানেত হেব,
তাহেলই তুিম একজন ভােলা া ামার হেয় উঠেব। তেব ভেয়র িকছু নই, সবই তুিম ধীের ধীের িশেখ ফলেত পারেবা, ধু লাগেব চ া আর সময়। এটা আশা করেবনা য
৬ মােস তুিম অেনক ভােলা া ামার হেয় যােব তেব লেগ থাকেল ২-৩ বছের অবশ ই মাটামুিট ভােলা একটা লেভেল তুিম পৗছােত পারেব।

তুিম যিদ কি উটার সাইে র ুেড হও তাহেল এইসব কথাই তুিম হয়েতা জােনা, ধু বলেবা া ািমং ক আর ৫টা সাবেজে র মেতা ভেবানা, খািল িসিজিপএ বাড়ােত
কািডং িশখেল তামার মেতা অভাগা কও নাই, া ািমং উপেভাগ করার চ া কেরা, জানার আনে িশেখা।

আমার আমােদর দেশ একটা িচ া করার সং ৃ িত তির হেব। মানুষ এেক অেন র ব ি গত ব াপাের মাথা ঘামােবনা, বরং মাথা ঘামােব গািণিতক সমস া িনেয়, পাজল িনেয়,
অ ালেগািরদম িনেয়। ছেলেমেয়রা তােদর মধা গমস খলার কােজ না লািগেয় কােজ লাগােব পৃিথবীর উ য়েন। বই পড়া, গিণত চচা করার পাশাপািশ া ািমং িশখা এই
সং ৃ িত করেত িবশাল একিট ভুিমকা রাখেত পাের। আিম মেন কির বতমান যুেগ া ািমং শখাটা অন যেকান িবষয় শখার মতই পূ ণ, কারণ আমােদর সব কােজ
কি উটার লােগ। তাই আপনার আেশপােশর ছেলেমেয়েদর গমস খলেত দখেল তােদর া ািমং স েক জানাও, উৎসািহত কেরা, অবশ ই জার কের শখােনার কােনা
মােন হয়না, যার ভােলা লাগেব স িশখেব তেব সবাই অ ত জানুক া ািমং িক, এছাড়া িকভােব শখার জন উৎসািহত হেব? অেনেকই ইউিনভািসিটেত আসার আেগ
জােননা া ািমং বেল একটা ব আেছ! আর তামরা া ািমং জানেল অন েদরও িশখেত সাহায কেরা, এভােবই পিরবতন একসময় আসেবই, সবাই লিজক িদেয় ভাবেত
িশখেব, িচ া করার সং ৃ িত তির হেব।

শষ করিছ আমার খুব ি য় আেরকিট কােটশন িদেয়:

craftsman-ship has its quiet rewards, the satisfaction that comes from building a useful object and
making it work. Excitement arrives with the flash of insight that cracks a previously intractable
problem. The spiritual quest for elegance can turn the hacker into an artist.There are pleasures in
parsimony, in squeezing the last drop of performance out of clever algorithms and tight coding. —
steven skiena & miguel reville

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
কি উটার িব ান
shafaetsplanet.com /planetcoding/

শাফােয়ত আগ ৮,
২০১৩

“আলেকিম ” বইেয়র িটওয়ালা দখেতা পযটক হবার। িক সই েক সিত করার জন রাখালবালক হেয় দশিবেদশ ঘুের না বিড়েয় স েক চাপা িদেয়িছেলা
কারণ মানুেষর চােখ িটওয়ালার জীবন রাখালবালেকর থেক বিশ স ােনর। তাই সমাজেক খুিশ করেত িগেয় তার পূ রণ করা হয়িন। আমরা বিশভাগই এেককজন
িটওয়ালা, িনেজর পূ রণ না কের আেগ িচ া কির িক িনেয় পড়ােলখা করেল বিশ টাকার চাকরী পাওয়া যােব। একটা িবষেয়র “ব” না জেন ট কের িব িবদ ালেয় ভিত
হেয় যাই চাকিরর আশায়, তারপর একসময় হতাশা িঘের ধের।

কি উটার সােয় খুবই জনি য় একটা িবষয়। এই িবষয়টা িনেয় মানুেষর মেধ অেনক ভূ ল ধারণা চিলত আেছ, এই সাবেজ টােত িক পড়ােনা হয় এ িবষেয় সবার ভােলা
ধারণা নই। সবেথেক :খজনক ব াপার হেলা এই সাবেজে িক পড়ােনা হয় সটা না জেনই ব ছা ছা ী ভিত হেয় যায় চাকরীর বাজার ভােলা এই কারেণ, এটা ধু
কি উটার সােয় না বরং বাংলােদেশ যেকােনা সাবেজে র জন ই সত । এরপর যটা হয় সটা হেলা খাপ খাওয়ােত না পের অেনেকই হতাশ হেয় পেড়।

আমার সৗভাগ য কি উটার সােয় স েক ভােলা না জানেলও া ািমং আমার আেগ থেকই ভােলা লাগেতা এবং কি উটার িনেয় অেনক আ হ িছেলা ছােটােবলা
থেক তাই এখন আন ময় সময় কাটােত পারিছ, িক সবার এই সৗভাগ হয়না, এবং এটা ধু িসে েমর দাষ না সােথ িনেজেদর অসেচতনতাও িবশাল অংেশ দায়ী। আিম
অেনক ব ু বা বেক দেখিছ ভিত পরী ায় ভােলা রজা কের চাকরীর বাজার দেখ সাবেজ বেছ িনেয় এখন হতাশ হেয় পেড়েছ।

““We are told from childhood onward that everything we want to do is impossible. We grow up with
this idea, and as the years accumulate, so too do the layers of prejudice, fear and guilt. There comes
a time when our personal calling is so deeply buried in our soul as to be invisible. But it’s still there” –
The alchemist,Paulo Coelho”

আমার এই লখার উে শ কি উটার সােয়ে িক িক পড়ােনা হয় সটা সবাইেক জানােনা, িবেশষ কের কম বেয়সীেদর যারা এখেনা কােনা িবষয় বেছ নয়িন এবং তােদর
অিভভাবকেদর। ভিত পরী া িনেয় অেনক গাইডলাইন থাকেলও সাবেজ িনেয় গাইডলাইেনর অভাব আেছ। আর য েলা আেছ স েলােতও কি উটার সােয়ে
ি েয়িটিভিট লােগ, মুখ কম করেত হয় এসব কথাবাতা ধু িলেখ রাখেস, আসেল িক িক পড়ােনা হয় সটা িলেখিন।

বাংলােদেশর মানুেষর এক অংেশর ধারণা কি উটার সােয়ে ওয়াড, পাওয়ারপেয় এসব শখােনা হয়, এবং এ েলা যেহতু পাড়ার দাকানদারও ভােলা পাের তাই কি উটার
সােয় পড়ার কােনা মােন নাই। আবার কি উটার স েক ভােলা জােন, টুকটাক া ািমংও িকছুটা জােন এমন মানুেষর ধারণা এখােন ধু এইচিটিমএল, িপএইচিপেত এ
ওেয়বসাইট বানােনা শখায়, য েলা কি উটার সােয় না পড়েলও শখা যায়, ি ল া ারেদর মেধ এই ধারণাটা বিশ কাজ কের।

এখন আমরা তাহেল এক এক কের দিখ কি উটার সােয়ে িক িক টিপক পড়েত হেব। টিপক েলা স েক সংে েপ আমরা জানেবা। এরপের িনেজই িস া নয়া যােব
উপেরর ধারণা েলা কতটা সিত । টিপক েলা স েক জেন একজন কাজ হেব তামার ভেব দখা এই সাবেজ টা িক সিত ই তামার পছ নািক তুিম ইেলকি কাল,
মকািনকাল , িফিজ বা অন কােনা সাবেজ পড়েব।

া ািমং: কি উটার সােয় বলেল অবধািরত ভােব থেম চেল আেস া ািমং। া ািমং হেলা কি উটারেক কথা নােনার উপায়, বাকা কি উটারেক িদেয় ই ামত
কাজ কিরেয় নয়া। কি উটার যেহতু মানুেষর ভাষা বুেঝনা তােক বাঝােত হয় িবেশষ ভাষায় যােক বেল া ািমং ল াং েয়জ। া ািমং ল াং েয়জ িশেখ সফটওয় ার,
ওেয়বসাইট যমন বানােনা স ব তমিন গািণিতক সমস া সমাধান করা স ব, রেকেটর গিতপথ িনণয় করা স ব, কায়া াম মকািন িনেয় গেবষণা স ব, িডএনএ
অ ানালাইিসস করা স ব। এককথায় বলেত গেল া ািমং এর ান আধুিনক যুেগর সুপারপাওয়ার যটা িদেয় পৃিথবীেক িনয় ণ করা স ব।

বাংলােদেশ বিশভাগ িব িবদ ালেয় থম সিম াের িশখােনা হয় িস ল াং েয়জ যটােক বলা যেত পাের া ামারেদর মাত ৃভাষা। এরপের অবেজ ওিরেয়ে ড া ািমং
কােস িশখােনা হয় জাভা। সফটওয় ার া ািমং এবং বড় বড় েজে র জন জাভা জনি য়। কােনা কােনা িব িবদ ালেয় জাভা শখােনার সময় অ া েয়েড া ািমং
শখােনা হয়।

া ািমং ল াং েয়জ কাস ই ভােগ করােনা হয়। াস েম িকছু িথওিরিটকাল কথাবাতা থােক তেব এই কােসর মূল অংশ হয় ল ােব। সখােন া ািমং ল াং েয়জ িদেয়
িবিভ সমস া সমাধান করেত দয়া হয়। সবেশেষ সাধারণত একটা েজ করেত দয়া হয়, সখােন ুেড রা ি েয়িটিভিট দখােনার সুেযাগ পায়।
কি উটার সােয়ে র আেরা অেনক অংশ থাকেলও ভােলা া ািমং জানা এই সাবেজে ভােলা করার পূ বশত।

পরবতীেত অ ােস লী ল াং েয়েজর জন আেরকিট কাস থােক। এখােন একদম লা লেভেল সরাসির মমিরর িবিভ অংশ িনেয় কাজ করা যায়। অ ােস লী ল াং েয়জ
1/3
জানেত সাহায কের কি উটার িকভােব মমিরেত িবট/বাইট িহসাব কের ডাটা রােখ, একদম হাডওয় ার লেভেল িকভােব ডাটা রাখা হয় সটা তুিম জানেত পারেব। অ ােস লী
ভােলাভােব িশখেল ভাইরাস বানােনার মেতা মজার কাজ করা স ব, া ািমং কের মমিরর িবিভ অংশ কে াল করা স ব।

অ ালেগািরদম: তুিম িক জােনা িকভােব বড় একটা ফাইলেক কমে স কের সাইজ কিমেয় ফলা স ব হয়? গল িকভােব লাখ লাখ ওেয়বসাইট থেক চােখর পলেক দরকাির
ডাটা খুেজ আেন? িকভােব লাখ লাখ টরাবাইেটর িডএনএ িসেকােয় থেক খুেজ বর করা হয় জীবেনর রহস ? এধরেণর বেলম সলিভং এর হােতখিড় হয় অ ালেগািরদম
কােস। অ ালেগািরদম হেলা একিট সমস ােক সমাধান করার িবিভ ধাপ। অ ালেগািরদম কােস মূলত শখােনা হয় বেলম সলিভং টকিনক। সখােন এধরেণর িরেয়ল
লাইফ বেলম সরাসির সলভ করা শখােবনা, তেব এই কাসটা একটা বস তির করেব, িকছু কমন বেলম সলিভং টকিনক িশিখেয় িদেব। কি উটাের মমির এবং সময়
কম খরচ কের িকভােব সমস া সমাধান করা যায় স েলা শখােনা হয় এখােন। এই কােসও ল াব এবং িথওরী েটাই থােক। এই কাসটা করার সময় তুিম বুঝেত পারেব য
ধু া ািমং ল াং েয়জ জেন কােনা লাভ নই, সটা ব বহার সমস া সমাধান করেত জানেত হেব।

ডাটা াকচার: ফসবুক িকভােব এত মানুেষর তথ সংর ণ কের? এেলােমেলা ভােব সংর ণ করেল তাড়াতািড় খুেজ পাওয়া সমস া, তাই তথ সংর ণ করার িনিদ িকছু
টকিনক আেছ। য়াের লেভল কের কাগজপ রাখেল যমন সহেজ খুেজ পাওয়া যায় তমিন িকছু িনিদ াকচার ফেলা কের ডাটা সভ করেল সহেজ সটা কােজর সময়
পাওয়া যায়। ডাটা াকচার কােস এ েলা স েক ধারণা দয়া হয়।

অ ালেগািরদম এবং ডাটা াকচার হেলা কি উটার সােয়ে র মূল িভি , িতটা টিপেক এ েলা কােজ লােগ।

গিণত: কি উটার সােয়ে র ুেড েদর ভােলা গিণত জানার দরকার হয়। এটার কারণটা সবার কােছ পির ার না। নতুন অ ালেগািরদম বা ডাটা াকচার িডজাইন করার
সময় এ েলা কতটা ভােলা কাজ করেব সটা িনধারণ করেত গিণত দরকার হয়। একটা সমস া অেনক ভােব সমাধান করা যায়, কান প িতটা সবেথেক ভােলা, কানটা কম
মমিরেত কম সমেয় কাজ করেব এসব িহসােবর জন গিণেতর ান খুব দরকার। তুিম যত ভােলা গিণত জানেব তামার বেলম সলিভং ি ল তত ভােলা হেব। কি উটার
সােয় েক এজন “অ া াইড ম াথ” বলেতও েনিছ অেনকেক।

গিণেতর অেনক কিঠন কিঠন সমস াও আজকাল কি উটার িদেয় সলভ করা হয়, এমনিক িথওেরম মাণও করা হয়। গিণেতর মেধ জানা লাগেব মূলত কি েনটির ,
াবািবিলিট, না ার িথওির, িজওেমি এবং িলিনয়ার অ ালেজ া ইত ািদ। এছাড়া িকছু ক ালকুলাস শখােনা হয়। াবািবিলিটর জন আলাদা কাস করােনা হয় এবং খুবই
ই ােরি ং িকছু বেলম সলভ করােনা হয় সখােন। কােরা যিদ গিণত ভােলা লােগ তার জন কি উটার সােয়ে ভােলা করা সহজ হয় যায়। আবার কও গিণেতর িরেয়ল
লাইফ অ াি েকশন িশখেত চাইেলও এটা তার জন একটা ভােলা সাবেজ হেত পাের।

অপােরিটং িসে ম এবং িসে ম া ািমং: এখােন িশখােনা হয় িকভােব অপােরিটং িসে ম কাজ কের। তেব তারমােন এই না য উইে াজ চালােনা শখােনা হয়! এখােন
িশখায় অপােরিটং িসে েমর ই ারনাল াকচার িকরকম। কি উটাের একই সােথ ১০টা কাজ করেল অপােরিটং িসে মেক ১০টা কােজর জন িবেশষ িশিডউল তির করেত
হয়, স েলা এখােন িশখােনা হয়। তারপর ধেরা ২টা া াম একই সােথ ি ার ব বহার করেত চাইেলা, কােক অেপ ায় রেখ কােক িদেব এ ধরেণর িরেসাস ম ােনজেমে র
কাজও িশখােনা হয়।

িসে ম া ািমং এ মু েসাস অপােরিটং িসে ম ইউিন /িলনাে র সাসেকাড িনেয় ঘাটাঘািট করা হয়। এই কাসটা ভােলামত করেল শখা যােব িকভােব মেডম বা িবিভ
িডভাইেসর জন াইভার তির করা যায়, িকভােব অপােরিটং িসে েমর িভতেরর কাড মিডফাই করা যায়। ভিবষ েত কও অপােরিটং িসে ম তির করেত চাইেল বা এই
স িকত িরসাচ করেত চাইেল সটার ব াক াউ তির হয় এখােন।

ডাটােবস: ওেয়বসাইট বা বড়বড় সফটওয় ার িবশাল ডাটা রােখ “ডাটােবস” এর িভতর। ডাটােবেস িকভােব ডাটা রাখেত হয়, িকভােব সখান থেক ডাটা িনেয় আসেত হয়
ইত ািদ িনেয় এই কাস।

আিটিফিসয়াল ইে িলেজ (এ.আই): নাম েনই বাঝা যাে িক িনেয় এই কাস, িথিসেসর জন খুবই পপুলার একটা টিপক এটা। িকভােব রাবটেক িদেয় কাজ করােনা
যায়, গেমর ক াের ার িনেজ িনেজ িবিভ িস া নয়, কি উটার িকভােব দাবা খেল এই ধরেণর দা ণ ই ােরি ং সব টিপক এ.আই এর অ ভূ । ল ােব া ািমং কের
এসব টকিনক ইমি েম ও করেত হয়। গম া ািমং বা রােবািটকস এ আ হ থাকেল এই কাসিট তামার খুব পছ হেব। িনউরাল নটওয়াক, জেনিটক
অ ালেগািরদেমর মেতা দা ণ সব িজিনস িশখেত পারেব।

ক াইলার: সাদামাটা ভাষায় ক াইলার িজিনসটার কাজ া ািমং ল াং েয়জেক মিশন ভাষায় পিরণত করা যােত হাডওয় ার সটা বুঝেত পাের। া ািমং ল াং েয়জ
িকভােব কাজ কের, িকভােব িনেজর া ািমং ল াং েয়জ তির করা যায় এ েলা িনেয়ই ক াইলার কাস। া ািমং ল াং েয়েজর ইন াকশন েলা কি উটার িকভােব
মিশন কাড বািনেয় কাজ কের স েলা শখােনা হয় এখােন। মানুেষর ভাষার মেতা া ািমং ভাষারও ামার থােক, স েলা িনেয় জানেত পারেব।

ািফ : আমরা কি উটার গমস বা অ ািনেমেটড মুিভেত এত সু র ািফ দিখ তার িপছেন আেছ চুর ম াথেমিটকাল িথওরী। যমন গমেস লাইিটং, শিডং িকভােব
বা বস ত করা যায় তার িপছেন আেছ অেনক িথওরী। গমারেদর কােছ চিলত শ “এি এিলয়ািসং”, “ শিডং” ইত ািদ স েক এই টিপেক িব ািরত পড়ােনা হয়। চুর
জ ািমিত দরকার হয় এখােন। যমন একটা ৩-িড বা েক ৪৫ িড ী ঘুরােল কা-অিডেনট কত পিরবতন হেব এসব িহসাব এখােন করেত হয় এবং ল ােব সই অনুযািয়
ািফকাল া াম িলখেত হয়, তাই শখাটা ধু মুখে সীমাব থােকনা। তুিম কেলেজ থাকেত হয়েতা ব ৃ , সরলেরখার ইকুেয়শন িশেখেছা, এখােন িশখেব ও েলা ব বহার
কের িকভােব ািফ তির হয়।

2/3
নটওয়ািকং: িকভােব একটা কি উটারেক আেরা ১০ কি উটােরর সােথ কােন করেত হয়, িকভােব ই ারেনট কাজ কের, িকভােব নটওয়ােক ডাটা প ােকট পাঠােনা হয়
এবং অন াে িরিসভ করা হয় ইত ািদ শখােনা হয়। নটওয়াক িসিকউিরিটও এই টিপেকর অ ভূ । জানেত পারেব ল ান, িডএনএস সাভার, আইিপিভ-৬, ি ে া ািফ
ইত ািদ স েক।

িডি িবউেটড িসে ম: তুিম হয়েতা জােনা বড় বড় যসব কােজ অেনক মমির, শি দরকার হয় সসব কােজ অেনক েলা কি উটারেক একসােথ ব বহার কের কাজ করা
হয়। বড় বড় িরসােচর কাজ এভােব করা হয়, ওেয়বসাইট েলােতও অেনক েলা সাভার একসােথ কাজ কের। িকভােব িডি িবউেটড িসে ম িডজাইন করা যায় সটা িনেয়ই
এই কাস।

সফটওয় ার ইি িনয়ািরং: আধুিনক সফটওয় ার িডজাইেনর টকিনক পড়ােনা হয় এই টিপেক। সব িব িবদ ালেয়র কািরকুলােম স বত এটা নই।

এখন আিস হাডওয় ার িরেলেটড িকছু টিপেক। এ ব াপাের আ হ এবং ান কম বেল কম কথা শষ করিছ। কি উটার সােয়ে হাডওয়ার িনেয় অেনক িকছু পড়ােনা হয়।
কি উটার আিকেটকচাের কি উটাের মূল গঠন পড়ােনা হয়। িকভােব কি উটােরর তথ যাবার পথ বা “ডাটা বাস” কাজ কের, এিজিপর সােথ িপিসআই এর পাথক , ক াশ
মমির ইত ািদ শখােনা হয়। ইেলকি কাল সািকেটর মেতা কি উটাের থােক িবেশষ িডিজটাল সািকট, স েলা িনেয় পড়ােনা হয় িডিজটাল িসে মস টিপেক। এছাড়া িবিভ
িডভাইস যাগ করেল িকভােব সটা কি উটােরর সােথ যাগােযাগ কের এসব পড়ােনা হয় হাডওয় ার অংেশ। ল ােব িবিভ ধরেণর সািকট তির করেত হয়। েজ অংেশ
অেনক ি েয়িটিভিট দখােনার সুেযাগ থােক, কও কও রাবট তির কের, আমােদর ােসর একজন মাবাইল িদেয় িনয় ণ করা যায় এমন খলনা গািড় বািনেয়িছেলা।

এই হেলা মাটামুিট কি উটার সােয়ে যা যা পড়ােনা হয় তার সামাির। অেনক িকছু হয়েতা বাদ পেড় িগেয়েছ এই মূহেূ ত মাথায় না থাকার কারেণ। কি উটার সােয়ে র
আকষণীয় একটা িদক হেলা “কনেট ”। সারাবছরই িবিভ িব িবদ ালয় বা কা ািন া ািমং কনেট এবং সফটওয় ার কনেট আেয়াজন কের। া ািমং কনেটে
মূলত অিলি য়াড াইেল অ ালেগািরদেমর সাহােয বেলম সলভ করেত হয়। এখােন সুেযাগ আেছ সারা িবে র বড় বড় া ামারেদর সােথ কনেট করার। বাংলােদেশর
মানুেষর গব করার মেতা িজিনস খুব বিশ নই, তেব া ািমং কনেট অবশ ই সই অ িজিনস েলার একটা, অেনকবছর ধেরই বাংলােদিশরা এসব কনেটে ভােলা ফল
করেছ। সফটওয় ার কনেটে মূলত িবিভ সফটওয় ার, ওেয়ব সাইট িডজাইন করেত হয়, মাবাইল িবেশষ কের অ া েয়ড িভি ক মাবাইেলর সফটওয় ার কনেট বতমােন
খুব জনি য়। মাইে াসফট ইেমিজন কােপর মেতা বড় বড় আ জািতক সফটওয় ার কনেটে ও বাংলােদিশরা অংশ নয়। আবার তুিম চাইেল হাডওয় ার কনেট ও করেত
পােরা, দা ণ একটা রাবট বািনেয় চমেক িদেতা পােরা সবাইেক।

আেরকিট আকষণীয় িদক হেলা গেবষণার সুেযাগ। কি উটার সােয় শষ বেষ িকছু িডট থােক গেবষণা বা েজে র জন । িত বছরই বাংলােদেশর অনােসর ছা রা
ভােলা ভােলা জানােল পপার পাবিলশ কের থােক। কি উটার সাইে র গেবষণার একটা সুিবধা হেলা িনেজর ড টপ কি উটার ব বহার কেরই বড় বড় গেবষণা কের ফলা
যায়, কািট টাকা য পািতর দরকার হয় না(অবশ ই দরকার হয়, তেব স েলা ছাড়াও অেনক কাজ করা যায়)।

কি উটার সােয় অনাস কের তুিম চাইেল অন ান িবষয় িনেয়ও পড়ােলখা করেত পােরা কারণ এখন সবকােজ কি উটার দরকার হয়।
যমন িরেস িল অ াে াইনফরেমিট নােমর একটা সাবেজ িনেয় গেবষণা হে , এেদর কাজ মহাকাশ গেবষণায় কি উটারেক আেরা ভােলাভােব িকভােব ব বহার করা যায়
সটা িনেয় কাজ করা। তুিম চাইেল িফিজে র লাইেন িগেয় কায়া াম কি উটার িনেয় কাজ করেত পােরা। আবার বােয়ালজী ভােলা লাগেল বােয়াইনফরেমিট িনেয়
পড়ােলখা করেত পােরা, কাজ করেত পারেবা ন ােনােটকেনালজী, িডএনএ/ ািটন অ ানালাইিসস িনেয়। এরকম হাজারটা স াবনা তামার সামেন থাকেব।

আশা কির লখাটা পড়ার পর কি উটার সােয়ে িক পড়ােনা হয় স স েক একটা ধারণা তির হেয়েছ এবং ভূ ল ধারণা েলা ভেঙ িগেয়েছ। চাকিরর বাজার িনেয় িকছু
বলেবানা, য আেগই চাকিরর িচ া কের সাবেজ চেয়স কের তার জন এ লখা নয়, তেব তারপেরও ধু বেল রািখ বতমােন কি উটার সােয় পের আিম কাওেক বকার বেস
থাকেত দিখিন।

ভিত পরী াথীেদর বলেবা, যসব সাবেজ পড়ার কথা ভাবেছা িতটা স েক ভােলাভােব জানার চ া কেরা, সখােন িক িক পড়ােনা হয় সটা খাজ নাও, এবং যিদ স েলা
তামার সিত ই পছ হয় তাহেলই ভিত হেয় যাও, কােনা সাবেজ ই ১ ন র-২ ন র না, ইেলি কাল মােটও মকািনকােলর থেক “ভােলা সাবেজ ” না, সটাই তামার
কােছ “ভােলা সাবেজ ” যটা তামার পছ , সটা যিদ পুি িব ােনর মেতা মানুেষর চােখ িপেছর িদেকর সাবেজ হয় তাহেলও সটা ভােলা, মানুষই তির িবভাজন অনুসরণ
করেল িনেজর সােথ তারণা করা হয়।

সকল ভিত পরী াথীেদর িত ভকামনা, আশা কির ভয়াবহ এই সময় সহেজ পার কের ফলেত পারেব।

“What’s the world’s greatest lie?” the boy asked, completely surprised. “It’s this: that at a certain point
in our lives, we lose control of what’s happening to us, and our lives become controlled by fate. That’s
the world’s greatest lie.”- The alchemist,Paulo Coelho

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
া ািমং কনেট এবং অনলাইন জােজ হােতখিড়
shafaetsplanet.com /planetcoding/

শাফােয়ত জানুয়াির ৭,
২০১৩

(আমােক অেনেক মইল কের িজ াসা কের িকভােব স া ািমং কনেটে র সােথ যু হেত পাের? তােদর হয়েতা কেয়ক বােক িকছুটা বুিঝেয় বলার চ া কির িক সব
কথা বা গাইডলাইন এভােব দয়া স ব হয়না। এই লখাটা তােদর জন যারা সামান া ািমং িশেখেছ বা শখার কথা ভাবেছ এবং া ািমং কনেটে অংশ নবার কথা
ভাবেছ। আিম যখন থম কেরিছলাম তখন যসব মাথায় এেসিছেলা বা অেনেকই যধরেণর কের স েলার উ র িদেত চ া করেবা এখােন এবং িকভােব
অনলাইন জােজ বেলম সলভ করেত হয় সটা দখােবা।)

তামার বয়স যতই হাক বা যখােনই পড়ােলখা কেরা তুিম া ািমং কনেটে অংশ িনেত পারেব, এমনিক তুিম যিদ ু েল পেড়া তাহেলও। ইনফরেমিট অিলি য়াড হেলা
ু ল-কেলেজর ুেড েদর জন া ািমং কনেট , বাংলােদশ জাতীয় পযােয়র অিলি য়ােড ভােলা কের তুিম অংশ িনেত পারেব আ জািতক ইনফরেমিট অিলি য়ােড।
তুিম যিদ ু ল-কেলজ থেকই িসিরয়াসিল কনেট করা কেরা তাহেল খুবই ভােলা স াবনা আেছ িব িবদ ালয় পযায় িগেয় তুিম দেশর সরা একজন কনেটে হেত
পারেব, রািশয়া-চীেনর মেতা যসব দশ কনেটে সবেথেক ভােলা তারা খুব কম বয়েস এটা কের। তুিম যিদ এরই মেধ কােনা িব িবদ ালেয় ১ম বা ২য় বেষ পড়ােলখা
কেরা তাহেলও মােটও দরী হেয় যায়িন, তুিম িবিভ িব িবদ ালেয়র আেয়ািজত ন াশনাল লেভেলর কনেট েলােত অংশ িনেত পারেব। তেব তামার ল হেব আকাশ
ছায়ার, তুিম হয়েতা একসময় অংশ িনেব acm icpc ওয়া ফাইনােল, া ািমং কনেটে র সবেথেক স ানজনক িতেযাগীতায়। এটার জন তামােক খুবই ভােলা
ফলাফল করেত হেব িরিজয়নাল কনেটে । িত বছরই বাংলােদশ থেক ১িট বা ২িট িটম ওয়া ফাইনােল অংশ নয়।

এ েলা ছাড়াও িবিভ ওেয়বসাইেট িনয়িমত অনলাইন কনেট হয়, স েলােত অংশ িনেত পাের য কও, ধু তামােক ইেমইল আইিড িদেয় সাইেট রিজ ার করেত হেব।
সখােন তুিম সারা িবে র া ামারেদর সােথ িতেযাগীতা করেব, তামােক পারফরেম অনুযায়ী া মা ার/এ পাট ইত ািদ রিটং দয়া হেব, সখােন দখেত পারেব
বাংলােদিশ া ামাররা ই ারন াশনাল পযােয়ও খুবই ভােলা ফলাফল কের। া ািমং কনেট টপ- রেটড কাডারেদর অেনেকর বয়স ১৫-১৬ বা তারও কম তাই তামার
ইউিনভািসিটেত যাওয়া পয অেপ া করা দরকার নই।

এখন থম হেলা তুিম করেব িকভােব? থম কাজ অবশ ই া ািমং শখা। তুিম যিদ এখেনা া ািমং না িশেখ থােকা তাহেল আেগ সটা কের দাও। িস++
এর একটা ভােলা বই যাগাড় কেরা (এখান থেক ডাউনেলাড কের িনেত পােরা) আর বিসক িজিনস েলা িশেখ ফেলা। থেমই খুব বিশ শখা দরকার নই, বিসক লিজক-
লুপ চালােনা-ইনপুট/আউটপুট নয়া িশেখই তুিম বেলম সলিভং াকিটস করেত পারেব, একই সােথ িশখেত থাকেব আেরা অ াডভা ড টিপক েলা। ল াং েয়জ শখা
আসেল কনেটে র িতর বড় অংশ না, এটা িশখেত বিশ সময় লাগেবনা, এরপের অেনক বিশ সময় িদেত হেব বেলম সলিভং টকিনক েলা িশখেত তেব সই সময়টা
তামার একদমই বািরং লাগেবনা সটার িন য়তা িদেত পাির, এই শখা চলেত থাকেব তুিম যতিদন কনেট করেব ততিদন, শখার কােনা শষ নই।

া ািমং ল াং েয়জ ছাড়াও িক িক িবষয় শখা লাগেব? তুিম া ািমং কনেটে অংশ নয়ার িত িনি , তুিম কােনা ওেয়ব ডেভলপার না ধু ল াং েয়জ িশেখ গেল
সাচ কের ফাংশন কিপ- প কের কাজ করেব, বা তুিম পরী ার িত িন না য কােনা একটা বই মুখ কের ফলেব। তুিম া ািমং কনেট করেব তাই তামার
জানার কােনা িলিমট থাকেবনা। তামােক খুবই ভােলা লিজক ডেভলপ করেত হেব, তামােক গিণেত িবেশষ কের কি েনটির , াবািবিলিট আর না ার িথওিরেত অবশ ই
ভােলা হেত হেব, অেনক অ ালেগািরদম আর ডাটা াকচার িকভােব কাজ কের তামােক জানেত হেব এবং স েলা কােড ইমি েম করেত জানেত হেব। কিঠন কিঠন
শ েলা েন ভেয়র িকছু নই, কনেট করেত করেতই তুিম এ েলা িশেখ যােব, আেগই সবিকছু িশেখ কও কেরনা। তামােক এই লখার শষ অংশ িকছু িরেসাস
িদেবা করার জন ।

এখন আিস যটা িশখােত মুলত লখাটা কেরিছলাম সই অংেশ, অনলাইন জােজ হােতখিড়। তুিম যখন একটা বেলম সলভ করেব সটা সিঠক নািক সটা বেল িদেব
অনলাইন জাজ। অনলাইন জাজ আসেল এক ধরেণর অনলাইন সফটওয় ার য তামার কাড পরী া কের কেয়ক সেকে র মােঝ বেল দয় সটা সিঠক নািক। াকিটস
করার জন অসংখ অনলাইন জাজ আেছ। তুিম হয়েতা জােনা এইসব জােজর মেধ একিট আেছ একজন বাংলােদিশর তির করা, জাজিটর নাম lightoj, তির কেরেছন
ঢাকা িব িবদ ালেয়র জােন আলম জান িযিন বতমােন গেল কাজ করেছন। তেব আমরা করেবা বাংলােদিশেদর মেধ সবেথেক পপুলার UVa online judge িদেয়,
এটা তির কেরেছ েনর ভ ালােডািলড ইউিনভািসিট, িলংকটা হেলা http://uva.onlinejudge.org/। তুিম েতই এখােন একটা অ াকাউ খুেল ফেলা।

1/6
অ াকাউ খুেল তুিম বােম browse problems থেক “ Contest Volumes” িলংকটােত যাও। সখােন দখেব উপেরর মেতা volume C,volume CI
ইত ািদ লখা আেছ। তুিম volume C ত ি ক কেরা। সখােন দখেব বেলেমর একটা িল এেস িগেয়েছ।

ডােনর কলাম েলােত দয়া আেছ কতজন বেলমটা সলভ কেরেছ আর কতজন চ া কেরেছ। য বেলম যত বিশ মানুষ সলভ কেরেছ সটা তত সহজ হবার স াবনা
বিশ। তুিম িনেচ ল কের 10055 – Hashmat the Brave Warrior বেলমটায় ি ক কেরা। বেলমিট সট কেরেছন বাংলােদেশর Shahriar
Manzoor,িতিন খুবই িবখ াত বেলমেসটার এবং পুেরা পৃিথবীেত হােতেগাণা অ য কয়জন মানুষ িতিন ওয়া ফাইনােলর জাজ হেত পেরেছন তােদর একজন। বেলমটা
একবার তুিম িরিডং পেরা তারপর আিম ব াখ া করিছ।

যেকােনা বেলমেক ৩টা অংশ ভাগ করা যায়। থম ভােগ থােক বেলেমর বণনা। এরপের থােক “Input” অংশ। এই অংশ বলা থােক তামােক িক ধরেণর ভ ালুর জন
2/6
বেলমটা সলভ করেত হেব। “Output” অংেশ থােক িকভােব আউটপুট ি করেত থােক। কেয়কিট sample input/output দয়া হয় বাঝার সুিবধার জন । িক
এটা িক জাজ এর Input না। জােজর একিট ইনপুট ফাইল থােক, hashmat বেলমটার জন সটা হেত পাের এরকম:

তেব সিত কােরর জাজ ইনপুট ফাইেল িক আেছ সটা খািল বেলম সটাররা জােনন, তামােক বা আমােক সটা দয়া হেবনা, তামােক খািল বলা হেব ইনপুট ফাইেল িক
ধরেণর ইনপুট আেছ, ইনপুট ফাইল কত বড়, য সংখ া বা ি ং ইনপুট দয়া হেব স েলা কত বড় ইত ািদ। িতিট ইনপুেটর জন তামােক আউটপুট ি করেত হেব
বেলেম বলা ইন াকশন অনুযায়ী। জােজর কােছ একটা answer ফাইল আেছ। তুিম যসব আউটপুট ি করেব জাজ সটােক আেরকিট আউটপুট ফাইেল িনেয় যােব।
তারপের answer ফাইেলর এর সােথ তামার কাডেথেক পাওয়া আউটপুট িমিলেয় দখেব। এই কারেণ তুিম আউটপুেট অিতির কােনা িকছু ি করেত পারেবনা, যমন
hashmat বেলেম তুিম িত লাইেন সু র কের “the answer is 10” এভােব ি করেল হেবনা, যভােব বেলেছ সভােব ধুমা উ রটা ি করেত হেব।
তামােক ফাইল িনেয় িচ া করেত হেবনা, তুিম সাধারণভােবই printf,scanf িদেয় কাজ করেব, ফাইেলর ব াপার জাজ হ াে ল করেব।

এখন তুিম একটা সিলউশন িলেখ ফলেব। সিলউশনটা হেত পাের এরকম:

3/6
আিম সরাসির কাড না িদেয় ইেমজ িদলাম যােত কও কিপ- প কের থম সিলউশন লখার আন িমস না কের। while এর িভতর scanf এর এরকম ব বহার হয়েতা
তুিম আেগ দেখািন, আপাতত জেন রােখা এভােব িলখেল যত ণ ২িট সংখ া ইনপুট দয়া হেব তত ন তামার কাড কাজ করেব, ফাইল যখন শষ হেব(EOF=end of
file) তখন কাড টািমেনট করেব। এই কাডটা িলেখ স া ল ইনপুট েলা িকেবাড িদেয় ইনপুট িদেয় দেখা য আউটপুেটর সােথ িমলেছ নািক। মেন রাখেব ধুমা
আউটপুট অংশটা িভ একটা ফাইেল িনেয় জােজর সােথ িমিলেয় দখা হেব।

এবার বােম quick submit এ ি ক কেরা। বেলম আইিড হেলা 10055 যটা বেলেমর উপেরই লখা আেছ। ল াং েয়জ িসেল কেরা C++ 4.5.3।

4/6
এরপর সাবিমট বাটেন ি ক কেরা। জােজর সাভার িঠকঠাক থাকেল কেয়ক সেকে জাজ হেয় যােব। বােম my submissions এ ি ক কেরা এখন। জাজ হেয় গেল
দখােব “Accepted”। তারমােন তামার কাড সিঠক, এইমা তুিম অনলাইন জােজ তামার থম বেলম সলভ কেরেছা!! UVa’ ত সাভােরর অেনক সময় সমস া
করেল verdict আসেত দির কের, তখন একটু অেপ া করেত হেব, তেব সটা খুব কমই হয়। তুিম কাড সাবিমট করার পর যসব verdict পেত পােরা স েলা হেলা:

Wrong answer: তামার সিলউশেন ভুল আেছ। sample input এর জন তামার কাড সিঠক উ র িদেলও জােজর মূল ইনপুট ফাইেলর জন িদেত পারেছনা।
যমন ধেরা hashmat বেলেম বলা আেছ 2^32-১ পয ইনপুট দয়া হেব, সাধারণ integer এর িলিমট হেলা 2^31-১, তাই long long ব বহার না করেল তুিম
wrong answer পােব। wrong answer আসেল িচ া কেরা কান ইনপুেটর জন তামার া াম কাজ করেছনা।

Time limit exceeded: বেলেমর উপর হয়েতা লখা দেখেছা time limit: 3 seconds, তারমােন সব েলা ইনপুেটর জন মাট ৩ সেকে র মােঝ তামােক
আউটপুট িদেত হেব, যিদ টাইম পার হেয় যায় তাহেল এই verdict পােব। তখন িচ া কেরা িকভােব কাড অপিটমাইজ করা যায়। আমরা সাধারণত ধের নই ১ সেকে
মাটামুিট ১০^৮ পয লুপ চালােনা যােব।

Run time error: তামার কাড এি িকউশন করার সময় কােনা একটা কারেণ ব হেয় িগেয়েছ। যমন হয়েতা কাথাও তুিম ণ িদেয় কাওেক ভাগ করার চ া
করেছা বা তামার অ ােরর সাইজ বিশ ছােটা।

Presentation error: তুিম যিদ কােড অিতির space ি কেরা তাহেল এই verdict পােব। তারমােন তামার সিলউশন িঠকই আেছ তেব ি ি ং ফরেমট
িঠক নাই। সাধারণত খুব সহেজই এই ইেরার দূর করা স ব।

Accepted: তামার সিলউশন সিঠক, অিভন ন, এখন অন আেরকিট বেলম সলভ কেরা।

এখন তুিম বােম My uHunt with Virtual Contest Service িলংেক ি ক কেরা। িস াপুর ন াশনাল ইউিনভািসিটর ফিল হািলম এই সাইটটা তির কেরেছন।
এখােন খুব সহেজই তামার সব statistics দখেত পারেব, সাবিমট করার পর চাইেল এখােনই তুিম verdict দখেত পােরা। িনেচর িদেক “Next Problems to
Solve” অংশ থেক তুিম সলভ করার মেতা বেলম খুেজ িনেত পারেব, থম িদেক সহজ যত বেলম আেছ সব সলভ কের ফলেব, এরপর দ তার বাড়ােত কিঠন বেলম
সলভ করা করেব। “World Ranklist” অংেশ দখেত পারেব তামার অব ান কাথায়। উপেরর িদেক search problems ঘের বেলম id বিসেয় খুব সহেজ
যেকােনা বেলেমর িলংক খুেজ বর করেত পারেব। এছাড়া এই সাইেট আেরা িকছু কােজর টুলস আেছ, একটু তা িত কের বুেঝ িনেব।

থম িদেক তামার input/output ফরেমট িনেয় একটু সমস া হেত পাের। eof পয ইনপুট নয়া, blank line পেল ক করা এসব ব াপার নতুন লাগেত পাের।
এজন তুিম এই ফাইলটা ডাউনেলাড কের নাও:

ইনপুট/আউটপুট টকিনক+অ াের+ি ং+ডাটাটাইপ+পেয় ার

এখােন কেয়কটা ছােটােছােটা pdf ফাইল আেছ, বেলম সলিভং করার জন খুবই কােজর এ েলা।
য বই েলা তামার পড়া খুবই দরকার স েলা হেলা knuth এর concrete math, rosen এর discrete math, কারম ান বা শাহনীর algorithm, ি েভন-
ফিল হািলেমর competitive programming। বই েলা ডাউনেলাড কের ধীের ধীের পড়েত থােকা, িবেশষ কের শষ বইটা।

বেলম সলভ করেত িগেয় অেনক সময়ই তুিম আটেক যােব, বারবার wrong answer খােব। তখন তুিম িক করেব? থম কাজ হেলা আেরা ভােলাভােব িচ া কেরা।
এরপেরও না পারেল সাহায নাও। হেত পাের তুিম এমন জায়গায় থােকা যখােন সাহায করার মেতা িশ ক বা বড় ভাই নাই। ই ারেনেটর যুেগ এটা কােনা ব পারই না,
তুিম িবিভ ফারােমর সাহায নাও। তুিম জান ভাইেয়র lightoj ত রিজ ার করেল একিট চমৎকার ফারাম পােব যখােন অেনেকই সাহায করেব। uva সহ ায় সব
অনলাইন জােজরই ফারাম আেছ, তুিম গেল সাচ করেলই িলংক পােব স েলার। সখােন তুিম বড় বড় া ামারেদর সােথ কথা বেলা, দেখা তারা িকভােব াকিটস
কের। বাংলােদেশর া ামারেদর সােথ যাগােযাগ করার জন চমৎকার জায়গা হেত পাের ফসবুক, তুিম িনেচর প েলােত জেয়ন কেরা:
াগি য়া-বাংলা ইনফরেমিট গ
BD programmers
Bangladesh Informatics Olympiad

এসব জায়গায় তুিম সাহায করার মেতা অেনক উদার মানুষেক পােব। ফািহম ভাইেয়র সাইেট তুিম দা ণ সব িরেসাস পােব, িবিভ অনলাইন জােজর কানটার িক িফচার
আেছ স েলা জানেত পারেব। তামার যসব িলংক দরকার হেত পাের তার একিট কােলকশন আিম তির কেরিছ, আশা কির তামার কােজ লাগেব। তুিম uva’র সহজ
বেলেমর একটা তািলকা পােব এখােন, এ েলা িদেয় সলভ করেত পােরা।

বুঝেতই পারেছা তুিম যখােনই থােকানা কেনা া ািমং কনেটে ভােলা করার মেতা সব িরেসাস ই ারেনেটই আেছ, তামার কাজ হেলা স েলা ব বহার কের খুব ভােলা
কের াকিটস করা। অেনকবার তামার মেন হেব “আিম পারিছনা”, এরকম ভেব অেনেকই হাল ছেড় দয়, তুিম ছাড়েবনা, একসময় তুিম ভােলা করেত বাধ । নেট তুিম
5/6
অেনক কাড পােব য েলা সাবিমট কের তুিম accepted পেত পােরা িক ভুেলও সই কাজ করেবনা, তাহেল িবশাল িত হেব, তামােক এ ব াপাের িনেজর কােছ সৎ
থাকেত হেব। িকছুটা দ তা আসার পর বিশ বেলম সলভ করার থেক বিশ িদেব ভােলা বেলম সলভ করােক, অনলাইন জােজ তুিম কয়টা বেলম সলভ কেরেছা
সটা কও দখেবনা, দখেব তুিম িবিভ কনেটে কমন কেরা সটা।

সবেশেষ বলেত চাই তামার চলার পথ হয়েতা খুব সহজ হেবনা, অেনেকই িন ৎসািহত করেব, অেনক িশ ক পছ করেবনা তামার কনেট করা, অেনক সময় অন কােজর
সােথ তাল িমিলেয় কনেট করা কিঠন হেব, এ েলাই বা বতা বাংলােদেশ। এসেবর মেধ কও কও হাল ছেড় িদেব, বািকরা কােনা িকছুেতই হাল ছাড়েবনা, জয় একমা
তােদরই াপ , তামােক বেছ িনেত হেব তুিম কান দেল থাকেব। আিম কনেট কির ২০১০ এ, বশ িকছু ন াশনাল আর িরিজয়নাল কনেট কেরিছ, কােনাভােবই
আমােক িসিনয়র কনেটে বা খুব ভােলা কনেটে বলা যায়না,তেব এই ৩ বছের অেনক অিভ তা হেয়েছ, অেনক ভােলা ভােলা কনেটে ে র সােথ কাজ করার সুেযাগ
হেয়েছ। অেনক সময়ই ranklist এ িপেছর িদেক িছটেক পেড়িছ আবার পেররবার সটা িরকভার কের থমিদেকও এেসিছ, এখনও চ া করিছ ইম ভ করার, সবিমিলেয়
কনেট করা একটা দা ণ অিভ তা। তুিম অেনক অেনক িকছু িশখেত পারেব, অ ালেগািরদেমর বাইেরও তুিম িশখেব িকভােব এ ি ম শাের কাজ করেত হয়, খারাপ
িসচুেয়শন থেক িরকভার করেত হয়, িকভােব িতেযাগীতা করেত হয় দেশর সরােদর সােথ। তুিম হয়েতা কখেনা টিলিভশেন ি েকট খলা দখেত দখেত শষ ওভাের দম
ব কের বেস থেকেছা, তারপর একটা ছ া মারার পর সবাইেক চমেক িচৎকার কেরেছা, তুিম িঠক সই অিভ তা পােব কনেটে , হয়েতা শষ িমিনেট একিট বেলম িমিলেয়
হািরেয় িদেব সবাইেক, কখেনা অনলাইন কনেটে বাংলােদেশর পতাকা তুেল ধরেব অেনক উপের, এই অসাধারণ অনুভূিত তুিম টাকা িদেয় িকনেত পারেবনা।

আপাতত এখােনই শষ করিছ। তামার আেরা কােনা থাকেল অবশ ই জানাও, তামােক সাহায করেত পারেল খুিশ হেবা। ভকামনা থাকেলা।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

6/6
অ ালেগািরদম কমে ি িট(িবগ “O” নােটশন)
shafaetsplanet.com /planetcoding/

শাফােয়ত 10/12/2012

তুিম যখন একটা অ ালেগািরদমেক কােড ইমি েম করেব তার আেগ তামার জানা দরকার অ ালেগািরদমিট কতটা কাযকর। অ ালেগািরদম লখার আেগ িনেজ িনেজ িকছু
ে র উ র িদেত হেব, যমন:

১. আমার অ ালেগািরদম িক িনধািরত সমেয়র মেধ ফলাফল এেন িদেব?


২. সেবা কত বড় ইনপুেটর জন আমার অ ালেগািরদম কাজ করেব?
৩. আমার অ ালেগািরদম কতখািন মমির ব বহার করেছ?

আমরা অ ালেগািরদেমর কমে ি িট বর কের থম িট ে র উ র িদেত পাির। একিট অ ালেগািরদম যত েলা “ইন াকশন” ব বহার কের কাজ কের সটাই সাজা কথাই
সই অ ালেগািরদেমর কমে ি িট। িট ন র ণ করা একিট ইন াকশন, আবার একিট লুপ ১০০ বার চলেল সখােন আেছ ১০০িট ইন াকশন। ফলাফল আসেত কত ণ
লাগেব সটা িসিপউর েসসেরর উপর িনভর করেব, কমে ি িট আমােদর cputime বেল িদেবনা, কমে ি িট আমােদর বেল িদেব আমােদর অ ালেগািরদমিট তুলনামূলকভােব
কতটা ভােলা। অথাৎ এটা হেলা অ ালেগারিদেমর কাযকািরতা িনধারেণর একটা ল। আর BIG OO নােটশন হেলা কমে ি িট িলেখ কাশ করার নােটশন।

নতুন া ািমং কনেটে রা ায়ই কমে ি িটর ব াপাের খয়াল না কেরই ট- ফাস অ ালেগািরদম িলেখ ফেল এবং কাড time limit exceed কের। আর যারা
ধুমা সফটওয় ার িনেয় কাজ কের তােদর মেধ কমে ি িট িনেয় িচ া করার বণতা আেরা কম। এই লখাটা িবিগনার া ামারেদর জন যারা এখেনা সিঠকভােব
কমে ি িট িহসাব করা িশেখিন।

আমরা একটা উদাহরণ িদেয় কির। আমােদর একিট ফাংশন আেছ যার নাম myAlgorithmmyAlgorithm,আমরা সই ফাংশেনর কমে ি িট বর করেবা। মেন
কেরা ফাংশনিট এরকম:

C++

1 int myAlgorithm1(int n)
2 {
3 int x=n+10;
4 x=x/2;
5 return x;
6 }

এই অ ালেগািরদমিট nn এর ভ ালু যাই হাকনা কন সবসময় একিট constant সংখ ক ইন াকশন িনেয় কাজ করেব। কাডিটেক মিশন কােড পিরণত করেল যাগ-
ভাগ িমিলেয় ৩-৪ ইন াকশন পাওয়া যােব,আমােদর সটা িনেয় ম াথাব াথার দরকার নাই। েসসর এত ত কাজ কের য এত কম ইন াকশন িনেয় কাজ করেত য সময়
লােগ সটা িনেয় আমরা িচ াই কিরনা,ইন াকশন অেনক বিশ হেল আমরা িচ া কির,আর লুপ না থাকেল সাধারণত িচ া করার মত বিশ হয়না।

অ ালেগািরদেমর কমে ি িট হেলা O(1)O(1),এর মােন হেলা ইনপুেটর আকার যমনই হাকনা কন একিট constant টাইেম অ ালেগািরদমিট কাজ
করা শষ করেব।

এবার পেরর কাডিট দখ:

C++

1/5
1 int myAlgorithm2(int n)
2 {
3 int sum=0;
4 for(int i=1;i<=n;i++)
5 {
6 sum+=i;
7 if(sum>=1000) break;
8 }
9 return sum;
10 }

এই কােড একিট লুপ চলেছ এবং সটা nn এর উপর িনভরশীল। n=100n=100 হেল লুপ ১০০ বার চলেব। লুেপর িভতের বা বাইের কয়িট ইন াকশন আেছ সটা
িনেয় িচ া করেবানা,কারণ সটার সংখ া খুবই কম। উপেরর অ ালেগািরদেমর কমে ি িট O(n)O(n) কারণ এখােন লুপিট nn বার চলেব। তুিম বলেত পােরা sum যিদ
১০০০ এর থেক বড় হয় তাহেল break কের িদি , nn পয চলার আেগই লুপিট break হেয় যেত পাের। িক া ামাররা সবসময় worst case বা সবেথেক
খারাপ কস িনেয় কাজ কের! এটা িঠক য লুপিট আেগ break করেতই পাের,িক worst case এ সটা nn পয ইেতা চলেব।

worst case এ যত েলা ইন াকশন থাকেব সটাই আমােদর কমে ি িট।

C++

1 int myAlgorithm3(int n)
2 {
3 int sum=0;
4 for(int i=1;i<=n;i++)
5 {
6 for(int j=i;j<=n;j++)
7 {
8 sum+=(i+j);
9 }
10 }
11 return sum;
12 }

উপেরর কােড িভতেরর লুপটা থমবার nn বার চলেছ,পেররবার n−1n−1 বার। তাহেল মাট লুপ চলেছ
n+(n−1)+(n−3)+…….+1=n×(n+1)/2=(n2+n)/2n+(n−1)+(n−3)+…….+1=n×(n+1)/2=(n2+n)/2 বার। n2n2 এর সােথ
n2+nn2+n এর তমন কােনা পাথক নই। আবার n2/2n2/2 এর সােথ n2n2 এর পাথক ও খুব সামান । তাই কমে ি িট হেব O(n2)O(n2)।

কমে ি িট িহসােবর সময় constant factor েলােক বাদ িদেয় িদেত হয়। তেব কাড লখার সময় constant factor এর কথা অবশ ই মাথায়
রাখেত হেব।

উপেরর ৩িট অ ালেগািরদেমর মেধ সবেথেক সময় কম লাগেব কানিটর? অবশ ই O(1)O(1) এর সময় কম লাগেব এবং O(n2)O(n2) এর বিশ লাগেব। এভােবই
কমে ি িট িহসাব কের অ ালেগািরদেমর কাযকািরতা তুলনা করা যায়। পেরর কাডিট দেখা:

C++

2/5
1 int myAlgorithm4(int n,int *val,int key)
2 {
3 int low=1,high=n;
4 while(low<=high)
5 {
6 int mid=(low+high)/2;
7 if(key<val[mid]) low=mid-1;
8 if(key>val[mid]) high=mid+1;
9 if(key==val[mid]) return 1;
10 }
11 return 0;
12 }

এটা একটা বাইনাির সােচর কাড। িতবার low+high=n+1low+high=n+1 বা nn এর মান ই ভােগ ভাগ হেয় যাে । একিট সংখ ােক সেবা কতবার ২িদেয়
ভাগ করা যায়? একিট িহসাব করেলই বর করেত পারেব সেবা ভাগ করা যােব log2nlog2n বার। তারমােন log2nlog2n ধােপর পর লুপিট ক করেব। তাহেল
কমে ি িট হেব O(log2n)O(log2n)।

এখন ধেরা একিট অ ালেগািরদেম কেয়কিট লুপ আেছ,একিট n4n4 লুপ আেছ,একিট n2n2 লুপ আেছ আর একিট lognlogn লুপ আেছ। তাহেল মাট ইন াকশন:
n4+n3+lognn4+n3+logn িট। িক n4n4 এর তুলনায় বািক টাম েলা এেতা ছােটা য স েলােক বাদ িদেয়ই আমরা কমে ি িট িহসাব করেবা,
O(n4)O(n4)।
িরকািসভ ফাংশেন depth এর উপর কমে ি িট িনভর কের, যমন:

C++

1 int myAlgorithm5(int n)
2 {
3 if(n==1) return 1;
4 return n*myAlgorithm5(n-1);
5 }

এই অ ালেগািরদেম সেবা depth হেলা nn,তাই কমে ি িট হেলা O(n)O(n)। িনেচ ছাট কের আেরা িকছু উদাহরণ িদলাম:

f(n)f(n)=ইন াকশন সংখ া


f(n)=n2+3n+112f(n)=n2+3n+112 হেল কমে ি িট O(n2)O(n2)।
f(n)=n3+999n+112f(n)=n3+999n+112 হেল কমে ি িট O(n3)O(n3)।
f(n)=6×log(n)+n×lognf(n)=6×log(n)+n×logn হেল কমে ি িট O(n×logn)O(n×logn)।
f(n)f(n) = 2n+n2+1002n+n2+100 হেল কমে ি িট O(2n)O(2n)। (এটােক exponential কমে ি িট বেল)

িবিগনারেদর আেরকিট কমন ভুল হেলা এভােব কাড লখা:

C++

3/5
1 int myAlgorithm6(char *s)
2 {
3 int c=0;
4 for(int i=0;i<strlen(s);i++)
5 {
6 if(s[i]=='a') c++;
7 }
8 return c;
9 }

s ি ং এর দঘ |s| হেল এখােন কমে ি িট হেলা O(|s|2)O(|s|2)। কন য়ার হেলা? কারণ strlen(s) ফাংশেনর িনেজর কমে ি িট হেলা O(|s|)O(|s|),এেক
লুেপর মেধ আেরা O(|s|)O(|s|) বার কল করা হেয়েছ। তাই strlen(s) এর মান আেগ অন একিট ভ ািরেয়বেলর রেখ তারপর সটা িদেয় লুপ চালােত হেব,তাহেল
O(|s|)O(|s|) এ লুপ চলেব।

া ািমং কনেটে আমরা ধের নই জাজ এর িপিস ১ সেকে মাটামুিট 108108 টা ইন াকশন রান করেত পারেব। এটা জাজ-িপিস অনুসাের কমেবিশ হেত পাের, যমন
টপেকাডার আেরা অেনক বিশ ইন াকশন ১ সেকে রান করেত পাের িক spoj বা কাডেশফ তােদর পি য়াম ৩ িপিস িদেয় 107107 টাও সহেজ রান করেত
পােরনা। অনসাইট ন াশনাল কনেটে আমরা ১ সেকে 108108 ধেরই কাড িলিখ। কাড লখার আেগ থেম দখেব তামার অ ালেগািরদেমর worst case
কমে ি িট কত এবং ট কস কয়টা এবং দখেব টাইম িলিমট কত। অেনক নতুন া ামার অ ালেগািরদেমর কমে ি িট সিঠক ভােব িহসাব করেলও ট কস সংখ ােক
দয়না,এ ব াপাের সতক থাকেত হেব।

িনেচর ােফ িবিভ কমে ি িটর অ ালেগািরদেমর তুলনা দখােনা হেয়েছ:

4/5
(x axis=input size, y axis=number of instructions)

কনেটে বেলেমর ইনপুট সাইজ দেখ অেনক সময় expected algorithm অনুমান করা যায়। যমন n=100 হেল স াবনা আেছ এটা একটা n^3 কমে ি িটর
িডিপ বেলম,বা ম া ে া-ম ািচং বেলম। n=10^5 হেল সাধারণ nlogn কমে ি িটেত বেলম সলভ করেত হয় তাই স াবনা আেছ এটা একটা বাইনাির সাচ বা
সগেম ি এর বেলম।

আজ এই পয ই। কমে ি িট িনেয় আেরা অেনক িকছু জানার আেছ,িব ািরত পড়েত:


A Gentle Introduction to Algorithm Complexity Analysis
Complexity and Big-O Notation

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
কমে ি িট াস(P-NP, টুিরং মিশন ইত◌্যািদ)
shafaetsplanet.com /planetcoding/

শাফােয়ত আগ ১৪,
২০১৩

আমরা যখন বেলম সলভ করেত করেত মাথার চুল িছেড় ফিল তখন ায়ই এমন িকছু বেলম সামেন আেস য েলা সলভ করেত গেল সবেথেক শি শালী কি উটারও
হাজার হাজার বছর লািগেয় িদেব। বড় বড় কি উটার িব ানীরা যখন িদন-রাত িচ া কেরও এ েলা সলভ করেত পারেলননা তখন তারা এই বেলম েলােক িকছু ক াটাগিরেত
ফেল িদেয় বলেলন “এই ক াটাগিরর বেলম েলা সলভ করার সাধ এখেনা আমােদর হয়িন, তামরা কও পারেল সলভ কের িদেয় ১০ ল ডলার পুর ার িনেয় যাও”।
স েলােকই আমরা NP-complete, NP-hard ইত ািদ নােম িচিন।

NP ক াটাগিরর বেলম েলা কি উটার সােয়ে খুব িবখ াত। যমন একটা ােফ সবেথেক ল া পথ খুেজ বর করা, ৩টা রঙ িদেয় াফ কালািরং করা ইত ািদ। এ েলােক
এখন পয কও পিলনিময়াল টাইেম সলভ করেত পােরিন, যসব সিলউশন বর হেয়েছ স েলা সামান বড় ইনপুেটর জন ই কাজ কেরনা। মজার ব াপার হেলা এই
বেলম েলার যেকান একটা যিদ তুিম সলভ করেত পােরা তাহেল সব েলা বেলমই সলভ করা যােব তামার সিলউশেনর সাহােয , অেনক বছর ধের মানুষেক ভাবােনা কিঠন
সব বেলম চােখর িনেমেষ সলভ হেয় যােব একটা মা সিলউশন িদেয়, কি উটার িব ােনর চহারাটাই পাে িদেব এটা। সজন ই এত বড় বড় পুর ার ঘাষণা করা
হেয়েছ NP বেলম সলভ করা জন ।

এই আিটেকলটা পড়ার আেগ তামােক অ ালেগািরদম কমে ি িট িনেয় জানেত হেব। এছাড়া NP িনেয় জানেত হেল আমােদর থেম কেয়কটা টিপক িনেয় িকছুটা জানেত
হেব, আেগ সটা িনেয় আেলাচনা করেবা। এই লখাটা পড়ার পর তুিম P-NP, টুিরং মিশন িনেয় একটা ভােলা ধারণা পােব।

টুিরং মিশন: ১৯৩৬ সােল এলান টুিরং একটা “হাইেপােথিটকাল” মিশন িডজাইন কেরন, বা েব তির কেরনিন, ধুই িথওির িদেয়েছন। মিশনটা অ ালেগািরদম িসমুেলট
করেত পাের। এই মিশন িদেয় ব াখ া করা যায় িকভােব কি উটার একটা বেলম সলভ করেত পাের। টুিরং িচ া করেতন “একটা বেলম কি উেটবল” বলেত িক
বাঝায়? একটা বেলম “কি উেটবল” মােন হেলা “িকছু ইন াকশন থাকেব য েলা একটা কি উটার ফেলা করেল একটা কাজ শষ হেব”, এই ইন াকশন েলাই হেলা
অ ালেগািরদম। ইন াকশন েলা কি উটার ফেলা করেত পারেব নািক সটা িনভর কের মিশেনর সামেথর উপর। যসব অ ালেগািরদম টুিরং মিশন িদেয় সলভ করা যায়
স েলা “টুিরং-ক ুউেটবল”।

টুিরং মিশেন একটা অসীম ল া টপ থােক(িনেচর ছিব)। একটা হড টেপর কােনা জায়গায় পেয় কের বেলেমর একটা “ ট” িনেদশ কের। িতটা ট থেক কান
ট যাওয়া যায় সটা িনভর কের ওই বেলেমর “ ানিজশন ডায়া াম” এর উপর। সহজ কথায় ডায়া ােম বলা থােক কান ইনপুেটর জন কান ট থেক কান েট
যেত হেব সটা।

আধুিনক কি উটার েলা টুিরং মিশন কি উেটবল। টুিরং মিশন িদেয় সলভ করা না গেল কি উটার িদেয় সলভ করা যায়না, তাই এটা িনেয় আমােদর এত আ হ।

1/4
নন-িডটারিমিনি ক টুিরং মিশন: ধেরা তামার ইন াকশন সেট বলা আেছ “তুিম যিদ একটা ১০ ন র েট থােকা এবং ইনপুেট একটা “A” পাও তাহেল বােম যাও” এবং
একই সােথ বলা থােক “তুিম যিদ একটা ১০ ন র েট থােকা এবং ইনপুেট একটা “A” পাও তাহেল ডােন যাও” তাহেল তুিম কানটা করেব? একই েট একই ইনপুেটর
জন িভ ইন াকশন! নন-িডটারিমিনি ক টুিরং মিশন এই ধরেণর িসচুেয়শেন অনুমােনর উপর িনভর করেব। স র মিল অনুমান কের কােনা একটা পােথ চেল যােব।
হয়েতা সই অনুমান ভুল এবং কি উেটশনটা ভুল আউটকাম দেব। িক এখােন িবেবচ হেলা এমন কােনা সিঠক িস াে র িসকুেয় আেছ িক না। নন-িডটারিমিনি ক
মিশন সবসময় িঠক রজা িদেব এমন কােনা কথা নই, যিদ রজা পিজিটভ হয় তাহেল অবশ ই সিলউশন আেছ, িক নেগিটভ হেলও িনি ত কের বলা যায়না য
আসেল পিজিটভ রজা আেছ নািক নই। এজন ই এধরেণর মিশেনর নাম নন-িডটারিমিনি ক।

িডটারিমিনি ক টুিরং মিশন: এই মিশেনর ইন াকশন সেট এভােব একই সােথ ই রকম ইন াশন থাকেবনা। িত িসচুেয়শেন িনিদ কানিদেক যেত হেব সটা আেগ
থেক জানা থাকেব।

আধুিনক কি উটার িডটারিমিনি ক টুিরং মিশন এর সমতুল । নন-িডটারিমিনি ক ইন াকশন সট িনেয় কি উটার কাজ কেরনা।

পিলনিময়াল কমে ি িট: যসব বেলেমর কমে ি িট ইনপুট সাইেজর পাওয়ার স েলা পিলনিময়াল কমে ি িট, যমন O(n),O(nlogn),O(n^3) ইত ািদ।

P(Polynomial) বেলম: P বা পিলনিময়াল ক াটাগির বেলমেক িডটারিমিনি ক টুিরং মিশন িদেয় পিলনিময়াল টাইেম সলভ করা যায়। যমন শেট পাথ বেলম,
ন াপস াক বেলম। ধু য স েলা সলভ করা যায় সটা না, একটা “সািটিফেকট” িদেল সটা পিলনিময়াল টাইেম ভিরফাই ও করা যায়। সািটিফেকট িক? ধরা যাক
ইউলার পাথ বেলেমর কথা, একটা ােফর সব েলা এজ িভিজট করেত হেব এবং কান এজ ইবার িভিজট করা যােবনা। এখােন সািটিফেকট হেলা িকছু এজ এর িসেকােয়
(e1,e2….,eK)। আমােদরেক এই িসেকােয় িদেল সহেজই বলেত পারেবা এটা একটা ভ ািলড পাথ নািক। িতটা নাড ধের আগােবা, দখেবা এক নাড ইবার িভিজট
হেয়েছ নািক এবং সব েলা নাড িভিজট হেয়েছ নািক। O(E) তই আমরা এটা ভিরফাই করেত পারেবা যখােন E হেলা এজ সংখ া। P বেলম পিলনিময়াল টাইেম
সলভ করা যায়, এবং একটা সিলউশন(সািটিফেকট) ভ ািলড নািক সটা পিলনিময়াল টাইেম ভিরফাই করা যায়।

NP(Non-deterministic Polynomial) বেলম: NP বেলমেক িডটারিমিনি ক টুিরং মিশন িদেয় পিলনিময়াল টাইেম ভিরফাই করা যায়। িক
পিলনিময়াল টাইেম সলভ করা যায় িক যায় না সটা মাণ করা স ব হয়িন। যমন হ ািম ন পাথ বেলম, একটা ােফর সব নাড িভিজট করেত হেব, একটা নাড ইবার
িভিজট করা যােবনা। তামােক যিদ িকছু নােডর িসকুেয় দয় তুিম সহেজই ইউলার পাথ এর মেতা কের ভিরফাই করেত পারেব। িক একটা ােফ হ ািম ন পাথ আেছ
নািক নাই িকভােব বলেব? এটা বর করার জন পিলনিময়াল অ ালেগািরদম এখন পয আিব ার হয়িন। পিলনিময়াল অ ালেগািরদম না থাকেল আমরা সলভ কির
এ েপােন িসয়াল অ ালেগািরদম িদেয় য েলার কমে ি িট O(2^n),(k^n) এরকম। এই ধরেণর কমে ি িট সােজ কের তামােক ট ফােসর সাহােয সবকরম
পিসিবিলিট চক করেত হেব, সাধারণত ব াক ািকং িদেয় এসব বেলম সলভ করা হয়।

P=NP?? : িতটা P বেলেমই NP বেলম ক াটাগিরেত পের। কারণ সব P বেলমেক পিলনিময়াল টাইেম ভিরফাই করা যায় যটা NP ক াটাগিরর একমা শত।
তারমােন P হেলা NP এর একটা সাবেসট। িক সব NP বেলমই িক P বেলম? যসব বেলেমর সািটিফেকট পিলনিময়াল টাইেম ভিরফাই করা যায় স েলার
সব েলােকই িক পিলনিময়াল টাইেম সলভ করা যায়? হ ািম ন পাথ, স াট বেলম ইত ািদর ে আমরা জািননা বেলম েলা P ত ফলা যায় নািক। আমরা জািননা
P=NP নািক P!=NP। এটা কি উটার সােয়ে র সবেথেক িবখ াত একিট ওেপন বেলম। ম াথেমিটকাল ই িটিটউট এটােক ৭িট িমেলিনয়াম াইজ বেলম এর
একিট ধের ১০ ল ডলােরর াইজমািন ঘাষণা কেরেছ! তেব কি উটার িব ানী এবং গিণতিবদরা ধারণা কের P!=NP, িক ধুমা ধারণা কখেনাই িব ান নয়,
আইন াইন মুেখ িক ধারণার কথা বলেলন সটা িব ান নয়, িতিন িপয়ার িরিভউড জানােল যটা কাশ কেরেছন সটা িব ান!

2/4
NP hard: এই ক াটাগিরর বেলম েলা “অ ত NP বেলেমর মেতা” কিঠন। এই কথার মােন িক আর কিঠনেক িকভােব পিরমাপ কের? অেনক সময়ই একটা
বেলমেক অন বেলেম কনভাট করা যায়। ধরা যাক A একটা বেলম যটা NP ক াটাগিরর এবং B বেলমটা আমরা সলভ করেত চাই। A বেলমেক যিদ আমরা
পিলনিময়াল টাইেম B বেলেম কনভাট পাির তাহেল িনি ত ভােব বলা যায় B বেলমটাও A বেলেমর মেতাই কিঠন। NP hard বেলমেক অেনক সময় NP
ক াটাগিরেত ফলা যায়না কারণ সটা পিলনিময়াল টাইেম ভিরফাই করা যায় না।

NP ক পিলনিময়াল টাইেম সলভ করা যায়না, ভিরফাই করা যায়। NP hard ক পিলনিময়াল টাইেম সলভ করা যায়না, ভিরফাই করা যেতও পাের, নাও যেত পাের।

তাহেল আমরা এখন পয যতটুক জেনিছ:

যিদ কখেনা মাণ হয় য P=NP তাহেল ছাট নীল সােকলটা আর দরকার হেব, হলুদ
সােকেল P=NP িলেখ দয়া যােব। NP-hard ক াটাগিরর যসব বেলম
পিলনিময়াল টাইেম ভিরফাই করা যায় স েলা NP ক াটাগিরেত, বািক েলা বাইের।
নীল অংেশর বেলম েলা েটা ক াটাগিরেত কমন, স েলার নাম িক?

NP complete: একটা বেলম NP-complete হেব কবল যিদ বেলমটা


NP-hard হয় এবং সটা NP ক াটাগরীেতও পেড়। NP complete
বেলমেক পিলনিময়াল টাইেম অন যেকােনা NP বেলেম কনভাট করা যায় এবং
এই বেলেমর সািটিফেকটেক পিলনিময়াল টাইেম ভিরফাইও করা যায়।

একটা বেলম NP-hard মাণ করেত হেল আমােদর সটােক পিরিচত কােনা NP-
complete বেলমেক সই বেলেম কনভাট করেত হেব। যমন লংেগ পাথ
বেলেম বলা হেয়েছ ােফ সবেথেক ল া পাথ বর করেত হেব যন কােনা নাড সই
পােথ ইবার না থােক। হ ািম িনয়ান পাথ একটা পিরিচত NP-complete
বেলম, ােফ যিদ হ ািম িনয়ান পাথ থােক তাহেল সবেথেক ল া পােথ n – 1 টা এজ
থাকেব কারণ n টা নাড একবার কের িভিজট করেত হেব। হ ািম ন বেলমেক আমরা একটু
িভ ভােব বলেত পাির “একটা ােফ িক এমন কােনা পাথ থাকা স ব যটায় k টা এজ
আেছ?”, k=n-1 এর জন বেলমটা সলভ করেত পারেল হ ািম ন পােথর বেলম সলভ
হেয় যােব। এবং এই বেলমটা সলভ করেত পারেল k এর িবিভ মােনর জন সলভ কের
সবেথেক ল া পাথও বর করেত পারেবা! তাহেল দখা যাে হ ািম ন পাথ বেলমেক একটু
িভ ভােব বণনা কের আমরা লংেগ পাথ বেলেম কনভাট করলাম। যেহতু হ ািম ন
পােথর পিলনিময়াল সিলউশন আমরা জািননা, লংেগ পােথরও জািননা।

এবার হয়েতা তুিম বুঝেত পারেছা একটা মা বেলম পিলনিময়াল টাইেম সলভ করেত পারেল
কন সব েলা করা যােব।

িডিসশান বেলম হেলা স েলা য েলােক yes/no িদেয় উ র দয়া যায়। যমন A থেক B ত িক 10 সেকে পৗছােনা স ব? অপিটমাইেজশন বেলম অ া ারেক
িমিনমাইজ বা ম াি মাইজ কের। যমন A থেক B ত সব থেক কম কত সেকে পৗছােনা স ব। উপেরর ক াটাগির েলা বেলেমর িডিসশান ভাসন িনেয় কাজ কের।
যেকােনা অপিটমাইেজশন বেলমেকই একটু িভ ভােব বণনা কের িডিসশান বেলম বািনেয় ফলা যায় যটা আমরা উপের হ ািম ন পােথর ে কেরিছ।

এখন হেলা থম np-complete বেলমটা িক? থম একটা np-complete বেলম না থাকেল আমরা অন বেলমেক np-complete বা hard
ক াটাগিরেত ফলেত পারিছনা যেহতু আমরা এটা করিছ বেলমেক কনভাট কের। ধরা যাক তামার কােছ িকছু বুিলয়ান ভ ািরেয়বল আেছ x,y,z ইত ািদ। তুিম িকছু শত
িদেল এরকম: “X সিত হেল Y িমথ া”, “Z এবং X ইটাই িমথ া” ইত ািদ। এখন তামােক x,y,z এ true/false ভ ালু অ াসাইন করেত হেব যন সব িরেলশন সিত
হয়। এটােক বলা হয় বুিলয়ান স ািটসফাইিবিলিট বেলম বা সংে েপ স াট বেলম। িরেলশেন ২িট ভ ািরেয়বল থাকেল ২-স াট বেলম, ৩িট থাকেল ৩-স াট, যমন “X
এবং Y িমথ া হেল Z সত ” এরকম িরেলশন থাকেল সটা ৩-স াট, জনােরলাইজ কের বলা হয় k-sat। ২-স াটেক পিলনিময়াল টাইেম সলভ করা যায়, k>2 হেল
পিলনিময়াল সিলউশন পাওয়া যায়না। NP ক াটাগিরর ফমাল ডিফেনশন ব বহার কের Cook–Levin মাণ কের k-sat একিট NP complete বেলম। এটাই
িছল থম মাণ। Cook পরবিতেত কি উটার সােয়ে র সেবা টুিরং পুর ার পান তার কােজর জন । k-sat বেলম যিদ তুিম পিলনিময়াল টাইেম সলভ করেত পােরা
চােখর িনেমেষ তুিম আইন াইন-িনউটন টাইেপর মানুেষর সমতুল হেয় যােব।

টুিরঙ এর একটা িবখ াত NP-hard বেলম হেলা হাি ং বেলম। “একটা কি উটার া াম দয়া হেলা, বলেত হেব এটা কখেনা শষ হেব নািক অসীম সময় ধের চলেত
থাকেব”। এটােক পিলনিময়াল টাইেম সলভ বা ভিরফাই িকছুই করা যায় না। িব ািরত জানেত আমার এই লখাটা পড় িক তার আেগ একটা কিমকস পিড়:

3/4
িনেচর ছিবেত িতটা ক াটগিরর িকছু বেলম দখােনা হেয়েছ:

া ািমং কনেটে ায়ই NP বেলম দখা যায় তেব সখােন ইনপুেটর সাইজ অেনক
কিমেয় দয়া হয় বা িবেশষ কােনা কি শন যাগ কের দয়া হয় যােত ব াক ািকং কের
৩-১০ সেকে র মােঝ সলভ করা স ব হয়। অেনক িরেয়ল লাইফ সমস ার পিলনিময়াল
সিলউশন না থাকায় িব ানীরা চ া করেছন এ েপােন িসয়াল সিলউশনেকই যতটা স ব
উ ত করার। া এ বাউ টকিনেকর সাহােয ব াক ািকঙ এ সাচ স কিমেয়
মাটামুিট ত সিলউশন বর করা যায়। অেনক সময় িহউিরি ক এর সাহায নয়া হয়।
ােভিলং সলসম ান, াফ কালািরং ইত ািদ সলভ করার জন অেনক আ◌্ধুিনক
অ ালেগািরদম আেছ, এ েলা িনেয় এখেনা িরসাচ চলেছ, তামার আ হ থাকেল িকছু
িরসাচ পপার নািমেয় িনেজই পড়ােলখা করেত পােরা।

রফাের :

http://www.quora.com/What-are-P-NP-NP-complete-and-
NP-hard

http://stackoverflow.com/questions/1857244/np-vs-np-
complete-vs-np-hard-what-does-it-all-mean

http://en.wikipedia.org/wiki/P_versus_NP_problem

Introduction to Algorithms by Coreman

http://en.wikipedia.org/wiki/Hamiltonian_path_problem

http://www.princeton.edu/~achaney/tmve/wiki100k/docs/Non-deterministic_Turing_machine.html

http://plato.stanford.edu/entries/turing-machine/#Computability

তানভী ল ইসলাম ক ধন বাদ নন-িডটারিমিনি ক এর ব াপারটা আমােক বুিঝেয় বলার জন ।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
হাি ং বেলম
shafaetsplanet.com /planetcoding/

শাফােয়ত সে র ২৭,
২০১৬

গিণত বা কি উটার িব ােনর সব সমস াই িক সমাধানেযাগ ? আমরা জািন NP ক াটাগিরর সমস া েলােক পিলেনািময়াল সমেয় সমাধান করার স ব নািক সটা জানা এখন
পয স ব হয় িন, িক ইনপুেটর আকার যেথ ছাট হেল অথবা তামার হােত অসীম সময় এবং মমির থাকেল NP সমস াও এ েপােননিশয়াল সমেয় সমাধান করা স ব।
িক এমন িকছু সমস া আেছ যটা তামার হােত যত বড় সুপার কি উটারই থাকুক সমাধান করা স ব না। এখােন আিম ধের িনি আমােদর কি উটার েলা টুিরং মিশন
কি উেটবল। (টুিরং মিশন িক মেন না থাকেল আেগ আমার এই লখাটা পেড়া)

হাি ং বেলম (Halting Problem) এমনই একটা সমস া যার কােনা সমাধান নই। তামােক একটা কি উটার া াম এবং একটা ইনপুট দয়া হেলা। তামােক
বলেত হেব সই ইনপুেটর জন া ামটা িক সীিমত সমেয় থামেব নািক অসীম বা ইনিফিনিট লুেপ আটেক যােব?

Python

1 def my_program(x):
2 count = 0
3 while True:
4 if count == x:
5 break
6 count = count + 1

উপেরর কােড তুিম যিদ x=−10x=−10 ইনপুট দাও তাহেল া ামটা কখেনাই থামেব না ( কাডটা পাইথেন লখা, ইি জার ওভারে া এর ভয় নই)

তামার কাজ হেলা এমন একটা া াম লখা যটা যেকােনা আেরকটা া াম এবং ইনপুট দেখ বেল িদেত পারেব া ামটা ইনিফিনিট লুেপ আটেক যােব নািক। এটাই
হেলা হাি ং বেলম (Halting Problem)।

এখন আমরা “ ফ বাই কন ািডকশন” মথেডর সাহােয মাণ করেবা য হাি ং বেলম সমস ার সমাধান করা স ব না। আমরা থেম ধের িনেবা য সমস ািটর একটা
সমাধান আেছ এবং তারপর মাণ করেবা য সমাধানিট অি থাকা অস ব।

ধেরা আমােদর কােছ একটা া াম আেছ যটা হাি ং বেলম সমাধান করেত পাের। া ামটা হেত পাের এরকম:

1 will_it_halt(P, I)
2 if P(I) halts in finite time
3 return TRUE
4 else
5 return FALSE
6

এটা একটা কা িনক কাড। কাডটার প ারািমটার হেলা একটা া াম P এবং P ক প ারািমটার িহসােব পাঠােনা হেব এমন একটা ইনপুট I। কাডটা কান উপােয় বেল
িদেত পাের P া ােম I ইনপুট পাঠােনা হেল সটা সীিমত সমেয় থামেব নািক থামেব না।

এ ধরেণর কাডেক বলা হয় Oracle Machine। Oracle এর আ িরক অথ হেলা একজন ওঝা য আধ াি ক মতা িদেয় সমস া সমাধান করেত পাের। আমােদর
will_it_halt কাডও জা কির মতা িদেয় হাি ং বেলম সমাধান করেত পাের। এখন আমরা যিদ মাণ করেত পাির এমন কােনা Oracle Machine থাকা স ব না
যটা িদেয় হাি ং বেলম সমাধান করা যায় তাহেলই আমােদর কাজ শষ।

এখন আমরা আেরকটা া াম িলখেবা, মেন কেরা া ামটার নাম প ারাড (Paradox)।

1/3
1 paradox(program)
2 will_it_halt(program, program)
3 Run Forever
4 else
5 return TRUE
6

প ারাড ইনপুট িহসােব একটা া ামেক হণ কের। একটা া াম হেলা িকছু ি ং িদেয় লখা িকছু ইন াকশন। তাই আমরা চাইেল প ারািমটার িহসােব প ারাড
া ামটােকই পাঠােত পাির!

1 paradox(paradox)

এখন ি তীয় লাইেন আমরা ওরাকল মিশনেক িজে স করিছ প ারাড া ােম ইনপুট িহসােব প ারাড া ামটােকই পাঠােল সটা ইনিফিনিট লুেপ আটেক যােব নািক যােব
না। যিদ ওরাকল বেল য ইনিফিনিট লুেপ আটেক যােব না, তাহেল আমরা ৩য় লাইেন সটােক ইনিফিনিট লুেপ আটেক িদেবা! আর ওরাকল যিদ বেল য ইনিফিনিট লুেপ
আটেক যােব তাহেল আমরা া াম থেক বর হেয় যােবা। তারমােন ওরাকল যা বলেছ সটা সিত না, বরং তার উ াটা ঘটেছ। এটাই হেলা ক ািডকশন, এ থেক আমরা
বলেত পাির will_it_halt নামক ওরাকল মিশনটার অি থাকা স ব না!

এটাই হেলা হাি ং বেলম যা সমাধানেযাগ না সটার মাণ।

মাবাইেল িকছু িকছু অ াপ চালু করেল কােনা একটা বােগর জন ীন ি জ হেয় যায়, তখন ফােনর ব াটাির খুেল ির াট করা ছাড়া উপায় থােক না। এমন কােনা অ াপ িক
তুিম িলখেত পারেব যটা বেল িদেত পারেব কান অ াপ চালােল ীণ ি জ হেয় যেত পাের? এটা হাি ং বেলেমরই একটা ভ ািরেয়শন যা এই লখাটায় সু র কের ব াখ া
করা আেছ, আ হ থাকেল পড়েত পােরা।

হাি ং বেলম যিদ সমাধানেযাগ হেতা তাহেল িক হত? তাহেল কাড িডবািগং করা অেনক সহজ হেয় যেত, কাড চালু না কেরই আমরা বলেত পারতাম কাডটা ইনিফিনিট
লুেপ পড়েব নািক। এর থেকও পূ ণ ব াপার হেলা, অেনক গািণিতক সমস া সমাধান করা যত এই will_it_halt া ামটা িদেয়। একটা উদাহরণ দই। গা বাখ
নামক একজন গিণতিবদ ব বছর আেগ বেল গেছন “২ এর থেক বড় য কান জাড় সংখ ােক িট াইম সংখ ার যাগফল িহসােব লখা স ব”। কও এখেনা মাণ করেত
পাের িন য কনেজকচারটা সত নািক িমথ া। এখন আিম একটা া াম িলখলাম মাণ করার জন :

Python

1 def goldbach():
2 k=4
3 while True:
4 ok = False
5 for p1 in range(k):
6 for p2 in range(k):
7 if(prime(p1) && prime(p2) && p1+p2==k):
8 ok = True
9 if not ok:
10 exit()
11 k += 2

এই া ামটা k=4 থেক কের িতিট জাড় সংখ ােক ট ফােসর মাধ েম িট াইম সংখ ার যাগফল িহসােব লখার চ া করেবা। যিদ কােনা k এর জন ok =
false হয় তাহেল মাণ হেব য কনেজকচারটা িমথ া, তখন া ামটা ব হেয় যােব। আর যিদ কনেজকচারটা সিত হয় তাহেল অসীম সময় ধের া ামটা চলেত থাকেব।
will_it_halt া ামটার অি থাকেল এখন will_it_halt(goldback, null) এর আউটপুট দেখই বেল িদেত পারতাম কনেজকচারিট সত নািক িমথ া!

তুিম যিদ এমন একটা গািণিতক মেডল বর করেত পােরা যা হাি ং বেলমেক সমাধান করেত পাের তাহেল আমরা আমরা একটা হাইপার কি উেটশন বা super-Turing
computation মেডল পােবা, তখন আমরা এমন সব সমস া সমাধান করেত পারেবা যা টুিরং মিশন িদেয় সমাধান করা স ব না।

হাি ং বেলম অেনক দাশিনক ে রও জ িদেয়েছ। যমন আমরা িক কখেনা িনেজর মি স েক ১০০% জানেত পারেবা? নািক কােনা িথওিরিটকাল সীমাব তার
কারেণ মি ে র অেনক রহস আমরা কােনা জানেত পারেবা না?

আজ এখােনই শষ, হ ািপ কািডং!

2/3
রফাের

http://www.cgl.uwaterloo.ca/csk/halt/
https://www.quora.com/If-the-halting-problem-was-solvable-what-would-be-the-implications

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
বাইনাির সাচ – ১
shafaetsplanet.com /planetcoding/

শাফােয়ত জুনe ৭,
২০১৫

তুিম িন য়ই ল কেরেছা িডকশনািরেত লাখ লাখ শ থাকেলও েয়াজনীয় শ টা খুেজ পেত কখেনা খুব বিশ সময় লােগ না। এটার কারণ হেলা শ েলা অ র অনুযায়ী
সাজােনা থােক। তাই তুিম যিদ dynamite শ টা িডকশনািরেত খাজার চ া কেরা এবং এেলােমেলাভােব কােনা একটা পাতা খুেল kite শ টা খুেজ পাও তাহেল তুিম
িনি ত হেয় যেত পােরা য তুিম য শ টা খাজার চ া করেছা সটা বাম িদেক কাথাও আেছ। আবার যিদ তুিম dear শ টা খুেজ পাও তখন তুিম আর বাম িদেকর
পাতা েলায় খাজার চ া করেব না। এভােব অ সমেয়র মেধ িডকশনািরেত যেকােনা শ খুেজ পাওয়া যায়।

বাইনাির সাচ হেলা অেনকটা এরকম একটা প িত যটা ব বহার কের একটা অ াের থেক কােনা একটা তথ খুেজ বর করা যায়।

ধেরা তামার কােছ একটা অ ােরেত অেনক েলা সংখ া আেছ এরকম:

100,2,10,50,20,500,100,150,200,1000,100100,2,10,50,20,500,100,150,200,1000,100

সংখ া েলা এেলােমেলাভােব সাজােনা থাকায় এখান থেক একটা িনিদ সংখ া খুেজ পাওয়া সহজ না। তুিম যিদ অ াের থেক ৫০০ সংখ াটা খুজেত চাও তাহেল সব েলা
ইনেড ই পরী া কের দখেত হেব, এটােক বলা হয় িলিনয়ার সাচ। অ ােরর আকার যিদ nn হয় তাহেল িলিনয়ার সােচর টাইম কমে ি িট হেলা O(n)O(n)।

িক যিদ সংখ া েলা িনেচর মত সাজােনা থােক তাহেল খুেজ পাওয়া অেনক সহজ হেয় যায়:

2,10,20,50,100,100,100,150,200,500,10002,10,20,50,100,100,100,150,200,500,1000

এখন যিদ ১৫০ সংখ াটা খুেজ বর করেত হয় তাহেল আমরা থেম িঠক মােঝর ইনেড টা পরী া করেবা। থম ইনেড ০ এবং শেষর ইনেড ১০ হেল মােঝর ইনেড টা
হেলা (০+১০)/২ বা ৫ তম ইনেড ।

$2, 10, 20, 50, 100, 100, 100, 150, 200, 500, 1000

মােঝর ইনেডে র সংখ াটা ১০০ যা ১৫০ এর থেক ছাট, আমরা জেন গলাম য সংখ াটা ডান পােশ কাথাও আেছ, বােমর অংশ আমােদর আর দরকার নাই।

100, 150, 200, 500, 1000

এখন বািক অংশটা িনেয় আবােরা একই কাজ করেবা। এবার মােঝর ইনেডে র সংখ াটা হেলা ২০০ যটা ১৫০ এর থেক বড়। তারমােন ডােনর অংশটা আমরা ফেল িদেত
পাির।

100, 150

এবার মােঝর সংখ াটা হেলা ১০০ যা ১৫০ এর থেক ছাট। আবােরা বােমর অংশ ফেল িদেবা, থাকেব ধু:

150

1/4
এবার মােঝর ইনেডে র সংখ াটা হেলা ১৫০। তারমােন কাি ত সংখ াটােক খুেজ পাওয়া গেছ।

বাইনাির সােচ িতবার অ ােরর িঠক অেধক অংশ আমরা বািতল কের িদি এবং বািক অেধক অংেশ খুজিছ। একটা সংখ া nn ক সেবা কয়বার ২ িদেয় ভাগ করা যায়
যত ণ না সংখ াটা ১ হেয় যাে ? উ র হেলা log2nlog2n। তাই বাইনাির সােচ সেবা log2(n)log2(n) সংখ ক ধােপর পর আমরা দরকাির সংখ াটা খুেজ পােবা,
কমে ি িট O(log2n)O(log2n)।

িক একটা সমস া হেলা বাইনাির সাচ করার আেগ অবশ ই সংখ া েলােক ছাট থেক বড় বা বড় থেক ছাট সািজেয় িনেত হেব, এই ি য়াটােক বলা হয় সিটং। তুিম যতই
চ া কর না কন একটা অ াের O(n×log2n)O(n×log2n) এর কম কমে ি িট সট করেত পারেব না।* তাহেল কও বলেত পাের য সট করেত য সময় লাগেছ তার
থেক অেনক কম সমেয় িলিনয়ার সাচ কেরই আমরা সংখ াটা খুেজ পেত পাির, বাইনাির সাচ কন করেবা? তামার যিদ একটা অ ােরেত মা ১ বার সাচ করা দরকার হয়
তাহেল ক কের সট কের বাইনাির সাচ করার থেক িলিনয়ার সাচ করা অেনক ভােলা। িক যিদ এমন হয় একটা অ ােরেত অেনকবার সাচ করা দরকার হেব? যমন একটা
িডকশনািরেত িবিভ সময় িবিভ শ খাজা দরকার হয়, সে ে সট কের রাখাই বুি মােনর কাজ।

িনেচর পাইথন কােড বাইনাির সােচর ইমি েমে শন দখােনা হেয়েছ:

Python

1 def search(array, key):


2 begin=0
3 end=len(array)-1
4 index=None
5 while begin<=end:
6 mid=(begin+end)/2
7 if key == array[mid]:
8 index=mid #The value is found, save the index.
9 break
10 elif key > array[mid]: begin=mid+1 #Search the right portion
11 elif key < array[mid]: end=mid-1 #Search the left portion
12 return index #If the number is not found, index will contain None.
13
14
15 info=[100,2,10,50,20,500,100,150,200,1000,100]
16 info=sorted(info)
17 while True:
18 key = int(raw_input())
19 print search(info,key)

উপেরর কােড যিদ আমরা ১০০ ইনপুট দই তাহেল ৫ িরটান করেব, কারণ অ ােরটা সট করার পর ৫ ন র ইনেডে ১০০ আেছ। িক সেটড অ ােরর িদেক তাকােল আমরা
দখিছ য ৪,৫,৬ এই সব েলা ইনেডে ই ১০০ আেছ। আমরা যিদ চাই কােনা সংখ া একািধকবার থাকেল সবেথেক বােমর ইনেড টা িরটান করেত, তাহেল কাডটা
িকভােব পিরবতন করেত হেব? সে ে বাইনাির সাচ ফাংশনটা হেব এরকম:

Python

1 def search(array, key):


2 begin=0
3 end=len(array)-1
4 index=None
5 while begin<=end:
6 mid=(begin+end)/2
7 if key == array[mid]:
8 index=mid #One occurance of the value is found, save the index
9 end=mid-1 #Continue searching the left portion after one occurrence is found
10 elif key > array[mid]: begin=mid+1
11 elif key < array[mid]: end=mid-1
12 return index #Index will contain None if the value is not found
2/4
ধুমা ১টা মা লাইন পিরবতন করা হেয়েছ, এবার কােনা সংখ া খুেজ পাবার পর খাজা ব না কের বােমর বািক অংশটুকুেত খুজেত থাকেবা।

লায়ার বাউ : তামােক একটা সেটড অ াের দয়া আেছ। তুিম নতুন একটা সংখ া XX সই অ ােরেত ঢুকােত চাও। লায়ার বাউ হেলা সবেথেক বােমর ইনেড যখােন
তুিম সংখ াটা ঢুিকেয় বািক সংখ া েলােক একঘর ডােন সরােল অ ােরটা তখেনা সেটড থাকেব। মেন কেরা অ ােরটা এরকম:

10 20 20 30 30 40 50

তাহেল 20 এর লায়ার বাউ হেলা ইনেড ১ (০ বসড ইনেড ), কারণ ১ ন র ইনেডে তুিম ২০ সংখ াটােক বিসেয় বািক সংখ া েলােক ডােন সিরেয় দয়ার পেরও
অ ােরটা সেটড থেক যাে । িঠক সরকম ২৫ এর জন লায়ার বাউ হেলা ইনেড ৩।
সহজ কথায় সবেথেক বােমর য ইনেডে X এর সমান বা বড় কােনা সংখ া আেছ সই ইনেড টাই হেলা লায়ার বাউ । XX যিদ অ ােরর িতটা সংখ ার থেক বড় হয়
তাহেল সবেশষ ইনেডে র পরবতী ইনেড টা অথাৎ nn তম ইনেড টা হেলা লায়ার বাউ যখােন nn হেলা অ ােরর আকার।

িনেচর কােড বাইনাির সাচ কের লায়ার ইনেড খুেজ বর করা হেয়েছ, তারপর সই ইনেডে নতুন সংখ াটা বিসেয় দয়া হেয়েছ।

Python

1 def searchLowerBound(array, key):


2 begin=0
3 end=len(array)-1
4 index=-1
5 while begin<=end:
6 mid=(begin+end)/2
7 if key == array[mid]:
8 index=mid
9 end=mid-1
10 elif key > array[mid]: begin=mid+1
11 elif key < array[mid]: end=mid-1
12 return begin
13
14
15 info=[100,2,10,50,20,500,100,150,200,1000,100]
16 info=sorted(info)
17 print info
18 while True:
19 X = int(raw_input())
20 lowerbound=searchLowerBound(info,X)
21 info.insert(lowerbound,X)
22 print "New array: ",info
23

(অ ােরেত এভােব সংখ া ইনসাট করেত O(n)O(n) সময় লােগ। অ ােরর জায়গায় িলংক িল ব বহার কের O(1)O(1) সমেয় ইনসাট করা যায় িক সে ে বাইনাির
সাচ করা স ব না কারণ িলংক িলে যেকােনা ইনেড র ম এে স করা যায় না, পেয় ার ধের আগােত হয়। একটা উপায় হেত পাের বাইনাির সাচ ি আকাের তথ েলা
সািজেয় রাখা, সটা আমরা এই লখায় দখেবা না, তুিম চাইেল িনেজ িশেখ িনেত পােরা।)

আপার বাউ : আপার বাউ হেলা সব থেক ডােনর ইনেড যখােন তুিম নতুন সংখ াটা ঢুকােল অ ােরটা সেটড থাকেব। তারমােন সবেথেক বােমর য ইনেডে X এর বড়
কােনা সংখ া আেছ সই ইনেড টাই হেলা আপার বাউ । উপেরর উদাহরণটায় ২০ এর আপার বাউ হেলা ইনেড ৩। আপার বাউ বর করার কাডটা তামার বািড়র
কাজ িহসােব থাকেলা!

থম পব এখােনই শষ। পেরর পেব বাইেসকশন মথড িনেয় আেলাচনা করেবা।

াকিটেসর জন বেলম:

https://uva.onlinejudge.org/index.php?
option=onlinejudge&Itemid=8&page=show_problem&problem=1552http://www.lightoj.com/volume_showproblem.ph
3/4
p?problem=1088

হ ািপ কািডং!

* কাউি ং সট বা রিড সট ব বহার কের O(n)O(n) এ সিটং করা যায় তেব স েলা কাজ কের িবেশষ ধরেণর িকছু ইনপুেটর ে । ইনপুট িক ধরেণর হেব সটার উপর
কােনা শত না থাকেল O(log2n)O(log2n) এর কেম সিটং করা স ব না সটা গািণিতকভােব মাণ করা যায়।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
বাইনাির সাচ – ২
shafaetsplanet.com /planetcoding/

শাফােয়ত আগ ১৭, ২০১৫

আেগর লখায় আমরা বাইনাির সাচ িকভােব কাজ কের দেখিছ। এখন একই প িত ব বহার কের আমরা অন রকম িকছু সমস া সমাধান করেবা। আমরা এখন যটা িশখেবা
সটা বাইেসকশন মথড নােমই বিশ পিরিচত।

সহজ একটা সমস া সমাধান করেত করেত আমরা বাইেসকশন িকভােব কাজ কের দখেবা। মেন কেরা তুিম য ভাষা ব বহার কের া ািমং করছ সখােন বগমূল বর করার
জন কােনা ফাংশন নাই, তামােক িনেজ ফাংশন িলেখ িনেত হেব। আমরা mysqrt(X) নােমর একটা ফাংশন িলখেবা যখােন X সংখ াটা পাঠােল সংখ াটার বগমূল িরটান
করেব, X সংখ াটা দশিমকযু হেত পাের, তেব শূ েণ র কম হেব না।

আমরা জিটল কােনা গািণিতক িহসােব যােবা না বগমূল বর করার জন , আমরা বাইনাির সাচ কেরই বগমূল বর কের ফলেবা!

একটু মেন কির আমরা একটা ছাট থেক বড় সাজােনা অ ােরেত কােনা সংখ া খুেজ বর করার সময় িক করিছলাম। মাঝখােনর সংখ াটা যিদ বিশ বড় হয় তাহেল ডােনর
অংশ বাদ িদেয় িদি লাম, বিশ ছােটা হেল বােমর অংশটা বাদ িদেয় িদি লাম।

বগমূল বর করার সময় আমরা জািন য X এর বগমূল অবশ ই ০ থেক X এর মেধ র একটা সংখ া হেব। ধেরা X=১৫। আমরা থেম িঠক মােঝর সংখ াটা িনেবা।
এে ে মােঝর সংখ া হেলা ৭.৫ যােক আবার বগ করেল পাওয়া যায় ৫৬.২৫ যা ১৫ এর থেক অেনক বড়। তারমােন ৭.৫ থেক ১৫ পয বািক সব সংখ ার বগই ১৫ এর
থেক বড়, এই অংশটা আমরা বাদ িদেয় িদেত পাির।

এখন তাহেল আমরা আবার ০ থেক ৭.৫ এর মেধ খুজেবা। মােঝর সংখ াটা হেলা ৩.৭৫ যােক বগ করেল পাই ১৪.০৬২৫ যা ১৫ থেক ছােটা। তারমােন ০ থেক ৩.৭৫
পয অংেশ বগমূল পাবার কােনা স াবনা নই। এখন আবার ৩.৭৫ থেক ৭.৫ এর মােঝ খুজেবা।

পুেরা িসমুেলশনটা হােতকলেম করিছ না, আশা কির তুিম বুঝেত পারেছা য বগমূল না পাওয়া পয আমরা এভােবই খুজেত থাকেবা। িনেচর কাডটা দেখা:

Python

1 def mysqrt(X):
2 low=0.0
3 high=X
4 while high-low>.0001:
5 mid=(low+high)/2
6 print low, high, mid, mid*mid
7 if mid*mid>X:
8 high=mid
9 else:
10 low=mid
11
12 print mid,mid*mid
13 return mid
14
15 mysqrt(15)

এই কাডটা চালােল দখেব বগমূল আসেছ 3.87296676636 যােক আবার বগ করেল পাওয়া যায় 14.9998715733। বুঝেতই পারেছা দশিমক সংখ ার ি িসশেনর
সমস ার কারেণ একদম সিঠক উ র পাওয়া যায় িন, কাছাকািছ একটা উ র পাওয়া িগেয়েছ। ৪ন র লাইনটা খুব পূ ণ, এখােন আমরা িঠক করিছ কত ণ আমরা খাজা
চািলেয় যােবা, যত বিশ ণ খুজেবা সিঠক উ েরর তত কাছাকািছ পৗছােত পারেবা। এখােন আমরা high এবং low এর পাথক যত ণ না খুব ছাট হেয় যাে তত ন
খুজেতিস। তুিম .0001 এর জায়গায় আেরা কােনা ছােটা সংখ া বসােল দখেব আেগর থেক ভােলা ফলাফল পাে া। যমন .000000001 ব বহার করেল বগমূল
পােব 3.87298334594 যােক আবার বগ করেল পাওয়া যায় 14.9999999979।

তুিম চাইেল িনিদ কের বেল িদেত পােরা বাইেসকশন কয়টা ধাপ পয চলেব। তখন কাডটা হেব এরকম:

1/4
Python

1 def mysqrt(X):
2 low=0.0
3 high=X
4 for step in range(64):
5 mid=(low+high)/2
6 print low, high, mid, mid*mid
7 if mid*mid>X:
8 high=mid
9 else:
10 low=mid
11 print mid,mid*mid
12 return mid
13 mysqrt(15)
14 x
15

এবার আমরা high, low এর পাথেক র কথা িচ া না কেরই ৬৪ বার সাচ কেরিছ। একটা সংখ ােক ৬৪ বার ২িদেয় ভাগ করা মােন সংখ াটােক চ রকম ছােটা কের ফলা,
তাই তুিম এভােব সিঠক উ েরর খুব কােছ পৗেছ যােব। তুিম চাইেল ৬৪ বােরর জায়গায় ১০০ বা ২০০ বারও ভাগ করেত পােরা আেরা ভােলা ফলাফেলর জন , তেব সে ে
কােডর রানটাইমও বেড় যােব। ধাপসংখ া িনধারণ করার সময় high-lowদ এর মান কত বড় এবং একই সােথ বেলেমর টাইমিলিমেটর িদেক ল রাখা উিচত।

বাইেসকশন ব বহার কের জ ািমিতর অেনক সমস া সমাধান করা যায়। ধেরা তামােক িনেচর মত একটা ি ভুজ দয়া আেছ:

AB, AC আর BC এর দঘ তামােক দয়া আেছ, আর বলা আেছ য DE আর BC


সমা রাল। এছাড়া ADE ি ভুজ এবং BDEC ািপিজয়ােমর ফেলর অনুপাত R ও
তামােক দয়া আেছ। তামােক বলেত হেব AD এর দঘ কত?

এটা আমরা সহেজই বাইেসকশন িদেয় সমাধান করেত পাির। তুিম অনুমান কের নাও য AD এর
দঘ হেলা x। এখন AD এর দঘ জানেল তুিম ু েল পড়া ি ভুেজর অনুপােতর িনয়ম
(AD/AB=AE/AC=DE/BC) িদেয় সহেজই AE, EC, DE বর কের ফলেত পারেব।
এখন তুিম বা র দঘ িদেয় ADE এবং BDEC এর ফলও সহেজ বর করেত পারেব।
ফল জানার পর অনুপাত বর কের ফল। যিদ দখ য তুিম য অনুপাতটা পেয়েছা সটা R
এর থেক ছােটা তারমােন তুিম AD এর য দঘ x অনুমান কেরিছেল সটা আসল দঘ থেক
ছােটা। তাহেল তুিম x থেক high পয রে আবার খুজেত থােকা। আর যিদ দেখা য
তামার পাওয়া অনুপাতটা R এর থেক বড় তাহেল 0 থেক x পয রে খুজেত থােকা। high
এর মান েত কত হেব সটা িচ া কের বর করার কাজ তামার :)।

বাইেসকশন কখন কাজ করেব কখন করেব না এটা বুঝেত পারা খুবই পূ ণ। বগমূল বর করা শখার পর তুিম হয়েতা মেন করেল sin(x)+5*log10(x)=5.27
ইকুেয়শনটার সমাধান বাইেসকশন িদেয় করেব। তুিম অনুমান করেল x=50, তাহেল sin(50)+5*log10(50)=9.26। এখন িক তুিম িনি ত ভােব বলেত পােরা য
উ র ৫০ এর বােম আেছ? পারেব না, কারণ x এর মান কমেল sin(x)+5*log10(x) এর মান বাড়েতও পাের, কমেতও পাের। x এর িবিভ মােনর জন গেল াফটা
ট করেল তুিম এরকম পােব:

2/4
এই ইকুেয়শেনর ে তুিম একটা রে র মাঝখােনর মান টা িনেয় িকছু িহসাব-িনকাশ কের বাম বা ডান িদেক অংশ বািতল কের িদেত পােরা না, কারণ তামার জানার উপায়
নাই কানিদেক তামার উ রটা আেছ। বগমূলব করার সময় ইকুেয়শনটা িছল x^2, সটােক ট করেল পাওয়া যায় এরকম:

এে ে বাইেসকশন কাজ কেরেছ কারণ তুিম সহেজই বাম বা ডােনর অংশ ফেল িদেত পেরেছা।

বেলম সলভ করার সময় ট বর করা কােনা দরকার নই, এটা ধু মা তামােক বুঝােত দিখেয়িছ। তুিম িনি ত হেত পােরা য মাঝখােনর মানটা দেখ কােনা একটা
অংশ বািতল কের দয়া যােব ধুমা তখনই বাইেসকশন কাজ করেব। যমন log(x)+x^2=y এই ইকুেয়শন বাইেসকশন িদেয় সমাধান করেত পারেব কারণ x এর মান
বাড়ার সােথ সােথ y সবসময় বাড়েব, িক tan(x)+x^2=y এটা বাইেসকশন িদেয় সমাধান করেত পারেব না।

এবার বাইেসকশন িদেয় একটা ােফর বেলম সমাধান কির। তামােক একটা াফ দয়া আেছ এরকম:
3/4
িতিট এজ এেককটা রা া যার একটা কের ওেয়ট আেছ। এখন তুিম A থেক G ত যেত চাও
এমন ভােব যন সই পেথ সেবা ওেয়ট এর মান যতটা স ব কম হয়। যমন A->D->F-
>G পেথ সেবা ওেয়ট ১১, আবার A->B->E->G পেথ সেবা ওেয়ট ৯।

এটা সহেজই বাইেসকশন িদেয় সমাধান করা স ব। এে ে েত high=15 কারণ কােনা


এেজর ওেয়ট ১৫ এর থেক বিশ না, low=০ আর mid=৭। এখন তুিম ৭ এর বড় সব েলা
এজেক াফ থেক বাদ িদেয় দাও আর দেখা য A থেক G ত যাওয়ার কােনা রা া আেছ
নািক। যিদ না থােক তাহেল ৭ এর বােম উ র থাকা স ব না, বােমর অংশ বািতল কের আবার
খুজেত থােকা। এে ে বাইেসকশন কাজ করেব কারণ মােঝর মান টা দেখ তুিম বাম বা ডােনর
অংশ বািতল কের িদেত পারেছা। (এই সমস াটা বাইেসকশেনর বদেল ডায়া া অ ালেগািরদমেক
িকছুটা পিরবতন কেরও সমাধান করা স ব।)

অনুশীলেনর জন সমস া:

http://www.lightoj.com/volume_showproblem.php?problem=1043

http://www.lightoj.com/volume_showproblem.php?problem=1076

https://uva.onlinejudge.org/index.php?
option=com_onlinejudge&Itemid=35&category=116&page=show_problem&problem=989

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
েয়েডর সাইেকল ফাইি ং অ ালেগািরদম
shafaetsplanet.com /planetcoding/

শাফােয়ত আগ ১৩,
২০১৬

তামােক একটা িলংকড িল দয়া আেছ, বলেত হেব িলংকড িলে কােনা সাইেকল আেছ নািক। এটা খুবই কমন একটা ই ারিভউ , আমরা েয়েডর সাইেকল
ফাইি ং অ ালেগািরদম িদেয় এই সমস াটা সমাধান করা িশখেবা।

ছিবর িলংকড িলে দখা যাে ৭ দেঘ র একটা সাইেকল আেছ।

সাইেকল িডেট করার সবেথেক সহজ উপায় হেলা িডকশনাির বা হ াশম াপ ব বহার করা।
থম নাড থেক এক এক ঘর আগােত হেব এবং িতটা নাডেক িডকশনািরেত সভ কের
রাখেত হেব। যিদ কােনা নােড িগেয় দখা যায় নাডটা আেগ থেকই িডকশনািরেত আেছ
তাহেল বুঝেত হেব িলংকড িল টা সাইি ক। এই অ ালেগািরদেমর টাইম কমে ি িট আর
মমির কমে ি িট ইটাই O(n)O(n)।

মমির কমে ি িট O(1)O(1) এ নািমেয় আনা স ব েয়েডর অ ালেগািরদম ব বহার


কের। এই অ ালেগািরদমটােক অেনেক “খরেগাশ-ক প অ ালেগািরদম” বেল।

মেন কেরা আমােদর িট পেয় ার আেছ, একটার নাম ক প পেয় ার যটােক আমরা TT
(Tortoise) িদেয় িচি ত করেবা, আেরকটার নাম খরেগাশ পেয় ার যটােক আমরা HH (Hare) িদেয় িচি ত করেবা। েত ইটা পেয় ারই িলংকড িলে র ট
নাড এ থাকেব।

িত সেকে খরেগাশ আগােব ইঘর িক ক প আগােব মা এক ঘর। তাহেল ১


সেক পের পেয় ার েটার পিজশন হেব এরকম:

আেরা ১ সেক পের TT থাকেব 1212 ন র নােড, HH থাকেব 9090 ন র


নােড। এভােব কেয়ক ধাপ হােত-কলেম িসমুেলট করেল দখেব ইিট পেয় ারই
2828 ন র নােড িমিলত হেয়েছ।

িট পেয় ার একই নােড িমিলত হওয়ার মােন হেলা িলংকড-িলে অবশ ই সাইেকল
আেছ। সাইেকল না থাকেল HH পেয় ারিট সামেন আগােত আগােত িলংকড িলে র
শষ মাথায় চেল যত।

এখন িকভােব আমরা সাইেকেলর থম নাডটা খুেজ বর করেবা?

1/4
মেন কেরা,

m=m= ট নাড থেক সাইেকেলর থম নােডর দূর


k=k=সাইেকেলর থম নাড থেক খরেগাশ ও ক েপর িমিটং পেয়ে র দূর
l=l=সাইেকেলর দঘ

এখন যিদ ক প মাট cTcT বার সাইেকেল চ র খেয় খরেগােশর সােথ িমিলত হয় তাহেল ক েপর অিত ম করা মাট দূর হেব:

DT=m+cT∗l+kDT=m+cT∗l+k

খরেগাশ যিদ cHcH বার সাইেকেল চ র খেয় ক েপর সােথ িমিলত হয় তাহেল খরেগােশর অিত ম করা মাট দূর হেব:

DH=m+cH∗l+kDH=m+cH∗l+k

যেহতু খরেগােশর গিত ক েপর ি ণ তাই আমরা বলেত পাির:

2∗(m+cT∗l+k)=m+cH∗l+k2∗(m+cT∗l+k)=m+cH∗l+k

এটােক একটু ঘুিরেয় লখা যায়:

m+k=(cH–2∗cT)∗lm+k=(cH–2∗cT)∗l

ll হেলা সাইেকেলর দঘ , তারমােন m+km+k হেলা সাইেকেলর দেঘ র একটা িণতক। আর সটার মােন হেলা যিদ তুিম সাইেকেলর থম নাড থেক m+km+k
দঘ অিত ম কেরা তাহেল তুিম আবার থম নােড িফের আসেব। এটা বাঝাই এই অ ালেগািরদেমর সবেথেক পূ ণ অংশ।
2/4
এখন যিদ তুিম িমিটং পেয় থেক mm ঘর সামেন যাও তাহেলই তুিম সাইেকেলর থম নােড আবার িফের আসেব, কারণ থম নাড থেক িমিটং পেয়ে র দূর kk।
িক তুিম mm বা kk কােরা মান ই জােনা না, তাহেল িকভােব mm ঘর সামেন যােব? সটার জন খুবই সহজ আর মজার একটা উপায় আেছ। তামার িন য়ই মেন
আেছ য ট নাড থেক সাইেকেলর থম নােডর দূর ও mm।

মেন কেরা খরেগাশ এখন আর নই, িক ট নাড এ নতুন একটা ক প পেয় ার T2T2 হািজর হেয়েছ, আর TT সই আেগর িমিটং পেয়ে ই আেছ। এখন িট
পেয় ারেকই এক ঘর কের আগােত থাকেল তারা যখােন িমিলত হেব সটাই সাইেকেলর থম নাড!

এটাই হেলা েয়েডর সাইেকল িডেটকশন অ ালেগািরদম। টাইম কমে ি িট এখনও O(n) ই আেছ ( কন ?) িক মমির কমে ি িট হেয় গেছ O(1)।

একিট িস++ কাড দিখ:

C++

3/4
1 /**
2 * Definition for singly-linked list.
3 * struct ListNode {
4 * int val;
5 * ListNode *next;
6 * ListNode(int x) : val(x), next(NULL) {}
7 * };
8 */
9 ListNode* Solution::detectCycle(ListNode* A) {
10 if(!A->next)return NULL;
11
12 ListNode *tortoise=A;
13 ListNode *hare=A;
14
15 //check if there is a cycle
16 while(hare){
17 if(hare->next and hare->next->next)
18 hare=hare->next->next;
19 else
20 return NULL; //no cycle
21 tortoise=tortoise->next;
22 if(hare==tortoise)break; //cycle exists
23 }
24
25 ListNode* tortoise2 = A;
26 while(tortoise2 != tortoise){
27 tortoise2 = tortoise2->next;
28 tortoise = tortoise->next;
29 }
30 return tortoise;
31 }

িলংকড িলে সাইেকল িডেট করা ছাড়াও এই অ ালেগািরদম অেনক কােজ লােগ। যমন কােনা গািণিতক ফাংশন বা pseudo-random না ার জনােরটেরর সাইেকল
িডেট করা।

অ ালেগািরদমটা তুিম বুেঝেছা নািক পরী া করেত uva 350 pseudo random numbers সমস াটা সমাধান করেত পােরা।

হ ািপ কািডং!

Now mobile friendly!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
ডাটা াকচার : িলংকড িল
shafaetsplanet.com /planetcoding/
শাফােয়ত জানুয়াির ৩০,
২০১৬

িলংকড িল বিসক একটা ডাটা াকচার। আমরা সাধারণত তথ রাখার জন অ াের ব বহার কির, তেব অ ােরর িকছু সীমাব তা আেছ য কারেণ অেনক সময় িলংকড িল
ব বহােরর দরকার হয়। িলংকড িল িনেয় জানেত হেল অবশ ই পেয় ার স েক ধারণা থাকেত হেব।

িলংক িলে র িতটা এিলেম ক বলেবা আমরা নাড। িতটা নােড সাধারণত ইটা তথ থােক: ১) য তথ টা আমরা সংর ণ করেত চাি ২) পরবিত তথ টা কাথায়
আেছ তার িঠকানা।

ছিবেত দখা যাে থম নাড এ একজন ছাে র রাল ন র লখা আেছ, এবং পরবিত ছাে র তথ কান নাড এ আেছ সটা দিখেয় িদে next নােমর একটা পেয় ার।
ি তীয় নাডটাই শষ নাড, তাই এই নােডর ন ট পেয় ার একটা null নাডেক পেয় করেছ। থম নাডেক আমরা বলেবা ট নাড।

অ ােরর সােথ িলংক িলে র একটা বড় পাথক হেলা অ ােরর তথ েলা মমিরেত পরপর সংর ণ করা হয়। যিদ অ ােরটা একটা 44 বাইেটর ইি জার অ াের হয় এবং অ ােরর
থম এিলেম টা যিদ থােক xx তম মমির সল এ, তাহেল পেরর ৩িট এিলেম x+4,x+8,x+12x+4,x+8,x+12 মমির সল এ থাকেব। িনেচর কাডটা রান
করেলই মাণ পােব।

1 int main(){
2 int a[5];
3 for(int i=0;i<5;i++)
4 {
5 printf("%u\n",&(a[i])); #print address of each element
6 }
7 return 0;
8 }

সজন অ ােরর থম এিলেমে র অ াে স জানেলই এরপর যেকােনা এিলেমে র অ াে স সহেজই বর কের ফলা যায়, ইি জার অ ােরর pp তম এিলেম থােক
x+p∗4x+p∗4 অ াে েস যখােন xx হেলা শূ ন তম এিলেমে র অ াে স।

িলংকড িলে তথ েলা থােক ছিড়েয়-িছিটেয়, তাই িতটা এিলেম েক পেরর এিলেমে র িঠকানা সংর ণ কের রাখেত হয়। এই প িতর িকছু সুিবধাও আেছ, অসুিবধাও
আেছ, স েলা আমরা দখেবা।

একটা িস ত িলংকড িল তিরর জন েতই একটা াকচার িডফাইন করেত হেব, যখােন থাকেব য তথ সংর ণ করেত চাই সটা এবং পরবতী নােডর অ াে স।

1/8
1 nstruct node
2 {
3 int roll;
4 node *next;
5 };
6 node *root=NULL;
7 int main(){
8 return 0;
9 }
10

node *next হেলা একটা পেয় ার যটা একটা node এর অ াে স সংর ণ কের।
node *root হেলা একটা পেয় ার যটা সবসময় থম নােডর অ াে স সংর ণ করেব। েত িল এ কােনা নাড নই, তাই ট পেয় ােরর মান নাল(Null)। থম
নােডর অ াে স ব াবহার কের আমরা পরবতীেত অন নােডর তথ পড়েত পারেবা।

এখন আমােদর একটা ফাংশন দরকার যটা ব বহার কের নতুন একটা নাড িলে শেষ েবশ করােত পারেবা। মেন কেরা ফাংশনটার নাম append। এই ফাংশনটা লখার
সময় ২টা কস মাথায় রাখেত হেব। থম কস হেলা য নাডটা েবশ করাি সটাই িলংক িলে র থম নাড িক না। যিদ তাই হয়, তাহেল ট পেয় ার ব বহার কের
থম নাডটা তির করেত হেব।

1 void append(int roll)


2 {
3 if(root==NULL) //If the list is empty
4 {
5 root=new node(); //create new node in root
6 root->roll=roll;
7 root->next=NULL;
8 }
9 }

যিদ িলংকড িলে আেগই িকছু নাড থােক তাহেল আমােদরেক শষ নাডটা খুেজ বর করেত হেব। তারপর শষ নােডর ন ট পেয় ার ব বহার কের পরবতী নাডটা তির
করেত হেব।

2/8
1 void append(int roll)
2 {
3 if(root==NULL) //If the list is empty
4 {
5 root=new node();
6 root->roll=roll;
7 root->next=NULL;
8 }
9 else
10 {
11 node *current_node=root; //make a copy of root node
12 while(current_node->next!=NULL) //Find the last node
13 {
14 current_node=current_node->next; //go to next address
15 }
16 node *newnode = new node(); //create a new node
17 newnode->roll=roll;
18 newnode->next=NULL;
19 current_node->next=newnode; //link the last node with new node
20 }
21 }
22

আমরা থেম লুপ চািলেয় শষ নাডটা বর করিছ। শষ নাড কানটা বাঝা খুব সহজ, যই নােডর ন ট পেয় ার নাল সটাই শষ নাড। এরপর নতুন একটা নাড তির
কের শষ নােডর সােথ সটা িলংক কের িদি । আমােদর এই অ ােপ ফাংশেনর কমে ি িট O(n)O(n)।

ল কেরা, ট পেয় ারেক আমরা সামেন িনি না, সটার একটা কিপ তির সটােক সামেন িনি । কারণ ট পেয় ারেক আমরা সামেন িনেল থম নােডর অ াে স
হািরেয় ফলেবা!

সব েলা ছাে র রাল ন র ি করেত চাইেলও একইভােব করেত পারেবা। আেগর মতই লুপ চািলেয় শষ নাড পয যােবা এবং সব েলা মান ি করেবা।

1 void print()
2 {
3 node *current_node=root;
4 while(current_node!=NULL) //loop until you reach null
5 {
6 printf("%d\n",current_node->roll);
7 current_node=current_node->next;
8 }
9 }
10 int main(){
11
12 append(1);
13 append(2);
14 append(6);
15 print();
16 return 0;
17 }

এখন তুিম যিদ চাও ধুমা ১০ তম ছাে র রাল ি করেত, তাহেল িক করেব? তামােক লুপ চািলেয় ১০ ন র নাড খুেজ বর কের ি করেত হেব। িক অ ােরেত
আমরা roll[10]roll[10] িলেখই ১০তম ছাে র রাল ি কের ফলেত পারতাম। িলংকড িলে তথ েলা মমিরেত পরপর সাজান নই তাই র ম এে স করা যায়
না। িলংকড িলে কােনা ইনেড খুেজ বর করার কমে ি িট তাই O(n)O(n), যখােন অ ােরেত O(1)O(1)। [পুরােনা আমেলর গানেশানার িফতার ক ােসট েলার
কথা মেন আেছ? সখােনও কােনা গােন লাফ িদেয় চেল যাওয়া যত না, িফতা ঘুিরেয় খুেজ বর করেত হেতা। এখােনও একই ব াপার ঘটেছ!]

িলংক িল এর সুিবধা হেলা চাইেলও কােনা তথ মাঝখান থেক মুেছ ফলা যায়। অ ােরেত তুিম চাইেলই মাঝখান থেক একটা ইনেড মুেছ ফলেত পারেব না, মুছেত
হেল ডােনর সব এিলেম েক একঘর বােম টেন এেন ফাকা জায়গা পূ রণ করেত হেব, এবং সবার শেষর এিলেম টােক মুেছ ফলেত হেব। িক িলংকড িলে তুিম সহেজই
3/8
মাঝখান থেক একটা নাড মুেছ ফলেত পারেব।

ছিবেত রাল ২ ক িকভােব মুেছ ফলা যায় দখােনা হেয়েছ। রাল ২ এর আেগর নাড রাল ১ এর পেয় ারেক িদেয় রাল ২ এর পেরর নাড এর অ াে স ক পেয় করােনা
হেয়েছ, এবং মােঝর নাডটা মমির থেক মুেছ ফলা হেয়েছ।

ল কেরা, ট নােডর আেগ কােনা নাড নই। তাই ট নাড মুেছ ফলা আেরা সহজ, ধুমা ট পেয় ার এক ঘর এিগেয় িদেত হেব এবং আেগর নাডটা মুেছ
ফলেত হেব।

1 void delete_node(int roll)


2 {
3 node *current_node=root;
4 node *previous_node=NULL;
5 while(current_node->roll!=roll) //Searching node
6 {
7 previous_node=current_node; //Save the previous node
8 current_node=current_node->next;
9 }
10 if(current_node==root) //Delete root
11 {
12 node *temp=root; //save root in temporary variable
13 root=root->next; //move root forward
14 delete(temp); //free memory
15 }
16 else //delete non-root node
17 {
18 previous_node->next=current_node->next; //previous node points the current node's next node
19 delete(current_node); //free current node
20 }
21 }
22

উপেরর কােড থেম আমরা খুেজ বর কেরিছ য রাল ন রটা মুছেত হেব সই নাডটােক। যিদ সটাই ট নাড হয় তাহেল টেক একঘর এিগেয় িদেয়িছ, নাহেল উপেরর
ছিবর মত কের মুেছিছ।

ল কেরা, আিম delete(node) নােমর একটা লাইে ির ফাংশন ব বহার কেরিছ। মাছার সময় পেয় ার িঠকঠাক করার পর অবশ ই delete ফাংশন ব বহার কের মমির
ি কের িদেত হেব, নাহেল িলংকড িল থেক নাড মুেছ গেলও নাডটা মমিরেত থেক যােব, অন কােনা া াম সটােক ব বহার করেত পারেব না। িলংকড িলে র

4/8
কাড লখার সময় delete() ফাংশন ব বহার করেত ভুেল যাওয়া খুবই কমন একটা ভুল।

িলংকড িল এ তুিম চাইেল মাঝখােনও নাড যাগ করেত পারেব। এই পয বুেঝ থাকেল তামার কাজ হেব ই নাড এর মােঝ নতুন নাড যাগ করার জন ফাংশন লখা।
এটা অেনকটা delete-node ফাংশেনর মত কের িলখেত হেব। ফাংশেনর প ারািমটার িহসােব িনেব roll1, roll2, তামার ফাংশেনর কাজ হেব roll1 য নােড আেছ
সটা খুেজ বর কের সটার পের roll2 নাডটা যাগ করা।

বাইিডেরকশনাল িলংকড িল

আমােদর আেগর কাড এ অ ােপ অপােরশন িছেলা O(n), লুপ চািলেয় বারবার শষ পয যেত হি েলা। এছাড়া িলংকড িল টা উে া িদক থেক াভাস করা স ব
হি েলা না।

উপেরর ছিবর িলংক িলে িত নােড ইটা পেয় ার ব বহার করা হেয়েছ। prev পেয় ারটা িতটা নােডর আেগর নােডর অ াে সেক পেয় কের আেছ। এছাড়াও
এআমরা কটা tail পেয় ার এর সাহােয শষ নাডটার অ াে স মেন রাখিছ।

এখন িলংকড িলে র শেষ নতুন নাড যাগ করা স ব O(1) কমে ি িটেত।

1 struct node
2 {
3 int roll;
4 node *next, *prev;
5 };
6 node *root, *tail;
7 void append(int roll)
8 {
9 if(root==NULL) //If the list is empty
10 {
11 root=new node();
12 root->roll=roll;
13 root->next=NULL;
14 tail=root;
15 }
16 else
17 {
18 node *newnode=new node();
19 newnode->roll=roll;
20 newnode->next=NULL;
21 tail->next=newnode; //add the new node after tail node
22 tail=tail->next; //move tail pointer forward
23 }
24 }

এবার append ফাংশন খুব সহজ হেয় িগেয়েছ। নতুন নাডটা tail এর সােথ যাগ কের টইল এক ঘর এিগেয় নয়া হে । নাড িডিলট করার সমেয়ও এখন আর
previous_node ভ ািরেয়বলটা রাখা দরকার নই।

5/8
বাইনাির সাচ ি

িলংকড িলে র আেরকটা ব বহার হেলা িবিভ ধরেণর ি তির করা। যমন িনেচ একটা বাইনাির সাচ ি তির করা হেয়েছ:

বাইনাির সাচ ি ত বাম পােশর নােড সবসময় ছােটা মান, ডােনর নােড সমান বা বড় মান থােক। আমােদর left এবং right নােমর ইটা পেয় ার লাগেব।

1 struct node
2 {
3 int roll;
4 node *left, *right;
5 node() //initialize the node using null
6 {
7 left=NULL;
8 right=NULL;
9 }
10 };
11 node *root;

নতুন নাড ইনসাট করার সময় আেগর মতই লুপ চািলেয় শষ নােড আসেত হেব। লুপ চালােনার সময় বােম নািক ডােন যােব সটা নােডর মান এবং নতুন মান তুলনা কের
বর করেত হেব।

6/8
1 void insert(int roll)
2 {
3 if(root==NULL) //first node in tree
4 {
5 root=new node();
6 root->roll=roll;
7 }
8 else
9 {
10 node *current=root,*parent;
11 while(current!=NULL)
12 {
13 if(roll<current->roll)
14 {
15 parent=current; //keep track of parent node
16 current=current->left;
17 }
18 else
19 {
20 parent=current;
21 current=current->right;
22 }
23 }
24 node *newnode=new node();
25 newnode->roll=roll;
26 if(newnode->roll<parent->roll) parent->left=newnode;
27 else parent->right=newnode;
28 }
29 }

কাড িঠক আেছ নািক বাঝার জন একটা ি ফাংশন িলিখ:

1 void print_preorder(node *current)


2 {
3 if(current==NULL) return;
4 cout<<current->roll<<endl;
5 print_preorder(current->left);
6 print_preorder(current->right);
7 }
8

এই ফাংশনটা িরকািসভিল নাড লার মান ি করেব।

কাডটা যিদ বুেঝ থােকা তাহেল বাইনাির সাচ ি থেক নাড মুেছ ফলার ফাংশনটা িলেখ ফেলা। নাড মাছার সময় বশ কেয়কটা কস িচ া করেত হয়, সটা িনেয় এখােন
আেলাচনা করেবা না। তুিম কারম ােনর অ ালেগািরদম বই থেক বা গেল একটু সাচ কের িশেখ িনেত পােরা।

িলংকড িলে সাইেকল িকভােব বর করেত হয় জানেত আমার এই লখাটা পেড়া।

িলংকড িলে র কাড লখার সময় িকছু কমন ভুল হয় র িদেক। যমন পেয় ােরর মান নাল হেয় যাবার পেরও মান ি করার চ া কের বা আেরা সামেন আগােনার চ া
করা, সে ে কাড রান টাইম ইেরার িদেব। এছাড়া মমির ি করেত ভুেল যাওয়াও খুব সাধারণ একটা ভুল। আেরকটা ভুল হেলা ট বা টইল পেয় ােরর মান বদেল
ফলা।

িলংকড িল শখার পর াক, িকউ, বাইনাির ি , িহপ ইত ািদ ডাটা াকচার েলা িলংকড িল িদেয় ইমি েম করা িশখেত হেব। তুিম যিদ কনেট কেরা আর আেরকটু
অ াডভা ড িকছু িশখেত চাও তাহেল এখান থেক াই ডাটা- াকচার িকভােব িলংকড িল ব াবহার কের ইমি েম কের িশেখ িনেত পােরা।

হ ািপ কািডং!
7/8
AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

8/8
ডাটা াকচার : াক
shafaetsplanet.com /planetcoding/

শাফােয়ত নেভ র ১১, ২০১৫

যেকােনা ডাটা াকচার কােস একদম র িদেক যসব ডাটা াকচার পড়ােনা হয় তার মেধ াক অন তম। াকেক বলা হয় LIFO বা লা -ইন-ফা -আউট ডাটা
াকচার। তুিম এভােব িচ া করেত পােরা, তামার কােছ অেনক েলা বই একটার উপর আেরকটা সাজােনা আেছ, তুিম চাইেল সবার উপেরর বইটা সিরেয় ফলেত
পােরা(Pop), অথবা সবার উপের আেরকটা বই রাখেত পােরা(Push)। এটা হেলা বইেয়র একটা াক। তুিম এই ােকর উপের ছাড়া কােনা জায়গায় বই ঢুকােত
পারেব না, উপেরর বই ছাড়া কােনা বই সরােত পারেব না, এ েলা করেল সটা আর াক থাকেব না।

াক হেলা িকছু ব র(এিলেম ) একটা সং হ। এখােন ইরকম অপােরশন করা যায়:

Push(new_element): ােকর উপের নতুন ব টা রােখা। যিদ েত াকটা খািল হয়, তাহেল থম জায়গায় ব টা রাখেত হেব।
Pop(): ােকর উপেরর ব টা সিরেয় ফেলা। যিদ েত াকটা খািল হয় তাহেল এই অপােরশনটা করা স ব না।

িচ ১: াক এ পুশ এবং পপ অপােরশন ( সাস: উইিকিপিডয়া)

িচ ১ এ দখা যাে িকভােব ােক পুশ এবং পপ অপােরশন করেত হয়। ােক আেরকটা অপােরশন থাকেত পাের Peek(), যটা ব বহার কের সবার উপেরর ব টা িক
জানা যােব ব টা পপ না কেরই।

ােকর আকার যিদ সীিমত হয়, যমন যিদ ১০টার বিশ ব রাখার সামথ কােনা ােকর না থােক তাহেল ১১তম ব পুশ করেল াকটা “ওভারে া” ট এ চেল যােব
এবং তামার া াম াশ করেব। একই ভােব খািল াক থেক িকছু পপ করার চ া করেল াক ‘আ ারে া’ েট চেল যােব এবং া াম াশ করেব। াক
ব বহােরর সময় এই ই ব াপাের খুব সতক থাকেত হয়।

াক ইমি েম করা খুব সহজ। সাধারণ অ াের ব বহার কেরই িনিদ আকােরর াক ইমি েম করা যায়। সবার উপেরর এিলেম টা কান ইনেডে আেছ সটা একটা
অিতির ভ ািরেয়বেল সভ কের রাখেত হেব। িনেচ পাইথেন একটা ইমি েমে শন দখােনা হেলা, একই ভােব িস++ এও তুিম করেত পারেব:

Python

1/4
1 class Stack:
2 def __init__(self, max_size): #initialize a stack of max_size
3 self.top_pointer = -1 #Keep track of top element using this
4 self.stack = [None for x in range(max_size)] #create a list of max_size
5
6 def push(self, new_element):
7 self.top_pointer = self.top_pointer + 1 #Move the pointer
8 self.stack[self.top_pointer] = new_element #Add the new_element to the top
9
10 def pop(self):
11 last_element = self.stack[self.top_pointer]
12 self.top_pointer = self.top_pointer - 1 #Move the pointer
13 return last_element #Pop the last element
14
15 def peek(self):
16 return self.stack[self.top_pointer]
17
18 def is_empty(self):
19 return top.pointer == -1

এই কােড আিম কােনা ওভারে া বা আ ারে া হ াে ল কির িন। তুিম কাডটার উ িত করেত চাইেল এ ব াপার েলা িনেয় কাজ করেত পােরা। যিদ তুিম িনিদ আকােরর
াক না চাও তাহেল িলংকড-িল ব বহার করেত হেব।

ােক িতটা অপােরশেনর কমে ি িট O(1)O(1)

ােকর ব বহার:

আমরা াউজাের ায়ই আেগর ওেয়বসাইেট িফের যেত “Back” বাতােম চাপ দই। এটাও াক ব বহার কের তির করা যায়। যখন নতুন ওেয়বসাইেট যােব তখন
আেগর ওেয়বসাইটটােক ােকর উপের রেখ দাও, িফের যেত চাইেল ােকর উপেরর ওেয়ব সাইেট ফরত িগেয় াক থেক পপ কের দাও। এভােব তুিম তামার
সফটওয় াের “undo” িফচার বানােত পােরা।

া ািমং ল াং েয়েজ ফাংশন কল করার সময় ােকর খুব পূ ণ ব বহার আেছ। মেন কেরা তুিম একটা ফাংশন func1 থেক func2 কল করেছা, সখান থেক আবার
func3 কল করেছা:

Python

1 def func_3():
2 return 42
3
4 def func_2():
5 x=20
6 y=func3()
7 return x+y
8
9 def func_1():
10 x=10
11 y=func2()
12 return x+y
13
14 print func1()

func_1() এ িকছু লাকাল ভ ািরেয়বল আেছ। তুিম যখন func_1() থেক func_2() ক কল করেছা তখন func_1() এর সব তথ একটা ােক ঢুিকেয় রেখ
নতুন ফাংশন func_2() ক লাড করা হয়। আবার যখন func_3() ক কল করেছা তখন func_2() ক ােক ঢুিকেয় রােখ হেব। যিদ n+1n+1 টা ফাংশন থােক
তাহেল যখন nn তম ফাংশন টা n+1n+1 তম ফাংশনেক কল করেব তখন ােকর চহারাটা হেব এরকম:

2/4
func_3() এর কাজ শষ হবার পর আবার func2() ক মমিরেত লাড করা হেব এবং াক থেক পপ
কের দয়া হেব। এটােক কল- াক বলা হয়। িরকািসভ ফাংশনও এভােব আেগর ট েলােক ােক
ঢুিকেয় রােখ।

হ াকাররা এক ধরেণর আ মণ মােঝ মােঝ ব বহার কের যােক বলা হয় “ াক ািশং”। আ হী হেল এই
আিটেকলটা পড়েত পােরা।

ােকর খুবই কমন একটা ব বহার হেলা ােকট এর ব ােল বা ভারসাম িঠক আেছ সটা পরী া করা
(Parenthesis Balance)। মেন কেরা তামােক একটা ােকট িসেকােয় S দয়া হেলা এরকম
“(({})”। তামােক বলেত হেব িসেকােয় টার ব ােল িঠক আেছ নািক নই। ব ােল িঠক থাকেব যিদ িনেচর
শত েলা পূ রণ হয়:

যিদ S একটা ০ দেঘ র ি ং হয়।


যিদ A আর B ইটা ব ােল ড িসেকােয় হয় তাহেল AB ও একটা ব ােল ড িসেকােয় ।
যমন GA = “(){}” এবং B = “()” ইটা ব ােল ড িসেকােয় হেল AB = “(){}()” ও
ব ােল ড।
যিদ S একটা ব ােল ড িসেকােয় হয় তাহেল (S) অথবা {S} ও ব ােল ড। যমন S=”{}
()” ব ােল ড হেল (S) = “({}())” এটাও একটা ব ােল ড িসেকােয় ।

িকছু ভারসাম হীন িসেকােয় হেলা “((” , “({)}”, ()(}” ইত ািদ।

“(“ আর “{“ ক আমরা বলেবা “ওেপন ােকট”, আর “)” এবং “}” ক বলেবা “ ািজং ােকট”।

এখন আমরা S=”(({})” ব ােল ড নািক পরী া করেবা াক ব বহার কের। আমরা বাম থেক ডােন একটা একটা ক ােরকটার িনেয় কাজ করেবা। কােনা “ওেপন ােকট”
পেলই সটােক ােক পুশ করেবা।

এই িসেকােয়ে র থম ক ােরকটার “(“, আমরা এটােক একটা ােক পুশ করেবা।

২য় এবং ৩য় ক ােরকটার হেলা “(“ এবং “{“। এেদরেকও পুশ করেবা:

পেরর ক ােরকটারটা হেলা “}”। ািজং ােকট যখন পােবা তখন আমরা দখেবা ােকর উপের িক আেছ:

যিদ াকটা খািল হয় তাহেল িসেকােয় টা ব ােল ড না।


যিদ বতমান ক ােরকটারটা “}” হয় তাহেল ােকর উপের অবশ ই “{“ থাকেত হেব।
যিদ বতমান ক ােরকটারটা “)” হয় তাহেল ােকর উপের অবশ ই “(“ থাকেত হেব।
3/4
আমােদর ােকর উপের “{“ আেছ যটা “}” এর সােথ ম াচ কের। আমরা “}” িনেয় িকছু করেবা না িক “{“ ক ােকর উপর থেক পপ কের িদেবা।

শষ ক ােরকটারটা হেলা “)” যটা “(“ এর সােথ ম াচ কের, আবার আমরা পপ করেবা:

সব কাজ শেষ দখা যাে ােক এখেনা একটা ােকট থেক গেছ যটা কােরা সােথ িমলােনা যাে না!
তারমােন আমােদর ােকট িসেকােয় টা ব ােল ড না। ব ােল ড হেল সব ক ােরকটার িনেয় কাজ করার পর
অবশ ই াক খািল হেয় যত।

আমরা াক এর কাড ইিতমেধ ই িলেখিছ, এবার ােকট ব ােল করার কাডটা িলেখ ফিল:

Python

1 def checkBalance(s):
2 mystack=Stack(len(s))
3 if s=="":
4 return True
5 for c in s:
6 if c=="(" or c=="{":
7 mystack.push(c) #push the opening bracket
8 else:
9 if mystack.is_empty():
10 return False
11 if c=="{" and mystack.peek()!="}": #the brackets dont match
12 return False
13 if c=="(" and mystack.peek()!=")": #the brackets dont matchs
14 return False
15 mystack.pop() #pop matching brackets
16 if mystack.is_empty(): #stack must be empty at the end
17 return True
18 return False
19
20
21
22 print checkBalance("(){}")
23 print checkBalance("()(((")
24 print checkBalance("()(}")
25

অ ালেগািরদমটা বুেঝেছা নািক পরী া করেত UVA 674 বেলমটা সমাধান কের ফেলা।

ােকর আেরকটা পূ ণ ব বহার হেলা গািণিতক ইকুেয়শেনর মান বর করা, যমন (1+(2+5)∗3)+(5∗7)(1+(2+5)∗3)+(5∗7) এরকম একটা ইকুেয়শন দয়া
থাকেল মান বর করা খুব সহজ না। িক িরভাস পিলশ নােটশেন িলখেল াক িদেয় খুব সহেজ মান বর করা যায়। এটা এখন তুিম সহেজই উইিকিপিডয়া থেক িশেখ
ফলেত পারেব, আিম িব ািরত িলখেবা না, আমার কাজ ধু বিসক িজিনস েলা তামােক জানােনা, িক ভােলা করেত হেল িনেজ ক কের শখার কােনা িবক নই

হ ািপ কািডং।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
ডাটা াকচার: িকউ এবং সাকুলার িকউ
shafaetsplanet.com /planetcoding/

শাফােয়ত 10/6/2016

িকউ একটা বিসক ডাটা াকচার। এটােক তুিম িচ া করেত পােরা বােসর লাইেনর মত, য সবার সামেন দািড়েয় আেছ স সবার আেগ উঠেব, নতুন কােনা যা ী আসেল স
লাইেনর িপছেন দাড়ােব।

িকউেত ইরকম অপােরশন থােক। এনিকউ(Enqueue) মােন হেলা িকউেত নতুন এিলেম যাগ করা এবং িডিকউ(Dequeue) বা পপ মােন হেলা সবেথেক পুেরােনা
এিলেম টা িকউ থেক সিরেয় ফলা।

অ াের ব বহার কের আমরা িফ ড সাইেজর িকউ ইমি েম করেত পাির। আমােদরেক সবসময় ইটা পেয় ার রাখেত হেব, হড (Head) পেয় ার িনেদশ করেব িকউেয়র
সামেনর এিলেমে র পিজশন এবং টইল (Tail) পেয় ার িনেদশ করেব িপছেনর এিলেমে র পিজশন। একদম েত Head = -1, Tail = -1 রাখেত পােরা। িতিট
এিলেম এনিকউ করার সময় টইলেক এক পিজশন সামেন এিগেয় িনেয় সই পিজশেন নতুন এিলেম েক রাখেত হেব। িডিকউ করার সময় ধুমা হড একধাপ এিগেয়
িনেত হেব। একটা িসমুেলশন দখেলই ব াপারটা পির ার হেব:

1/6
ল কর, শেষর এিলেম টা িডিকউ করার পর হড টইেলর এর সামেন চেল
গেছ। এেত কােনা সমস া নাই, Head > Tail বা Head = -1 মােন
হেলা িকউটা পুেরাপুির খািল।

উপেরর িকউেত সেবা ৫টা এিলেম রাখা যােব। িক আেরা বড় একটা


সমস া আেছ। Head বা Tail সবসময় সামেন আগাে এবং িডিকউ করার
সময় অ ােরর য জায়গাটা ফাকা হেয় যাে সটা ি তীয়বার ব বহার করার
কােনা উপায় নই! সবেশষ ধােপ Tail = 2 হেয় িগেয়েছ, যিদও িকউটা
খািল। তারমােন থম ৩টা পিজশন আর ব বহার করেত পারেব না। এই কারেণ
বা েব কখেনাই এভােব িকউ ইমি েম করা হয় না, করেল মমিরর সেবা
ব বহার করেত পারেব না।

একটা সমাধান হেলা িলংকড িল ব বহার করা। িলংকড িল ব বহার করেল


থম সুিবধা হেলা িকউ এর সাইজ িফ ড কের দয়া দরকার নই। আেরকটা
সুিবধা হেলা তুিম যখন িডিকউ করেব তখন টইল পেয় ার য এিলেম েক
পেয় কের আেছ তােক মমির থেক মুেছ িদেত পারেব। িলংকড িল ব বহার
কের একটা িসমুেলশন দিখ।

2/6
আমরা দখেত পাি এখােন কান মমির অপচয় হবার সুেযাগ নই।

িফ ড সাইেজর অ াের িদেয়ও এমনভােব িকউ ইমি েম করা যােত মমির অপচয় না হয়। এেক বলা হয় সাকুলার িকউ যা দখেত অেনকটা এরকম:

সাকুলার িকউেত তুিম েত যেকােনা পিজশেন এনিকউ করেত পােরা, উদাহরণ


িহসােব ছিবেত 2 ন র ইনেড েক ািটং পেয় ধেরিছ। আেগর মেতাই িকউ
10, 20 এবং 30 এনিকউ করার পর দখেত হেব এরকম:

3/6
িডিকউ ও একই ভােব করেবা:

এখন মেন কেরা িকউটা স ূণ ভের গেছ:

এখন যিদ আেরা একটা নতুন এিলেম এনিকউ করেত চাও তাহেল তামার েয়াজেনর উপর িডেপ
কের ইরকম ঘটনা ঘটেত পাের। এনিকউ ফাংশন এেরার িদেত পাের য জায়গা খািল নই। অথবা
সবেথেক পুরােনা এিলেম টা ফেল িদেয় সই জায়গায় নতুন এিলেম টা রাখেত পােরা, এটােক বলা
হয় সাকুলার বাফার।

এখন হেলা িকভােব বুঝেব য সাকুলার িকউ ফুল হেয় গেছ নািক? িকউ ফুল হেল অবশ ই
টইেলর পিজশন হেডর এক ধাপ িপছেন হেব। সাকুলার িকউ এর একটা পাইথন কাড দখ:

Circular Queue
Python

4/6
1 Q = []
2 head = -1
3 tail = -1
4 capacity = 5
5 starting_point = 2
6 Q = [None for x in range(0, capacity)]
7 def enqueue(value):
8 global head
9 global tail
10 global capacity
11 global Q
12 global starting_point
13
14 if (tail + 1)%capacity == head:
15 print "Q is full"
16 return
17 if head == -1:
18 head = starting_point
19 tail = head
20 Q[tail] = value
21 else:
22 tail = (tail + 1)%capacity
23 Q[tail] = value
24
25 def deque():
26 global head
27 global tail
28 global capacity
29 global Q
30 global starting_point
31 if head == -1:
32 print "Q is already empty"
33 return
34 Q[head] = None
35 if head == tail:
36 head = -1
37 tail = -1
38 else:
39 head = (head +1)%capacity

আেরক ধরেণর িকউ আেছ যার নাম ডাবল এে ড িকউ। ডাবল এে ড িকউ এর ই পােশই এিলেম েবশ করােনা যায়, আবার ইিদক থেকই পপ করা যায়। ডাবল
এে ড িকউ িদেয় সমাধান করা যায় এমন একটা মজার সমস া আেলাচনা কেরিছ াইিডং র িমিনমাম কুেয়ির িনেয লখায়।

ােয়ািরিট িকউ নােমর আরও এক ধরেণর িকউ আেছ। সখােন িতটা এিলেমে র একটা ােয়ািরিট থােক, পপ করার সময় যার ােয়ািরিট বিশ স আেগ পপ হয়।
ােয়ািরিট িকউ ইমি েম করেত হেল িহপ ডাটা াকচার স েক জানেত হেব, সটা িনেয় আেরকিদন আেলাচনা করেবা।

া ািমং কনেটে িকউ এর সবেথেক কমন ব বহার হেলা থড ফা সাচ । ােয়ািরিট িকউ ব বহার কের ডায়া া অ ালেগািরদম ইমি েম করা হয়। আবার অপােরিটং
িসে ম িবিভ রকেমর িকউ ব বহার কের টা িশিডউিলং এর জন ।

িতিট বড় া ািমং ল াং েয়েজই িকউ লাইে ির আেছ যা িদেয় খুব সহেজ িকউ ব বহার করা যায়। িক শখার সময় িনেজেক অবশ ই ইি েম করেত হেব, নাহেল িকউ
িকভােব কাজ কের বুঝেত পারেব না।

আজ এই পয ই, হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/6
6/6
াইিডং র িমিনমাম কুেয়ির
shafaetsplanet.com /planetcoding/

শাফােয়ত অে াবর ১৩,


২০১৫

মেন কেরা তামােক একটা অ াের দয়া হেয়েছ যখােন nn টা সংখ া আেছ। তামােক বলা হেলা সই অ ােরর m=৩ আকােরর যত েলা সাবঅ াের আেছ সব েলা থেক
সবেথেক ছােটা সংখ াটা বর করেত হেব।

যমন অ ােরটা যিদ হয় ১০,২,৫,৯,৬,৪ তাহেল m=৩ সাইেজর সব েলা সাবঅ াের হেলা:

১০,২,৫ , সবিন সংখ া ২


২,৫,৯ , সবিন সংখ া ২
৫,৯,৬, সবিন সংখ া ৫
৯,৬,৪ , সবিন সংখ া ৪

তাহেল তামার আউটপুট হেব [২,৫,৫,৪]।

mm এর মান ৩ না হেয় ১ থেক nn পয যেকােনা সংখ া হেত পাের।

nn এর মান যিদ ছােটা হয় তাহেল আমরা সহেজই িতটা সাবঅ ােরর উপর লুপ চািলেয় সমস াটা সমাধান করেত পাির। িনেচর পাইথন কাডিট দেখা:

Python

1 def brute_rmq(arr,m):
2 res=[]
3 for i in range(0,len(arr)-m+1):
4 subarr=arr[i:i+m] #take subarray of size m, starting from index i
5 res.append(min(subarr)) #append the minimum element in result
6 return res

এই কােডর কমি ি িট O(n2)O(n2)।

আমরা O(nlogn)O(nlogn) এ সমস াটা সমাধান করেত পাির সগেম ি ব বহার কের।

াইিডং উইে া এবং মেনােটানাস িডিকউ ব বহার কের সমস াটা O(n)O(n) কমে ি িটেত সমাধান করা স ব, সটাই আজেক আমরা িশখেবা। মেনােটানাস িডিকউ বা
ডাবল-এে ড-িকউ হেলা এমন একটা িডিকউ যখােন সংখ া েলা সবসময় সেটড থােক।

মেন কির অ ােরেত সংখ া েলা হেলা [১০,৫০,১৫,১২,৪] এবং m=৩।

আমরা বাম থেক ডােন একটা একটা সংখ া িনেয় কাজ করেত থাকেবা। আমরা সংখ া েলােক এমনভােব িডিকউেত ঢুকােবা যন সবেথেক ছােটা সংখ াটা সবসময় সবার
ডােন থােক। i তম ইনেডে যখন থাকেবা তখন (i−m+1,i)(i−m+1,i) সাবঅ ােরর সবিন সংখ াটােক িডিকউর সবেথেক ডােন পাওয়া যােব।

থম সংখ াটা হেলা ১০, এটােক আমরা িডিকউ ত বামিদক থেক ঢুকােবা:

DQ=[১০]

পেরর সংখ াটা হেলা ৫০, এটােকও বামিদক থেক ঢুকােবা:

1/3
DQ=[৫০,১০]

পেরর সংখ াটা হেলা ১৫। এখন ল কেরা, এখন পয যত েলা সংখ া পেয়িছ তােদর মেধ যারা ১৫ এর থেক বড় তারা কখেনাই সবিন সংখ া হেত পারেব না, কারণ
তারা ১৫ এর বােম আেছ এবং তারা য সাবঅ ােরেত আেছ স েলােত ১৫ ও অবশ ই আেছ। এটা বাঝাই অ ালেগািরদেমর সবেথেক পূ ণ অংশ। কােনা একটা সংখ া
িডিকউেত ঢুকােনার আেগ সই সংখ াটার থেক যত েলা বড় সংখ া িডিকউেত আেছ স েলা বর কের িদেত হেব।

DQ=[১৫,১০]

তাহেল থম ৩ আকােরর সাবঅ াের [১০,৫০,১৫] এ সবিন সংখ া হেলা িডিকউ এর সবডােনর সংখ া ১০।

পেরর সংখ াটা হেলা ১২। তাহেল আমরা ১৫ ক ফেল িদেয় ১২ ক ঢুকােবা।

DQ=[১২,১০]

ল কেরা আমরা এখন i=3 ন র ইনেডে আিছ এবং i-m+1=৩-৩+১=১ ন র ইনেডে র বােমর কােনা সংখ া আমােদর দরকার নই কারণ স েলা রে র বাইের।
িকউ এর সবার ডােনর সংখ া ১০ মূল অ ােরর এর ০ তম ইনেডে অবি ত, সটােক আমরা ফেল িদেত পাির।

DQ=[১২]

তাহেল ২য় ৩ আকােরর সাবঅ াের [৫০,১৫,১২] এ সবিন সংখ া হেলা িডিকউ এর সবডােনর সংখ া ১২।

পরবিত সংখ াটা হেলা ৪। আমরা ১২ ফেল িদেয় ৪ ঢুকােবা:

DQ=[৪]

তাহেল ৩য় ৩ আকােরর সাবঅ াের [১৫,১২,৪] সবিন সংখ া হেলা িডিকউ এর সবডােনর সংখ া ৪।

তাহেল O(n)O(n) কমি ি িটেত আমরা সব েলা রে র সবিন সংখ া েলা বর কের ফললাম।

িনেচর পাইথন কােড উপেরর অ ালেগািরদমটা ইমি েম করা হেয়েছ। পাইথন না জানেলও বুঝেত সমস া হেব না:

Python

2/3
1 def sliding_rmq(arr, m):
2 DQ = deque()
3 res=[]
4 for i,val in enumerate(arr):
5 while len(DQ) and DQ[0][0]>=val: #DQ[0][0] is the leftmost element of DQ
6 DQ.popleft()◌্
7 DQ.appendleft((val,i)) #pushing a pair containing the value and the index
8 while len(DQ) and DQ[-1][1]<=i-m: #DQ[-1][1] is the index of the rightmost element of DQ
9 DQ.pop() #popping the out-of-range elements
10 if i>=m-1: #We got a m size range
11 print DQ[-1][0] #print the rightmost element of DQ
12 res.append(DQ[-1][0])
13 return res
14
15
16
17

িচ া করার জন সমস া:

১. মেন কেরা তামােক nn টা সংখ া এবং qq টা র দয়া হেয়েছ, র েলা হেলা [a1,b1],[a2,b2]…….[aq,bq][a1,b1],[a2,b2]…….[aq,bq] এবং
িতটা i<qi<q এর জন ai≤ai−1ai≤ai−1 এবং bi≤bi−1bi≤bi−1। িতটা রে র সবিন সংখ া বর করেত হেব। িকভােব করেব?

২. http://www.spoj.com/problems/PARSUMS/

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
ডাটা াকচার: িডসজেয় সট(ইউিনয়ন ফাই )
shafaetsplanet.com /planetcoding/

শাফােয়ত আগ ২৮,
২০১১

ডাটা াকচার কি উটার সাইে র চমতকার অংশ েলার একিট। আমরা অসংখ উপােয় কি উটাের ডাটা জমা রাখেত পাির। আমরা বাইনাির ি বানােত পাির,পের স গাছ
বেয় বেয় logN এ ডাটা বর কের আনেত পাির,বােসর লাইেনর মত িকউ বানােত পাির,ি িফ ি বা trie বািনেয় খুব ত ি ং সাচ করেত পাির। আজ আমরা দখেবা
অসাধারণ একিট ডাটা াকচার যার নাম “িডসজেয় সট”।

kruskal’s MST বা tarjan’s offline LCA ইত ািদ অ ালেগািরদম ইমি েম করেত িডসজেয় সট খুব পূ ণ। এিট ইমি েম করেত আমােদর একিট অ াের
ছাড়া িকছু লাগেবনা।

থেম আমরা দখেবা িক ধরেণর কােজ আমােদর এই ডাটা াকচারিট দরকার। মেন কির A,B,C,D,E ৫ জন মানুষ। A-B যিদ ব ু হয় এবং B-C যিদ ব ু হয় তাহেল
আমরা বলেত পাির A-C ও ব ু ,অথাত তােদর ব ু transitive। এখন আিম বেল িদলাম য A-B,B-C,D-E এরা পর েরর ব ু । এখন তামােক করলাম A-C
িক পর েরর ব ু ? B-D িক পর েরর ব ু ? থম ে র উ র হেব “হ া”,২য় ে র উ র হেব “না”। আমােদর তথ েলােক ােফর মাধ েম দখােত পাির:

সহেজই বাঝা যাে ােফ যসব নাড একই কে ােন বা সাব ােফর মেধ আেছ তারা
পর েরর ব ু । তাহেল -জন ব ি ব ু নািক সটা জানেত হেল আমােদর দখেত হেব তারা
একই সাব ােফ আেছ নািক। সহেজই িবএফএস বা িডএফএস চািলেয় এটা বর করা যায়।
িক এ েলার থেকও ভােলা উপায় হেলা “িডসজেয় সট”, কেনা এটা ভােলা সটা িকছু ণ
পেরই বুঝেত পারেব।

িতিট মানুষ একিট কের নাড হেল িডসজেয় সট িদেয় সমাধােনর আইিডয়া এরকম:

১. যারা পর েরর ব ু তারা সবাই একই সেটর অ গত

২. যত েলা সাব াফ থাকেব তত েলা সট থাকেব

৩. িতিট সেটর একিট representative থাকেব।

৪. িট নােডর representativeএকই হেল তারা একই সেট আেছ। সুতরাং জন ব ি ব ু নািক বুঝেত আমােদর তারা য সেট আেছ তার
representative চক করেত হেব।

ঘালােট লাগেছ? সমস া নই,আমরা ািফকালভােব এখন ব াপারিট বুঝেবা,সােথ কাডও দখেবা। েত কও কােরা ব ু নয়। তাহেল সবাই আলাদা আলাদা সেট
আেছ। এবং যেহতু সট েলােত মা একিট কের সদস তাই সই সদস িটই হেব সেটর representative। ছিবিট দেখা:

আমরা সেটর representative ক সবসময় হলুদ রং িদেবা।

এই অংশিট ইি েম করেবা এভােব:

Python

1/5
1 #Python2.7.6
2 #assume a=1,b=2,c=3,d=4,e=5
3 element=5
4 par=[None]*(element+1) #Creating an array with 6 elements
5
6
7 def makeset(n):
8 par[n]=n
9
10 for i in range(1,element+1):
11 makeset(i)

par নামক অ ােরটা িদেয়ই আমরা সট বানােবা। েত সবার প াের স িনেজই। প াের বলেত বুঝাে নাডিট কার সােথ সংযু । একিট মা সাধারণ অ াের ব বহার
কের আমরা পুেরা াকচারিট বানােবা! এটা একধরেনর ি াকচার।

এখন a আর b হঠাত িঠক করেলা য তারা ব ু হেব। তাহেল তােদরেক একই সেটর মধ আসেত হেব। a িঠক করেলা য b এর representative ক িনেজর
representative বািনেয় ফলেব,তাহেলই তারা একই সেট চেল আসেব। তাই a এেস b এর সােথ যু হেয় গেলা কারণ b এর representative হেলা b
িনেজই। ছিব দেখা:

এখন c ভাবেলা সও a এর ব ু হেব। এখন c কার িনেচ যু হেব? a এর িনেচ c


যু না হেবনা,c যু হেব a এর representative এর িনেচ,তারমােন b এর
িনেচ।

d,e কও ব ু বািনেয় দই:

পেরর ধাপিট ভােলা কের দেখা । এবার আমরা e আর c ক ব ু বানােবা। c যই


সেট সটার representative হেলা b। তার সােথ আমরা যু করেবা e এর
representative ক। e এর representative হেলা d। b ক d এর
প াের বািনেয় িদলাম। তাহেল b এখন e এরও representative হেয় গেলা।

আমরা আবার একটু কাড দিখ:

Python

1 #Python2.7.6
2 def union(a,b):
3 u=find(a)
4 v=find(b)
5 if u==v:
6 print "They are already friends"
7 else:
8 par[u]=v #Or you can write par[v]=u too

আমরা য িট নাডেক ব ু বানােবা তােদর representative বর করলাম find()


ফাংশন কল কের। (ফাংশনিটর ডিফেনশন পের দখেবা) এবার একিটেক আেরকিটর
প াের বািনেয় িদলাম।

এখন হেলা representative খুজেবা িকভােব? মেনােযাগিদেয় এই পয পেড়


থাকেল একটা িজিনস চােখ পড়ার কথা, কােনা একিট সেটর representative
element এর প াের সই এিলেম িনেজই,অথাত এিলেম িট যিদ হয় r তাহেল par[r]=r। আমরা আেরকটু বড় াফ দিখ। মেন কির a,b,c,d,e এর ব ু হেত
আেরা কেয়কজন চেল এেসেছ:

2/5
আেগর সেটই ধু িকছু নাড যু করা হেয়েছ পেরর অংশ বাঝার সুিবধার জন । ধির f এর representative বর করেত হেব। f এর প াের স িনেজ নয়,তাহেল
তার representative খুজেত তার প ােরে র প াের চক কির। f এর প াের c। c ও representative নয় কারণ স িনেজই িনেজর প াের নয়,c এর প াের
b এবং b িনেজই িনেজর প াের । তাহেল b ই হেলা representative। ফাংশনিট িলেখ ফিল:

Python

3/5
1 #python2.7.6
2 def find(r):
3 if par[r]==r: return r
4 return find(par[r])

ফাংশনিট গাছ(tree) বেয় উপের উঠেলা যত ননা representative ক খুেজ পাওয়া যায়। আেগর ফাংশন িট(union এবং makeset) তােদর আসল কাজ
কেরেছ O(1) এ। find() ফাংশেন এেস complexity’r এেস পেড়েছ। worst case এ O(n) টাইম লাগেত পাের উপেরর find() ফাংশেনর,tree এর
depth যত বিশ হেব তত টাইম বিশ লাগেব। ভািসিটর ল ােব লখা কােডর জন এটা িঠক আেছ,িক কনেটে বা অন কাথাও যিদ নাড অেনক বিশ হয় তাহেল
পারফরম া খারাপ িদেব।

এখােন একিট চমৎকার optimization আেছ। আসেল এই optimization টাই িডসজেয় সট াকচােরর সৗ য। িতিট find() ফাংশন কল এর সােথ সােথ
আমরা াফিট এমন ভােব পিরবতন করেবা যন depth কেম যায়। g এর representative খুজেত আমরা g এর প াের f ক কল িদেয়িছ। f তার প াের েক কল
িদেয় representative খুেজ িরটাণ কেরেছ। িরটাণ ভ ালু েলােক এভােব দখেত পাির:

িতিট নােডর িনেচ িরটাণ ভ ালু িলেখ দয়া হেয়েছ। িতিট নাড তার আেগর ফাংশন একই ভ ালু িরটাণ কের কের, যটা সবেশেষ আমরা পাই,এই ভ ালুটাই
representative। আমরা return find(par[r]) না িলেখ যিদ আেগ িলখতাম par[r]=find(par[r]) এবং তারপর িলখতাম “return par[r]” তাহেল িক
ঘটেতা? িরটাণ করার সময় িরটাণ ভ ালুটােক িনেজর প াের বািনেয় ফলেতা,অথাত সবাই representative কই বািনেয় ফলেতা িনেজর প াের ! ফাংশন কেলর
সােথ সােথ াফিট হেয় যত এমন:

4/5
ি এর depth কেম িগেয়েছ,তাই নয় িক?এটােক বলা হয় path compression। পের আমরা যখন f এর representative খুজেবা তখন আর মা একিট
ডাল(edge) বেয় উঠেত হেব। wiki ত সু র কের লখা আেছ:

path compression, is a way of flattening the structure of the tree whenever Find is used on it. The
idea is that each node visited on the way to a root node may as well be attached directly to the root
node; they all share the same representative. To effect this, as Find recursively traverses up the tree,
it changes each node’s parent reference to point to the root that it found. The resulting tree is much
flatter, speeding up future operations not only on these elements but on those referencing them,
directly or indirectly.

মাটামুিট এই হেলা আমােদর disjoint set। িট নাড একই সেট আেছ নািক চক করেত আমরা তােদর representative বর কের তারা সমান নািক সটা চক
করেবা। িট নাড ক একই সেট িনেত হেল তােদর representative বর কের একিটেক আেরকিটর প াের বািনেয় িদেবা। kruskal এ িট নাড একই সাব-ি েত
আেছ নািক সটা চক করেত disjoint set ব বহার করা হয়। একই tree ত না থাকেল union ফাংশনিট কল কের এক করা হয়।

এখন যিদ সিত ই িকছু িশখেত চাও তাহেল ঝটপট িকছু বেলম সলভ কের ফেলা:

Graph connectivity
Nature
Virtual Friend(*)

আেরা জানেত চাইেল:

টপেকাডার িটউেটািরয়াল
Wikipedia

[িস++ কাড েলা বদেল পাইথেন িলেখ দয়া হেলা, তেব সজন বুঝেত সমস া হবার কথা না। সমস া হেল যাগােযাগ কর]

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
ডাটা াকচার: াই (ি িফ ি / রিড ি )
shafaetsplanet.com /planetcoding/

শাফােয়ত 12/27/2013

াই বা ি িফ ি ব বহার কের ডাটােবস থেক খুব সহেজ ি ং খুেজ বর করা যায়। ধেরা একটা ফানবুেক একটা শহেরর সব মানুেষর ফান ন র রাখা আেছ। শহের মানুষ
আেছ হয়েতা কেয়ক ল , িক িতটা মানুেষর নাম সেবা ২০টা অ র ব বহার কের লখা যায়। আমরা এমন একটা ডাটা াকচার ব বহার কের নাম খুজেবা য িনভর কের
ধু মা নামিটেত কয়িট অ র আেছ তার উপর। যমন “Alice” নামিট খুজেত মা ৫িট অপােরশন করা লাগেব ডাটােবস যত বড়ই হাক না কন।

এই লখা পড়ার আেগ িলংকড িল এবং িরকাসন স েক ধারণা থাকেত হেব।

ধেরা তামােক একটা িডকশনারী দয়া হেলা যখােন িনেচর শ েলা আেছ:

algo
algea
also
tom
to

এখন আমরা এই িডকশনািরটােক এমনভােব মমিরেত রাখেত চ া করেবা যন খুব সহেজ কােনা একটা শ খুেজ পাওয়া যায়। একটা উপায় হেলা শ েলােক সট কের
রাখা যটা কাগেজর িডকশনাির েলােত রাখা হয়, তাহেল বাইনাির সাচ কেরই আমরা কােনা একটা শ খুেজ বর করেত পারেবা। আেরকটা উপায় হেলা ি িফ ি বা
সংে েপ াই(trie) ব বহার করা। trie শ টা এেসেছ “retrieval” শ টা থেক। সই িহসােব এটার উ ারণ “ি ” হওয়ার কথা িক াফ িথওরীেত ি এর আেরা
ব পক ব বহার আেছ তাই এটােক বলা হয় “ াই” । ি িফ মােন হেলা একটা ি ং এর থেক কেয়কটা ক ােরকটার িনেয় নতুন ি ং তির করা। যমন blog এর
ি িফ হেলা b,bl,blo এবং blog।

েত আমােদর একটা ট নাড ছাড়া িকছুই নই।

এখন আমরা algo শ টােক যাগ করেবা। িনেচর ছিবেত দেখা িকভােব শ টা যাগ করা হেয়েছ। ট নাড থেক আমরা একটা এজ িদেবা যই এজ এর নাম হেব “a”।
তারপর নতুন তির হওয়া নাড থেক “l” নােমর একটা এজ তির করেবা। এভােব “g” আর “o” এজ ইটাও তির করেবা। ল কেরা নােড আমরা কােনা তথ
রাখিছনা, খািল নাড থেক এজ বর করিছ।

এখন আমরা algea শ টা যাগ করেত চাই। ট থেক “a” নােমর এজ দরকার, সটা অলেরিড
আেছ, নতুন কের যাগ করা দরকার নাই। িঠক সরকম a থেক l এবং l থেক g তও এজ আেছ।
তারমােন “alg” অলেরিড াই ত আেছ, আমরা ধু e আর a যাগ করেবা।

also শ টােক যাগ করেবা এবার। ট থেক “al” ি িফ এরইমেধ আেছ, ধু “so” যাগ করেত
হেব।

এবার “tom” যাগ কির। এবার ট থেক নতুন এজ তির করেত হেব কারণ tom এর কােনা ি িফ
আেগ যাগ করা হয়িন।

এখন “to” শ টা যাগ করেবা িকভােব? “to” পুেরাপুির tom এর ি িফ তাই নতুন কােনা এজ যাগ করা দরকার নাই। আমরা য কাজটা করেত পাির সটা বেল
নাড েলােত িকছু এ -মাক বসােনা। যসব নােড এেস অ ত একটা শ কমি ট হেয়েছ সসব নােড আমরা এ মাক বিসেয় দই, ছিবেত ধূসর রঙ িদেয় এ মাক
1/5
বাঝােনা হেয়েছ। আেগর সব শে র জন এবং সই সােথ নতুন শ “to” এর জন এ মাক বসােল াইটা এরকম দখােব:

িন য়ই বুঝেত পারেছা এ মাক েলা কন বিসেয়িছ। মাক দেখ সহেজই বাঝা যাে কান কান শ
াইেত আেছ। কান ক ােরকটার িনি সই তথ থাকেব এজ এ, আর এ মাক েলা থাকেব নাড এ।

এভােব শ েলা রাখার সুিবধা িক? ধেরা তামােক বলা হেলা “alice” শ টা িডকশনািরেত আেছ িকনা
বলেত। তুিম থেক াই ধের আগােত থােকা। থেম দেখা ট থেক a নােমর এজ আেছ নািক,
তারপর চক কেরা a থেক l নােমর এজ আেছ নািক। এরপের l থেক i নােমর এজ খুেজ পাওয়া যাে না,
তাই বলেত পােরা alice শ টা নই।

“alg” শ টা খুজেত িদেল তুিম root->a, a->l এবং l->g এজ েলা সবই খুেজ পােব, িক শষ পয
কােনা ধূসর নােড যেত পারেবনা, তারমােন alg ও িডকশনািরেত নই। “tom” খুজেত গেল তুিম একটা
ধূসর নােড িগেয় শষ করেব তাই শ টা িডকশনািরেত আেছ।

াই ইমি েম করার সহজ একটা উপায় হেলা িলংকড িল ব বহার করা। িলংকড িল , পেয় ার এসব েন
ভেয়র িকছুই নই, তুিম যিদ িলংকিল ব বহার করেত অভ নাও হও আশা কির এই ইমি েমে শনটা দেখ
িশেখ ফলেত পারেব।আমােদর িতটা নােড ২িট িজিনস থাকেব:

১. এ -মাক রাখার জন একটা ভ ািরেয়বল।

২. িতটা নাড থেক a,b,c,……..,x,y,z ইত ািদ নােমর এজ তির হেত পাের। আমরা িতটা
ক াের ােরর জন একটা পেয় ার রাখেবা। পেয় ােরর সাহােয একটা নাড আেরকটার সােথ যাগ হেব। a
নােমর পেয় ার িদেয় যাগ হেল বুঝেত হেব কাের নাড থেক a নােমর একটা এজ আেছ। েত সব েলা
পেয় ার “নাল” থাকেব।

আমরা থেমই নাডটা তির কের ফিল:

C++

1 struct node {
2 bool endmark;
3 node* next[26 + 1];
4 node()
5 {
6 endmark = false;
7 for (int i = 0; i < 26; i++)
8 next[i] = NULL;
9 }
10 } * root;
11 int main()
12 {
13 root = new node();
14 return 0;
15 }

next[]next[] অ ােরর িতটা এিলেম আেরকটা নাডেক পেয় কের। next[0]next[0] িদেয় নতুন নাডেক পেয় করা হেল সই এজ এর নাম “ aa”,
next[1]next[1] এর জন এজ এর নাম “ bb”, next[25]next[25] এর জন “zz”। েত সব েলা পেয় ার নাল। ল কেরা নােডর িভতর একটা কন া র
“node()” তির কেরিছ। যখনই নতুন নাড তিরর জন new node()new node() কল করেবা তখনই ভ ািরেয়বল েলােক শূ ন বা নাল বািনেয় িদেব। এটা না
িদেল গােবজ ভ ালু থাকেতা। rootroot ভ ািরেয়বলটা হেলা আমােদর ট নাড, উপেরর ছিব েলােত লাল রঙ এর নাড। আসেল ট একটা পেয় ার, যখন
root=new node();root=new node(); লাইনটা এি িকউট হেব তখনই একটা নতুন নাড তির কের rootroot য মমির অ াে সেক পেয় কের সখােন
অ াসাইন কের দয়া হেব। এটােক একটু গালভরা ভাষায় বেল instanceinstance তির করা। এবার আমােদর একটা ফাংশন লাগেব নতুন শ াইেত যাগ করার
জন :

2/5
C++

1 void insert(char* str, int len)


2 {
3 node* curr = root;
4 for (int i = 0; i < len; i++) {
5 int id = str[i] - 'a';
6 if (curr->next[id] == NULL)
7 curr->next[id] = new node();
8 curr = curr->next[id];
9 }
10 curr->endmark = 1;
11 }

ট ভ ািরেয়বলটা আমােদর সবসময় দরকার হেব তাই “curr” এর মেধ সটার কিপ
তির কের কাজ কির। যেহতু পেয় ার িনেয় কাজ করিছ তাই ট থেক নতুন এজ তির করা আর “curr” থেক নতুন এজ তির করা একই কথা। আমরা এখন ধু a-z
িনেয় কাজ করিছ, তাই অ াসিক ভ ালু েলােক 0-25 এ কনভাট কের িনেবা ‘a’ এর অ াসিক ভ ালু িবেয়াগ কের। insert করা খুব সহজ, আমরা ধু চক করেবা কাের
নাড (curr) থেক বতমােন য ক ােরকটাের আিছ সই নােমর কােনা এজ আেছ নািক, না থাকেল নতুন নাড তির করেত হেব। এরপের সই এজ ধের আমরা পেরর
নােড যােবা। সবার শষ নাডটায় এ -মাক true কের িদেবা।

ইনসাট করার পর এখন সাচ করেবা। এটা আসেল িঠক ইনসাট এর মেতাই। পাথক হেলা য এজটা দরকার সটা না থাকেল তির কের িনি লাম, এখন এজ না থাকেল
false িরটাণ কের িদেবা।

C++

1 bool search(char* str, int len)


2 {
3 node* curr = root;
4 for (int i = 0; i < len; i++) {
5 int id = str[i] - 'a';
6 if (curr->next[id] == NULL)
7 return false;
8 curr = curr->next[id];
9 }
10 return curr->endmark;
11 }

ল কেরা সবকাজ ইনসাট এর মেতাই কেরিছ। সবার শেষ লা নাডটার এ মাক িরটাণ কের িদেয়িছ। এ মাক true হেল শ টা আেছ, false হেল নাই।

আমােদর মূল কাড শষ। আমরা এখন যেকােনা শ াইেত যাগ করেত পারেবা, আবার াই থেক কােনা শ খুজেত পারেবা। অেনক সময় িতটা ট েকস এর জন
াই তির করেত গেল মমির িলিমট িনেয় সমস া হয়। তাই িনরাপদ উপায় হেলা িত কস এর পর ব ব ত মমির- সল েলােক িডিলট কের দয়া। ধু root িডিলট
করেল হেবনা, িতটা নাড করেত হেব। আমরা স জন একটা িরকািসভ ফাংশন িলখেত পাির:

C++

1 void del(node* cur)


2 {
3 for (int i = 0; i < 26; i++)
4 if (cur->next[i])
5 del(cur->next[i]);
6 delete (cur);
7 }

এই ফাংশনটা িতটা নােড িগেয় আেগ চাই েলােক িডিলট কের এেস তারপর নাডটােক িডিলট কের িদেব।

3/5
স ূণ কাডটা এরকম:

C++

1 struct node {
2 bool endmark;
3 node* next[26 + 1];
4 node()
5 {
6 endmark = false;
7 for (int i = 0; i < 26; i++)
8 next[i] = NULL;
9 }
10 } * root;
11 void insert(char* str, int len)
12 {
13 node* curr = root;
14 for (int i = 0; i < len; i++) {
15 int id = str[i] - 'a';
16 if (curr->next[id] == NULL)
17 curr->next[id] = new node();
18 curr = curr->next[id];
19 }
20 curr->endmark = true;
21 }
22 bool search(char* str, int len)
23 {
24 node* curr = root;
25 for (int i = 0; i < len; i++) {
26 int id = str[i] - 'a';
27 if (curr->next[id] == NULL)
28 return false;
29 curr = curr->next[id];
30 }
31 return curr->endmark;
32 }
33 void del(node* cur)
34 {
35 for (int i = 0; i < 26; i++)
36 if (cur->next[i])
37 del(cur->next[i]);
38
39 delete (cur);
40 }
41 int main()
42 {
43
44 puts("ENTER NUMBER OF WORDS");
45 root = new node();
46 int num_word;
47 cin >> num_word;
48 for (int i = 1; i <= num_word; i++) {
49 char str[50];
50 scanf("%s", str);
51 insert(str, strlen(str));
52 }
53 puts("ENTER NUMBER OF QUERY";);
54 int query;
55 cin >> query;
4/5
56 for (int i = 1; i <= query; i++) {
57 char str[50];
58 scanf("%s", str);
59 if (search(str, strlen(str)))
60 puts("FOUND");
61 else
62 puts("NOT FOUND");
63 }
64 del(root); // াইটা ংস কের িদলাম
65 return 0;
66 }

কমে ি িট: িতটা শ খুজেত লুপ চালােত হে শ টার লংথ পয , সািচং এর কমে ি িট O(length)। িতটা শ ইনসাট করার কমে ি িটও একই। মমির
কতখািন লাগেব সটা িডেপ কের ইমি েমে শন এবং শ েলার ি িফ কতখািন ম াচ কের তার উপর। উপেরর ইমি েমে শন িদেয় ায় 10^6 টা ক ােরকটার াইেত
ইনসাট করা যােব (10^6 টা ওয়াড নয়, ক ােরকটার বা লটার)।

তুিম চাইেল াই িলংকিল ছাড়া সাধারণ অ াের ব বহার কের ইমি েম করেত পােরা, িনেজ চ া কেরা!

াই এর িকছু ব বহার:

১. একটা িডকশনািরেত অেনক েলা শ আেছ, কােনা একটা শ আেছ নািক নাই খুেজ বর করেত হেব। এই বেলমটা আমরা উপেরর কােডই সলভ কেরিছ।

২. ধেরা তামার ৩ ব ু র টিলেফান ন র হেলা “৫৬৭৮”, “৪৩২২”, “৫৬৭”। তুিম যখন থম ব ু েক ডায়াল করেব তখন ৫৬৭ চাপার সােথ সােথ ৩য় ব ু র কােছ ফান চেল
যােব কারণ ৩য় ব ু র না ার থম জেনর ি িফ ! অেনক েলা ফান ন র দয়া আেছ, বলেত হেব এরকম কােনা ন র আেছ নািক যটা অন ন েরর ি িফ । (UVA
11362)।

৩. একটা িডকশনািরেত অেনক েলা শ আেছ। এখন কােনা একটা শ কয়বার “prefix” িহসােব এেসেছ সটা বর করেত হেব। যমন “al” শ টা উপেরর
িডকশনািরেত ৩বার ি িফ িহসােব এেসেছ (algo, algea, also এই সব েলা শে র ি িফ “al”)। এটা বর করার জন িতটা নােড একটা কাউ ার ভ ািরেয়বল
রাখেত হেব, কােনা নােড যতবার যােব ততবার কাউ ােরর মান বািড়েয় িদেব। সাচ করার সময় ি িফ টা খুেজ বর কের কাউ ােরর মান দখেব।

৪. মাবাইেলর ফানবুেক সাচ করার সময় তুিম যখন কেয়কটা লটার িলেখা তখন সই ি িফ িদেয় িক িক নাম হেয়েছ স েলা সােজশন বে দখায়। এটা তুিম াই
িদেয় ইমি েম করেত পারেব?

৪. ◌্িট ি ং এর “longest common substring” বর করেত হেব। (subsequence হেল িডিপ িদেয় সহেজ করা যায়, এখােন substring চেয়িছ)।
(িহ স: একটা ি ং এর শষ থেক এক বা একািধক ক ােরকটার নয়া হেল সটােক ি ংটার সািফ বেল, যমন blog এর সািফ g,og,log,blog। আর িতটা
substring ই িক কােনা না কােনা সািফ এর ি িফ !! তাই সব েলা সািফ েক াইেত ইনসাট করেল কাজটা সহজ হেয় যায়!)

৫. (অ াডভা ড) স বত ২০১১ ত ডেফািডল ইউিনভািসিটর ন াশনাল কনেটে এেসিছেলা বেলমটা। একটা িডকশনাির ইনপুট দয়া থাকেব। িতবার িডকশনািরর ২টা
শ কুেয়ির িদেব, বলেত হেব তােদর মেধ common prefix এর দঘ কত। যমন algo আর algea এর কমন ি িফ alg, দঘ ৩। াইেত িডকশনািরেত
ইনসাট কের িত কুেয়িরেত শ িট এ -মাক থেক LCA(lowest common ancestor) বর কের বেলমটা সলভ করা যায়।

িকছু বেলম:
UVA 10226
(UVA 11362 Phonebook)
UVA 11488 Hyper prefix sets
POJ 2001 Shortest Prefix
POJ 1056

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
ডাটা াকচার: সগেম ি -১
shafaetsplanet.com /planetcoding/

শাফােয়ত জুনe ১১,


২০১৩

তুিম হয়েতা এরকম বেলম কনেটে দেখছ, একিট ইি জার অ াের দয়া আেছ আর অেনক েলা কুেয়ির দয়া আেছ। িতটা কুেয়িরেত বেলেছ একটা রে র মেধ
সব েলা সংখ ার যাগফল বলেত। অ ােরর সাইজ ১০^৫, কুেয়িরর সংখ াও ১০^৫! বুঝেতই পারেছা িত কুেয়িরেত লুপ চািলেয় যাগফল বর করেত পারেবনা। িকভােব
বেলমিট সলভ করেব?

এটা সিলউশন খুব সহজ, তামােক িকউমুেলিটভ সাম রাখেত হেব। ধেরা একিট অ াের আেছ sum[MAX], তাহেল sum[i] ত রাখেব ১ থেক i ন র ইনেড পয
সব েলা সংখ ার যাগফল। i থেক j পয যাগফল বর করেত িদেল(i<=j) sum[j]-sum[i-1] হেব তামার উ র। বুঝেত না পারেল িনেচর উদাহরণটা দেখা:

ইনপুট:
arr[]={4, -9, 3, 7, 1, 0, 2}

cumulative sum বর করেবা:


sum[0]=0;
(for i=1;i<=n;i++) sum[i]=sum[i-1]+arr[i];

তাহেল cumulative sum হেব:


sum[] ={4, -5, -2, 5, 6, 6, 8}

এটা একদম বা ােদর কাজ, তুিম ৫িমিনেট কাড কের ফলেত পারেব। িক বেলমেসটার তামােক িবপেদ ফলেত বলেলা কুেয়িরর করার মােঝ মােঝ অ ােরিট বদেল দয়া
হেব!! মােঝ মােঝ তামােক বলেব i-তম ইনেডে র সংখ ািটেক x বািনেয় িদেত, আবার আেগর মেতা যাগফলও বলেত বলেব। এখন িক করেব?

এবার আর িকউমুেলিটভ সাম িদেয় কাজ হেবনা, তামার দরকার হেব সগেম ি নােমর একটা ডাটা াকচার। ইউিনভািসিটেত ডাটা াকচার কােস তামােক এটা
পড়ােবনা, িক এটা ব বহার কের অেনক কাজ করা যায়।

1/8
পেরর অংেশ যাবার আেগ তামার িকছু িজিনস স েক ধারণা পির ার থাকেত হেব। িরকাশন স েক কােনা রকম অ তা থাকেল আপাতত সামেন না আগােনাই ভােলা।
এছাড়া তুিম যিদ মাজ সট স েক জােনা তাহেল সগেমি বাঝা তামার জন খুব সহজ হেয় যােব। এছাড়া ি স েক যিদ িকছুই না জােনা তাহেল সগেম ি এখনই
শখা িক িঠক হেব? িঠক মাজ সেটর মেতা সগেমি ি ও “িডভাইড এ কনেকায়ার” প িতেত কাজ কের।

িডভাইড এ কনেকায়ার প িতর মূল কথা হেলা একটা বেলমেক ভেঙ ছােটা ছােটা অংশ বানাও, আেগ সই ছাট অংশ সলভ কেরা এবং ছােটা অংেশর সিলউশন থেক
বড় অংেশর সিলউশন বর কেরা। আমরা তাই অ ােরটােক ২টা অংেশ ভাগ কের ফলেবা এবং ইটা ভােগর যাগফল আলাদা কের বর করেবা।

তুিম যিদ বাম আর ডান পােশর ভােগর যাগফল আলাদা কের বর করেত পােরা তাহেল খুব সহেজই বড় অংশটার যাগফল বর করেত পারেব। আিম বলার আেগই বুঝেত
পারেছা এরপের িক করেবা। ছােটা অ াের েলােক আেরা টুকরা করেবা যত ণনা ১ সাইেজর টুকরা পাই। ১ সাইেজর টুকেরার যাগফল আমরা জািন, সখান থেক
বড় েলার যাগফল বর কের ফলেবা।

2/8
ছিবটা দখেত িবদঘুেট হেলও িজিনসটা খুবই সহজ। আমরা অ ােরটােক ভাঙেত ভাঙেত ছাট কের ফেলিছ, সবেথেক ছাট অংেশর(িলফ নাড) যাগফল আমরা জািন,
সখান থেক বড় েলা সহেজই বর করেত পারেবা বাম এবং ডােনর অংশ যাগ কের।

ছিবটায় িতটা সগেম েক যিদ একটা নাড ধির তাহেল একটা ি তির হেয় িগেয়েছ, িতটা নােড আেছ একটা অংশ বা রে র যাগফল। এটার নামই সগেম ি ।
এখন তামার মেন হেত পাের এই িজিনস িদেয় িকভােব i থেক j অংেশর যাগফল বর করেব কারণ আমরােতা ভাঙিছ স ূণ অ ােরটা আর সবেশেষ পাি সবটুকুর
যাগফল। িকছু েণর মেধ এটার উ র পােব। আমরা ি টােক একটু অন ভােব দিখ:

খয়াল কের দেখা আেগর ি টাই এেকিছ িক এবার সগেম েলা পুেরাটা না দিখেয় ধু র টা িলেখিছ। যমন ৩ ন র নােড আেছ ৫ থেক ৭ ইনেডে র সব েলার
3/8
যাগফল। নােডর না ািরং টা পূ ণ। ট নাড হেব ১, তার বােমর নাড হেব ১*২=২, এবং ডােনর নাড হেব (১*২+১)=৩। অথাৎ ট x হেল বােমরটা হেব 2x
এবং ডােনরটা 2x+1। বাইনাির ি অ ােরেত ার করার জন সুিবধাজনক প িত এটা।

এখন আেগ দিখ িকভােব এই াকচারটা তির করেবা। িনেচর কাডিট দেখা, ব াখ া আেছ কােডর িনেচ:

1 #define mx 100001
2 int arr[mx];
3 int tree[mx * 3];
4 void init(int node, int b, int e)
5 {
6 if (b == e) {
7 tree[node] = arr[b];
8 return;
9 }
10 int Left = node * 2;
11 int Right = node * 2 + 1;
12 int mid = (b + e) / 2;
13 init(Left, b, mid);
14 init(Right, mid + 1, e);
15 tree[node] = tree[Left] + tree[Right];
16 }
17 int main()
18 {
19 //READ("in");
20 int n;
21 cin >> n
22 repl(i, n) cin
23 >> arr[i];
24 init(1, 1, n);
25
26 return 0;
27 }

tree[] অ ােরেত আমরা ি টােক ার করেবা। ি অ ােরর সাইজ হেব ইনপুট অ ােরর ৩ ণ( কন??)। init ফাংশনিট arr অ াের থেক ি তির কের িদেব। init এর
প ারািমটার হেলা node,b,e, এখােন node=বতমােন কান নােড আিছ এবং b,e হেলা বতমােন কান রে আিছ। েত আমরা নাড ১ এ থাকেবা এবং ১-৭ রে
থাকেবা(ি এর ছিবটা দেখা)।

যিদ (b==e) হেয় যায় তাহেল আমরা শষ নােড পৗেছ গিছ, এখােন যাগফল হেব অ ােরেত য ভ ালু আেছ সটাই, সটােক ি েত ার কের িরটাণ কের িদলাম। যিদ
(b==e) না হয় তাহেল অ ােরটা ক ই ভােগ ভাগ করেত হেব। বাম পােশর নােডর ইনেড হেব node*2 এবং ডান পােশরটা node*2+1। এবং অ ােরটােক
ভাঙেবা িঠক মাঝখােন। এবার িরকািসভিল ই পােশ init কল করেল বাম এবং ডান পােশর ছােটা অংেশর যাগফল বর হেয় যােব। ইপােশর কাজ শষ হেয় গেল
বতমান নােডর যাগফল হেব বাম এবং ডােনর নােডর যাগফল।
বুঝেত সমস া হেল কাডটা হােত-কলেম একবার িসমুেলট কেরা, তাহেলই পির ার হেয় যােব।

এইবার আমােদর একটা কুেয়ির ফাংশন দরকার যটা i থেক j এর মেধ সব েলা সংখ ার যাগফল বেল িদেব। ধেরা i=2 এবং j=6। তাহেল ল কেরা িনেচর হলুদ রেঙর
নাড েলার যাগফলই তামার উ র:

4/8
2-6 রে র জন হলুদ নাড েলা আমােদর িরেলেভ নাড, বািক েলা এ া। আমােদর কুেয়ির ফাংশেনর কাজ হেব ধু িরেলেভ নাড েলার যাগফল বর করা।
কাডটা init ফাংশেনর মেতাই হেব তেব িকছু কি শন অ াড করেত হেব। ধেরা তুিম এমন একটা নােড আেছা যখােন b-e রে র যাগফল আেছ। তুিম এই নাডটা
িরেলেভ িকনা সটা িকভােব বুঝেব? এখােন ৩ধরেণর ঘটনা ঘটেত পাের:

কস A: (b >= i && e <= j) এরকম হেল কাের সগেম টা পুেরাটাই i-j এর িভতের আেছ, সগেম টা িরেলেভ ।
কস B: (i > e || j < b) এরকম হেল কাের সগেম টা পুেরাটাই i-j এর বাইের আেছ, এই সগেম টা নয়ার দরকার নাই।
কস C: কস A,B সত না হেল এই সগেমে র িকছু অংশ i-j এর মেধ , সগেম টােক আেরা ভেঙ িনেচ িগেয় িরেলেভ অংশটা িনেত হেব।

তাহেল আমরা কুেয়ির ফাংশেন িত নােড িগেয় দখেবা সগেম টা িরেলেভ নািক। যিদ িরেলেভ হয় তাহেল সই নােডর যাগফল িরটাণ করেবা, যিদ বাইের চেল যায়
তাহেল ০ িরটাণ কের িদেবা, অন থায় আমরা সগেম টা আেরা ভেঙ িরেলেভ অংশ খুজেবা।

5/8
1 int query(int node, int b, int e, int i, int j)
2 {
3 if (i > e || j < b)
4 return 0; //বাইের চেল িগেয়েছ
5 if (b >= i && e <= j)
6 return tree[node]; //িরেলেভ সগেম
7 int Left = node * 2; //আেরা ভাঙেত হেব
8 int Right = node * 2 + 1;
9 int mid = (b + e) / 2;
10 int p1 = query(Left, b, mid, i, j);
11 int p2 = query(Right, mid + 1, e, i, j);
12 return p1 + p2; //বাম এবং ডান পােশর যাগফল
13 }

init ফাংশেনর মেতাই কাজ কের কুেয়ির ফাংশনটা। i,j হেলা য রে র যাগফল বর করেত হেব সটা আর b,e হেলা কাের নােড য রে র যাগফল আেছ সটা।

সবেশেষ আপেডট করা, যার জন িকউমুিলিটভ সাম ব বহার না কের ি বািনেয়িছ। তামােক বলেলা i=৩ ন র ইনেডে র ভ ালু x=১০ কের িদেত। তারমােন ি ত যই
নােড ৩-৩ রে র যাগফল আেছ সটা আপেডট কের িদেবা(িনেচর ছিবর হলুদ নাড)। নাডিটর ভ ালু আপেডট হেল পেথ যসব নাড িছেলা(নীল নাড) সব েলার
যাগফল বদেল যােব, বািক নাড েলার কােনা পিরবতন হেবনা কারণ ৩ ন র নাড স েলা রে র বাইের।

আপেডেটর কােডও খুব বিশ পাথক নই:

6/8
1 void update(int node, int b, int e, int i, int newvalue)
2 {
3 if (i > e || i < b)
4 return; //বাইের চেল িগেয়েছ
5 if (b >= i && e <= i) { //িরেলেভ সগেম
6 tree[node] = newvalue; //নতুন মান বিসেয় িদলাম
7 return;
8 }
9 int Left = node * 2; //আেরা ভাঙেত হেব
10 int Right = node * 2 + 1;
11 int mid = (b + e) / 2;
12 update(Left, b, mid, i, newvalue);
13 update(Right, mid + 1, e, i, newvalue);
14 tree[node] = tree[Left] + tree[Right];
15 }

i ন র ইনেডে আপেডট করেবা, এ া সগেম েলা েতই বাদ িদেয় িদেয়িছ। িরেলেভ সগেমে গেল নতুন মান বিসেয় িদেয়িছ, এইখােন কি শনটা if(b==e)
িলখেলও চলেতা কারণ সবসময় িলফ নােড আপেডট করিছ আমরা।

সগেম ি তা মাটামুিট এই ৩টা ফাংশন সবসময় থােক init,query,update। অেনক সময় init এর কাজটা আপেডট িদেয় কের ফলা যায়। যমন এখােন তুিম init
কল কের ি না বািনেয় িতটা নাড আলাদা কের আপেডট কের ি বানােত পারেত। ৩টা ফাংশন িমিলেয় কাডটা হেব:

1 #define mx 100001
2 int arr[mx];
3 int tree[mx * 3];
4 void init(int node, int b, int e)
5 {
6 if (b == e) {
7 tree[node] = arr[b];
8 return;
9 }
10 int Left = node * 2;
11 int Right = node * 2 + 1;
12 int mid = (b + e) / 2;
13 init(Left, b, mid);
14 init(Right, mid + 1, e);
15 tree[node] = tree[Left] + tree[Right];
16 }
17 int query(int node, int b, int e, int i, int j)
18 {
19 if (i > e || j < b)
20 return 0; //বাইের চেল িগেয়েছ
21 if (b >= i && e <= j)
22 return tree[node]; //িরেলেভ সগেম
23 int Left = node * 2; //আেরা ভাঙেত হেব
24 int Right = node * 2 + 1;
25 int mid = (b + e) / 2;
26 int p1 = query(Left, b, mid, i, j);
27 int p2 = query(Right, mid + 1, e, i, j);
28 return p1 + p2; //বাম এবং ডান পােশর যাগফল
29 }
30 void update(int node, int b, int e, int i, int newvalue)
31 {
32 if (i > e || i < b)
33 return; //বাইের চেল িগেয়েছ
34 if (b >= i && e <= i) { //িরেলেভ সগেম
35 tree[node] = newvalue;
7/8
36 return;
37 }
38 int Left = node * 2; //আেরা ভাঙেত হেব
39 int Right = node * 2 + 1;
40 int mid = (b + e) / 2;
41 update(Left, b, mid, i, newvalue);
42 update(Right, mid + 1, e, i, newvalue);
43 tree[node] = tree[Left] + tree[Right];
44 }
45 int main()
46 {
47 READ("in");
48 int n;
49 cin >> n;
50 repl(i, n)
51 cin
52 >> arr[i];
53 init(1, 1, n);
54
55 update(1, 1, n, 2, 0);
56 cout << query(1, 1, n, 1, 3) << endl;
57 update(1, 1, n, 2, 2);
58 cout << query(1, 1, n, 2, 2) << endl;
59 return 0;
60 }

সগেম ি অ ােরেক বারবার ২ভােগ ভাগ কের, ি এর গভীরতা হেব সেবা log(n) তাই িতটা কুেয়ির আর আপেডেটর কমে ি িট O(logn)। init ফাংশেন ি এর
িতটা নােডই একবার যেত হেয়েছ তাই সে ে কমে ি িট হেব ায় O(nlogn)।

সগেম ি তুিম তখনই ব বহার করেত পারেব যখন ইটা ছােটা সগেম েক একসােথ কের বড় সগেমে র ফলাফল বর করা যায়। যাগফল ছাড়াও একটা রে র মেধ
সেবা বা সবিন মান তুিম বর করেত পারেব, বামপােশর সেবা মান এবং ডানপােশর সেবা মান জানেল ট নােডরটাও বর করা যায় খুবই সহেজ।

এখােন একটা পূ ণ িজিনস বাদ পেড়েছ। ধেরা তামােক একটা ইনেডে আপেডট করেত না বেল i থেক j ইনেডে আপেডট করেত বলেলা, তাহেল িক করেব?
িতটা িলফ নােড আলাদা কের আপেডট করেল O(nlogn) হেয় যােব কমে ি িট যটা TLE িদেব। এটার জন খুবই এিলেগ একটা টকিনট আেছ যার নােম
অলস( লিজ) পােগশন! স স েক পেরর পেব জানেবা, এখন তুিম যতটুকু িশেখেছা সটা িদেয় array queries(lightoj), Multiple of 3 (SPOJ),
Frequent Values (UVA), Curious Robin Hood(lighoj) বেলমটা সলভ কেরা।

পেরর পব- লিজ পােগশন

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

8/8
অ াের কে শন
shafaetsplanet.com /planetcoding/

শাফােয়ত 12/31/2012

খুবই সহজ িক দরকাির একটা টকিনক িনেয় আেলাচনা করেবা আজেক। STL এর ম াপ ব বহার কের আমরা অ াের কে শন করেবা। মেন কেরা কােনা একটা বেলেম
তামােক বলা হেলা একিট অ ােরেত ১ লাখটা সংখ া দয়া থাকেব যােদর মান হেব ০ থেক সেবা ১০০০। এখন যেকােনা আিম একিট সংখ া বলেল তামােক বলেত হেব
অ ােরর কান কান পিজশেন সংখ ািট আেছ। যমন মেন কেরা ইনপুট অ ােরটা হেলা:

১০০২৫২১০৪৫১২

খুবই সহজ সিলউশন হেলা একিট ভ র নয়া। i তম পিজশেন x সংখ ািট পেল ভ েরর x তম পিজশেন পুশ কের রাখেব i। তাহেল ইনপুট নবার পর ভ র েলার চহারা
হেব:

[0]->1 2 7
[1]->0 6 10
[2]->3 5 11
[3]->empty
[4]->8
[5]->4 9

কান সংখ া কান কান পিজশেন আেছ তুিম পেয় গেল। এখন যিদ বেল 2 কাথায় কাথায় আেছ তাহেল তুিম ২ ন র ইনেডে লুপ চািলেয় 3,5,11 ি কের দাও।
1001 সাইেজর ২-িড ভ র িদেয়ই কাজ হেয় যােব।

এখন তামােক বলা হেলা সংখ া েলা নেগিটভও হেত পাের এবং সেবা 2^30 পয হেত পাের। এবার িক এই প িত কাজ করেব? একিট সংখ া -100 বা 2^30 হেল
তুিম সটার পিজশন লা কান ইনেডে রাখেব? অবশ ই তুিম এেতা বড় ভ র িডে য়ার করেত পারেবনা অথবা নেগিটভ ইনেড ব বহার করেত পারেবনা। ধেরা ইনপুট
এবার এরকম:

input[]={-102,1,134565589,134565589,-102,66666668,134565589,66666668,-102,1,-2}

একটা ব াপার ল কেরা, সংখ া দয়া হেব সেবা 10^5 বা ১ লাখটা। তাহেল অ ােরেত মাট িভ িভ সংখ া হেত পাের কয়টা? অবশ ই সেবা ১ লাখটা। আমরা
িতিট িভ িভ সংখ ােক ছােটা িকছু সংখ ার সােথ one-to-one ম ািপং কের ফলেবা। উপেরর অ ােরেত িভ িভ সংখ া েলা হেলা:

-102,1,134565589,66666668,-2

1/4
ইটা উপায় আেছ ম ািপং করার। একটা হেলা STL এর map ব বহার কের। map এর কাজ হেলা যেকােনা একিট সংখ া, ি ং বা অবেজ েক অন একিট মান
অ াসাইন করা যটা আমরা উপেরর ছিবেত কেরিছ। আমােদর এই বেলেম কান সংখ া কার থেক বড় বা ছােটা সটা দরকার নাই তাই সট না কেরই ম ািপং কের িদেত
পাির। িনেচর কাডটা দেখা:

C++

1 void compress()
2 {
3 map<int,int>mymap;
4 int input[]={-102,1,134565589,134565589,-102,66666668,134565589,66666668,-102,1,-2};
5 int assign=0,compressed[100],c=0,n=sizeof(input)/sizeof(int); //array size;
6 for(int i=0;i<n;i++){
7 int x=input[i];
8 if(mymap.find(x)==mymap.end()){//x not yet compressed
9 mymap[x]=assign;
10 printf("Mapping %d with %d\n",x,assign);
11 assign++;
12 }
13 x=mymap[x];
14 compressed[ c++ ]=x;
15 }
16 printf("Compressed array: ");
17 for(int i=0;i<n;i++) printf("%d ",compressed[i]);puts("");
18 }

কােডর আউটপুট হেব:

Mapping -102 with 0


Mapping 1 with 1
Mapping 134565589 with 2
Mapping 66666668 with 3
Mapping -2 with 4
2/4
Compressed array: 0 1 2 2 0 3 2 3 0 1 4

আমরা ইনপুট অ ােরেত যখনই একটু নতুন সংখ া পাি সটােক একটা ভ ালু অ াসাইন কের িদি এবং আসল ভ ালুেক ম ােপর ভ ালু িদেয় িরে স কের আেরকিট অ ােরেত
রেখ িদেয়িছ। এরপের আমরা নতুন অ ােরটা ব বহার কের বেলমটা সলভ করেত পারেবা। কুেয়িরেত যিদ বেল -2 কাথায় কাথায় আেছ বর কেরা তাহেল তুিম আসেল 4
কাথায় কাথায় আেছ বর করেব কারণ mymap[-2]=4।

অেনক সময় কমে স করার পেরও কান সংখ ািট কার থেক বড় এটা দরকার হয়। যমন তামােক বলেত পাের য একিট ভ ালু নয়ার পর ছােটা কােনা ভ ালু আর িনেত
পারেবনা। এই তথ টা িকভােব রাখেব উপেরর প িতেত ১ এর থেক -২ এ অ াসাইন করা ভ ালু বড় হেয় িগেয়েছ। যিদ তুিম সটা না চাও তাহেল আেগ িভ িভ ভ ালু েলা
আেরকটা অ ােরেত সট কের নাও।

sorted[]={-102,-2,1,66666668,134565589}

এইবার sorted অ ােরটা ব বহার কের ম ািপং কের ফেলা। এ ে আসেল য সংখ ািট sorted অ ােরেত য পিজশেন আেছ সটাই হেব তার ম াপ করা ভ ালু।
এটা যিদ বুঝেত পােরা তাহেল িন য়ই ম াপ ছাড়াই বাইনাির সাচ কের তুিম কমে স কের ফলেত পারেব অ ােরটােক। ইনপুট অ ােরর উপর লুপ চালাও, িতিট x এর জন
দেখা sorted অ ােরেত x এর অব ান কাথায়। সই মানটা তুিম আেরকটা অ ােরেত রেখ দাও:

input[]={-102,1,134565589,134565589,-102,66666668,134565589,66666668,-102,1,-2}
compressed_input[]={0,2,4,4,0,3,4,3,0,2,1}

কুেয়িরর সময়ও বাইনারী সাচ কের কমে স করার মানটা বর কের কাজ করেত হেব।
তুিম ম াপ বা বাইনাির সাচ যভােব ই া কমে স করেত পােরা। িতবার map এে স করেত logn কমে ি িট লােগ যটা বাইনারী সােচর সমান। stl এ িবিভ
class,ডাইনািমক মমিরর ব বহােরর জন map িকছুটা া, তেব টাইম িলিমট খুব tight না হেল খুব একটা সমস া হেবনা। map ব বহার করেল কািডং সহজ হয়।

কােনা কােনা াফ বেলেম নাড লা আর এজ েলা ক string িহসােব ইনপুট দয়। যমন ধেরা ােফর ৩টা এজ হেলা:

3
BAN AUS
AUS SRI
SRI BAN

map এ string কও integer িদেয় ম ািপং করা যায়। এই সুিবধাটা ব বহার কের িতিট নাডেক একিট ভ ালু অ াসাইন করেবা:

C++

3/4
1 map<string,int>mymap;
2 int edge,assign=0;
3 cin>>edge;
4 for(int i=0;i<edge;i++)
5 {
6 char s1[100],s2[100];
7 cin>>s1>>s2;
8 if(mymap.find(s1)==mymap.end()){
9 printf("Mapping %s with %d\n",s1,assign);
10 mymap[s1]=assign++;
11 }
12 if(mymap.find(s2)==mymap.end()) {
13 printf("Mapping %s with %d\n",s2,assign);
14 mymap[s2]=assign++;
15 }
16 int u=mymap[s1];
17 int v=mymap[s2];
18 cout<<"Edge: "<<u<<" "<<v<<endl;
19 }

অেনক সময় বলা হেত পাের নাড েলার মান হেব -2^30 থেক 2^30 পয িক সেবা নাড হেব ১০০০০ টা, তখন আমরা নাড েলােক একই ভােব ছােটা ভ ালু
িদেয় ম ািপং কের ফলেবা।

2-d grid ও কমে স কের ফলা যায় অেনকটা এভােব। সটা িনেয় আেরকিদন আেলাচনা করেত চ া করেবা, তেব িনেজ একটু িচ া করেলই বর করেত পারেব।

বেলম:
Drunk
Babel
A Node Too Far

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
ডাটা াকচার: সগেম ি -২ ( লিজ পােগশন)
shafaetsplanet.com /planetcoding/

শাফােয়ত জুলাই ১৮,


২০১৩

সগেম ি র সবেথেক এিলেগ অংশ হেলা লিজ পােগশন টকিনক। আমরা আেগর পেব য সগেম ি যভােব আপেডট কেরিছ তােত একটা বড় সমস া িছেলা।
আমরা একটা িনিদ ইনেড আপেডট করেত পেরিছ, িক একটা রে র মেধ সব েলা ইনেড আপেডট করেত গেলই িবপেদ পের যােবা। স কারেণই আমােদর লিজ
পােগশন িশখেত হেব, ায় সব সগেম ি বেলেমই এই টকিনকটা কােজ লাগেব। এই পবটা পড়ার আেগ অবশ ই তামােক সগেম ি র এক িট বেলম সলভ কের
আসেত হেব, এছাড়া তামার বুঝেত সমস া হেব। আেগর পেব লিজ পােগশন দরকার হয়না এমন কেয়কিট বেলম িদেয়িছ, আেগ স েলা সলভ করেত হেব।

তামােক একিট অ াের দয়া আেছ n সাইেজর এবং তামােক কুেয়ির করা হে i থেক j ইনেডে র মেধ সব েলা এিলেমে র যাগফল বলেত হেব । আর আপেডট
অপােরশেন তামােক বলা হেলা i থেক j ইনেডে র মেধ সব েলা সংখ ার সােথ একিট িনিদ সংখ া x যাগ করেত ।

যমন যিদ অ ােরটা েত হয়েতা িছেলা এরকম:

4123987

তাহেল i=3,j=5 ইনেডে র মেধ সব েলা সংখ ার সােথ ২ যাগ করেল অ ােরটা হেব:

4 1 2+2 3+2 9+2 8 7

আবার i=3,j=4 ইনেডে র মেধ সব েলা সংখ ার যাগফল হেব ২+২+৩+২=৯।

আেগর বেলেম আমরা খািল একটা ইনেড আপেডট কেরিছলাম। তখন আিম ধু ৩ ন র ইনেডে আপেডট দখােনার জন এই ছিবটা এেকিছলাম:

আমরা সগেম ি এর একদম িনেচ িগেয় ৩ যখােন আেছ সই নাডটা আপেডট কেরিছ এবং সই পেথর বািকেনাড েলােকও আপেডট কের িদেয়িছ উপের ওঠার সময়।

এখন তামােক i=১ এবং j=৪ এই রে র সবার সােথ x যাগ করেত বলা হেলা। একটা সিলউশন হেত পাের তুিম আেগর মেতা কেরই ১,২,৩,৪ ইত ািদ ইনেড আলাদা
1/5
কের আপেডট করেল। তাহেল িত আপেডেট কমে ি িট logn এবং সেবা n িট আপেডেটর জন nlogn সময় লাগেব। এটা খুব একটা ভােলা সিলউশন না, আমরা
এখােন logn এই আপেডট করেত পাির।

িকছু ডিফেনশন:
যেকােনা ি াকচাের িলফ নাড হেলা সবেথেক িনেচর নাড েলা। িলফ ছাড়া বািক সবেনাড হেলা ই ারনাল নাড।

সগেম ি ত িলফ নাড েলােত িক থােক? সখােন থােক কােনা একিট ইনেডে র অিরিজনাল ভ ালু।

সগেম ি ত ই ারনাল(িলফ ছাড়া বািক সব) নাড েলােত িক থােক? সখােন থােক িনেচ যত েলা িলফ নাড আেছ সব েলার মাজ করা ফলাফল।

সগেম ি ত একটা নােডর র হেলা সই নােড যসব ইনেডে র মাজ করা রজা আেছ। যমন ছিবেত ৩ ন র নােডর র ৫ থেক ৭।

যমন উপেরর ছিবেত ১০ ন র নােড আেছ ৩ ন র ইনেডে র ভ ালু আর ২ ন র নােড আেছ ১,২,৩,৪ ন র নােডর যাগফল। িক দরকার এত েলা িলফ নােড ক কের
িগেয় আপেডট কের আসা? তার থেক আমরা িক ২ ন র নােড এেস সখােন এই ইনফরেমশনটা রেখ িদেত পািরনা “কাের নােডর িনেচর সব েলা ইনেডে র সােথ x
যাগ হেব” ? তার মােন যখন দখিছ একটা নােডর র যখন পুেরাপুির কুেয়িরর িভতের থােক তখন সই নােডর িনেচ আর না িগেয় সখােন পােগশন ভ ালুটা সভ কের
রাখেত পাির। একটা নােডর পােগশন ভ ালু হেলা সই নােডর রে র মেধ সব ইনেডে র মেধ য ভ ালুটা যাগ হেব সটা।

িনেচর ছিবেত দেখা িকভােব এই এ া ইনফরেমশনটা সভ করা হে :

িতিট নােড যাগফল ছাড়াও আেরকটা ভ ািরেয়বল রাখেত হেব যটার নাম িদেয়িছ propagate। এই ভ ািরেয়বলটার কাজ হেলা তার িনেচর িলফ নাড েলার সােথ কত
যাগ করেত হেব তার িহসাব রাখা। propagate এর মান েত থােক শূ ন । এরপর য র টা আপেডট করেত বলেব সই রে র “িরেলেভ নাড” েলােত িগেয়
propagate এর সােথ x যাগ কের আসেবা। (আেগর পেবই জেনেছা “িরেলেভ নাড” হেলা যসব নােডর র পেরাপুির কুেয়িরর িভতের আেছ)

আেরকটা উদাহরণ, ২ থেক ৬ ন র নাড যিদ আপেডট করেত হয় তাহেল হলুদ নাড েলােত িগেয় বেল িদেবা িনেচর নাড েলার সােথ x যাগ করেত:

2/5
আেগর আপেডট ফাংশেনর মেতাই কােনা একটা নাড আপেডট করার পর সই পেথর সব েলা নাড আপেডট কের উঠেত হেব। আমরা কাডটা দিখ:

1 struct info {
2 i64 prop, sum;
3 } tree[mx * 3]; //sum ছাড়াও িনেচ অিতির কত যাগ হে সটা রাখেবা prop এ
4 void update(int node, int b, int e, int i, int j, i64 x)
5 {
6 if (i > e || j < b)
7 return;
8 if (b >= i && e <= j) // নােডর র আপেডেটর রে র িভতের
9 {
10 tree[node].sum += ((e - b + 1) * x); //িনেচ নাড আেছ e-b+1 িট, তাই e-b+1 বার x যাগ হেব এই রে
11 tree[node].prop += x; //িনেচর নাড েলার সােথ x যাগ হেব
12 return;
13 }
14 int Left = node * 2;
15 int Right = (node * 2) + 1;
16 int mid = (b + e) / 2;
17 update(Left, b, mid, i, j, x);
18 update(Right, mid + 1, e, i, j, x);
19 tree[node].sum = tree[Left].sum + tree[Right].sum + (e - b + 1) * tree[node].prop;
20 //উপের উঠার সময় পেথর নাড েলা আপেডট হেব
21 //বাম আর ডান পােশর সাম ছাড়াও যাগ হেব িনেচ অিতির যাগ হওয়া মান
22 }

আেগর আপেডট ফাংশেনর সােথ পাথক হেলা এখন একটা রে আপেডট করিছ এবং কােনা নােডর র আপেডট রে র িভতের হেল আমরা িনেচ না িগেয় বেল িদি য
িনেচর ইনেড েলােত x যাগ হেব।

এখন মেন কেরা আমরা বশ কেয়কবার আপেডট ফাংশন কল কেরিছ। নাড েলার পােগেটড ভ ালু লা আপেডট হেয় িনেচর মেতা হেয়েছ:

3/5
যসব নােডর ভ ালু িলিখিন স েলােত ণ আেছ মেন কেরা। তাহেল উপেরর ছিবর মােন হেলা ১-৪ ইনেডে র সােথ x যাগ হেব, ৫-৭ এর সােথ z যাগ হেব ইত ািদ।
এবার হেলা কুেয়ির করেবা িকভােব?

ধেরা আমােদর কুেয়িরর র হেলা ১-৩। সাধারণভােব আমরা আমােদর িরেলেভ নাড ৪ আর ১০ থেক ভ ালু িনেয় যাগ কের িদতাম। িক আমরা জািন ২ ন র নােডর
িনেচর সবার সােথ x যাগ হেয়েছ, তাই ৪ ন র নােডর িনেচর সবার সােথও x যাগ হেয়েছ! তাই আমরা ৪ ন র রে রাখা ভ ালুর সােথ যাগ কের িদেবা 2*x, কারণ ৪
ন র নােডর রে ২িট ইনেড আেছ এবং তােদর সবার সােথ x যাগ হেয়েছ। িঠক একই ভােব যেহতু ২ এবং ৫ ন র নােডর িনেচ আেছ ১০, তাই ১০ ন র নােডর
র ১িট ইনেড আেছ এবং তার সােথ যাগ হেব (x+y)।

তারমােন এটা পির ার য কুেয়ির করা সময় কােনা নােড যাবার সময় উপেরর পােগেটড ভ ালু লার যাগফল সােথ কের িনেয় যেত হেব। তাহেল কুেয়িরর ফাংশেন
carry নােমর একটা প ারািমটার যাগ কের দই যার কাজ হেব ভ ালুটা বেয় িনেয় যাওয়া:

4/5
1 int query(int node, int b, int e, int i, int j, int carry = 0)
2 {
3 if (i > e || j < b)
4 return 0;
5
6 if (b >= i and e <= j)
7 return tree[node].sum + carry * (e - b + 1); //সাম এর সােথ যাগ হেব সই রে র সােথ অিতির যত যাগ করেত বেলেছ সটা
8
9 int Left = node << 1;
10 int Right = (node << 1) + 1;
11 int mid = (b + e) >> 1;
12
13 int p1 = query(Left, b, mid, i, j, carry + tree[node].prop); // পােগট ভ ালু বেয় িনেয় যাে carry ভ ািরেয়বল
14 int p2 = query(Right, mid + 1, e, i, j, carry + tree[node].prop);
15
16 return p1 + p2;
17 }

আেগর কােডর সােথ িডফাের হে carry প ারািমটাের এবং িরটাণভ ালুেত। েত িহসাব কের রাখা sum এর সােথ যাগ হে অিতির য ভ ালু যাগ হেয়েছ
সটা।

মাটামুিট এই হেলা লিজ পােগশেনর কািহনী। সামারী করেল দাড়ায়:

১. রে র আপেডট O(logn) এ করেত চাইেল লিজ পােগশন ব বহার করেতই হেব।


২. লিজ পােগশেনর কাজ হেলা িলফ নােড আপেডট না কের আেগই কােনা নাড আপেডট রে র িভতের পড়েল সখােন বেল দয়া িনেচর
ইনেড েলা িকভােব আপেডট হেব।
৩. কুেয়ির করার সময় উপেরর নাড েলােত সভ করা পােগশন ভ ালু েলা িরেলেভ নাড ক াির কের িনেয় আসেত হেব এবং সই অনুযায়ী ভ ালু িরটাণ
করেত হেব।

অেনক সময় বেলেম বলেত পাের একটা রে র মেধ সব েলা সংখ ােক x িদেয় বদেল িদেত (x যাগ নয়), সে ে পােগশন ভ ালু িহসােব রাখেত হেব িনেচর সবেনাডেক
কান ভ ালু িদেয় বদেল িদেত হেব সটা। কুেয়ির করার সময় carry ভ ালুেতও সামান পিরবতন আসেব, িকরকম পিরবতন আসেব সটা বর করার দািয় তামার উপের
ছেড় িদলাম।

সগেম ি র মূল িটউেটািরয়াল এখােনই শষ। পরবতী কােনা পেব ২িড সগেম ি এবং িকছু বেলম িনেয় আেলাচনা করেবা। িটউেটািরয়ােলর কােনা অংশ বুঝেত
সমস া হেল ইেমইেল যাগােযাগ করেত পােরা বা আেরা ভােলা হয় ম ব অংেশ সটা জানােল।

াকিটস বেলম:
HORRIBLE
LITE
Lightoj Segment Tree Section

আেগর পব

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
লােয় কমন অ ানেস র
shafaetsplanet.com /planetcoding/

শাফােয়ত মাচ ১৩,


২০১৪

লােয় কমন অ ানেস র িজিনসটা নেত একটু কিঠন মেন হেলও িজিনসটা সহজ আর খুবই কােজর। বশ িকছু ধরেণর বেলম সলভ কের ফলা যায় এই অ ালেগািরদম
িদেয়। আমরা থেম লােয় কমন অ ানেস র বর করার টেফাস অ ালেগািরদম দখেবা, তারপর াস টিবল নােমর নতুন একটা ডাটা াকচার িশেখ কমে ি িট লগ এ
নািমেয় আনেবা।

থেমই আমরা জেন নই লােয় কমন অ ানেস র বা এল.িস.এ(LCA) িক সটা। িনেচর ছিবটা দখ :

ছিবেত k আর n নােডর প াের ধের িপেছ যেত থাকেল তারা i নােড এেস িমলেব। i হেলা k,n এর লােয় কমন অ ানেস র। ‘a’ ও ইজেনর কমন অ ানেস র
িক i হেলা ‘ লােয় ’ বা সবেথেক কাছাকািছ।

মেন কেরা ি টা িদেয় বুঝােনা হে একটা অিফেস ক কার সুপারভাইজর বা বস। a হেলা অিফেসর হড, b এবং i এর বস হেলা a, আবার c এবং f এর বস হেলা b
ইত ািদ। তাহেল লােয় কমন অ ানেস র অ ালেগািরদম িদেয় ইজন এম িয়র লােয় /সব থেক কােছর কমন বস খুেজ বর কের ফলেত পাির সহেজই।

থেম আমরা একদম নইভ একটা উপায় দিখ যটা খুব বড় ইনপুেটর জন কাজ করেবনা। মেন কির আমরা k,n এর এল.িস.এ বর করেত চাই, থেমই k এর প াের
ধের ধের উপের উেঠ সব েলা অ ানেস েরর িল কের ফিল:

k এর অ ানেস র :

j i a

n এর অ ানেস র :

m i a

ইটা িলে ই বাম থেক ডােন যেত থাকেল থম য ইটা নাড কমন পােবা সটাই হেব এল .িস.এ! এই উদাহরেণ থেম কমন পােবা i, তাই সটাই হেব এল.িস.এ। ‘a’
1/7
ও একটা কমন এনেস র িক সটা “ লােয় ” না। একটা িভিজেটড অ াের বা াগ ব বহার কের খুব সহেজই আমরা এই অ ালেগািরদম ইমি েম করেত পাির। থেম k
এর িলে যারা আেছ স েলার ইনেডে র াগ অন কের িদেবা , তারপর n এর িলে লুপ চািলেয় দখেবা াগ অন আেছ কান নােডর।

িতটা িল বানােত আমােদর সেবা n টা নাড িভিজট করা লাগেত পাের, তাই কমে ি িট O(n) ।

O(n) কমি ি িট খারাপ না যিদ আমােদর মা এক জাড়া নােডর এল.িস.এ বর করেত হয়। যিদ আমােদর m জাড়া নাড িদেয় বেল িতটা পয়ােরর এল .িস.এ বর
করেত তাহেল কমে ি িট হেয় যােব O(m*n) । এটােক আমরা চাইেল O(m*log(n)) এ সলভ করেত পাির, অথাৎ িত কুেয়ির কাজ করেব O(logn) এ। তেব তার
আেগ িকছু ি – েসিসং কের িনেত হেব।

িতটা নােডর জন আমরা সভ কের রাখেবা নাডটার:

থম প াের বা ২^০ তম প াের

২য় প াের বা ২^১ তম প াের

৪থ প াের বা ২^২ তম প াের

৮ম প াের বা ২^৩ তম প াের

যিদ K-তম প াের বলেত িকছু না থােক তাহেল আমরা –১ রেখ িদেবা। যমন ট নােডর থম প াের বলেত িকছু নই, তাই থম প াের হেব –১।

তাহেল উপেরর ি এর জন িনেচর মেতা একটা ২ –িডেমনশনাল টিবল তির হেব:

নাড ২^০ তম প াের ২^১ তম প াের ২^২ তম প াের

০ –১ –১ –১

১ ০ –১ –১

২ ০ –১ –১

৩ ০ –১ –১

৪ ২ ০ –১

৫ ৪ ২ –১

৬ ৫ ৪ ০

৭ ৫ ৪ ০

৮ ০ –১ –১

2/7
তাহেল উপেরর ি এর জন িনেচর মেতা একটা ২ –িডেমনশনাল টিবল তির হেব:

এই টিবলটােক বেল াস টিবল। এই টিবলটা তির কের িক লাভ হেলা? এখন তুিম কােনা নােডর k তম প াের খুব সহেজই খুেজ বর করেত পারেব। যমন কােরা
২৫ তম প াের দরকার হেল থেম ২৫ এর িনেচ ২ এর সবেথেক বড় পাওয়ার ২^৪=১৬ তম প াের খুেজ বর করেব। তারপর ১৬তম প ােরে র (২৫–১৬)=৯তম প াের
খুেজ বর করেব একই প িতেত! িতটা সংখ ােক ২ এর পাওয়ােরর যাগফল িহসােব কাশ করা যায় সটারই সুিবধা িনি আমরা। এভােব কের O(logn) কমে ি িটেত
আমরা কােরা k তম প াের বর করেত পারেবা যটা পরবতীেত LCA বর করেত কােজ লাগেব।

এখন কথা হেলা উপেরর টিবলটা বানােবা িকভােব? ২^০ তম প াের বর করা সহজ, ি এর উপর একটা ডপথ–ফা –সাচ বা থড–ফা –সাচ চািলেয় একটা অ ােরেত
সভ কের রাখেবা কার প াের ক। মেন কির অ ােরটা হেলা T। তাহেল উপেরর ি এর জন পােবা T[০]=-১, T[১]=০,T[৬]=৫ ইত ািদ।

এবার আমরা কলাম–বাই–কলাম টিবলটা ভরাট করেবা। থেমই থম কলাম ভরাট করেবা যটা আসেল T অ ােরর সমান।

টিবলটা নাম P হেল থম কলাম ভরাট করেবা এভােব,

1 for (i = 0; i < N; i++)


2 P[i][0] = T[i];

এখন িচ া কের দেখা একটা নােডর ২^৪=১৬ তম প াের হেলা নাডটার ২^৩=৮ম প ােরে র ২^৩=৮ম প াের । তাহেল কান নােডর 2^j তম প াের হেব নাডটার
2^(j-1) তম প ােরে র 2^(j-1) তম প াের ! তাহেল যেকান নাড i এর জন :

P[i][j]=P[P[i][j – 1]][j – 1] যখােন P[i][j – 1] হেলা j-1 তম প াের ।

তাহেল পুেরা টিবলটা ভরাট কের ফলেত পাির এভােব:

1 for (j = 1; (1 << j) < N; j++)


2 for (i = 0; i < N; i++)
3 if (P[i][j - 1] != -1)
4 P[i][j] = P[P[i][j - 1]][j – 1];

2^j এর মান যিদ N এর ছাট না হয় তাহেল নতুন কােনা প াের পাবার স াবনা নই, তাই লুপ চলেব (1<<j) বা 2^j যত ণ N এর ছাট হেব।

এখন আমরা িট নােডর এল.িস.এ বর করেবা। আমােদর আেরকটা অিতির অ াের লাগেব L[] যখােন থাকেব িতটা নােডর ডপথ বা লেভল। ট নােডর লেভল
হেব ০।

3/7
এখন আমরা হলুদ নাড ইটার এল.িস.এ বর করেত চাই:

থম কাজ হেব এেদরেক একই লেভেল িনেয় আসা। p এর লেভল থেক ২


এর পাওয়ার িবেয়াগ করেত থাকেবা এবং একই সােথ াস টিবল ব বহার কের
উপের উঠােত থাকেবা যত ণনা q এর লেভেলর সমান হয়।

1 for (i = log; i >= 0; i--)


2 if (L[p] - (1 << i) >= L[q]) //2^i তম প ােরে যাও
3 p = P[p][i];

এখন ইজন সমান লেভেল আসেলা। এবার কাজ হেব ইটা নাডেকও টেন
একসােথ উপের উঠােনা যত না নাড িটর প াের একসােথ এেস িমেল:

কাডটা হেব এরকম:

1 for (i = log; i >= 0; i--)


2 if (P[p][i] != -1 && P[p][i] != P[q][i])
3 p = P[p][i], q = P[q][i];

আমরা এমন জায়গায় p,q ক আনিছ যখােন তােদর ইজেনরই প াের


একই। তাহেল এখন p বা q এর প াের ই হেব এল.িস.এ।

C++

1 return T[p];

আমরা যিদ লুেপর মেধ ই ২ আর ৮ না ার নাডেক p,q ত না এেন িডের ১ ন র নােড


আনার চ া করতাম তাহেল িক ঘটেত পারেতা? P[p][i] != P[q][i] এই শতটা না
থাকেল িক হত? এটা িচ া করা তামার কাজ ।

কমে ি িট:

াস টিবেল রা থাকেব n টা, িতটা রা ত logn টা কলাম থাকেব, ি – ােসিসং


কমে ি িট O(nlogn)।

িত কুেয়িরেত কমে ি িট O(logn)

িরেলেটড বেলম:

১. একটা ওেয়েটড ি দয়া আেছ। িট নাড িদেয় বলা হেলা তােদর মেধ র দূর বর
করেত হেব। (Spoj QTree)

২. একটা ওেয়েটড ি দয়া আেছ। িট নাড িদেয় বলা হেলা তােদর মধ কার পােথর সেবা ওেয়েটর এজ এর মান বলেত হেব। (LOJ A Secret Mission)

সিলউশন ১: েত িডএফস চািলেয় ট থেক িতটা নােডর দূর সভ কের রােখা। এখন নাড ইটা a,b এবং তােদর কমন অ ানেস র L হেল সিলউশন হেব
4/7
dist(root,a)+dist(root,b)-2*dist(root,L)।

সিলউশন ২: াস টিবেল অিতির একটা ইনফরেমশন রাখেত হেব। িতটা নাড


থেক 2^0, 2^1, 2^2 ইত ািদ তম প ােরে র জন , প াের থেক ওই নােডর
মধ কার পােথর সেবা ওেয়েটর এেজর মান সভ কের রাখেত হেব। িব ািরত
িলখলাম, এটা সলভ করা তামার কাজ।

আেরা িকছু বেলম:

TJU Closest Common Ancestors


UVA Flea Circus
LightOJ LCA Category

িরেসাস:

এল.িস.এ বর করার আেরা িকছু প িত আেছ য েলা পােব এখােন। এ েলা ছাড়াও
টারজােনর একটা অফলাইন অ ালেগািরদম আেছ যটা আেগ সব কুেয়ির ইনপুট িনেয়
একিট িডএফস চািলেয় সব েলা পয়ােরর এল.িস.এ বর কের দয়।

স ূণ কাড:

ভ র g ত ি সভ করেত হেব। থেম dfs ফাংশন কল কের লেভল,প াের


িফ ড কের তারপর lca_init কল কের ি েসিসং করেত হেব।

//LCA using sparse table

//Complexity: O(NlgN,lgN)

#define mx 100002

int L[mx]; // লেভল

int P[mx][22]; // াস টিবল

int T[mx]; //প াের

vector<int>g[mx];

void dfs(int from,int u,int dep)

T[u]=from;

L[u]=dep;

for(int i=0;i<(int)g[u].size();i++)

int v=g[u][i];

if(v==from) continue;

dfs(u,v,dep+1);

5/7
}

int lca_query(int N, int p, int q) //N= নাড সংখ া

int tmp, log, i;

if (L[p] < L[q])

tmp = p, p = q, q = tmp;

log=1;

while(1) {

int next=log+1;

if((1<<next)>L[p])break;

log++;

for (i = log; i >= 0; i--)

if (L[p] - (1 << i) >= L[q])

p = P[p][i];

if (p == q)

return p;

for (i = log; i >= 0; i--)

if (P[p][i] != -1 && P[p][i] != P[q][i])

p = P[p][i], q = P[q][i];

return T[p];

void lca_init(int N)

memset (P,-1,sizeof(P)); // েত সব েলা ঘের -১ থাকেব

int i, j;

6/7
for (i = 0; i < N; i++)

P[i][0] = T[i];

for (j = 1; 1 << j < N; j++)

for (i = 0; i < N; i++)

if (P[i][j - 1] != -1)

P[i][j] = P[P[i][j - 1]][j - 1];

int main(void) {

g[0].pb(1);

g[0].pb(2);

g[2].pb(3);

g[2].pb(4);

dfs(0, 0, 0);

lca_init(5);

printf( "%d\n", lca_query(5,3,4) );

return 0;

view raw LCA hosted with by GitHub

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

7/7
ডাটা াকচার: বাইনাির ইনেড ড ি
shafaetsplanet.com /planetcoding/

শাফােয়ত আগ ১৯,
২০১৪

বাইনাির ইনেড ি খুবই চমৎকার একটা ডাটা াকচার যার সবেথেক ভােলা িদক হেলা কেয়ক িমিনেটই কাড িলেখ ফলা যায়। আর খারাপ িদক হেলা িভতের িক হে
বুঝেত একটু ক হয়, তেব তুিম লখাটা মনেযাগ িদেয় পড়েল আিম িনি ত কান সমস◌্যা হেব না। বাইনাির ইনেড ড ি বা BIT এর আেরক নাম হেলা
ফনউইক(fenwick) ি । এই লখাটা পড়ার আেগ তামােক িবটওয়াইজ অপােরশন েলা(AND,OR ইত◌্যািদ) স েক ভােলা জানেত হেব।

আমরা একটা সহজ সমস◌্যা সমাধান করেত করেত বাইনাির ইনেড ি স েক জানব। এই লখায় আমরা ধের িনব অ◌্যােরর ইনেড ১ থেক , BIT িকভােব
কাজ কের জানার পের বুঝেত পারেব এটা কন পূ ণ। তামােক একটা অ◌্যাের দয়া হেলা যার িতিট পিজশেন ০ আেছ। এখন তামােক অেনক েলা অপােরশন দয়া
হেব। িতটা অপােরশন হেত পাের িনেচর যেকান একটা:

* ii তম ইনেডে xx স ংখ ্যাটা যাগ কর।


* 11 থেক ii তম ইনেডে র সাবঅ ্যােরর মাট যাগফল বল।

একদম ‘ নইভ(Naive)’ উপােয় করেল আমরা O(1)O(1) এ িত পিজশেন xx যাগ করব আর লুপ চািলেয় O(n)O(n) এ যাগফল বর করব। BIT িদেয় যাগফল
O(logn) এ বর করা স ব, তেব সে ে আপেডট অপােরশনও O(log×n)O(log×n) এ করেত হেব।

আমরা জািন িতটা সংখ◌্যােকই িকছু ২ এর পাওয়ােরর যাগফল িহসােব লখা যায়। যমন ১৩ এর বাইনাির হেলা “১১০১”, বাইনািরেত ১ আেছ ০তম, ২য় এবং ৩য়
অব ােন। তাহেল ১৩ ক লখা যায় ২^০+২^২+২^৩ বা ১+৪+৮। বাইনাির ইনেড ি ত আমরা এই াপািটটা ব◌্যবহার কের িকছু কাজ করব। য সংখ◌্যাটা
অ◌্যােরেত যাগ করিছ সটােক নয় বরং আমরা অ◌্যােরর ইনেড েলােক ২ এর পাওয়াের যাগফল িহসােব িলেখ িকছু কাজ করব।

11 থেক ii পয অ◌্যােরর সামেক আমরা অ◌্যােরর িকছু সগেমে র যাগফল িহসােব িলখেত পাির। মেন কর আমােদর একটা sum(i,j)sum(i,j) ফাংশন আেছ
যার কাজ হেলা ii থেক jj ইনেডে র মধ◌্েয অ◌্যােরর সব েলা এিলেমে র যাগফল বর করা। তাহেল ১৩ তম ইনেডে র এর জন◌্য যাগফল হেত পাের
sum(1,5)+sum(6,10)+sum(11,12)sum(1,5)+sum(6,10)+sum(11,12)। এখােন ১৩ ক আমরা ৩িট সগেমে ভাগ কেরিছ। বাইনাির
ইনেড ি ত আমরা িতিট সংখ◌্যােক িকছু সগেমে ভাগ করব। তেব উপের যভােব কেরিছ সভােব ই ামত করেল হেব না, এটা আমরা একটু বুি মােনর মত করব।
যেহতু “বাইনাির ইনেড ড ি ” ব◌্যবহার করব, তাই বুঝেত পারছ হয়ত য অ◌্যােরর ইনেড েলার বাইনাির িরে েজ শনেক ব◌্যবহার কের কান কাজ করেত হেব।

কান সংখ◌্যােক যেহতু ২এর পাওয়ােরর যাগফল িহসােব লখা যায়, তারমােন সংখ◌্যাটা থেক ২এর পাওয়ার িবেয়াগ িদেত িদেত আমরা ০ বািনেয় ফলেত পাির। ১৩
থেক এেক এেক ১, ৪ এবং ৮ বাদ িদেল আমরা পােবা:

১৩-১=১২
১২-৪=৮
৮-৮=০

তাহেল ১৩ এর জন◌্য সগেম হেব sum(1,8)+sum(9,12)+sum(13,13)sum(1,8)+sum(9,12)+sum(13,13)। আেরকটা উদাহরণ দখেল


পির ার হেব, ৬(বাইনািরেত ১১০)=২^১+২^২ এর জন◌্য একই ভােব িলখেত পাির:

৬-২=৪
৪-৪=০

এবার তাহেল ৬ এর জন◌্য সগেম হেব sum(1,4)+sum(5,6)sum(1,4)+sum(5,6)।

কাড িকভােব করব সটা এখন িচ া করা দরকার নই, তুিম ধু িচ া কর গািণিতকভােব ভাগটা িকভােব করা হে সটা তুিম বুঝেত পারছ নািক। এখন আমরা
1/6
সগেম েলা ছিবেত দখব:

ছিবেত ১ এর জন◌্য সগেম টা িচি ত করা হেয়েছ। এরপের আমরা ২এর জন◌্য করব। ২ এর জন◌্য উপেরর মত কের িলখেত পাির:

২-২=০

তাই সগেম টা হেব ১ থেক ২পয ।

এখন তামার কাজ ১৬ পয সব েলা সংখ◌্যার জন◌্য এভােব সগেম এেক ফলা। িকভােব সগেম তির হে বাঝাটা বাইনাির ইনেড ড ি এর সবেথেক দরকাির
অংশ, তাই না বুঝেল আবার ভাল কের পড়। তামার আকার সােথ িনেচর ছিবিট িমিলেয় দখ:

2/6
এই ছিব দেখই আমরা িতটা সংখ◌্যার জন◌্য সগেম েলা বেল িদেত পাির। যমন ১১ এর জন◌্য সগেম েলা হেব
(11,11),(10,9),(8,1)(11,11),(10,9),(8,1)। তুিম যিদ িনেজ বুেঝ উপেরর ছিবটা এেক থােকা তাহেল তুিম বুেঝ গছ িকভােব ছিব দেখ সগেম বর কের
ফললাম।

আমরা আেগই sum(i,j)sum(i,j) ফাংশন িডফাইন কেরিছ। িক সই ফাংশনটা ব◌্যবহার করেল আমােদরেক ii থেক jj ত লুপ চািলেয় যাগফল বর করেত হেব
যটা আমরা চাইনা। আমরা আেরকটা অ◌্যাের িডফাইন করব Tree[]Tree[]। তুিম ছিবেত দখেত পা অ◌্যােরর িতিট ইনেড একটা সাবঅ◌্যােরেক কভার
কের। যমন ১২ ন র ইনেড (৮,১২) সাবঅ◌্যােরেক কভার কের। আমরা এমন িকছু করার চ া করব যন Tree[i]Tree[i] ত ii তম ইনেড যতটুকু সাবঅ◌্যাের
কভার কের সটার যাগফল থােক। তাহেল Tree[12]Tree[12] ত সভ করা থাকেব sum(8,12)sum(8,12), আবার Tree[14]Tree[14] ত সভ
করা থাকেব sum(13,14)sum(13,14)।

এই কাজটা যিদ করেত পাির তাহেল ১১ ন র ইনেডে র জন◌্য sum(11,11)+sum(10,9)+sum(8,1)sum(11,11)+sum(10,9)+sum(8,1) বর


না কের আমরা tree[11]+tree[10]+tree[8]tree[11]+tree[10]+tree[8] বর করেলই যাগফল পেয় যােবা।

এখন ধির আমােক বলা হল ৫ ন র ইনেডে xx যাগ করেত চাই। আমােক এখন বুি মােনর মত Tree অ◌্যােরেত িকছু ইনেডে x সংখ◌্যাটা যাগ কের িদেত হেব।
আমরা থেম Tree[5]Tree[5] এ xx যাগ করব, এরপের সবেথেক ছাট সই ইনেডে করব যটা উপেরর ছিবেত ৫ ক কভার কের। সই ইনেড টা হেলা ৬,
তাহেল tree[৬] এ xx যাগ করব। এরপের ৬ ক কভার কের ৮, তাই tree[৮] এ x যাগ করব। এরপের একই ভােব tree[১৬] ত xx যাগ করব।

3/6
আমরা tree অ◌্যােরেত ছিবেত তীর িচ দয়া ইনেড েলােত xx যাগ করব। এখােন ল ◌্য করার িবষয় হেলা উপের লখা প িতেত যাগফল বর করার সময় তুিম
এই ৩টা ইনেডে র সেবা যেকান এে স করেত পারেব। যমন ১৬ ত এে স করেল সরাসির ৫,৮ ইত◌্যািদেক ি প কের সরাসির ১ এ চেল যেত হেব। এই
াপািটটা থাকার কারেণ একই আপেডট ইবার েণ ফলার স াবনা নই। আপেডট অপােরশন িঠকমত বুেঝেছা নািক পরী া করেত ৯ এর জন◌্য উপেরর মত কের
তীরিচ বসায় এবং তারপর িনেচর সমাধােনর সােথ িমিলেয় দখ:

ছিবেত ৯ থেক কের িতবার এমন ইনেডে িগেয়িছ যটা আেগর ইনেড টােক পুেরাটা কভার কের। যাগফল বর করার সময় কানভােবই এই ৪টা ইনেডে র একটার
বিশ এে স করা স ব না!

এবার আমরা কােডর িদেক যােবা। থেমই কুেয়ির অপােরশনটা ইমি েম করব। কান সংখ◌্যা ২ এর পাওয়ার হেল তার বাইনাির িরে েজ শন হয় ১,
১০,১০০,১০০০,১০০..০০ এরকম, অথাৎ ১ এর পর িকছু শূ ন◌্য। এখন ১১ না ার ইনেডে র জন◌্য কুেয়ির করেত চাই। ১১ ক বাইনািরেত িলখেত পাির ১০১১।
আমরা থেমই সবেথেক ডােনর ১ খুেজ বর করব এবং সই পিজশন থেক বািক অংশটা মূল সংখ◌্যা থেক িবেয়াগ িদব। তাহেল েতই িবেয়াগ হেব ১।

১০১১-১=১০১০ (অথবা দশিমক প িতেত ১১-১=১০)

আবােরা সব থেক ডােনর ১ থেক কের বািকটা িবেয়াগ িদেল পাব:

১০১০-১০=১০০০ (অথবা দশিমক প িতেত ১০-২=৮)

এভােব িবেয়াগ করেত থাকেবা যত ণ শূ ন◌্য না পাই।

১০০০-১০০০=০ (অথবা দশিমক প িতেত ৮-৮=০)

ল ◌্য কর ১১ এর জন◌্য দরকাির ৩টা ইনেড ১১,১০,৮ আমরা পেয় িগেয়িছ ২এর পাওয়ার িবেয়াগ কের কের! ১৩ বা বাইনািরেত ১১০১ এর জন◌্য িনেজ কর এবং
তারপর িনেচর সমাধান দখ:

১১০১-১=১১০০ (অথবা দশিমক প িতেত ১৩-১=১২)

১১০০-১০০=১০০০ (অথবা দশিমক প িতেত ১২-৪=৮)


4/6
১০০০-১০০০=০ (অথবা দশিমক প িতেত ৮-৮=০)

১৩ এর জন◌্য দরকাির ইনেড ১৩,১২,৮ পেয় িগেয়িছ!

এখন হল এই কাজটা কােড করব িকভােব? লুপ চািলেয় একটা একটা িবট পরী া কের করা যেত পাের িক কাজ O(1) এই করা যায়। idx ন র ইনেডে র পেরর
ইনেড টা হেব:

idx=idx – (idx & -idx)

এটা িকভােব কাজ কের বাঝার জন◌্য খাতাকলেম িবেয়াগটা কের দখ আমার ব◌্যাখ◌্যা পড়ার আেগই! আিম একটা উদাহরণ িদি , ধির idx=১০ বা বাইনািরেত
১০১০। তাহেল 2’s complement প িতেত -idx বা -১০ হেব ০১০১+১=০১১০। (যারা ভুেল গছ তােদর জন◌্য, 2’s কমি েম বর করেত িবট েলােক উে
িদেয় ১ যাগ করেত হয়।) এবার যিদ িবটওয়াইজ AND কির তাহেল পােবা:

1010
0110
——-
0010

সবেথেক ডােনর ১ থেক বািক অংশ পেয় গলাম! এবার িবেয়াগ কের িদেলই কাজ শষ। এটা কন কাজ করেছ? আমরা বাইনাির সংখ◌্যাটােক ৩টা অংেশ ভাগ করেত
পাির x1z। 1 হেলা সবেথেক ডােনর ১, x হেলা তার আেগর যেকান িবট, z হেলা ১ এর পেরর থাকা o িবট(x বা z এ শূ ণ◌্যটা, একটা বা একািধক িবট থাকেত পাের।
এখন িবট েলা উে িদেল পােবা: x’0z’। x বা z অংেশর িবট েলােক উে িদেয় পেয়িছ x’ আর z’, তারমােন z’ হেলা িকছু ১ িবট। 2’s কমি েম বর করেত ১ যাগ
করেল পােবা: x’1z। এখন আেগর সংখ◌্যা x1z আর x’1z ক AND করেল থােক 1z। x এর ভাগটা পুেরাটা শূ ণ◌্য হেয় যােব তাই সটা বাদ। তাহেল আমরা
ডােনর ১ থেক বািক অংশ পেয় যােবা!

কাডটা তাহেল খুব সহজ:

C++

1 int query(int idx){


2 int sum=0;
3 while(idx>0){
4 sum+=tree[idx];
5 idx -= idx & (-idx);
6 }
7 return sum;
8 }

আপেডট অপােরশন িকভােব করব? ১০১০ বা ১০ এর পেরর কান ইনেড টা ১০ ক কভার করেব? এবার আমরা সবেথেক ডােনর ১ ক বামপােশ িশফট কের িদব। ১০১০
এর সােথ ১০ যাগ করেল পাই ১১০০ বা ১২ যটা ১০ ক পুেরাটা কভার কের। িঠক সরকম ১২ বা ১১০০ এর সােথ ১০০ যাগ করেল পাই ১০০০০ যটা ১২ ক পুেরাটা
কভার কের। এটা িকভােব কাজ করেছ সটা িচ া কের বর কের ফল!

আেগর মত কেরই ধু িবেয়ােগর জায়গায় যাগ করেলই সবেথেক ডােনর ১টা বােম সের যােব। তারমােন য সংখ◌্যাটা যাগ করিছ, নতুন ইনেড থেক কুেয়িরর সময়
তারেথেকও বড় একটা সংখ◌্যা িবেয়াগ করা হেব তাই নতুন ইনেড টা আেগরটােক কভার করেত বাধ◌্য! কাডটা হেব এরকম:

C++

5/6
1 void update(int idx, int x, int n) //n is the size of the array, x is the number to add
2 {
3 while(idx<=n)
4 {
5 tree[idx]+=x;
6 idx += idx & (-idx);
7 }
8 }

এটাই হেলা বাইনাির ইনেড ড ি । এখন আমরা সহেজই কান একটা ইনেড আপেডট করেত পারব এবং 1 থেক কান ইনেড পয যাগফল বর করেত পারব।

কমে ি িট:

আপেডট এবং কুেয়ির সব ে ই ২ এর পাওয়ার যাগ বা িবেয়াগ করিছ, থেম ছাট পাওয়ার থেক কের বড় পাওয়ার িবেয়াগ করিছ। তাই টাইম কমে ি িট হেব
O(log×n)O(log×n)। ধুমা Tree অ◌্যােরটােতই সব অপােরশন হে , স কমে ি িট O(n)O(n)।

ল কর য এই বেলমটা সগেম ি িদেয় করা গেলও এখােন মমির লাগেছ অেনক কম, কাডও খুব ছাট। তেব সগেম ি ত িবিভ সব রে র িভতর আপেডট করা
যায়, এখােন করা যায় ১ ন র ইনেড সহ রে ।

বেলম ১: কুেয়ির করার সময় ii থেক jj ইনেডে র মধ◌্েযর সাবঅ◌্যােরর যাগফল বর করেত বলেল িক করেব?

বেলম ২: কুেয়িরেত যিদ বলা হয় অ◌্যােরর সবিন কান ইনেডে গেল যাগফল X এর বিশ পােবা তাহেল ইনেড টা িকভােব বর করেব? িহ স:
O(logn*logn)।

অনলাইন জাজ থেক িকছু বেলম:

Curious Robin Hood


Inversion Count
Nice Day

২িড বাইনাির ইনেড ড ি এবং আেরা িকছু বেলম িনেয় ভিবষ◌্যেত লখার ই া আেছ। আজেক এই পয ই। হ◌্যািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

6/6
াফ িথওিরেত হােতখিড় – ১
shafaetsplanet.com /planetcoding/

শাফােয়ত িডেস র ২১,


২০১০

( াফ অ ালগিরদম বইিট অনলাইেন পাওয়া যাে রকমাির.কম এ। এছাড়াও নীলে েত হক, মািনক এবং রানা লাইে িরেত
বইিট পাওয়া যাে )

তুিম িক জােনা পৃিথবীর ায় সব রকেমর বেলমেক িকছু রা া আর শহেরর বেলম বািনেয় সলভ কের ফলা যায়? াফ
িথওিরর যখন জ হয় তখন তামার আমার কােরাই জ হয়িন, এমনিক পৃিথবীেত কান কি উটারও িছেলানা! সই
সেতেরা দশেকর শেষর িদেক িলওনাদ অয়লার াফ িথওির আিব ার কেরন কিনসবােগর সাতিট ি েজর সমস ার সমাধান
করেত। তখনই সবার কােছ পির ার হেয় যায় য যেকান বেলমেক শহর-রা ার বেলম িদেয় মেডিলং কের চনা একটা
বেলম বািনেয় ফলেত াফ িথওিরর জুিড় নই। আর যখনই তুিম একটা বেলমেক চনা কান বেলেম কনভাট কের
ফলেত পারেব তখন সটা সমাধান করা অেনক সহজ হেয় যােব।

াফ িথওিরর অেনক অ াি েকশন আেছ। সবেথেক কমন হেলা এক শহর থেক আেরক শহের যাবার ততম পথ খুেজ বর
করা। তুিম হয়েতা জােনা সাভার থেক একটা ওেয়বেপজ তামার িপিসেত পৗছােত অেনক েলা রাউটার পার কের আসেত
হয়, াফ িথওির িদেয় এক রাউটার থেক আেরকটােত যাবার পথ খুেজ বর করা হয়। যুে র সময় একটা দেশর কান
কান রা া বামা িদেয় উিড়েয় িদেল দেশর রাজধানী সব শহর থেক িবি হেয় যােব সটাও বর কের ফলা যায় াফ
িথওির িদেয়। আমরা াফ অ ালেগািরদম েলা শখার সময় আেরা অেনক অ াি েকশন দখেবা।

আমােদর এই হােতখিড়র ল হেব থেমই াফ িথওিরর একদম বিসক িকছু সং া জানা, তারপর িকভােব াফ মমিরেতা ার করেত হয় সটা জানা, এরপের ােফর িকছু
বিসক অ ালেগািরদম জানা এবং সােথ সােথ মজার িকছু বেলম দখা। সব সং া একসােথ দখেল মাথায় থাকেবনা, তাই একদম না জানেলই নয় সরকম িকছু সং া থেম
দখেবা, এরপর েয়াজনমেতা আেরা িকছু সং া জেন িনেবা।

াফ িক?

ধরা যাক ৬িট শহরেক আমরা ১,২,৩,৪,৫,৬ িদেয় িচি ত করলাম। এবার য শহর থেক য শহের সরাসির রা া আেছ তােদর মেধ লাইন টেন িদলাম:

শহর েলার নাম ১,২ ইত ািদ িদেয় িদেত হেব এমন কান কথা নই, তুিম চাইেল ঢাকা,
চ াম ইত ািদ িদেত পােরা। এটা খুবই সাধারণ একটা াফ যখােন িকছু শহেরর মেধ র
রা া েলা দখােনা হেয়েছ। াফ িথওিরর ভাষায় শহর েলােক বলা হয় নাড(Node)
বা ভারেট (Vertex) আর রা া েলােক বলা হয় এজ(Edge)। াফ হেলা িকছু
নাড আর িকছু এজ এর একটা কােলকশন।

ােফ নাড িদেয় অেনকিকছু বুঝােত পাের, কান ােফ হয়েতা নাড িদেয় শহর বুঝায়,
কান ােফ এয়ারেপাট, কান ােফ আবার হয়েতা দাবার বােডর একটা ঘর বুঝােত
পাের! আর এজ িদেয় বুঝায় নাড েলার মেধ র স ক। কান ােফ এজ িদেয় িট
শহেরর দূর বুঝােত পাের, কান ােফ এক এয়ারেপাট থেক আেরক এয়ারেপােট যাবার
সময় বুঝােত পাের, আবার দাবার বােড একটা ঘের ঘাড়া থাকেল সই ঘর থেক কান
ঘের যাওয়া যায় সটাও বুঝােত পাের।

িনেচর ছিবেত দাবার বাডটাও একটা াফ। িতটা ঘর একটা কের নাড। য ঘের
ঘাড়া আেছ সখান থেক এজ েলা দখােনা হেয়েছ:

1/3
এককথায় নােডর কাজ কান একধরেণর অবেজ েক িরে েজ করা আর এজ এর কাজ হেলা িট অবেজে র
মেধ স কটা দখােনা।

অ াডেজেস নাড:
A নাড থেক B নােড একটা এজ থাকেল B ক বলা হয় A এর অ াডেজেস নাড। সাজা কথায়
অ াডেজেস নাড হেলা এজ িদেয় সরাসির কােনে ড নাড। একটা নােডর অেনক েলা অ াডেজেস নাড
থাকেত পাের।

িডেরে ড াফ আর আনিডেরে ড াফ:


িডেরে ড ােফ এজ েলােত তীরিচ থােক, তারমােন এজ েলা হেলা একমুিখ(Unidirectional),
আনিডেরে ড ােফ এজ েলা ি মুখী(Bidirectional)। িনেচর ছিব দখেলই পির ার হেব:

বােমর ছিবর াফ িডেরে ড, ডােনরটা আনিডেরে ড।

ওেয়েটড আর আনওেয়েটড াফ:


অেনক সময় ােফ এজ েলার পােশ ছাট কের ওেয়ট(Weight) বা ক (Cost) লখা থাকেত পাের:

এই ওেয়ট বা ক িদেয় অেনকিকছু বুঝােত পাের, যমন িট শহেরর দূর কত িকেলািমটার, অথবা রা ািট িদেয় যেত
কত সময় লােগ, অথবা রা া িদেয় কয়টা গািড় একসােথ যেত পাের ইত ািদ। আেগর াফ েলা িছেলা আনওেয়েটড,
সে ে আমরা ধের নই সব েলা এেজর ওেয়েটর মান এক(১)। সব েলা ওেয়ট ১ হেল আলাদা কের লখা দরকার
হয়না।

পাথ:
পাথ(Path) হেলা য এজ েলা ধের একটা নাড থেক আেরকটা নােড যাওয়া যায়। অথাৎ এেজর একটা িসেকােয় ।

এক নাড থেক আেরক নােড যাবার অেনক েলা পাথ থাকেত পাের। ছিবেত A থেক D ত যাবার ইটা পাথ আেছ।
A->B,B->C,C->D হেলা একটা পাথ, এই পােথর মাট ওেয়ট হেলা ৩+৪+২=৯। আবার A->D ও একটা পাথ হেত পাের যই পােথর মাট ক ১০। য পােথর
ক সবেথেক কম সটােক শেট পাথ বেল।

িড ী:

িডেরে ড ােফ একটা নােড কয়টা এজ েবশ কেরেছ তােক ইনিড ী, আর কান নাড থেক কয়টা এজ বর হেয়েছ তােক আউটিড ী বেল। ছিবেত িতটা নােডর
ইনিড ী আর আউটিড ী দখােনা হেয়েছ:

আনিডেরে ড ােফ ইন বা আউটিড ী আলাদা করা হয়না। একটা নােডর যত েলা অ াডেজেস নাড আেছ সই সংখ াটাই নাডটার িড ী।

হ া েশিকং লমা একটা িজিনস আেছ যটা বেল একটা িবেজাড় িড ীর নােডর সংখ া সবসময় জাড় হয়। উপেরর ােফ A আর C এর িড ী ৩, এরা িবেজাড় িড ীর
নাড। তাহেল িবেজাড় িড ীর নাড আেছ ২টা, ২ হেলা একটা জাড় সংখ া। হ া েশক করেত সবসময় ২টা হাত লােগ, িঠক সরকম একটা এজ সবসময় ২টা নাডেক
যাগ কের। তুিম একটু িচ া কের দেখা:

2/3
২টা জাড় িড ীর নাডেক এজ িদেয় যাগ করেল ২টা নতুন িবেজাড় িড ীর নাড তির হয়।

২টা িবেজাড় িড ীর নাডেক এজ িদেয় যাগ করেল ২টা িবেজাড় িড ীর নাড কেম যায়।

১টা জাড় আর একটা িবেজাড় িড ীর নাড যাগ করেল মাট িবেজাড় িড ীর নাড সমান থােক(এক
পােশ কেম, আেরক পােশ বােড়)।

তাহেল দখা যাে হয় ২টা কের বাড়েতেস বা ২টা কের কমেতেস বা সমান থাকেছ, তাই িবেজার িড ীর নােডর
সংখ া সবসময় জাড়।

একইভােব এটাও দখােনা যায় একটা ােফর িড ী েলার যাগফল হেব এজসংখ ার ি ণ । উপেরর ােফ
িড ী েলার যাগফল ১০, আর এজসংখ া ৫।

এ েলা গল এেকবােরই াথিমক কথাবাতা। পরবিত লখায় তুিম জানেত পারেব িকভােব ভ ািরেয়বেল াফ ার
করেত হয়। আশা কির াফ িথওরীেত তামার যা াটা দা ণ আনে র হেব, অেনক িকছু িশখেত পারেব।

অন ান পব

AccessPress Staple | WordPress Theme: AccessPress Staple by


AccessPress Themes

3/3
াফ িথওিরেত হােতখিড় – ২ (ভ ািরেয়বেল াফ ার-১)
shafaetsplanet.com /planetcoding/

শাফােয়ত িডেস র ২৬,


২০১০

আেগর পাে আমরা দেখিছ াফ িথওির িক কােজ লােগ,আর এিলেম াির িকছু টাম
িশেখিছ। এখন আমরা আেরকটু িভতের েবশ করেবা। থেমই আমােদর জানা দরকার
একটা াফ িকভােব ইনপুট িনেয় ার কের রাখা যায়। অেনক েলা প িতর মেধ িট
খুব কমন:

১. অ াডেজেসি ম াি (adjacency matrix)

২. অ াডেজেসি িল (adjacency list)

অ াডেজেস (adjacent) শ টার অথ “ কান িকছুর পােশ”। যমন তামার পােশর


বািড়র িতেবিশরা তামার অ াডেজেস । ােফর ভাষায় এক নােডর সােথ আেরকটা
নােড যাওয়া গেল ২য় নাডিট থমিটর অ াডেজেস । এই পাে আমরা ম াি ে র
সাহােয কান নাড কার অ াডেজেস অথাৎ কান কান নােডর মােঝ এজ আেছ সটা
িকভােব ার করা যায় দখেবা। ম াি বলেত এখােন ধুমা ২-িড অ াের বুঝােনা
হেয়েছ, তাই ঘাবেড় যাবার িকছু নই!

ােফর পােশ একিট টিবল দখেত পা । এটাই আমােদর অ াডেজেসি ম াি । ম াি ে র [i][j][i][j] ঘের 11 থােক যিদ ii থেক jj ত কােনা এজ থােক, না থাকেল
00 বিসেয় দই।

এজ লা ওেয়েটড হেত পাের, যমন ঢাকা থেক চ ােম একটা এজ িদেয় বেল িদেত পাের শহর িটর দূর ৩০০ িকেলািমটার। তাহেল তামােক ম াি ে ওেয়টও বসােত
হেব।

উপেরর াফিট বাইিডেরকশনাল বা আনিডেরে ড, অথাৎ ১ থেক ২ এ যাওয়া গেল ২ থেক ১ এও যাওয়া যােব। যিদ াফিট িডেরে ড হেতা তাহেল এজ েলার মেধ
তীরিচ থাকেতা। তখেনা আমরা আেগর মেতা কেরই ম াি ে ার করেত পারেবা। িনেচর ছিবেত িডেরে ড ওেয়েটড ােফর অ াডেজেসি ম াি ে র উদাহরণ দখােনা
হেয়েছ।

1/3
যসব নাড এর িভতর কােনা এজ নাই তােদরেক এখােন ইনিফিনিট বা অেনক বড় একটা সংখ া িদেয় দখােনা হেয়েছ।

একটা ব াপার ল কেরা, াফ আনিডেরে ড হেল ম াি িট িসেমি ক হেয় যায়, অথাৎ mat[i][j]=mat[j][i] হেয় যায়।

ছাট একটা এ ারসাইজ:

ক না কর একিট াফ যার ৩িট নাড আেছ edge সংখ া ৩,এবং সব েলা edge bidirectional । edge েলা হেলা ১-২(cost ৫),২-৩(cost ৮),১-৩(cost
৩)। এটার adjacency matrix টা কমন হেব?

চট কের িনেজই খাতায় এেক ফলেত চ া কর এবং িনেচর উ েরর সােথ িমিলেয় দেখা:

053
508
380

আশা কির বুঝেত পারছ িকভােব ম াি িট আকলাম। না বুঝেল উপেরর অংশটা আেরকবার পেড় ফল।

াফ ইনপুট যভােব দয়া হেব:

িঠক উপেরর ম াি টা া ািমং বেলেম ইনপুট িহসােব িদেয় দয়া হেত পাের, েত ধু নাড সংখ া বেল িদেব। ল কর এই ম াি টা ইনপুট িনেত আমােদর এজ সংখ া
জানা জ রী না। আমােদর একিট ভ ািরেয়বল লাগেব নাড সংখ া ইনপুট িনেত,আেরকিট ২-িড অ ের লাগেব ম াি ইনপুট িনেত।

C++

1 int N;
2 int matrix[100][100]; //এই সেবা ১০০ নােডর াফ ার করা যােব।
3
4 //িডে য়ার করার পের ইনপুট নবার পালা। খুব সহজ কাজ:
5 scanf("%d",&N);
6 for(int i=1;i<=N;i++)
7 for(int j=1;j<=N;j++)
8 scanf("%d" ,&matrix[i][j]);

সরাসির ম াি না িদেয় নাড সংখ া,edge সংখ া বেল িদেয় edge েলা িক িক বেল িদেত পাের,এভােব:

3 3 //৩ টা নাড এবং ৩টা এজ


1 2 5 //node1-node2-cost
238
133

2/3
এটা ইনপুট িনব এভােব:

C++

1 int Node,Edge;
2 int matrix[100][100];
3 scanf("%d%d",&Node,&Edge);
4 for(i=0;i<Edge;i++)
5 {
6 int n1,n2,cost;
7 scanf("%d%d%d",&n1,&n2,&cost);
8 matrix[n1][n2]=cost;
9 matrix[n2][n1]=cost;
10 }

আেরা অেনক উপােয় বেলেম াফ ইনপুট িদেত পাের। নােডর ন র এেলােমেলা হেত পাের, যমন ৩িট নাডেক ১,২,৩ িদেয় িচি ত না কের ১০০,১০০০০,৪০০ নােম
িচি ত করা হেত পাের। সে ে আমােদর ম ািপং করেত হেব। অথাত ১০০ ক আমরা ম াপ করব ১ িদেয়,মােন ১০০ বলেত বুঝব ১,১০০০০ বলেত বুঝব ২। index
নামক একিট array রেখ index[100]=1;index[100000]=2;এভােব িচি ত কের িদেলই চলেব। পের নাড ন র ইনপুট িদেল আমার ইনেড থেক আমােদর
দয়া ন র বর কের আনব। ব াপারটােক বলা হয় অ াের কে শন, তুিম িব ািরত জানেত চাইেল পের কােনা সময় আমার এই লখাটা দখেত পােরা।

অ াডেজেসি ম াি ব বহার করার সমস া:

মমির একটা িবশাল বেলম, এজ যত েলাই থাকুকনা কন তামার লাগেছ N∗NN∗N সাইেজর ম াি যখােন NN হেলা নাড সংখ া। 1000010000 টা নাড
হেলা N∗NN∗Nম াি ে র সাইজ দাড়ােব 4∗1000∗10004∗1000∗1000 বাইট বা ায় 381381 মগাবাইট! এজ কম হেল এটা মমিরর িবশাল অপচয়।

কােনা একটা নাড uu থেক অন কান কান নােড যাওয়া যায় বর করেত হেল আমােদর NN টা নােডর সব েলা চক কের দখেত হেব, টাইেমর িবশাল অপচয়!

অ াডেজেসি ম াি ব বহার করার সুিবধা:

u–vu–v নােডর মেধ কােনকশন আেছ নািক বা cost কত সটা খুব সহেজই mat[u][v]mat[u][v] চক কের জেন যেত পাির।

এই সমস া লা দূর কের িদেব অ াডেজেসি িল , সােথ নতুন িকছু সমস াও হািজর করেব! তামরা পেরর পেব সটা িশখেব। তার আেগ তামােক একটা িজিনস িশখেত হেব,
সটা হেলা C++ এর া াড টমে ট লাইে ির(STL)। আমরা STL এর ভ র ব বহার কের কাজ করেবা কারণ এটা ব বহার করা খুব সহজ। তুিম িনেচর িট িলংেকর
সাহােয খুবই সহেজ িশখেত পারেব:

১: http://sites.google.com/site/smilitude/stl এিট ফািহম ভাইেয়র েগর িলংক,তার িটউেটািরয়াল েলা অি তীয়।

২: http://www.cplusplus.com/reference/stl/ STL এর িবিভ ফাংশেনর কাজ শখার জন সরা সাইট।

ভ র ব বহার শখা হেয় গেল পড়া কেরা পেরর পব: adjacency list

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
াফ িথওিরেত হােতখিড় – ৩ (ভ ািরেয়বেল াফ ার-২)
shafaetsplanet.com /planetcoding/

শাফােয়ত িডেস র ২৭,


২০১০

আেগর পব
সব েলা পব

এই পেব াফ ার করার ২য় প িত অ াডেজেসি িল িনেয় িলখব। এ প িতেত াফ ার কের কম মমির ব বহার কের আেরা efficient কাড লখা যায়। এ ে
আমরা ডায়নািমক ািল মমির অ ােলােকট করব,ভেয়র িকছু নই িস++ এর standard template library(STL) ব বহার কের খুব সহেজ কাজটা করা যায়। আেগর
লখার শেষর িদেক STL এর উপর কেয়কিট িটউেটািরয়ােলর িলংক িদেয়িছ, আশা করিছ ভ র িকভােব কাজ কের এখন তুিম জােনা।

অ াডেজেসি িল নেত যতটা ভয়ংকর নায়,ব াপারিট আসেল তমনই সহজ। আমরা আবার আেগর পাে র ছিবিটেত িফের যাই:

এবার বাজার করার িলে র মত একিট িল বানাই:

এটাই অ াডেজেসি িল , কান নােডর সােথ কান নাড যু আেছ সটার একটা তািলকা। িক কাড করার সময় িকভােব এই িল টা ার করেবা?

থম উপায়(অ াের):

সাধারণ ২িড অ াের ব বহার কের িল িট ার করা যায়। যমন:

arr[1][1]=2, arr[1][2]=4;
1/4
arr[2][1]=1; arr[2][2]=4, arr[2][3]=5;

িক এভােব ার করেল িকছু সমস া আেছ:

সমস া ১. আমােদর ৬িট নাড আেছ। িত নােডর সােথ সেবা ৬িট নাড যু থাকেত পাের(ধের িনি িট নােডর মেধ ১িটর বিশ সংেযাগ থাকেবনা)। এ ে
আমােদর লাগেব [6][6]আকােরর ইি জার অ াের। যিদ ১ ন র নােডর সােথ মা ২িট নাড যু থােক তাহেল বািক array[1][0],array[1][1] কােজ
লাগেব,array[1][2] থেক array[1][6] পয জায়গা কােনা কােজই লাগেবনা। মেন হেত পাের এ আর এমন িক সমস া। িক িচ া কর ১০০০০ িট নাড আেছ এমন
একিট ােফর কথা। [10000][10000] integer অ াের তুিম ব বহার করেত পারেবনা,memory limit অিত ম কের যােব,এছাড়া এভােব মমির অপচয় করা
ভােলা া ামােরর ল ণ নয় :)। অ াডেজেসি ম াি ব বহার করার সময় যমন মমিরর সমস া হেয়িছেলা, এখনও সই সমস া রেয় যােব।

সমস া ২. অ ােরর কান ইনেডে কয়িট এিলেম আেছ তার িহসাব রাখেত িত ইনেডে র জন আেরকিট ভ ািরেয়বল মইনেটইন করেত হেব।

ি তীয় উপায়( ভ র):

সমস া লা দূর করেত আমরা STL vector বা list ব বহার কের াফ ার করব। ভ র/িলে তামােক িলে র সাইজ বেল িদেত হেবনা,খািল সেবা নাড সংখ া বেল
িদেলই হেব। এই িটউেটািরয়ােল আিম ভ র ব বহার করব কারণ list এ বশ িকছু সমস া আেছ।

১০০০০০ নােডর াফ ইনপুট দয়ার সময় কখেনা ম াি িহসােব িদেবনা,তাহেল ইনপুেটর আকারই মা ািতির িবশাল হেয় যােব। আেগর পাে ২য় উদাহরেণ যভােব
দিখেয়িছ সরকম ইনপুট িদেত পাের, অথাৎ থেম নাড আর এজ সংখ া বেল িদেয় তারপর কান নােডর সােথ ক যু আেছ বেল িদেব। উপেরর ােফর জন ইনপুট:

6 8 //node-edge
1 2 //node1-node2
14
24
25
45
53
36
66

এিট ভ র িদেয় ইনপুট িনব এভােব:

C++

2/4
1 #include<cstdio>
2 #include<vector>
3 using namespace std;
4 #define MAX 100000 //maximum node
5 vector<int>edges[MAX];
6 vector<int>cost[MAX]; //parallel vector to store costs;
7 int main()
8 {
9 int N,E,i;
10
11 scanf("%d%d",&N,&E);
12 for(i=1;i<=E;i++)
13 {
14 int x,y;
15 scanf("%d%d",&x,&y);
16 edges[x].push_back(y);
17 edges[y].push_back(x);
18 cost[x].push_back(1);
19 cost[y].push_back(1);
20 }
21 return 0;
22 }

cost নামক ভ রিট এ ােফর ে দরকার িছলনা,তেব ওেয়েটড ােফ অবশ ই দরকার হেব। িন য়ই বুঝেত পারছ edge ও cost ভ র িট সমা রাল ভােব কাজ
করেব,অথাত edge ভ েরর য পিজশেন তুিম িট িনিদ নােডর কােনকশন পােব cost ভ েরর সই পিজশেনই তুিম cost পােব।

যিদ ১০০০ বা তার কম নাড থােক তাহেল ম াি বা িল কােনা ে ই মমির সমস া হেবনা। তাও আমরা ভ র িদেয়ই াফ ার করব। কারণ, িচ া কর তামােক
১০০টা নােডর ম াি ে ১ এর সােথ িক িক সংযু আেছ বর করেত matix[1][0],matrix[1][1]…….matrix[1][99] এভােব ১০০িট পিজশন চক কের কানটায়
কানটায় ০ নই বর করেত হেব,১ ন র নােডর সােথ যতিট নাডই সংযু থাকুকনা কন। তাই এখােনও অ াের আমােদর বাড়িত সুিবধা িদেত পারেছনা।

একটা নােডর সােথ কান কান নাড যু আেছ বর করা:

ধেরা তুিম ১ ন র নােডর সােথ যু সব েলা নােডর ন র চাও, তুিম তাহেল edges[1] এর সাইজ পয লুপ চালােব এভােব:

C++

1 size=edges[1].size();
2 for(int i=0; i < size ; i++)
3 printf("%d ",edges[1][i]);

১ >> ০ ১ ০ ০ ০ ১ ১ ০ পুেরাটা ঘুের আসার থেক ১>>২,৬,৭ ঘুের আসেত কম সময় লাগেব,তাই নয়িক? ।

অ াডেজেসি ম াি কখন িল অেপ া সুিবধাজনক?

যিদ কােনা বেলেম তামার u,v নােডর এর মেধ কােনা এজ আেছ নািক চক করেত বেল তখন িল ব বহার করেল তামােক লুপ চািলেয় চক করেত হেব, িক
ম াি ে জা matrix[u][v] ইনেড চক কেরই বেল িদেত পারেব তােদর মেধ কােনকশন আেছ নািক।

এ ারসাইজ:

এ পয বুেঝ থাকেল তুিম মাটামুিট bfs,dfs এর মত বিসক অ ালেগািরদম েলা শখার জন ত। পরবিত লখািট পড়ার আেগ একিট ছাট exercise কের ফল।
এমন একিট কাড িলখ যটায় উপেরর মত কের ইনপুট িদেল িনেচর কাজ েলা কের:
১. একিট adjacency list তির কের। ( াফিটেক directed ধের িনেব,bidirectional নয়)
3/4
২. কান নােডর সােথ কয়টা নাড যু আেছ, নাড েলা িক িক স েলা ি কের।
৩. indegree হেলা একিট নােড কয়িট নাড েবশ কেরেছ,outdegree হেলা িঠক তার উে াটা। িতিট নােডর outdegree ও indegree ি কর।

পব-৪,িবএফএস:http://www.shafaetsplanet.com/planetcoding/?p=604

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
াফ িথওিরেত হােতখিড়-৪( ডথ ফা সাচ)
shafaetsplanet.com /planetcoding/

শাফােয়ত ফ য়াির ২২, ২০১৪

আেগর পব েলােত আমরা দেখিছ িকভােব ম াি বা িল ব বহার কের াফ ার করেত হয়। এবার আমরা থম অ ালেগািরদম দখেবা এর িদেক যােবা। েতই
আমরা য অ ালেগািরদমটা িশখব তার নাম ডথ ফা সাচ(breadth first search,bfs)।

িবএফএস এর কাজ হেলা ােফ একটা নাড থেক আেরকটা নােড যাবার শেট পাথ বর করা। িবএফএস কাজ করেব ধুমা আন-ওেয়েটড ােফর ে , তারমােন
সব েলা এেজর ক হেব ১।

িবএফএস অ ালেগািরদমটা কাজ কের িনেচর ধারণার েলার উপর িভি কের:

১. কােনা নােড ১ বােরর বিশ যাওয়া যােবনা


২. সাস নাড অথাৎ য নাড থেক করিছ সটা ০ ন র লেভেল অবি ত।
৩. সাস বা ‘ লেভল ০’ নাড থেক সরাসির যসব নােড যাওয়া যায় তারা সবাই ‘ লেভল ১’ নাড।
৪. ‘ লেভল ১’ নাড েলা থেক সরাসির যসব নােড যাওয়া যায় তারা সবাই ‘ লেভল ২’ নাড। এভােব লেভল এক এক কের বাড়েত থাকেব।
৫. য নাড যত ন র লেভেল, সাস থেক তার শেট পেথর দঘ তত।

উপের লখা েলা পুেরাপুির না বুঝেল আমরা একটা উদাহরণ দেখ বািকটা পির ার করব।

ধর তুিম ১ ন র শহর থেক ১০ ন র শহের যেত চাও। থেম আমরা সাস ধরলাম ১ ন র
নাডেক। ১ তাহেল একটা ‘ লেভল ০’ নাড। ১ ক িভিজেটড িচি ত কির।

১ থেক সরাসির যাওয়া যায় ২,৩,৪ ন র নােড। তাহেল ২,৩,৪ হেলা ‘ লেভল ১’ নাড।
এবার স েলােক আমরা িভিজেটড িচি ত কির এবং স েলা িনেয় কাজ কির। িনেচর ছিব দখ:

লাল নাড েলা িনেয় আমরা এখন কাজ করেবা। রিঙন সব েলা নাড িভিজেটড, এক নােড
২বার কখেনা যােবানা। ২,৩,৪ থেক শেট পেথ যাওয়া যায় ৬,৭,৮ এ। স েলা িভিজেটড
িচি ত কির:

ল কর য নাডেক যত ন র লেভেল পাি , সাস থেক তার শেট পেথর দঘ িঠক তত।
যমন ২ন র লেভেল ৮ ক পেয়িছ তাই ৮ এর র ২। ছিব েলােক এেককটা লেভেলর
এেকক রং দয়া হেয়েছ। আর লাল নাড িদেয় বুঝােনা হেয়েছ আমরা এখন ও েলা িনেয় কাজ
করিছ। আমরা ১০ এ পৗছাইিন তাই পেরর নাড েলা িভিজট কের ফিল:

আমরা দখেত পাে ২িট লেভল পার হেয় ৩ ন র লেভেল আমরা ১০ ক পাি । তাহেল ১০
এর শেট পথ ৩। লেভল বাই লেভল াফটােক সাচ কের আমরা শেট পথ বর করলাম।
যসব এজ েলা আমরা ব বহার কিরিন স েলােক বাদ িদেয় ছিবিটেক িনেচর মত কের আকেত
পাির:

যসব এজ ব বহার কিরিন স েলা হালকা কের িদেয়িছ,এই এজ েলা বাদ িদেল াফিট একিট ি হেয় যায়। এই ি টােক বলা হয় িবএফএস ি ।

তারমােন আমােদর কাজ েলা সাস থেক লেভল ১ নাড েলােত যাওয়া, তারপর লেভল ১ এর নাড েলা থেক লেভল ২ নাড েলা খুেজ বর করা, এভােব যত ন না
গ েব পৗেছ যাি অথবা সব নাড িভিজট করা শষ হেয় িগেয়েছ তত ণ কাজ চলেত থাকেব।

িকউ ডাটা াকচারটার সােথ আশা কির সবাই পিরিচত। িকউ হেলা বু বােসর লাইেনর মেতা ডাটা াকচার। যখন একটা সংখ া িকউেত যাগ করা হয় তখন সটা আেগর
সব েলা সংখ ার িপেছ িগেয় দাড়ায়, যখন কান একটা সংখ া বর কের ফলা হয় তখন সবার থেমর সংখ াটা নয়া হয়। এেক বলা ফা ইন ফা আউট। আমরা
িবএফএস এ িকউ কােজ লাগােত পাির। লেভল ১ থেক যখন কেয়কটা নতুন লেভল ২ নাড পােবা স েলােক িকউেত বা লাইেন অেপ া কিরেয় রাখেবা, আর সবসময়
থম নাডটা িনেয় কাজ করেবা। তাহেল বড় লেভেলর নাড েলা সবসময় িপেছর িদেক থাকেব, আমরা ছাট লেভল েলা িনেয় কাজ করেত করেত আগােবা। উপেরর
ােফর জন এটা আমরা িসমুেলট কের দিখ:
1/5
থেম িকউেত সাস পুশ করেবা:

2/5
১ এর লেভল হেব ০ বা লেভল[১] = ০। এবার িবএফএস করেবা।

থেম িকউ এর সবার সামেনর নাডটােক িনেয় কাজ করেবা। সবার সামেন আেছ ১, সখান থেক যাওয়া যায় ৪, ৩, ২ এ। ৪, ৩, ২ এ এেসিছ ১ থেক, তাহেল
লেভল[৪] = লেভল[১] + ১ = ১, লেভল[৩] = লেভল[১] + ১ = ১, লেভল[২] = লেভল[১] + ১ = ১।

১ ক ফল িদেয় এেদরেক িকউেত পুশ কের রািখ:

এবার ৪ িনেয় কাজ কির। ৪ থেক যাওয়া যায় ৭ এ। তাহেল আমরা বলেত পাির লেভল[৭]= লেভল[৪]+১=২। ৪
ক ফেল িদেয় ৭ ক িকউেত পুশ কির:

৩ থেক ৭,৮ এ যাওয়া যায়। ৭ ক এরই মেধ িনেয়িছ, ধু ৮ পুশ করেত হেব। লেভল[৮]= লেভল[৩]+১=২।

এভােব যত ণনা িকউ খািল হে তত ণ কাজ চলেত থাকেব। লেভল[] অ ােরর মেধ আমরা পেয় যােবা সাস থেক
সব েলা নােডর দূর !

সুেডােকাড:

1 1 procedure BFS(G,source):
2 2 Q=queue(), level[]=infinity
3 3 Q.enqueue(source)
4 4 level[source]=0
5 5 while Q is not empty
6 6 u ← Q.pop()
7 7 for all edges from u to v in G.adjacentEdges(v) do
8 8 if level[v] = infinity:
9 9 level[u]=level[v]+1;
10 10 Q.enqueue(v)
11 11 end if
12 12 end for
13 13 end while
14 14. Return distance;

3/5
িঠক যভােব িসমুেলট কেরিছ সভােবই কাডটা িলেখিছ, আশা কির বুঝেত সমস া হে না।

ধু পােথর দঘ যেথ না, পাথটাও দরকার হেত পাের। ল কেরা আমরা uu থেক vv ত যাবার সময় parent[v]=uparent[v]=u কের িদি । আমরা িতটা
নােডর জন জািন কান নাড থেক সই নােড এেসিছ। তাহেল আমরা য নােডর জন পাথ বর করেত চাই সই নাড থেক তার প াের নােড যেত থাকেবা
যত ণনা সােস পৗেছ যাই। খুবই সহজ কাজ, পাথ বর করার কাড করা তামার উপর ছেড় িদলাম।

কমে ি িট:
িতটা নােড একবার কের িগেয়িছ, িতটা এজ এ একবার িগেয়িছ। তাহেল কমে ি িট হেব O(V+E)O(V+E) যখােন VV হেলা নাড সংখ া এবং EE হেলা এজ
সংখ া।

কখেনা কখেনা ২-িড ি েড িবএফএস চালােনা লাগেত পাের। যমন একটা দাবার বােড একিট ঘাড়া আর একটা রাজা আেছ। ঘাড়াটা িমিনমাম কয়টা মুেভ রাজার ঘের
পৗছােত পারেব? অথবা একটা ২-িড অ ােরেত িকছু সল ক কের দয়া হেয়েছ, এখন কােনা সল থেক আেরকিট সেল িমিনমাম মুেভ পৗছােত হেব, িত মুেভ ধুমা
সামেন-িপেছ-বােম-ডােন যাওয়া যায়। আেগ নাডেক আমরা কাশ করিছলাম একটা মা সংখ া িদেয়, এখন নাডেক কাশ করেত হেব িট সংখ া িদেয়, রা(row) না ার,
এবং কলাম না ার। তাহেল আমরা নাড িরে েজ করার জন িস ত একটা াকচার বািনেয় িনেত পাির এরকম:

struct node{int r,c;};

অথবা আমরা িস++ এর “ পয়ার” ব বহার করেত পাির।

pair<int,int>

এ ে িভিজেটড, প াের , লেভল অ াের েলা হেব ২ িডেমনশেনর, যমন visited[10][10]visited[10][10] ইত ািদ। িকউেত নােডর বদেল াকচার পুশ
করেবা। আর কান একটা ঘর থেক অন ঘের যাবার সময় চক করেত হেব বােডর বাইের চেল যাে িকনা। একটা স া ল িস++ কাড দিখ:

C++

4/5
1 #define pii pair<int,int>
2 int fx[]={1,-1,0,0}; //িডেরকশন অ াের
3 int fy[]={0,0,1,-1};
4 int cell[100][100]; //cell[x][y] যিদ -১ হয় তাহেল সলটা ক
5 int d[100][100],vis[100][100]; //d means destination from source.
6 int row,col;
7 void bfs(int sx,int sy) //Source node is in [sx][sy] cell.
8 {
9 memset(vis,0,sizeof vis);
10 vis[sx][sy]=1;
11 queue<pii>q; //A queue containing STL pairs
12 q.push(pii(sx,sy));
13 while(!q.empty())
14 {
15 pii top=q.front(); q.pop();
16 for(int k=0;k<4;k++)
17 {
18 int tx=top.uu+fx[k];
19 int ty=top.vv+fy[k]; //Neighbor cell [tx][ty]
20 if(tx>=0 and tx<row and ty>=0 and ty<col and cell[tx][ty]!=-1 and vis[tx][ty]==0) //Check if the neighbor is
21 valid and not visited before.
22 {
23 vis[tx][ty]=1;
24 d[tx][ty]=d[top.uu][top.vv]+1;
25 q.push(pii(tx,ty)); //Pushing a new pair in the queue
26 }
27 }
28 }
}

তুিম যিদ িডেরকশন অ ােরর ব াপারটা না বুেঝা তাহেল এই লখাটা পড়েল আেরা িকছু িডেটইলস জানেত পারেব।

িবএফএস ধুমা আন-ওেয়েটড ােফ কাজ কের, ওেয়েটড ােফ শেট পাথ বর করেত ডায়া া অ ালেগািরদম ব বহার করেত পােরা। ােফ নেগিটভ সাইেকল থাকেল
বলম ান ফাড ব বহার করেত হেব।

াকিটেসর জন বেলম:
Bicoloring(Bipartite checking)
A Node Too Far(Shortest path)
Risk(Shortest path)
Bombs! NO they are Mines!!(bfs in 2d grid)
Knight Moves(bfs in 2d grid)
We Ship Cheap(Printing path)
Word Transformation(strings)

পেরর পব

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
াফ িথওিরেত হােতখিড় ৫: িমিনমাম ািনং ি (ি ম অ ালেগািরদম)
shafaetsplanet.com /planetcoding/

শাফােয়ত আগ ৪,
২০১১

(িসিরেজর অন ান পা )

একিট াফ থেক কেয়কিট নাড আর এজ িনেয় নতুন একিট াফ তির করা হেল সটােক বলা হয় সাব াফ। ািনং ি হেলা এমন একিট সাব াফ যটায়:

* মূল ােফর সব েলা নাড আেছ।


* সাব াফিট একিট ি । ি েত কখেনা সাইেকল থােকনা,এজ থােক n−1n−1 িট যখােন nn হেলা নাড সংখ া।

একিট ােফর অেনক েলা ািনং ি থাকেত পাের, য ি এর এজ েলার ক /ওেয়ট এর যাগফল সব থেক কম সটাই িমিনমাম ািনং ি । আমরা এই লখায় ি ম
অ ালেগািরদেমর সাহােয িমিনমাম ািনং ি বর করা িশখেবা।

মেন কির িনেচর ােফর িতিট নাড হেলা একিট কের বািড়। আমােদর বািড় েলার মেধ টিলেফান লাইন বসােত হেব। আমরা চাই সবেথেক কম খরেচ লাইন বসােত।
এজ েলার ওেয়ট লাইন বসােনার খরচ িনেদশ কের:

mst wiki

আমরা অেনক ভােব লাইন বসােত পারতাম। ছিবেত লাল এজ িদেয় টিলেফান লাইন বসােনার একিট উপায় দখােনা হেয়েছ। টিলেফান লাইন েলা একিট সাব াফ তির
কেরেছ যটায় অবশ ই n−1n−1 িট এজ আেছ, কােনা সাইেকল নই কারণ অিতির এজ বসােল আমােদর খরচ বাড়েব, কােনা লাভ হেবনা। িমিনমাম ািনং ি বর
করার সময় আমরা এমন ভােব এজ েলা িনেবা যন তােদর এজ এর যাগফল িমিনমাইজ হয়।

এখন িনেচর াফ থেক িকভােব আমরা িমিনমাম ািনং ি বর করব?

ি িড(greedy) অ াে ােচ খুব সহেজ িমিনমাম ািনং ি বর করা যায়। আমরা এখন ি মস অ ালেগািরদম িকভােব কাজ কের দখব। তুিম যিদ আেগ ুসকাল িশখেত
চাও তাহেলও সমস া নই, সরাসির পেরর পেব চেল যেত পােরা।

আমরা থেম যেকােনা একিট সাস নাড িনব। ধির সাস হেলা ১। ১ থেক যত েলা এজ আেছ স েলার িমিনমাম িটেক আমরা সাব ােফ যাগ করব। িনেচর ছিবেত নীল
এজ িদেয় বুঝােনা হে এজিট সাব ােফ যু করা হেয়েছ:
1/6
এবার সাস ১ এবং ৫ ন র নাড থেক মাট যত এজ আেছ(আেগর এজ েলা সহ) তােদর মেধ িমিনমাম িট িনব:

এবার িনব ১,২ এবং ৫ ন র নাড থেক মাট যত এজ আেছ(আেগর এজ েলা সহ) তােদর মেধ িমিনমাম:

2/6
পেরর ধাপিট পূ ণ। ১,২,৫,৪ থেক যত এজ আেছ তােদর মধ িমিনমাম হেলা ২-৪, িক ২ ন র নাড এবং ৪ ন র নাড ইটাই অলেরিড সাব ােফর অংশ,তারা
আেগ থেকই কােনে ড,এেদর যাগ করেল সাব ােফ সাইেকল তির হেব,তাই ২-৪ এজিট িনেয় আমােদর কােনা লাভ হেবনা। আমরা এমন িতবার এজ িনব যন নতুন
আেরকিট নাড সাব ােফ যু হয়। তাহেল ৪-৮ হেব আমােদর পেরর চেয়স।

এরপর ৮-৬ যাগ করেবা:

3/6
এরপর ৬-৭:

সবেশেষ ৪-৩ যাগ করেবা:

4/6
নীলরং এর এই সাব াফটাই আমােদর িমিনমাম ািনং ি । বািক এজ েলা মুেছ িদেল থােক:

তাহেল টিলেফান লাইন বসােতা মাট খরচ: ৪ + ২ + ৫ + ১১ + ৯ + ২ + ১ = ৩৪। একিট ােফ এক বা একািধক িমিনমাম ািনং ি থাকেত পাের।

আমােদর সুেডােকাড হেব এরকম:

1 * Input: A non-empty connected weighted graph with vertices V and edges E (the weights can be negative).
2 * Initialize: Vnew = {x}, where x is an arbitrary node (starting point) from V, Enew = {}
3 * Repeat until Vnew = V:
4 o Choose an edge (u, v) with minimal weight such that u is in Vnew and v is not
5 (if there are multiple edges with the same weight, any of them may be picked)
6 o Add v to Vnew, and (u, v) to Enew
7 * Output: Vnew and Enew describe a minimal spanning tree

5/6
এখন মাথায় আসেত পাের িক ভােব ি মস অ ালেগািরদম ইি েম করব? বারবার লুপ চািলেয় নইভ অ াে ােচ কাড িলখেল তামার কাড টাইম িলিমেটর মেধ রান না
করার স াবনাই বিশ।

রানটাইম কমােত ােয়ািরিট িকউ ব বহার করেত পােরা। যখন নতুন একটা নাড Vnew ত যাগ করেছা তখন সই নােডর অ াডেজেস সব েলা এজ ােয়ািরিট িকউেত
ঢুিকেয় রাখেত হেব। এখন ােয়ািরিট িকউ থেক সবেথেক িমিনমাম ওেয়েটর এজটা লগািরদম কমে ি িটেত খুজেত পারেব। মাট কমে ি িট হেব
O(ElogE)O(ElogE)। তেব এেজর বদেল িকউেত নাড পুশ কের O(ElogV)O(ElogV) ত কমে ি িট নািমেয় আনা যায়, সটা িকভােব করা যায় িচ া কের
বর কেরা।

অ ালেগািরদমটা ইমি েম করার পর অবশ ই িনেচর সমস া েলা সমাধােনর চ া করেব।

http://uva.onlinejudge.org/external/5/544.html(Straight forward)
http://uva.onlinejudge.org/external/9/908.html
http://uva.onlinejudge.org/external/100/10034.html(Straight forward)
http://uva.onlinejudge.org/external/112/11228.html
http://uva.onlinejudge.org/external/104/10462.html(2nd best mst)
spoj:
http://www.spoj.pl/problems/MST/(Straight forward)

িমিনমাম ািনং ি বর করার জন আেরকিট অ ালেগািরদম আেছ যা ুসকাল অ ালেগািরদম নােম পিরিচত। পেরর পেব আমরা সটা িশখেবা।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

6/6
াফ িথওিরেত হােতখিড় ৬: িমিনমাম ািনং ি ( ুসকাল অ ালেগািরদম)
shafaetsplanet.com /planetcoding/

শাফােয়ত 9/29/2011

(অন ান পা )
আেগর পাে আমরা ি মস অ ালেগািরদম ব বহার কের mst িনণয় করা দেখিছ। mst কােক বেল সটাও আেগর পাে বলা হেয়েছ। এ পাে আমরা দখেবা mst
বর করার আেরকিট অ ালেগািরদম যা ুসকােলর অ ালেগািরদম নােম পিরিচত। এিট mst বর করার সবেথেক সহজ অ ালেগািরদম। তেব তামােক অবশ ই িডসজেয় সট
ডাটা াকচার স েক জানেত হেব,না জানেল এই পা িট অবশ ই দেখ আেসা।

এই পাে িনেজর আকা ছিব ব বহার করেবানা। উইিকেত ুসকাল িনেয় খুব সু র কের লখা আেছ,আিম ওখানকার ছিব েলাই ব বহার কের সংে েপ অ ালেগািরদমটা
বুঝােনার চ া করেবা।

িনেচর াফিট দেখা:

থেম আমােদর ি েত একিট এজও নই। আমরা মুল ােফর এজ েলােক cost অনুযায়ী সট কের
ফলেবা। সব থেক কম cost এর এজ আেগ িনেবা, বিশ cost এর এজ পের িনেবা। িট এেজর cost
সমান হেল যেকােনা একিট আেগ িনেত পাির। তারপর একিট কের এজ িনেবা আর দখেবা এেজর াে র
নাড েলার মেধ ইেতামেধ কােনা পথ আেছ নািক,যিদ থােক তাহেল এজিট িনেল সাইেকল তির
হেব,তাই এজটা আমরা িনেবানা। বুঝেতই পারেছা ি মেসর মত এিটও একিট ‘ি িড’ অ ালেগািরদম।

উপের AD আর CE হেলা সবেথেক কম cost এর এজ। আমরা AD ক সাব ােফর অ ভূ করলাম।

একই ভােব এরপ CE তারপর DF,AB এবং BE ক যাগ করেবা:

এরপর সবেথেক ছােট এজ হেলা EF, এটােক আমরা িনেত পারেবানা কারণ EF িনেল একিট সাইেকল তির হেয় যােব,E থেক F ত যাবার রা া আেগ থেকই আেছ,তাই
এজিট নয়ার কােনা দরকার নই। এভােব BC,DB সহ লাল রেঙর এজ েলা বাদ পড়েব কারণ এরা সাইেকল তির কের।

1/4
সবেশেষ EG যাগ করেল আমরা mst পেয় যােবা।

এখন আমরা ইি েমনেটশেন আিস। আমােদর থম কাজ হেলা সট করা। পেরর কাজ হেলা একিট একিট
এজ িনেয় চক করা য াে র নাড িটর মধ পথ আেছ নািক,অথাত তারা একই কে ােনে র িভতর
আেছ নািক। এটা চক করেত লাগেব িডসজেয় সট। িডসজেয় সট িনেয় িটউেটািরয়ােল দিখেয়িছলাম
িকভােব িট নাড একই সাব ােফ আেছ নািক বর করেত হয়। তুিম সই কাজিটই এখােন করেব। তারপর
একই সাব ােফ না থাকেল আেগর মত Union ফাংশন কল িদেয় তােদর একসােথ িনেয় আসেব আর এজিট
একিট ভ র বা অ ােরেত সভ কের রাখেব।

িনেচ একটা ইমি েমে শন িদলাম, আশা কির এটা কিপ না কের িনেজ বুেঝ িলখেব:

kruskal
C++

2/4
1 struct edge {
2 int u, v, w;
3 bool operator<(const edge& p) const
4 {
5 return w < p.w;
6 }
7 };
8 int pr[MAXN];
9 vector<edge> e;
10 int find(int r)
11 {
12 return (pr[r] == r) ? r : find(pr[r]);
13 }
14 int mst(int n)
15 {
16 sort(e.begin(), e.end());
17 for (int i = 1; i <= n; i++)
18 pr[i] = i;
19
20 int count = 0, s = 0;
21 for (int i = 0; i < (int)e.size(); i++) {
22 int u = find(e[i].u);
23 int v = find(e[i].v);
24 if (u != v) {
25 pr[u] = v;
26 count++;
27 s += e[i].w;
28 if (count == n - 1)
29 break;
30 }
31 }
32 return s;
33 }
34
35 int main()
36 {
37 // READ("in");
38 int n, m;
39 cin >> n >> m;
40 for (int i = 1; i <= m; i++) {
41 int u, v, w;
42 cin >> u >> v >> w;
43 edge get;
44 get.u = u;
45 get.v = v;
46 get.w = w;
47 e.push_back(get);
48 }
49 cout << mst(n) << endl;
50 return 0;
51 }

কমে ি িট অ ানালাইিসস:
মেন কির EE হেলা এজ সংখ া। এজ েলােক সট করেত হেব, সটার কমে ি িট O(ElogE)O(ElogE), এরপের ধু এজ েলার উপর িলিনয়ার লুপ চালােত হেব।
তাহেল মাট কমে ি িট O(ElogE)O(ElogE)।

mst স িকত অেনক েলা সহজ বেলম িদেয়িছ ি মস এর িটউেটািরয়ােল,ও েলা সলভ কের াকিটস করেত পােরা। আেরকটু ভােলা বেলম করেত চাইেল দেখা:
3/4
২য় সরা ািনং ি ?
অেনক সময় বেলেম বলা হয় সেক ব MST বর করেত। এটা আমরা ট ফাস িদেয় বর করেত পাির। MST বর করা পর য এজ েলা পােবা স লার েত কটা
একবার কের বাদ িদেয় নতুন কের MST বর করেত হেব, এভােব কের য MST টা িমিনমাম হেব সটাই সেক ব MST।

http://uva.onlinejudge.org/external/103/10369.html
http://uva.onlinejudge.org/external/117/11733.html

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
াফ িথওিরেত হােতখিড় ৭:টেপােলািজকাল সট
shafaetsplanet.com /planetcoding/

শাফােয়ত 10/6/2011

(অন ান পব)
মেন কর তামার হােত িকছু কােজর একটা তািলকা আেছ,কাজ েলা অবশ ই শষ করেত হেব। কাজ েলা হেলা অিফেস যাওয়া,সকােল না া করা,িটিভেত খলা দখা,িকছু
ই- মইেলর উ র দয়া ,ব ু েদর সােথ িডনার করা ইত ািদ। কাজ েলা িক আপিন যেকােনা অডাের করেত পারেবনা,িকছু শত মানেত হেব। যমন অিফেস যাবার আেগ
না া করেত হেব, খলা দখার আেগ অিফেস যেত হেব,িডনাের বসার আেগ ইেমইেলর উ র িদেত হেব।
তুিম শত েলার তািলকা কের ফলেল:

১. সকােলর না া —> অিফস (ক—>খ এর মােন হেলা ‘খ’ কাজিট করার আেগ ‘ক’ কাজিট করেত হেব)
২. সুট-টাই পড়া —-> অিফস
৩. অিফস —-> ইেমইল
৪. অিফস —-> িডনার
৫. অিফস —-> খলা
৬. ইেমইল —> িডনার
৭. ইেমইল —> খলা
৮. িডনার —> খলা

তুিম এখন কান কাজ কখন করেব? উ াপা া অডাের করেল তামার কাজ ভ ুল হেয় যােব,ইেমইল না কের খলা দখেত বসেল তুিম ােয় হারােব,তাই অডািরং খুব
জ ির।

এটা একিট “টা িশিডউিলং” বেলম। কান কােজর পর কান কাজ করেত হেব সটা আমােদর বর করেত হেব। অথাৎ এটা এক ধরেণর সিটং যােক টেপােলািজকাল সিটং
বেল। আমরা এ িটউেটািরয়ােল এজ সিরেয় বা ইনিড ী কিমেয় টপসট বর করেবা।

আমরা থেমই সমস াটােক িনেচর াফ িদেয় মেডিলং করেবা:

উপেরর ছিবেত িতটা কাজ একিট কের নাড িদেয় দখােনা হেয়েছ। কফা থেক অিফেসর িদেক তীরিচ িদেয় বুঝােনা হে য অিফেস আসার আেগ কফা করেত
হেব। উপেরর ৮িট শত ছিবেত ৮িট িডেরে ড এজ িদেয় দখােনা হেয়েছ।

িতিট নােডর পােশ ছাট কের িকছু সংখ া দখেত পাে া। যমন অিফেসর সােথ ০,িডনােরর সােথ ২ ইত ািদ। এ েলা িদেয় বুঝাে একিট কাজ অন কয়িট কােজর উপর
িনভরশীল। যমন িডনােরর আেগ তামােক অিফস,ইেমইল এই ২টা কাজ করেত হেব,িডনার নাডিটেত ২িট তীরিচ েবশ কেরেছ,আর আমরা পােশ িলেখ িদেয়িছ “২”।

1/5
িঠক এভােব ইেমইেলর পােশ লখা হেয়েছ ১। এ সংখ া েলােক indegree বলা হয়।

ল কর কফা এবং সআপ কােনা কােজর উপর িনভরশীল নয়,তাই তােদর পােশ ০ লখা হেয়েছ। তারমােন আমরা এ িট কােজর যেকােনাটা িদেয় িদন করেত
পাির। মেন কির তুিম না া আেগ খেত চাও। না া খেয় নবার পর যসব কাজ কফাে র উপর িনভরশীল িছল তারা আর সটার উপর িনভরশীল থাকেলানা, াফটা হেয়
গল এরকম:

কফা থেক অিফেসর তীরিচ সিরেয় িদেয়িছ। এখন অিফস আর মা ১িট কােজর উপর িনভরশীল(আেগ িছল ২িটর উপর)। এবার তামােক সআপ করেত
হেব,কারণ এখন একমা এই কাজিটই কােরা উপর িনভরশীল নয়:

সআপ থেক অিফেসর তীরিচ সিরেয় দয়া হেয়েছ,আর কােনা কাজ নই,এবার তুিম অিফেস যাবার জন ত। অিফেস যাবার উপর যারা িনভরশীল তােদর
তীরিচ েলা এখন সিরেয় িদেত পাির:

2/5
এখন ইেমইল “ নাড” এর িনভরশীলতা ০ হেয় িগেয়েছ:

এরপর িডনার:

3/5
সবেশেষ খলা দখেত বসা:

এখন তুিম কােজর অডািরং পেয় িগেয়েছা,না া করা,অিফেসর পাষাক পড়া,অিফেস যাওয়া,ইেমইল করা,িডনার করা, খলা দখা।

এটােকই বলা হয় টেপােলািজক াল সট(topological sort) বা টপসট। মূলত কােজর অডািরং খুেজ বর করেত এই অ ালেগািরদমিট ব বহার করা হয়। কি উটার তার
অভ ের িবিভ কােজর অডািরং িঠক করেত টপসট ব বহার কের। অেনক িরেয়ল লাইফ েয়াগ থাকায় টপসট কি উটার সােয়ে খুবই পূ ণ একিট টিপক। টপসট বর
করার আেরকিট প িত আেছ যার নাম “ ডপথ ফা সাচ”,এটা িনেয় আেলাচনা কেরিছ এই লখায়।

উপেরর অ ালেগািরদমিট O(n^2) এ কাজ কের। একিট ােফর অেনক েলা সেটড অডার থাকেত পাের, যমন উপেরর সমস ায় তুিম না া খাবার আেগ জামা-কাপড় পরেত
পারেত। তামােক লি েকা ািফকািল ছাটটা ি করেত বলেত পাের অথবা যটা ইনপুেট আেগ আেছ সটােক আেগ ি করেত বলেত পাের,আশা কির এসব কি শন
সহেজ হ া ল করেত পারেব।

ইমি েমে শন িনেয় তমন িকছু বলার নই। সব েলা নােডর indegree বর করেব। তারপর যার indegree শূ ন তার সােথ যােদর এজ আেছ তােদর indegree ১
কিমেয় িদেব,তারপর আবার খুজেব কার indegree এখন শূ ন । এক নাডেক কখেনা ২বার িনেবনা। ছিবেত এজ উিঠেয় দিখেয়িছ বুঝােনার জন , তামার ম াি থেক
এজ উঠােনার দরকার নই,indegree কমােলই চলেব।

অেনক সময় বলেত পাের যতরকম ভােব topsort করা যায় সব েলা বর করেত। তখন তামােক backtracking এর সাহায িনেত হেব।
4/5
িনেচর সমস া েলা সমাধান কের ফেলা:
http://uva.onlinejudge.org/external/103/10305.html(Easy,straight-forward,special judge)
http://uva.onlinejudge.org/external/110/11060.html(Easy)
http://uva.onlinejudge.org/external/1/124.html(Medium,All possible topsort)
http://uva.onlinejudge.org/external/4/452.html(Medium)

(অন ান পা )

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
াফ িথওিরেত হােতখিড় ৮: ডপথ ফা সাচ এবং আবােরা টেপােলািজকাল সট
shafaetsplanet.com /planetcoding/

শাফােয়ত 3/8/2012

আেগর পব েলা পেড় থাকেল হয়েতা ডপথ ফা সাচ বা িডএফএস এতিদেন িনেজই িশেখ ফেলেছা।
তারপেরও এই িটউেটািরয়ালিট পড়া দরকার িকছু কনেস জানেত।

িবএফএস এ আমরা াফটােক লেভল বাই লেভল সাচ কেরিছলাম,িনেচর ছিবর মেতা কের:

এবার আমরা কােনা নাড পেল সােথ সােথ স নাড থেক আেরা গভীের চেল যেত থাকেবা,যখন আর গভীের
যাওয়া যােবনা তখন আবার আেগর নােড িফের এেস অন আেরক িদেক যত চ া করেবা,এক নাড কখেনা
২বার িভিজট করেবানা। আমরা নােডর ৩িট রং(কালার) িদেবা:

সাদা নাড= য নাড এখেনা খুেজ পাইিন/িভিজট কিরিন।


বা ধুসর নাড= য নাড িভিজট কেরিছ িক নাডিট থেক যসব চাই নােড যাওয়া যায়
স েলা এখেনা িভিজট কের শষ কিরিন,অথাত নাডিটেক িনেয় কাজ চলেছ।
কােলা নাড= য নােডর কাজ স ূণ শষ।

এবার আমরা ধাপ েলা দখেত পাির:

1/8
2/8
3/8
আশা কির িডএফএস িকভােব কাজ কের এটা পির ার,খুব সহজ িজিনস এটা। এবার আমরা একটা খুব পূ ণ টাম িশখেবা, সটা হেলা ব াকএজ(backedge)। ল
কেরা ৫-১ ক ব াকএজ বলা হেয়েছ। এর কারণ হেলা তখনও ১ এর কাজ চলেছ,৫ থেক ১ এ যাওয়া মােন এমন একটা নাড িফের যাওয়া যােক িনেয় কাজ এখেনা শষ
হয়িন,তারমােন অবশ ই ােফ একিট সাইেকল আেছ। এ ধরেনর এজেক ব াকএজ বেল,dfs এ যিদ কােনা সময় একিট নাড থেক আেরকিট নােড যেত চ া কের
তাহেল স এজিট ব াকএজ এবং ােফ অবশ ই সাইেকল আেছ। dfs এর সাস নাড এবং নাড িভিজট করার অডার এর উপর িনভর কের সাইেকেল য কােনা এজেক
ব াকএজ িহসােব পাওয়া যেত পাের, যমন ১ থেক আেগ ২ এ না িগেয় ৫ এ গেল পের ২-১ ক ব াকএজ িহসােব পাওয়া যেতা।

আর যখন আমরা াভািবক ভােব থেক সাদা নােড যাি তখন স এজ েলােক বলা হয় ি এজ । ধুমা ি এজ েলা রেখ বািক এজ েলা মুেছ িদেল য াফটা থােক
তােক বলা হয় িডএফএস ি ।

আনিডেরে ড ােফর ে আেগ িভিজট করা কােনা নােড িফের গেলই সটা ব কএজ,কালার চক না করেলও হয়। তেব িডেরে ড ােফর ে অবশ ই করেত হেব।
পেরর ছিবটা দেখা:

4/8
২-৩এর এজটােক ব াকএজ বলা যাে না,কারণ ৩ এর কাজ আেগই শষ হেয় গেছ।

িতটা নাড আর এজ িনেয় একবার কের করিছ, dfs এর কমে ি িট O(V+E)।

আমরা টেপালিজকাল সেটর সমস া সমাধান কেরিছলাম বারবার indegree উিঠেয়। এবার আমরা খুব সহেজ dfs িদেয় এটা করেবা। টেপালিজকাল িক সটা না জানেল
আেগ এই পা টা পেড়া,তারপর আগাও।
মেন কির আমােদর এজ েলা হেলা: ২-১,২-৩,৩-৪,১-৪। অথাত ১ ন র কাজ করার আেগ ২ ন রিট করেত হেব ইত ািদ। এবার আমরা dfs চালােনার সময় একিট
পওয়াচ চালু কের িদেবা। আর কােনা নাড িনেয় কাজ করেল ঘিড় দেখ নাডিট starting time/discovery time িলেখ রাখেবা,কাজ শষ হেলা নাডিটর
finishing time িলেখ রাখেবা।

5/8
finishing time দেখ আমরা সহেজই টপসট করেত পাির। য নাডিট সবার
আেগ আসেব তার finishing time অবশ ই সবেথেক বিশ হেব,কারণ থম
নােডর উপর িনভরশীল সব নাড ঘুের আসার পের স নােডর finishing time
assign করা হয়। uva 11504-dominos বেলেম আেগ নাড েলােক
finishing time িদেয় সট কের তারপর আবার dfs চালােত হয়, বেলমটা চ া
কেরা।

িডএফএস িদেয় আমরা যসব কাজ কির স েলার অেনক েলাই bfs িদেয় করেত
পাির। bfs এ সাধারণত টাইম কমে ি িট কম হয় তেব dfs কািডং করেত খুব
কম সময় লােগ। একটা িস ল dfs এর সুেডােকাড এরকম:

1 procedure DFS(G, source):


2 U ← source
3 time ← time+1
4 d[u] ← time
5 color[u] ← GREY
6 for all edges from u to v in G.adjacentEdges(v)
7 do
8 if color[v] = WHITE
9 DFS(G,v)
10 end if
11 end for
12 color[u] ← BLACK
13 time ← time+1
14 f[u] ← time
return

িনেচর বেলম েলা সলভ করেত চ া কেরা:


http://uva.onlinejudge.org/external/2/280.html
http://uva.onlinejudge.org/external/115/11518.html
http://uva.onlinejudge.org/external/104/10452.html

এরপের এই আিটেকলটা পেড় ফেলা িব ািরত জানার জন ,আমার লখা পেড় তুিম বিসকটা িশখেত পারেব,িব ািরত জানেত এবং কিঠন বেলম সলভ করেত আেরা অেনক
িকছু জানেত হেব।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

6/8
7/8
8/8
় (ডাযা়
াফ িথওিরেত হােতখিড-৯ া)
shafaetsplanet.com /planetcoding/

শাফােয়ত এি ল ৯,
২০১৩

আমরা েতই িশেখিছ িকভােব শেট পােথ এক জাযগ় া থেক আেরক জাযগ় ায় যেত হয। ় সজন আমরা িশেখিছ ডথ ফা সাচ নােমর একিট সািচং অ ালেগািরদম।
অ ালেগািরদমিট চমৎকার িক সমস া হেলা স ধের নয িতিট রা া িদেয যেত সমান সময় লােগ, মােন সব এজ এর ক সমান। াকিটকাল লাইেফ বিশভাগ ে ই
় ়
এটা অচল হেয় পেড়, তখন আমােদর দরকার পের ডাযা় া। থেম নাম েন আমার ধারণা হেযি় ছেলা ডাযা় া খুবই ভযং় কর কােনা িজিনস িক আসেল িবএফএস লখার
মেতাই সহজ ডাযা় া লখা, আিম তামােদর দখােনার চ া করেবা িকভােব িবএফএসেক িকছুটা পিরবতন কের একটা ােযা় িরিট িকউ যাগ কের সটােক ডাযা় া বািনেয়

ফলা যায।

ডাযা় া করার আেগ আমরা পাথ িরল াে শন(relax) নােমর একটা ছা িজিনেসর সােথ পিরিচত হই। ধেরা সাস থেক িতটা নােডর িডসেট রাখা হেযে় ছ
d[]d[] অ ােরেত। যমন d[3]d[3] মােন হেলা সাস থেক িবিভ এজ পার হেয় ৩ এ আসেত মাট d[3]d[3] িডসেট লেগেছ। যিদ িডসেট জানা না থােক তাহেল
ইনিফিনিট অথাৎ অেনক বড় একটা মান রেখ িদেবা। আর cost[u][v]cost[u][v] ত রাখা আেছ u–vu–v এজ এর cost।

ধেরা তুিম িবিভ জাযগ় া ঘুের ফামেগট থেক িটএসিস ত গেল ১০ িমিনেট, আবার ফামেগট থেক কাজন হেল গেল ২৫ িমিনেট। তাহেল তামার কােছ ইনফরেমশন
আেছ:

d[িটএসিস] = ১০, d[কাজনহল] = ২৫

এখন তুিম দখেল িটএসিস থেক ৭ িমিনেট কাজেন চেল যাওযা় যায,়

cost[িটএসিস][কাজন] = ৭

তাহেল তুিম ২৫ িমিনেটর জাযগ় ায় মা ১০ + ৭ = ১৭ িমিনেট কাজনহেল যেত পারেব। যেহতু তুিম দেখেছা:

d[িটএসিস] + cost[িটএসিস][কাজন] < d[কাজনহল]

তাই তুিম এই নতুন রা া িদেয় কাজন হেল িগেয় d[কাজনহল] = d[িটএসিস] + cost[িটএসিস][কাজন] বািনেয় িদেতই পােরা!!

উপেরর ছিবটা সটাই বলেছ। আমরা u থেক v ত যােবা যিদ d[u] + cost[u][v] <
d[v] হয। ় আর d[v]d[v] ক আপেডট কের
d[v]=d[u]+cost[u][v]d[v]=d[u]+cost[u][v] বািনেয় িদেবা। ভিবষ েত যিদ কাজনহেল
অন রা া িদেয় আেরা কম সমেয় যেত পাির তখন সই রা া এভােব কে যা় র কের আপেডট কির
িদেবা। ব াপারটা অেনকটা এরকম:

C++

1 if d[u] + cost[u][v] < d[v]:


2 d[v] = d[u] + cost[u][v]

উপেরর অংশটা যিদ বুেঝ থােকা তাহেল ডাযা় া বাঝার ৬০% কাজ হেয় গেছ। না বুেঝ থাকেল আবার পেড়া।

িবএফএস িন যই় তুিম ভােলা কের বুেঝা। িবএফএস এ আমােদর একটা নােড কখেনা ইবার যাওযা় দরকার হযি় ন, আমরা িতবার দেখিছ একটা নাড িভিজেটড িকনা,
যিদ িভিজেটড না হয় তাহেল সই নাডেক িকউেত পুশ কের িদেযি় ছ এবং িডসেট ১ বািড়েয় িদেযি় ছ। ডাযা় ােত আমরা একই ভােব িকউ ত নাড রাখেবা তেব িভিজেটড
1/3
িদেয় আপেডট না কের নতুন এজেক “িরল া ” বা আপেডট করেবা উপেরর প িতেত। িনেচর াফটা দেখা:

ধের নই সাস হেলা ১ ন র নাড। তাহেল

d[1] = 0, d[2] = d[3] = d[4] = infinity(a large value)

ইনিফিনিট কারণ ২,৩,৪ এর দূর আমরা এখেনা জািননা, আর সােসর দূর অবশ শূ ন । এখন তুিম
আেগর িবএফএস এর মেতাই সাস থেক যত েলা নােড যাওযা় যায় স লা আপেডট করার চ া
কেরা, আপেডট করেত পারেল িকউেত পুশ কেরা। যমন ১ – ২ এজটা ধের আমরা আগােবা কারণ
d[1]+2<d[2]d[1]+2<d[2] এই শতটা পূ রণ হে । তখন d[2]d[2] হেয় যােব ২, একই
ভােব ১ থেক ৩ এ গেল d[3]d[3] হেয় যােব ৫।

িক ৫ তা ৩ ন রেনােড যাওযা় র শেট িডসেট না! আমরা িবএফএস এ দেখিছ একটা নাড
একবােরর বিশ আপেডট হযন় া, সই াপািট এখােন কাজ করেছনা। ২ ন র নাড থেক ২-৩ এজ ধের এিগেয় আবার আপেডট করেল তখন d[3]d[3] ত
d[2]+1=3d[2]+1=3 পােবা। তাহেল আমরা দখলাম এে ে একটা নাড অেনকবার আপেডট হেত পাের। ( : সেবা কত বার?)

আমরা তাহেল আেগর িবএফএস এর সুেডােকােডর আপেডট অংশ একটু পিরবতন কির যােত একটা নাড বার বার আপেডট হেত পাের:

1 1 procedure BFSmodified(G,source):
2 2 Q = queue(), distance[] = infinity
3 3 Q.enqueue(source)
4 4 distance[source] = 0
5 5 while Q is not empty
6 6 u ← Q.pop()
7 7 for all edges from u to v in G.adjacentEdges(v) do
8 8 if distance[u] + cost[u][v] < distance[v]
9 9 distance[v] = distance[u] + cost[u][v]
10 10 Q.enqueue(v)
11 11 end if
12 12 end for
13 13 end while
14 14 Return distance

আমরা িঠক আেগর িবএফএস এর কােডই জা ক বসায় বারবার আপেডট করিছ! এই কাড তামােক সাস থেক িতটা নােডর শেট পাথ বর কের িদেব িক
কমে ি িটর িদক থেক এটা খুবই বােজ! এজন আমােদর লাগেব একটা ােযা় িরিট িকউ।

িবএফএস এ আমরা যখন ১ নাড থেক অেনক েলা নােড যাি তখন সই নাড েলা থেক আবার নতুন কের কাজ করার সময় “আেগ আসেল আেগ পােবন” িভি েত
কাজ করিছ। যমন উপেরর ােফ ১ থেক আেগ ৩ ন র নােড এবং তারপর ২ ন র নােড এ গেল আেগ ৩ িনেয় কাজ করিছ, এরপর ২ িনেয় কাজ করিছ।

ভােলা কের দেখা এখােন িক সমস াটা হে । ৩ িনেয় আেগ কাজ করেল আমরা ৪ এর িডসেট েক আপেডট কের িদি িডসেট ৫ + ৩ = ৮ িহসােব। পরবতীেত যখন ২
িদেয় ৩ ক আবার আপেডট করা হে তখন ৩ এর িডসেট হেয় িগেযে় ছ ৩, এবার ৪ এর িডসেট েক আবার আপেডট করিছ ৩ + ৩ = ৫ িহসােব। ৪ ক মাট ইবার
আপেডট করা লাগেলা।

িব ানী ডাযা় া িচ া করেলন যিদ এই “আেগ আসেল আেগ পােবন” িভি েত কাজ না কের সবেথেক কােছর নাড েলােক আেগ েসস কির তাহেল অেনক কমবার
আপেডট করা লােগ। আমরা যিদ ২ ক িনেয় আেগ কাজ করতাম তাহেল ৩ আেগই আপেডট হেয় যত এবং ৪ ক একবার আপেডট কেরই শেট িডসেট পেয় যতাম!
একটু হােত কলেম িসমুেলট কের দেখা। আইিডযা় টা হেলা যেকােনা সময় িকউ ত যত েলা নাড থাকেব তােদর মেধ যটা সাস থেক সবেথেক কােছ সটা িনেয় আেগ
কাজ করেবা। এজন ই আমরা িকউ এর জাযগ় ায় বিসেয় িদেবা একিট ােযা় িরিট িকউ য িকউেত নাড পুশ করার সােথ সােথ কােছর নাডটােক সামেন এেন িদেব। পাথক
হেলা আেগ খািল নাড না ার পুশ কেরিছ, এখন বতমান িডসেট অথাত d[u]d[u] এর মানটাও পুশ করেত হেব।

িনেচ একটা স ূণ ডাযা় ার সুেডােকাড িদলাম যটা ১ থেক nn তম নােড যাবার শেট পাথ বর কের এবং পাথটাও ি কের:

C++

2/3
1 1 procedure dijkstra(G, source):
2 2 Q = priority_queue(), distance[] = infinity
3 3 Q.enqueue(source)
4 4 distance[source]=0
5 5 while Q is not empty
6 6 u = nodes in Q with minimum distance[]
7 7 remove u from the Q
8 8 for all edges from u to v in G.adjacentEdges(v) do
9 9 if distance[u] + cost[u][v] < distance[v]
10 10 distance[v] = distance[u] + cost[u][v]
11 11 Q.enqueue(v)
12 12 end if
13 13 end for
14 14 end while
15 15 Return distance

এখােন আেগর সুেডােকােডর থেক কেয়ক জায়গায় একটু িভ তা আেছ। এখােন সাধারণ িকউ এর জায়গায় ােয়ািরিট িকউ ব বহার করা হেয়েছ। িকউ থেক পপ হবার সময়
তাই সাস থেক এখন পয পাওয়া সবেথেক কােছর নাডটা পপ হে এবং সটা িনেয় আেগ কাজ করিছ।

উপেরর সুেডােকােড সাস থেক বািক সব নােডর দূর বর করা হেয়েছ। তুিম যিদ ধু একটা নােডর র বর করেত চাও তাহেল সটা যখন িকউ থেক পপ হেব তখনই
িরটান কের িদেত পােরা।

নেগিটভ এজ থাকেল িক ডাযা় া অ ালেগািরদম কাজ করেব? যিদ নেগিটভ সাইেকল থােক তাহেল ইনিফিনট লুেপ পের যােব, বারবার আপেডট কের ক কমােত থাকেব।
যিদ নেগিটভ এজ থােক িক সাইেকল না থােক তাহেলও কাজ করেবনা। তেব তুিম যিদ টােগট পপ হবার সােথ সােথ িরটাণ কের না দাও তাহেল কাজ করেব িক সটা তখন
আর মূল ডাযা় া অ ালেগািরদম থাকেবনা।

কমে ি িট:
িবএফএস এর কমে ি িট িছেলা O(log(V+E))O(log(V+E)) যখােন VV হেলা নাড সংখ া আর EE হেলা এজ সংখ া। এখােনও আেগর মেতাই কাজ হেব তেব
ােযা় িরিট িকউ ত িতবার সট করেত
O(logV)কমপ◌্ল ◌ক◌্সি◌টি◌ল◌াগব ◌।ম ◌াট:O(logV)কমপ◌্ল ◌ক◌্সি◌টি◌ল◌াগব ◌।ম ◌াট:O(VlogV+E)$ ।

নেগিটভ সাইেকল িনেয় কাজ করেত হেল আমােদর জানেত হেব বলম ান ফাড অ ালেগািরদম। সখােনও এজ িরল া কের আপেডট করা হয,় একটা নাডেক সেবা
n–1n–1 বার আপেডট করা লাগেত পাের সই াপািট কােজ লাগােনা হয। ়

ডাযা় া ভােলা কের িশখেত িনেচর বেলম েলা ঝটপট কের ফেলা:

Dijkstra?
Not the Best
New Traffic System

হ ািপ কািডং!

( াফ িথওির িনেয় সব েলা লখা)

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
াফ িথওিরেত হােতখিড় ১০: েয়ড ওয়াশল
shafaetsplanet.com /planetcoding/

শাফােয়ত জুলাই ২২, ২০১৪

েয়ড ওয়াশল স বত সব থেক ছাট আকােরর াফ অ◌্যালেগািরদম, মা ৩লাইেন এটা লখা যায়! তেব ৩ লাইেনর এই অ◌্যালেগািরদেমই বাঝার অেনক িকছু আেছ।
েয়ড ওয়াশেলর কাজ হেলা ােফর িতটা নাড থেক অন◌্য সব েলা নােডর সংি তম র বর করা। এ ধরেণর অ◌্যালেগািরদমেক বলা হয় “অল- পয়ার শেট
পাথ” অ◌্যালেগািরদম। এই লখাটা পড়ার আেগ অ◌্যাডেজেসি ম◌্যাি স েক জানেত হেব।

আমরা একটা ােফর উপর িকছু িসমুেলশন কের সহেজই অ◌্যালেগািরদমটা বুঝেত পাির। িনেচর ছিবটা দখ:

ছিবেত চার নােডর একটা ওেয়েটড িডেরে ড াফ দখা যাে । আর উপের ডান কানায় একটা ম◌্যাি । ম◌্যাি ে র u,v তম ঘের বসােনা হেয়েছ u-v এজ এর
ওেয়ট বা ক । যােদর মধ◌্েয সরাসির এজ নই সসব ঘের অসীম বা ইনিফিনিট বিসেয় দয়া হেয়েছ। আর কানাকুিন ঘর েলােত মান ০ কারণ িনেজর বাসা থেক
িনেজর বাসােতই যেত কান দূর অিত ম করেত হয় না!

এখন মেন কেরা “২” ন র নাডটােক আমরা “মােঝর নাড” িহসােব ধরলাম। মােঝর নাডেক আমরা বলেবা k। তারমােন এখন k=2। (আমরা এেক এেক সব নাডেকই
মােঝর নাড িহসােব ধরেবা, এটা যেকান অডাের করা যায়)

এখন যেকান এক জাড়া নাড (i,j) নাও। ধির i=1, v=3। আমরা চাই u থেক v ত যেত, k নাডটােক মােঝ রেখ । তাহেল আমােদর i থেক k ত যেত হেব,
তারপর k থেক থেক j ত যেত হেব। িক লাভ না হেল আমরা এভােব যাব কন? আমরা k ক মােঝ রেখ যােবা কবল যিদ মাট ক (cost) কেম যায়। ১ থেক ৩
এর বতমান দূর matrix[1][3]=ইনিফিনিট। আর যিদ k=২ ক মাঝখােন রািখ তাহেল দূর দাড়ােব matrix[1][2] + matrix[2][3] = 3 +2 = 5। তারমােন
ক কেম যাে ! আমরা াফটা আপেডট কের িদেত পাির এভােব:

1/5
আমরা ২ ক “মােঝর নাড” িহসােব ব◌্যবহার কের ১ থেক ৩ এ িগেয়িছ মাট ৫ ক এ। ােফ তাহেল ১ থেক ৩ এ সরাসির একটা এজ িদেয় িদেত পাির ৫ ক এ।

এখন আবার ধর i=2, j=4। আর আেগর মতই k=2। এবার matrix[2][4]=ইনিফিনিট। এিদেক matrix[2][2] + matrix[2][4] = ০ + ইনিফিনিট। এবার
িক দূর কমেলা না। তাই াফ আপেডট করার দরকার নই। িন য়ই বুঝেত পারেছা আপেডেটর শতটা হেব এরকম:

if(matrix[i][k] + matrix[k][j] < matrix[i][j])


matrix[i][j] = matrix[i][k] + matrix[k][j]

অথবা আমরা একলাইেন িলখেত পাির:

matrix[i][j] = min(matrix[i][j] , matrix[i][k] + matrix[k][j])

এখন k=2 ি র রেখ আমরা i,j এর সবরকেমর কি েনশন িনেবা। তুিম িনেজই িচ া করেল দখেব k=2 এর জন◌্য i=3, j=1 এই কি েনশেন আমরা আেরকটা নতুন
এজ পােবা, বািক াফ আেগর মতই থাকেব।

2/5
এবার আমরা k=1 ক মােঝর নাড িহসােব িচ া কির। মাথা খাটােত চাইেল িনেচ দখার আেগ িনেজই খাতায় এেক ফলেত পােরা নতুন এজ েলা।

এবার একটা মা এজ যাগ হেব। i=4, j=2 হেল আমরা ৪ থেক ১ হেয় ২ ন র নােড যেত পাির ২৩ ক এ। তাহেল াফটা হেব এরকম:

এবার ৩ ন র নাডেক মােঝর নাড িহসােব ধরেবা। আবােরা িনেজ চ া কের তারপর িনেচর অংশ দখ।

এবার িকছু মজার িজিনস ঘটেব। ৪ থেক ১ এ আেগ লাগিছল ২০ ক । এখন ৩ ক মােঝ রেখ ৪ থেক ১ এ গেল লাগেব ৮+৭=১৫ ক । ল ◌্য কর একদম
েত ৩ থেক ১ এ আমােদর এজ িছল না। িক আপেডট করার সময় আমরা এজ বিসেয় িদেয়িছ, এখন ৩ থেক ১ এ যিদও সরাসির চেল যাি , মূল ােফ আসেল ৩-
>২->১ পেথ যাি ।
একই ভােব ৪ থেক ২ এর ২৩ ক এর পথটা আপেডট হেয় ১৩ হেয় যােব।

k=৪ এর জন◌্য আর কান আপেডট হেব না কারণ কােনা নাড থেক ৪ এ যাওয়া যায় না।

এখন আমরা ম◌্যাি দেখই বেল িদেত পারিছ কান নাড থেক কান নােড কত ক এ যাওয়া যায়। ইনিফিনিট থাকা মােন সই নােড যাবার পথ নই।

3/5
ইনপুট থেক অ◌্যাডেজেসি ম◌্যাি বানাবার পর তাহেল কাজ খুবই সহজ:

C++

1 for k from 1 to |V|


2 for i from 1 to |V| \\ |V| = number of nodes
3 for j from 1 to |V|
4 if matrix[i][j] > matrix[i][k] + matrix[k][j]
5 matrix[i][j] ← matrix[i][k] + matrix[k][j]

কােড আমরা k এর লুপটা ১ থেক চালাি যিদও উদাহরেণ আেগ ২ িনেয়িছ। এটা আসেল যেকান অডােরই করা যায়, তুিম আেগ ১ িনেলও দখেব অ◌্যালেগািরদম কাজ
করেব।

এভােবেতা আমরা ধু পােথর ক পলাম, পাথটা ি◌কভােব পাব?

ধেরা আমােদর একটা ম◌্যাি আেছ next[][]। এখন next[i][j] িদেয় আমরা বুিঝ i থেক j ত যেত হেল পরবিত য নাড এ যেত হেব সই নাডটা। তাহেল
একদম েত সব i,j এর জন◌্য next[i][j] = j হেব। কারণ েত কান “মােঝর নাড” নই এবং তখনও শেট পাথ বর করা শষ হয় িন।

এখন আমরা যখন matrix[i][j] আপেডট করেবা লুেপর সটার মােন হেলা মােঝ একটা নাড k ব◌্যবহার কের আমরা যােবা। ল ◌্য কর আমরা িক মূল ােফ সরাসির
এজ িদেয় i থেক k ত নাও যেত পাির, আমরা ধু জািন i,j নাড েটার মােঝ একটা নাড k আেছ যখােন আমােদর যেত হেব j ত যাবার আেগ। i থেক k ত যাবার
পেথ পরবিত য নােড যেত হেব সটা রাখা আেছ next[i][k] ত! তাহেল next[i][j] = next[i][k] হেয় যােব।

1 for k from 1 to |V|


2 for i from 1 to |V|
3 for j from 1 to |V|
4 if matrix[i][k] + matrix[k][j] < matrix[i][j] then
5 matrix[i][j] ← matrix[i][k] + matrix[k][j]
6 next[i][j] ← next[i][k]
7
8
9 findPath(i, j)
10 path = [i]
11 while i ≠ j
12 i ← next[i][j]
13 path.append(i)
14 return path

findpath ফাংশেন আমরা j ক িফ ড রেখ next অ◌্যাের ধের আগাি যত ণ না j ত পৗছাি । তাহেল আমরা পেয় গলাম পাথ!

াি িটভ াজার(Transitive Closure):

ধেরা আমােদর অ◌্যাডেজি ম◌্যাি টা এরকম:

1 matrix[i][j] = 1 যিদ i থেক j ত সরাসির এজ থােক


2 matrix[i][j] = 0 যিদ এজ না থােক

এখন আমরা এমন একটা ম◌্যাি তির করেত চাই যটা দেখ বেল দয়া যােব i থেক j ত এক বা একািধক এজ ব◌্যবহার কের যাওয়া যায় িকনা। আমরা চাইেল
উপেরর মত কের o এর জায়গায় ইনিফিনিট িদেয় শেট পাথ বর কের কাজটা করেত পারতাম। িক এে ে “OR” আর “AND” অপােরশন ব◌্যবহার আেরা ত
কাজটা করা যায়। এখন আপেডেটর শতটা হেয় যােব এরকম:

4/5
1 matrix[i][j] = matrix[i][j] || (matrix[i][k] && matrix[k][j])

এটার মােন matrix[i][j] ত তখনই ১ বসেব যখন হয় “matrix[i][j] ত ১ আেছ” অথবা “matrix[i][k] এবং matrix[k][j]” েটােতই ১ আেছ। তারমােন হয়
সরাসির যেত হেব অথবা মােঝ একটা নাড k ব◌্যবহার কের যেত হেব।

কমে ি িট:

৩টা নে ড লুপ ঘুরেছ নাড স◌ংখ◌্যার উপর, টাইম কমে ি িট O(n^3)। ২িড ম◌্যাি ব◌্যবহার করায় স কমে ি িট O(n^2)।

িকছু :

১. k এর লুপটা িক i,j লুেপর িভতর িদেল অ◌্যালেগািরদম কাজ করত?


২. ােফ নেগিটভ ক থাকেল েয়ড ওয়াশল কাজ করেব িক?
িরেলেটড বেলম:

Page Hopping
05-2 Rendezvous
Minimum Transport Cost
Asterix and Obelix
আেরা অেনক বেলম

হ◌্যািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
াফ িথওিরেত হােতখিড় ১১: বলম◌্যান ফাড
shafaetsplanet.com /planetcoding/

শাফােয়ত অে াবর ১৭,


২০১৪

বলম◌্যান ফাড ােফ শেট পাথ বর করার একটা অ◌্যালেগািরদম। এই অ◌্যালেগািরদম একটা নাডেক সাস ধের সখান থেক সব নােডর সংি তম বা শেট
পথ বর করেত পাের। আমরা একদম েত এই কাজ করার জন◌্য ডথ ফা সাচ িশেখিছ। িক িবএফএস(BFS) যেহতু ওেয়েটড ােফ কাজ কের না তাই এরপর
আমরা িশেখিছ ডায়া া অ◌্যালেগািরদম। এখন বলম◌্যান ফাড িশখব কারন আেগর কােনা অ◌্যালেগািরদমই নেগিটভ ওেয়ট এর এজ আেছ এমন ােফ কাজ কের
না।

আমরা ডায়া া শখার সময় িরল◌্যাে শন নােমর একটা ব◌্যাপার িশেখিছলাম। তামার যিদ মেন না থােক বা ডায়া া না িশেখ থােকা তাহেল আমরা থেম একটু
ঝালাই কের নই আেরকবার। মেন থাকেল পেরর অংশটা বাদ িদেয় সরাসির এখােন যেত পার।

এজ িরল◌্যাে শন:

ধর একটা ােফ সাস থেক িতটা নােডর িডসেট /ক রাখা হেয়েছ d[]d[] অ ােরেত। যমন d[3]d[3] মােন হেলা সাস থেক িবিভ এজ পার হেয় ৩ ন র নাড এ
আসেত মাট d[3]d[3] িডসেট পার করেত হেয়েছ। যিদ িডসেট জানা না থােক তাহেল ইনিফিনিট অথাৎ অেনক বড় একটা মান রেখ িদেবা। আর
cost[u][v]cost[u][v] ত রাখা আেছ u−vu−v এজ এর cost।

ধর তুিম িবিভ জায়গা ঘুের ফামেগট থেক িটএসিস ত গেল ১০ িমিনেট, আবার ফামেগট থেক কাজন হেল গেল ২৫ িমিনেট। তাহেল ফামেগটেক সাস ধের আমরা বলেত
পাির:

d[িটএসিস] = ১০, d[কাজন হল] = ২৫

এখন তুিম দখেল িটএসিস থেক ৭ িমিনেট কাজেন চেল যাওয়া যায়,

cost[িটএসিস][কাজন হল] = ৭

তাহেল তুিম ২৫ িমিনেটর জায়গায় মা ১০ + ৭ = ১৭ িমিনেট কাজ নহেল যেত পারেব। যেহতু তুিম দেখেছা:

d[িটএসিস]+cost[িটএসিস][কাজন] < d[কাজন হল]

তাই তুিম এই নতুন রা া িদেয় কাজন হেল িগেয় d[কাজন হল] = d[িটএসিস] + cost[িটএসিস][কাজন হল] বািনেয় িদেতই পােরা!!

উপেরর ছিবটা সটাই বলেছ। আমরা uu থেক vv ত যােবা যিদ d[u]+cost[u][v] <
d[v] হয়। আর d[v]d[v] ক আপেডট কের
d[v]=d[u]+cost[u][v]d[v]=d[u]+cost[u][v] বািনেয় িদেবা। ভিবষ েত যিদ কাজনহেল
অন রা া িদেয় আেরা কম সমেয় যেত পাির তখন সই রা া এভােব কে য়ার কের আপেডট কির
িদেবা। ব াপারটা অেনকটা এরকম:

C++

1/5
1 if(d[u]+cost[u][v] < d[v])
2 d[v] = d[u] + cost[u][v];

এটাই হেলা এজ িরল◌্যাে শন। এখন আমরা বলম◌্যান ফাড শখার জন◌্য তির।

বলম◌্যান ফাড

িনেচর ােফ আমরা ১ থেক কের িতটা নােড যাবার শেট পাথ বর করেত চাই:

েত d[1]=0d[1]=0 কারণ ১ হেলা সাস। বািকসব েলােত ইনিফিনিট রেখিছ কারণ আমরা এখনও জািননা শেট পােথর ক কত।

তুিম এজ িরল◌্যা িকভােব করেত হয় এরই মধ◌্েয িশেখ গছ। এখন কাজ হেলা সব েলা এজেক একবার কের িরল◌্যা করা, যেকান অডাের। একবার ‘ াফ
িরল◌্যা ’ করার মােন হল াফটার সব েলা এজেক একবার কের িরল◌্যা করা। আিম িনেচর অডাের িরল◌্যা করেত চাই,

Serial 1 2 3 4 5 6

Edge 4 -> 5 3 -> 4 1 -> 3 1 -> 4 4 -> 6 2 -> 3

তুিম চাইেল অন◌্য যেকােনা অডােরও এজ েলা িনেত পারেত। এখন িচ া কর এজ েলােক একবার িরল◌্যা করেল আমরা d[] অ◌্যােরেত িক পাব? সাস থেক
কের সেবা ১টা এজ ব◌্যবহার কের অন◌্যান◌্য নােড যাবার শেট পােথর ক আমরা পেয় যাব। উপেরর ছিবেত িরল◌্যা করার পর d[] এর মান েলা আপেডট
কের দাও। করার পর ছিবটা িনেচর মত হবার কথা:

এজ িরল◌্যা করার সময় িকছু নাড এর ক আপেডট করেত পাির িন কারণ d[u]+cost[u][v] < d[v] শতটা পূ রণ কের িন। বািক এজ েলা আপেডট করার পর
2/5
d[]d[] অ◌্যােরর এর মান উপেরর ছিবর মত পেয়িছ। ১ ন র নাড থেক কের সেবা একিট এজ ব◌্যবহার কের সব নােড যাবার শেট পাথ এখন আমরা জািন!

এখন সেবা ২টা এজ ব◌্যবহার কের সব নােড যাবার শেট পােথর cost বর করেত আেরকবার িরল◌্যা কের ফিল! আবােরা যেকান অডাের করা যােব, তেব থেম
য অডাের কেরিছ সভােবই িতবার করা কাড লখার সময় সুিবধাজনক।

একটা ব◌্যাপার ল ◌্য কর, ১ থেক ৬ ত যাবার শেট পেথ ৩ টা এজ আেছ (১->৩, ৩->৪, ৪->৬) এবং পেথর দঘ◌্য ২+১+৫=৮। মা ২বার িরল◌্যা
করেলও আমরা এখনই d[6] ত ৮ পেয় গিছ, অথচ আমােদর এখন সেবা ২টা এজ ব◌্যবহার কের শেট পােথর cost পাবার কথা। এটা িনভর কের তুিম কান
অডাের এজ িরল◌্যা কেরছ তার উপর। স কারেণ ৫ এ যাবার শেট পাথ ১০ হেলও d[5] এ এখেনা ১০ পাইিন। X বার ‘ াফ িরল◌্যা ’ করেল সেবা X টা এজ
ব◌্যবহার কের সাস িতটা নােড যাবার শেট পাথ তুিম িনি ত ভােব পােব। X এর থেক বিশ এেজর ব◌্যাবহার কের িতটা নােড যাবার শেট পাথ তুিম X বার াফ
িরল◌্যাে র পর পেতও পার, নাও পেত পার, সটা এজ এর অডােরর উপর িনভর কের।

এখন ৩য় বােরর মত িরল◌্যা কির:

এবার ধু মা ৫ ন র নাড আপেডট হেব।

এরপের আমরা আর যতই আপেডট কির, d[]d[] অ◌্যােরেত কােনা পিরবতন হেব না, আমরা ১ থেক িতটা নােড যাবার শেট পাথ পেয় িগেয়িছ।

এখন াভািবকভােবই আসেব য িরল◌্যা কয়বার করেত হেব? ােফ যিদ নাড n টা থােক তাহেল এক নাড থেক অন◌্য নােড যেত সেবা n−1n−1 টা এজ
ব◌্যবহার করেত হেব। তারমােন কােনা নাড সেবা n−1n−1 বার আপেডট হেত পাের। তাই িরল◌্যা করার লুপটাও চালােত হেব n−1n−1 বার। তেব আমরা
যরকম উপেরর ােফ দেখিছ ৩বােরর পেরই আর কান নাড আপেডট করা যাে না, সরকম হেল আর নতুন কের িরল◌্যা করার দরকার নাই।

এখন িনেচর মা ৩ নােডর াফটায় বলম◌্যান ফাড অ◌্যালেগািরদম চালাও, অথাৎ যত ণ কান নাড আপেডট করা যায় তত ণ পুেরা াফটা িরল◌্যা কর:

3/5
Serial 1 2 3

Edge 2 -> 3 1 -> 2 3 -> 1

থমবার িরল◌্যা করার পর পাব:

২য়বার করার পর:

৩ নােডর ােফ সাস থেক কােনা নােড শেট যেত ২টার বিশ এজ লাগেব না, ৩য় বার িরল◌্যা করার
চ া করেল কােনা নাড আপেডট হবার কথা না। িক এই ােফ আপেডট হে :

এটা হে কারণ 1−>2−>3−>11−>2−>3−>1 সাইেকলটার মাট ওেয়ট নেগিটভ


(3+2–10=−53+2–10=−5)। তাই তুিম যতবার এই সাইেকেল ঘুরেব শেট পাথ তত ছাট হেত
থাকেব। তাই নেগিটভ সাইেকল থাকেল এবং সাস থেক সই নেগিটভ সাইেকেল যাবার পথ থাকেল সােসর
শেট পাথ আনিডফাইনড বা অসং ািয়ত। যিদ n−1n−1 বার াফ িরল◌্যা করার পর দিখ য nn তম
বারও কােনা নােডর cost আপেডট করা যায় তখন বুঝেত হেব আমরা নেগিটভ সাইেকেল িগেয় পেরিছ, শেট
পাথ বর করা স ব না।

আমােদর সুেডােকাড তাহেল হেব এরকম:

bellman

1 Input: A non-empty connected weighted graph G with vertices G.V and


2 edges G.E
3 procedure Bellman Ford(G,source):
4 1 Let distance[] ← infinity
5 2 Let N ← number of nodes
6 3 distance[source] = 0
7 4 for step from 1 to N-1
8 5 for all edges from (u,v) in G.E
9 6 if distance[u] + cost[u][v] < distance[v]
10 7 distance[v] = distance[u] + cost[u][v]
11 8 end if
12 9 end for
13 10 end for
14 11 for all edges from (u,v) in G.E
15 12 if distance[u] + cost[u][v] < distance[v]
16 13 return “Negative cycle detected
17 14 end if
18 15 end for
16 return distance

পাথ ি করা:

িবএফএস বা ডায়া ােত যভােব পাথ ি কের িঠক সভােব এখােনও পাথ ি করা যােব। previous[]previous[] নােমর একটা অ◌্যাের নাও।
previous[v]=uprevious[v]=u মােন হেলা vv তম নােড তুিম uu থেক এেসছ। েত অ◌্যােরেত ইনিফিনিট থাকেব। u−>vu−>v এজটা িরল◌্যা
করার সময় previous[v]=uprevious[v]=u কের দাও। এখন তুিম previousprevious অ◌্যাের দেখ সাস থেক যেকান নােডর পাথ বর কের ফলেত
পারেব।

কমে ি িট:

সেবা n−1n−1 বার িতটা এজেক িরল◌্যা করেত হেব, টাইম কমে ি িট O(n∗e)O(n∗e)।

4/5
িচ া করার জন◌্য িকছু বেলম:

তামােক একটা াফ িদেয় বলা হল শেট পােথ সেবা xx টা এজ থাকেত পাের। এবার িকভােব শেট পাথ বর করেব? (UVA 11280)
একিট ােফ কান কান নাড নেগিটভ সাইেকেলর অংশ িকভােব বর করেব? (িহ স: ংিল কােনে ড কে ােন + বলম◌্যান ফাড)

িরেলেটড িকছু বেলম:

UVA 558(সহজ)
LOJ 1108
UVA 10449

হ◌্যািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
াফ িথওিরেত হােতখিড় ১৩: আিটকুেলশন পেয় এবং ি জ
shafaetsplanet.com /planetcoding/

শাফােয়ত 11/28/2015

আিটকুেলশন পেয় হেলা আনিডেরে ড ােফর এমন একটা নাড যটা াফ থেক মুেছ ফলেল বািক াফটুকু
একািধক কে ােন এ ভাগ হেয় যায়।

উপেরর ছিবেত ১, ৩ অথবা ৪ ন র নাড এবং সই নােডর অ াডেজেস এজ েলােক মুেছ িদেল াফটা
একািধক ভাগ হেয় যােব, তাই ১, ৩ ও ৪ হেলা এই ােফর আিটকুেলশন পেয় । আিটকুেলশন পেয় েক
অেনেক কাট- নাড(cut node) , আিটকুেলশন নাড বা ি িটকাল পেয় (critical point) ও বেল।

আিটকুেলশন পেয় বর করার একটা খুব সহজ উপায় হেলা, ১টা কের নাড াফ থেক মুেছ িদেয় দখা য
াফিট একািধক কে ােন এ িবভ হেয় িগেয়েছ নািক।

1 1 procedure articulationPointNaive(G):
2 2 articulation_points=[]
3 3 for all nodes u in G
4 4 G.removeNode(u)
5 5 if get_number_of_component(G)>1
6 6 articulation_points.add(u)
7 7 end if
8 8 G.addBackNode(u)
9 9 end for
10 10 return articulation_points

কে ােন সংখ া িডএফএস বা িবএফএস িদেয় খুব সহেজ বর করা যায়। এই প িতেত VV বার
িডএফএস চালােত হেব যখােন VV হেলা নাড সংখ া, মাট কমে ি িট
O(V×(V+E))O(V×(V+E)) বা O(V3)O(V3) কারণ সেবা এজ সংখ া V2V2।

এখন আমরা একবার মা িডএফএস চািলেয় আিটকুেলশন পেয় বর করেবা। এই অ ালেগািরদম


শখার জন িডএফএস এর িডসকভাির/িফিনিশং টাইম এবং ি এজ ও ব াক এজ িনেয় ধারণা থাকেত
হেব।

একটা ােফ িডএফএস চালােল যসব ি এজ পাওয়া যায় স েলা িনেয় তির হেয় িডএফএস ি ।

িট কস থাকেত পাের। যিদ একটা নাড ি এর ট হয় তাহেল একভােব কাজ করেবা, ট না হেল
আেরকভােব কাজ করেবা।

একটা নাড uu যিদ ি এর ট হয় এবং িডএফএস ি ত নাডটার একািধক চাই নাড থােক
তাহেল নাডটা আিটকুেলশন পেয় ।

ট ছাড়া বািক নােডর জন কাজটা একটু জিটল।

1/5
িডএফএস ি এর একটা এজ u−vu−v এর কথা িচ া কেরা। ট থেক uu ত আসার পেথ যসব নাড িভিজট কেরেছা তােদর আমরা বলেবা
ancestor(u)ancestor(u)। এখন vv য সাবি এর ট সই সাবি র সব েলা নােডর সটেক আমরা বলেবা subtree(v)subtree(v)।

এখন uu একটা আিটকুেলশন পেয় হেব যিদ মূল ােফ uu ক মুেছ িদেল subtree(v)subtree(v) এর নাড েলা একটা আলাদা কে ােন এ পিরণত হয়।
subtree(v)subtree(v) আলাদা কে ােন এ পিরণত হেব যিদ না মূল ােফ সাবি subtree(v)subtree(v) এর কােনা নাড থেক ancestor(u) ত
একটা ব াকএজ থােক। যিদ ব াকএজ থােক তাহেল নাড uu এবং অ াডেজেস এজ েলা মুেছ গেলও ancestor(u)ancestor(u) থেক ব াকএজ িদেয়
subtree(v)subtree(v) ত পৗছােনা যাে , নতুন কে ােন তির হে না।

u এর যেকােনা একটা চাই নাড vv এর জন যিদ subtree(v)subtree(v) থেক ancestor(u)ancestor(u) ত পৗছােনা না যায় , তাহেল uu
আিটকুেলশন পেয় , uu ক মুেছ িদেল সইসব subtree(v)subtree(v) নতুন কে ােন এ পিরণত হেব যােদর সােথ ancestor(u)ancestor(u) এর
কােনা ব াকএজ সংেযাগ নই।

িনেচর ছিবেত subtree(v)subtree(v) যিদও ব াকএজ িদেয় ancestor(u)ancestor(u) এর সােথ সংযু , subtree(w)subtree(w) থেক
ancestor(u)ancestor(u) ত ব াকএজ নই। তাই uu একটা আিটকুেলশন পেয় ।

2/5
এবার থম াফটায় িফের আিস। ােফর নাড েলা ১,২,৩,৪,৬,৭,৫ এই অডাের িভিজট করেল আমরা িতটা নােডর যা িডসকভাির টাইম পােবা সটা পােশ ছােটা কের
লখা হেয়েছ:

িডসকভাির টাইম িকভােব বর করেত হয় না বুঝেল িডএফএস িনেয় িটউেটািরয়ালটা দেখা। d[]
িদেয় আমরা িডসকভাির টাইম বুঝােবা।

ােফর ব াকএজ টা লাল এজ িদেয় দখােনা হেয়েছ। বািক কােলা এজ েলা িডএফএস ি এর
অংশ। 11 হেলা ট নাড।

িডএফএস ি ত ট নাড 11 এর চাই সংখ া এখােন ২টা (২ এবং ৩)। তাই 11 একটা
আিটকুেলশন পেয় ।

ল কেরা নাড ancestor(u)ancestor(u) এর যেকােনা নােডর িডসকভাির টাইম


d[u]d[u] এর থেক ছােটা। আবার uu এর অ াডেজেস যেকােনা এজ u−vu−v এর
জন subtree(v)subtree(v) এর সব নােডর িডসকভাির টাইম d[u]d[u] এর থেক
বড়। এখন subtree(v)subtree(v) এর কােনা নাড থেক যিদ এমন একটা ব াকএজ
v−wv−w থােক যন d[w]<d[u]d[w]<d[u] হয় তাহেল বুঝেত হেব তুিম u−vu−v
এজ পার হেয় subtree(v)subtree(v) িদেয় ancestor(u)ancestor(u) ত
পৗেছ গেছা এবং w∈ancestor(u)w∈ancestor(u) । তারমােন u মুেছ িদেলও
subtree(v)subtree(v) থেক ww ত পৗছােনা যােব।

যমন 44 ন র নােডর কথা িচ া কেরা। 44 এর িডসকভাির টাইম d[4]=6d[4]=6 এবং


ancestor(4)={1,2,3}ancestor(4)={1,2,3}। এখন 4-6 এজটার কথা ভািব।
subtree(6)subtree(6) এ একটা ব াকএজ 7−37−3 আেছ, এবং d[3]=5d[3]=5
যা d[4]d[4] এর থেক ছােটা। তারমােন 3∈ancestor(4)3∈ancestor(4)।
তাহেল তুিম 44 নাডটা মুেছ িদেলও subtree(6)subtree(6) ব াকএেজর মাধ েম
ancestor(4)ancestor(4) এর সােথ সংযু থাকেব।

এবার আমরা আেরকটা ভ ািরেয়বল িডফাইন করেবা low[u]low[u]। মেন কেরা subtree(u)subtree(u) এবং subtree(u)subtree(u) এর সােথ ব াকএজ
3/5
িদেয় সংযু সব েলা নােডর একটা সট বানােনা হেলা, সটা টা হেলা {x1,x2…xm}{x1,x2…xm}। তাহেল low[u]low[u] হেব
min(d[x1],d[x2]…,d[xm])min(d[x1],d[x2]…,d[xm])।

যমন 4 ন র নােডর জন subtree(u)={5,6,7}subtree(u)={5,6,7} এবং subtree(u)subtree(u) এর সােথ ব াকএজ িদেয় যু আেছ নাড 33।
তাহেল low[u]=min(d[5],d[6],d[7],d[3])=5low[u]=min(d[5],d[6],d[7],d[3])=5।

এখন িচ া কেরা কােনা একটা এজ u−vu−v এর জন d[u]>low[v] হবার অথ িক? d[u] এর থেক িডসকভাির টাইম ছােটা একমা
ancestor(u)ancestor(u) সেটর নাড েলার। subtree(v) এর কােনা নাড ব াকএজ িদেয় ancestor(u) এর সােথ যু , সজন low[v] এর মান d[u]
এর থেক কেম িগেয়েছ। যিদ d[u]<=low[v]d[u]<=low[v] হয়, তাহেলই ধুমা u একটা আিটকুেলশন পেয় হেব।

আেগর ােফই িডসকভাির টাইেমর পাশাপািশ low[u]low[u] এর মান েলাও দিখ:

তাহেল আমরা আিটকুেলশন পেয় বর করার একটা অ ালেগািরদম পেয় িগেয়িছ। িতটা
নােডর জন d[u], low[u] বর করেত পারেলই কাজ শষ। low[u] বর করা কিঠন িকছু
না, সুেডােকাড দখেলই পির ার হেব:

1 articulation_point[] ← false
2 visited[] ← false
3 low[]=d[u] ← 0
4 time ← 0
5 1 Procedure FindArticulationPoint(G, u):
6 2 time ← time+1
7 3 low[u]=d[u] ← time
8 4 visited[u] ← true
9 5 no_of_children ← 0
10 6 for each edge u to v in G.adjacentEdges(u) do
11 7 if(v == parent[u]) continue
12 8 if visited[v] //This is a backedge
13 9 low[u] = min(low[u], d[v])
14 10 end if
15 11 if not visited[v] //This is a tree edge
16 12 parent[u] = v
17 13 FindArticulationPoint(G, v)
18 14 low[u] = min(low[u], low[v])
19 15 if d[u] <= low[v] and u is not root:
20 16 articulation_point[u]=true
21 17 end if
22 18 no_of_children=no_of_children+1
23 19 end if
24 20 if(no_of_children>1 u is root):
25 21 articulation_point[u]=true
26 22 end if
27 23 end for

ি জ িজিনসটা আিটকুেলশন পেয়ে র মতই। াফ থেক য এজ তুেল িদেল াফটা একািধক কে ােনে ভাগ হেয় যায় তােকই বলা হয় ি জ।

4/5
উপেরর ােফ 4−54−5, 1−21−2, আর 1−31−3 এই ৩িট এজ হেলা ি জ।

ি জ আর আিটকুেলশন পেয়ে র সুেডােকােডর পাথক খািল এক জায়গায় ১৫ ন র লাইেন


d[u]<=low[v] এর জায়গায় d[u]<low[v] িলখেত হেব। এটা কন কাজ কের তুিম
সহেজই বুঝেত পারেব যিদ তুিম সুেডােকাডটা বুেঝ থােকা, তাই আর ব াখ া করলাম না।

িট নােডর মেধ একািধক এজ থাকেল অবশ এটা কাজ করেব না। তখন িক করেত হেব
সটা িচ া করা তামার কাজ!

সলভ করার জন িকছু বেলম পােব এখােন।

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress


Staple by AccessPress Themes

5/5
াফ িথওিরেত হােতখিড় ১৪ – ংিল কােনে ড কে ােন
shafaetsplanet.com /planetcoding/

শাফােয়ত 11/29/2015

একটা িডেরে ট ােফর ংিল কােনে ড কে ােন বা SCC হেলা এমন একটা কে ােন যার
িতটা নাড থেক অন নােড যাবার পথ আেছ। িনেচর ছিবেত একটা ােফর িতটা ংিল কােনে ড
কে ােন আলাদা রঙ িদেয় দখােনা হেয়েছ।

ডপথ ফা সাচ এর িফিনিশং টাইেমর ধারণা ব বহার কের আমরা O(V+E)O(V+E) ত একটা ােফর ংিল কােনে ড কে ােন েলােক আলাদা কের ফলেত
পাির। এই লখাটা পড়ার আেগ অবশ ই টপেলািজকাল সিটং আর ডপথ ফা সাচ এর িডসকভাির এবং িফিনিশং টাইম স েক ধারণা থাকেত হেব।

িনেচর াফটা দখ:

1/5
থেমই একটা ভুল প িতেত অেনেক SCC বর করার চ া কের। সটা হেলা যেকােনা নাড থেক িডএফএস চািলেয় যসব নােড যাওয়া যায় তােদরেক একটা
কে ােন িহসােব ধরা। িক খুব সহেজই বাঝা যায় এটা কাজ করেব না, উপেরর ােফ ১ থেক িডএফএস চালােল সব েলা নাড িভিজট করা যােব, িক ১ থেক ৪ এ
যাওয়া গেলও ৪ থেক ১ এ যাবার কােনা পথ নই, তাই এরা একই কােনে ড কে ােন এর অংশ না। এই প িতেত সমস া হেলা িডএফএস কােনে ড কে ােন
থেক বর হেয় অন কে ােন এ চেল যায়। এই সমস া সমাধান করেত আমরা একটু বুি মােনর মত িডএফএস চালােবা।

িট নাড u,v একই SCC ত থাকেব ধুমা যিদ u থেক v ত যাবার পথ থােক এবং v থেক u ত যাবারও পথ থােক।

থেম আমরা ১ থেক িডএফএস চািলেয় সব েলা নােডর িডসকভাির টাইম আর িফিনিশং টাইম িলেখ ফিল। নাড েলা ১,২,৩,৪,৫,৬,৭ অডাের িভিজট করেল আমরা
িনেচর ছিবর মত ািটং/িফিনংিশং টাইম পােবা:

এখন বাঝার সুিবধার জন ংিল কােনে ড কে ােনে র সব েলা নাডেক একটা বড় নাড মেন কির:

2/5
ল কেরা, াফটােক এভােব ‘িডকে াজ’ করার পর াফিটেত আর কােনা সাইেকল থাকা স ব না, অথাৎ াফিট একিট ড াগ বা িডেরে ড অ াসাইি ক ােফ পিরণত
হেয়েছ। এখন বড় নাড েলােক সহেজই টেপালিজকাল অডাের সাজােনা স ব, অডারটা হেব A,B,C।

এখন ল কেরা ড ােগ একটা নাড D1 থেক অন নাড D2 এ যাওয়া যায় তাহেল D1 টেপালিজকাল অডাের D2 এর আেগ অবশ ই থাকেব। আবার আমরা আেগই
জািন য টেপালিজকাল অডাের য আেগ থােক তার িফিনিশং টাইম বিশ হয় কারণ অন ান সব নােডর কাজ শষ কের ওই নােড িফের আসেত হয়।

তাহেল D1 যিদ টেপালিজকাল অডাের D2 এর আেগ থােক তাহেল যসব ছােটা ছােটা নাড িনেয় D2 গিঠত হেয়েছ তােদর সবার িফিনংিশং টাইম অবশ ই D1 এর সব
নােডর থেক কম হেব।

এখন u থেক v ত যাওয়া গেলই তারা একই SCC এর অ ভূ না, v থেক u ত যাবার পথও থাকেত হেব। অথবা আমরা বলেত পাির ‘উে া- াফ’ এও u থেক v
ত যাবার পথ থাকেত হেব!

যিদ ােফর এজ েলা উে দয়া হয়, তাহেলও SCC েলা একই থােক। এেক বলা হয় া েপাজ াফ(transpose) , া েপাজ ােফ সাইেকল েলার কােনা
পিরবতন হয় না। মূল ােফ যিদ u-v একই SCC এর মেধ থােক তাহেল তারা অবশ ই একই সাইেকেলর মেধ থাকেব। এটাই আমােদর অ ালেগািরদেমর মূল িভি ।

3/5
উপেরর ছিবেত আেগর ােফর এজ েলা উে দয়া হেয়েছ। িডসকভাির এবং িফিনিশং টাইম আেগরটাই লখা আেছ।

এখন ল কেরা তুিম যিদ েত টপেলািজকাল অডাের আেগ থাকা নাড েলা থেক িডএফএস চালাও অথাৎ যার িফিনিশং টাইম বড় সখান থেক কেরা তাহেল তুিম
থম থম SCC টা পেয় যােব।

উপেরর ােফ 1 এর িফিনিশং টাইম সবেথেক বিশ (14)। 1 থেক িডএফএস চালােল তুিম যেত পারেব {1,2,3} নাড েলােত যারা একই SCC’র অংশ। এবার
{১,২,৩} নাড েলা াফ থেক মুেছ ফল। এরপর 4 এর িফিনিশং টাইম বড়। 4 থেক ধুমা {4} এ যাওয়া যায়। এরপর 5 থেক িডএফএস চালােবা, সখান থেক
যাওয়া যায় {5,6,7} নাড েলােত যারা একিট SCC এর অংশ।

যসব নাড েলা একই কে ােন এর অংশ তােদর ক আমরা আলাদা িলে সভ কের রাখেবা িনেজর সুেডােকাডটা দেখা:

1 1 procedure DFS(G, u):


2 5 color[u] ← GREY
3 6 for all edges from u to v in G.adjacentEdges(u) do
4 7 if color[v]=WHITE
5 8 DFS(G,v)
6 9 end if
7 10 end for
8 11 stk.add(source)
9 13 return
10
11 14 procedure DFS2(R,u, mark)
12 15 components[mark].add(u) //save the nodes of the new component
13 16 visited[u] ← true
14 17 for all edges from u to v in R.adjacentEdges(u) do
15 18 if visited[v] ← false
16 19 DFS2(R,v, mark)
17 20 end if
18 21 end for
19 22 return
20
21 23 procedure findSCC(G):
22 24 stk ← an empty stack
23 25 visited[] ← null
24 26 color[] ← null
25 27 components[] ← null
26 28 mark=0
27 29 for each u in G
28 30 if color[u]=WHITE
29 31 DFS(G,u)
30 32 end if
31 33 end for
32 34 R=reverseEdges(G)
33 35 while stk not empty
34 36 u=stk.removeTop()
35 37 if visited[u]=false
36 38 mark=mark+1 //A new component found, it will be identified by ‘mark’
37 39 DFS2(R,u,mark)
38 40 end if
39 41 end for
40 42 return components

কাডটা একটু বড় মেন হেলও বাঝা খুব সহজ। থেম একটা িডএফএস চািলেয় িফিনিশং টাইম অনুযায়ী নাড েলা সট করিছ। একটা াক ব বহার কের কাজটা করিছ।
যার িফিনিশং টাইম কম স কাজ আেগ শষ কের ১১ ন র লাইেন আসেব, তখন সই নাডটা ােক ঢুিকেয় রাখেবা। সবেশেষ ােকর উপের য নাড থাকেব তার
িফিনিশং টাইম হেব সব থেক বিশ। এর পর ২য় িডএফএস চািলেয় কে ােন েলা আলাদা কের ফলেবা। mark নােমর ভ ািরেয়বল টা ব বহার করিছ িতটা কে ােন
এর আলাদা নাম দয়ার জন , ছিবেত যভােব A,B,C নাম দয়া হেয়েছ।

4/5
সলভ করার জন িকছু বেলম পােব এখােন।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
াফ িথওিরেত হােতখিড় ১২ – ম াি মাম া (১)
shafaetsplanet.com /planetcoding/
শাফােয়ত জানুয়াির ২৩,
২০১৫

এই লখায় আমরা ােফ ম াি মাম া বর করার অ ালেগািরদম িশখেবা। ম া া এর ধারণাটা ব বহার কের বশ িকছু ই ােরি ং বেলম সলভ করা যায়, তাই এটা শখা
খুবই পূ ণ। এই লখাটা পড়ার আেগ তামােক াফ িথওিরর বিসক অ ালেগািরদম েলা, িবেশষ কের শেট পাথ বর করার অ ালেগািরদম েলা ভােলা কের িশেখ িনেব।

থেমই আমরা দিখ একিট খুবই সাধারণ ম া া বেলম:

িচ : ১

তামােক িচ -১ এর মত একটা াফ দয়া আেছ। মেন কর ােফর িতটা এজ একটা কের পািনর পাইপ। িতটা পাইপ িদেয় িত সেকে কত িলটার পািন বািহত হেত
পারেব সটার একটা সীমা আেছ যটােক বলা হয় পাইেপর ক াপািসিট। আর কােনা পাইপ িদেয় সেকে যতটুকু পািন যাে সটা হেলা পাইপটার া। িতটা এেজর সােথ
“ া/ক াপািসিট” উে খ কের দয়া হেয়েছ। যমন A->B এজ িদেয় সেকে সেবা ২িলটার পািন যেত পাের এবং এই মুহেূ ত সেকে পািন যাে ০ িলটার। ধুমা A
নাড িদেয় পািন েবশ করােনা যায় এবং ধুমা F নাড িদেয় পািন বর হেয় যায়। A ক বলা হয় সাস এবং F হেলা িসংক। তামােক বলেত হেব A থেক F এ িত
সেকে সেবা কত িলটার পািন বািহত করা যােব? অথাৎ পািনর “ া” সেবা কত হেত পাের?

মূল সমস া সমাধােনর আেগ আমরা ছাট একটা সমস া সমাধান কির। A->C->D->F এই পথটা ব বহার কের পািন সাস থেক িসংক এ গেল সেবা কত িলটার পািন
বািহত হেত পারেব? ছিবেত দখা যাে A->C এেজর ক াপািসিট ৫, C->D এেজর ক াপািসিট 3, D->F এেজর ক াপািসিট ৪। এখােন সবিন ক াপািসিট হেলা ৩,
তাই আমরা কােনা সময় ৩িলটােরর বিশ পািন এই পেথ পাঠােত পারেবানা।

কােনা পেথর সবিন ক াপািসিটর এজ সই পেথর া িনয় ণ কের। বাতেলর স মুেখর সােথ তুলনা িদেয় এই ব াপারটােক বলা হয় বাটলেনক(bottleneck)। যমন
ধেরা তামার বাসায় ৫MBps এর ই ারেনট কােনকশন আেছ, এখন তুিম একটা মুিভ ডাউনেলাড করেত চা । এখন মুিভর সাভার থেক তামার বাসায় ডাটা প ােকট
আসার আেগ অেনক েলা নটওয়াক পার হেয় আেস, কােনা একটা নটওয়ােক গিত মা 1MBps। এখন নটওয়ােকর বািক অংেশর গিত যতই বিশ হাক না কন তুিম
1MBps এর বিশ গিতেত ডাউনেলাড করেত পারেব না, নটওয়ােকর সবেথেক ধীরগিতর অংশই তামার ডাউনেলােডর গিত িনয় ণ করেব।

এখন দিখ িকভােব সেবা পািনর া পাবার সমস াটার সমাধান করা যায়। সমাধান খুবই সহজ, আমরা িতবার যেকােনা একটা কের পথ িদেয় পািন পাঠােত থাকেবা যত ণ
পাইেপ ক াপািসিট থােক। িক এভােব িক আমরা সেবা া বা বাহ পােবা? পােবা তেব সজন একটু বুি খাটােত হেব। থেম আমরা একটা পেথ পািনর া পািঠেয়
দিখ িক ঘেট। যেকােনা একটা পথ বেছ িনেত পাির, আিম বুঝােনার সুিবধার জন A->B->D->F পথটা বেছ িনলাম। এই পেথ সবিন ক াপািসিট হেলা ২। তাহেল
এই পেথ ২িলটার পািনর া পািঠেয় দবার পর াফটা দখেত হেব এরকম:

1/5
িচ -২: A->B->D->F পেথ া পাঠােনার পর

আমরা A->B->D->F পেথর িতিট এেজর া ২বািড়েয় িদেয়িছ। ল কেরা A->B এেজর আসল ক াপািসিট ২ এবং া পাঠােনা হেয়েছ ২, তাই এই এজ িনেয় আর
কােনা া পাঠােনা যােব না। তমিন B->D এেজর ক াপািসিট ৩ িক া পাঠােনা হেয়েছ ২, তাই এই এজটা িদেয় আেরা ৩-২=১ া পাঠােনা স ব। আমরা বলেত
পাির B->D এেজর residual ক াপািসিট =১, residual শ টার অথ হেলা কােনা িকছু ব বহার কের ফলার পর বেচ যাওয়া অংশ।

residual ক াপািসিট = এজ এর ক াপািসিট – ব ব ত ক াপািসিট বা া এর পিরমাণ ।

এবার একইভােব A->C->D->F পথটা িনবািচত কির। এই পেথ D->F এেজর আসল ক াপািসিট ৪ হেলও ২ া আেগই পাঠােনা হেয়েছ, তাই বতমান ক াপািসিট বা
residual ক াপািসিট ৪-২=২। এই পথটা িদেয় ২ া পাঠােনা স ব।

িচ -৩: A->C->D->F পেথ া পাঠােনার পর

আমরা এখন মাট ২+২=৪ া পলাম, অথাৎ পািন বােহর হার এখন সেকে ৪ িলটার। এই ােফ িক আেরা বিশ পািনর া পাঠােনা স ব? A->B এবং D->F এজ
এরই মেধ সেবা ক াপািসিটেত পৗেছ গেছ, এই ২টা এেজর কােনাটােক না িনেয় িসংক এ যাবার পথ ােফ নই। তাই দেখ মেন হেত পাের আর া পাঠােনা স ব না।
িক আমরা এখন বুি খািটেয় আেরা বিশ া পািঠেয় িদব!

আমােদর এখন িতটা এেজর residual ক াপািসিট ব বহার কের residual াফ আকঁেত হেব িকভােব আেরা া পাঠােবা সটা বুঝেত হেল।residual াফ আকার
িনয়ম হেলা:

2/5
১. ােফর িতটা এজ (u,v) এর ক াপািসিট হেব এজ টার residual ক াপািসিটর সমান।
২. িত এজ (u,v) এর জন উ া এজ (v,u) এর residual ক াপািসিট হেব (u,v) এজ এ া এর সমান।

তারমােন কােনা এজ িদেয় যতটুকু া পািঠেয়িছ সটা হেব উে া এেজর residual ক াপািসিট। তাহেল residual ােফ মূল এজ এবং উে া এেজর residual
ক াপািসিটর যাগফল হেব মূল এজ এেজর মাট ক াপািসিটর সমান। িচ -৪ এর াফটার residual াফটা হেব এরকম:

িচ -৪: ৩নং িচে র ােফর residual াফ

সবুজ রঙ িদেয় উে া এজ এবং তােদর residual ক াপািসিট দখােনা হেয়েছ। ০ ক াপািসিটর এজ েলােক ােফ এেক দখাইিন। A->C এজ িদেয় আেগ ২ া পাঠােনা
হেয়েছ বেল উে া এজ এর residual ক াপািসিট ২, এবং এজটার আেরা ৩ া পাঠােনার মতা আেছ তাই মূল এজ এর residual ক াপািসিট ৩। িঠক এভােব অন ান
এজ েলা আঁকা হেয়েছ, তুিম িনেজ এেক যাচাই কের িনেত পােরা িঠকমত বুেঝেছা নািক বা আমার ছিবেত ভূ ল আেছ নািক।

এখন উ া এজ এ া পাঠােনার মােন িক? আমরােতা পাইেপর উে া িদক িদেয় পািন পাঠােত পারেবা না বা রা ার উে া িদক িদেয় গািড় চালােত পারেবা না। উে া িদেক
া পাঠােনার মােন হেলা মূল া টােক বািতল কের দয়া! আমরা যিদ D->B এজ িদেয় ২ া পাঠাই তার মােন B->D এজ িদেয় আসা ২িলটার পািনর বাহেক আমরা
বািতল কের িদি । তখন residual ােফ মূল এেজর residual ক াপািসিট যােব বেড়, এবং উ া এেজর residual ক াপািসিট যােব কেম, যাগফল আেগর মতই
থাকেব!

এখন িচ া কের দেখা িচ -৪ িদেয় আেরা া িসংক এ পাঠােনা যায় নািক। মেন রাখেব িচ -৩ আর িচ -৪ এ একই াফেকই িভ ভােব আঁকা হেয়েছ।

িচ ৪ এ দখা যাে A->C->D->B->E->F পেথ আেরা ১ া পাঠােনা স ব! এই পেথ D->B হেলা উে া এজ। তারমােন D->B এজ এর ১ া বািতল কের
িদেয় আমরা ােফ মাট া ১বািড়েয় ফলেত পারিছ। এখন residual াফ িকরকম হেব দিখ:

িচ -৫: A->C->D->B->E->F পেথ া পাঠােনার পর residual াফ

3/5
তুিম যিদ এ পয বুেঝ থােকা তাহেল িচ -৫ থেক মূল াফটাও িনেজ এেক িনেত পারেব। িচ -৪ এ C->D এজ িদেয় ১ া পাঠােনা হেয়েছ। তাই িচ -৫ এ C->D
এেজর residual ক াপািসিট কেম ১-১=০ হেয় িগেয়েছ এবং D->C এেজর residual ক াপািসিট বেড় ২+১=৩ হেয় িগেয়েছ। এভােব সব েলা এজ আঁকা হেয়েছ।

এই ােফ সাস থেক িসংক এ পািন পাঠােনার আর কােনা পথ নই। আমরা ৩িট পেথ মাট ২+২+১=৫ া পেয়িছ, অথাৎ পািন বােহর হার িত সেকে ৫ িলটার।
এটাই াফটার জন ম াি মাম া।

residual ােফ আমরা যখন একটা পথ বর কির সই পেথর একটা িবেশষ নাম আেছ, সটা হেলা অগেমে ড পাথ(Augmented path)। তাহেল আমােদর
অ ালেগািরদম খুব সহজ, যত ণ স ব আমরা residual graph এ একটা অগেমে ড পাথ খুেজ বর করেবা এবং সই পেথ া পািঠেয় িদেবা! এটার নাম Ford-
Fulkerson অ ালেগািরদম। এটার সুেডােকাড এরকম:

Max flow pseudo-code

1 Input: A graph G = (V,E) with flow capacity cap, source node s and sink node t.
2 Output: Calculate maximum flow from s to t.
3 Initialize:
4 1. total_flow=0
5 2. Residual Capacity Cf(u,v)=cap(u,v) for each edge(u,v) in the graph
6 Algorithm:
7 1. While there is a path from s to t such that Cf[u][v]>0 for all edges (u,v) in path:
8 1.1. min_res_cap = minimum residual capacity among all the edges (u,v) in the path.
9 1.2. For each edge (u,v) in the path:
10 Cf(u,v) = Cf(u,v) - min_res_cap
11 Cf(v,u) = Cf(v,u) + min_res_cap
12 1.3. total_flow = total_flow + min_res_cap
13 3. Return total_flow

সহজ কথায় একটা ২-িড অ াের Cf[u][v] ত িতটা এেজর residual ক াপািসিট থাকেব, য এজ েলা ােফ নাই স এেজর residual ক াপািসিট ০। এখন তুিম
সাস থেক িসংক এ যাবার এমন একটা পথ বর করেব য পেথর িতিট এেজর residual ক াপািসিট ০ থেক বড়। পেথর এজ েলার মেধ িমিনমাম residual
ক াপািসিটর মান খুেজ বর করেব। া পাঠােনার পর িতটা এেজর residual ক াপািসিট কেম যােব এবং উ া এেজর residual ক াপািসিট বেড় যােব। িমিনমাম
residual ক াপািসিটটা মাট া এর মােনর সােথ যাগ হেত থাকেব। সবেশেষ চাইেল তুিম আসল ক াপািসিট থেক residual capacity িবেয়াগ কের কােনা এজ এ
া এর পিরমাণ িনণয় করেত পােরা।

াফটা িডেরে ড হেত হেব এমন কােনা কথা নই। বাইিডেরকশনাল এজও থাকেত পাের। A-B বাইিডেরকশনাল এেজর ক াপািসিট ১০ হেল C f[A][B] = Cf[B]
[A]=১০ হেব। এখন আেগর মতই অগেমে ড পাথ বর কের ম াি মাম া বর করেত পারেব। তেব এে ে কান নােড া কত হে সটা বর করেত হেল তামােক
আেরকটু বুি খাটােত হেব।

অ ালেগািরদেম ২ন র ধােপ পাথ বর করার জন িবএফএস/িডএফএস/ বলম ান ফাড ইত ািদ অ ালেগািরদম ব বহার করা যেত পাের। বেলেমর ধরণ অনুযায়ী এই ধােপ
এেকক অ ালেগািরদম এেকক ধরেণর সুিবধা িদেব, স েলা তুিম বেলম সলভ করেত করেত জানেত পারেব। আর পাথ বর করার জন িবএফএস বা যটাই ব বহার কেরানা
কন, িতটা নােড যাবার সময় নাডটার প াের ক সটা মেন রাখেত হেব কােনা একটা অ ােরেত।

তুিম যিদ িবএফএস ব বহার কের সমাধান কেরা তাহেল সটােক বলা হয় এডম কাপ অ ালেগািরদম। ফাড-ফুলকাসন অ ালেগািরদেম ধু পাথ খুেজ বর করার কথা বেল
হেয়েছ, সটা যেকােনাভােব বর করা যেত পাের, আর এডম -কাপ িবএফএস ব বহার কের কাজটা করেত বলা হেয়েছ অথাৎ ফাড-ফুলকাসন ইমি েম করার একটা উপায়
হেলা এডম কাপ অ ালেগািরদম যার কমে ি িট O(VE^2)।

এখন তামােদর জন িচ া করার মত কেয়কটা :

১: আমােদর বেলেম সাস এবং িসংক িছেলা একটা। িক ােফ একািধক নাড িদেয় পািন েবশ করেল এবং একািধক নাড িদেয় পািন বর হেয় গেল িকভােব
অ ালেগািরদমটা পিরবতন করেব?

২: যিদ িতটা নােডর িকছু ক াপািসিট থােক, অথাৎ একটা নাড িদেয় কত সেবা া পাঠােনা যােব সটা িনিদ করা থােক তাহেল িকভােব সমাধান করেব?

৩: িট নােডর মেধ একািধক এজ থাকেল িক করেব?

4/5
৪: ই ব ু একই নাড থেক যা া কের একই গ েব পৗছােত চায় িক ইজেনই চায় িভ িভ রা া ব বহার কের যেত, তারমােন একই এজ কখেনা ২জন
ব বহার করেত পারেব না। াফিট দয়া হেল তুিম িক বলেত পারেব এরকম ২িট পথ আেছ নািক? এ ধরেণর পথেক এজ িডসজেয় পাথ বেল।

এই েলা িনেয় আেলাচনা করা হেয়েছ পেরর পেব।

া ািমং কনেটে ম াি মাম া বেলম এ কািডং এর থেক অেনক কিঠন হেলা াফটা িকভােব বানােত হেব সটা বর করা, তাই অেনক সমস া সমাধান কের াকিটস
করেত হেব। করার জন কেয়কটা বেলম িদেয় িদলাম:

http://lightoj.com/volume_showproblem.php?problem=1153

http://lightoj.com/volume_showproblem.php?problem=1155

http://uva.onlinejudge.org/external/110/11045.html

হ ািপ কািডং!

(এখন থেক কােনা লখায় িস++/জাভায় সাস- কাড দয়া হেব না এবং আেগর লখা েলার িস++ সাস- কাড েলাও ধীের ধীের সিরেয় নয়া হেব, তুিম যিদ
অ ালেগািরদমটা বুেঝ থােকা তাহেল িনেজই কাড িলখেত পারেব। আর বুঝেত সমস া হেল বা িবেশষ কােনা কারেণ কাড চাইেল সরাসির আমার সােথ যাগােযাগ কর)

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
াফ িথওিরেত হােতখিড়-১২ – ম াি মাম া (২)
shafaetsplanet.com /planetcoding/

শাফােয়ত মাচ ৩০, ২০১৫

আেগর পেব আমরা দেখিছ িকভােব ফাড-ফুলকারসন প িত ব বহার কের ম াি মাম া বর করেত হয়। এই পেব ম াি মাম া সমস ার সহজ িকছু ভ ািরেয়শন
দখেবা।

একািধক সাস/িসংক:

আেগর পেব একটা কেরিছলাম এরকম “আমােদর বেলেম সাস এবং িসংক িছেলা একটা। িক ােফ একািধক নাড িদেয় পািন েবশ করেল এবং একািধক নাড িদেয়
পািন বর হেয় গেল িকভােব অ ালেগািরদমটা পিরবতন করেব?” অথাৎ একািধক সাস বা িসংক থাকেল িক করেত হেব সটা জানেত চাওয়া হেয়েছ।

িচ -১ এ বাম পােশর নীল নাড েলা হেলা সাস এবং ডােনর সবুজ নাড েলা হেলা িসংক।

িচ -১: একািধক সাস এবং িসংক সহ একিট াফ

এ ধরেণর ােফ এডম কাপ অ ালেগািরদম েয়াগ করার সহজ উপায় হেলা সুপার- সাস এবং সুপার িসংক বািনেয় নয়া। সুপার সাস হেলা এমন একটা নাড যটা সব েলা
সােসর সােথ িডেরে ড এজ িদেয় যু । িঠক সভােব, সুপার িসংক িতিট িসংেকর সােথ িডেরে ড এজ িনেয় সংযু । এবং এই এজ েলার ক াপািসিট হেব অসীম বা
ইনিফিনিট।

িচ -২: সুপার সাস এবং সুপার িসংক

িচ -২ ত সুপার সাস এবং সুপার িসংক দখােনা হেয়েছ। ইনিফিনিট িহসােব বেছ িনেত পােরা সব েলা এেজর সি িলত ক াপািসিটর থেক বড় কােনা মানেক। এখন

1/3
সাধারণ া অ ালেগািরদম ব বহার কেরই এই ােফ ম াি মাম া বর করেত পারেব।

নাড ক াপািসিট:

এত ণ সব েলা ােফ এেজর িনিদ ক াপািসিট িছেলা, নােডর িছেলা না। িক বা েব অেনক সমস ায় নােডর ক াপািসিট থাকেত পাের। যমন ধেরা কােনা একটা দেশ
িতটা রা ার পাশাপািশ িতটা শহেরর িনিদ গািড় ধারণ মতা আেছ, সই দেশর াফ িচ -৩ এর মেতা হেত পাের:

িচ -৩: নাড ক াপািসিট

ছিবেত পুেরা াফটা না এেক ধু একটা নাড আর ২িট এজ এেকিছ, নাডটােত ঢাকার এজ এর ক াপািসিট ৫, য এজিট বাইের চেল গেছ তার ক াপািসিট ৭, এিদেক
নােডর িনেজর ক াপািসিট ৪। আেগ শখা অ ালেগািরদেম আমরা এেজর ক াপািসিটর িহসাব রাখার জন একটা অ াের ব বহার কেরিছলাম, এখনও আমরা সই অ ােরটা
ব বহার কেরই কাজ করেত পারেবা, বুি টা হেলা নাডটােক ই ভােগ ভাগ কের ফলা, এবং ভাগ িটেক নতুন এজ িদেয় যাগ কের দয়া। িচ -৪ দখেলই পির ার হেব
ব াপারটা:

িচ -৪: A নাডিটেক ইভাগ করা হেয়েছ

আমরা A নাডটা Ain এবং Aout এই িট নােড ভাগ কেরিছ। এখন আসল াফ যত েলা এজ A ত েবশ কেরেছ স েলা েবশ করেব Ain এ এবং আসল ােফ
যত েলা এজ A থেক বাইের িগেয়েছ স েলা এখন বাইের যােব Aout থেক। Ain থেক Aout এ একটা এজ েবশ করেব যটার ক াপািসিট হেব এজ এর ক াপািসিটর
সমান।

এখন িনি ে তুিম আেগর অ ালেগািরদম ব বহার করেত পােরা। কাড লখার সময় িকভােব নাড ইভাগ করেব, আনিডেরে ড ােফর ে ব াপারটা িকরকম হেব
স েলা িচ া করা তামার কাজ!

এজ িডসজেয় পাথ:

ই ব ু একই নাড থেক যা া কের একই গ েব পৗছােত চায় িক ইজেনই চায় িভ িভ রা া ব বহার কের যেত, তারমােন একই এজ কখেনা ২জন ব বহার
করেত পারেব না। এধরেণর পথেক এজ িডসজেয় পাথ বেল। তামােক বলেত হেব কােনা একটা ােফ িট এজ িডসজেয় পাথ আেছ নািক। িচ -৫ এ একটা উদাহরণ
দখােনা হেয়েছ:

2/3
ছিবেত ইজনই বােমর সাস নাডটা থেক যা া কের ডােনর িসংক নােড যেত চায়। লাল এবং নীল রঙ ব বহার কের িট এজ-িডসজেয় পাথ দখােনা হেয়েছ।

সাধারণ ম া - া ব বহার কেরই এজ িডসজেয় পাথ বর করা যায়। র নাডেক সাস এবং গ ব নাডেক িসংক ধরেব। এবার সব েলা এজ এর ক াপািসিট বািনেয় দাও
১ এর সমান। এখন যিদ তুিম সাস থেক িসংেক ই া পাঠােতা পােরা সটার মােন হেলা িট িডসজেয় পাথ আেছ। িতটা এেজর ক াপািসিট ১ হওয়ােত ২ া য িট
পেথ িগেয়েছ তােদর মেধ কমন এজ থাকা স ব না।

িঠক একই ভােব তুিম একটা ােফ সেবা কয়টা িডসজেয় পাথ থাকা স ব অথবা ই ব ু র জায়গায় K টা ব ু থাকেল িক হেতা বর কের ফলেত পারেব।

এখন হেলা তুিম যিদ িতটা রা ার িনিদ দঘ থােক এবং িডসজেয় পাথ িটর মাট দঘ িমিনমাইজ করেত চাও তাহেল া এর অ ালেগািরদমটা িকভােব পিরবতন
করেব? এটা বর করেত পারেল uva 10806 সমস াটা সমাধান কের ফেলা, সমস াটার নােমর িভতেরই িকভােব সমাধান করেত হেব বলা আেছ!

আজেকর পব এখােনই শষ। িমন-কাট এবং ম ািচং িনেয় আেলাচনার জন আেরকটা পব অেপ া করেত হেব। কনেটে ম া - া বেলেমর কিঠন অংশ হেলা াফটা
িকভােব তির করেবা, এজ েলা িকভােব যাগ করেবা, কান এেজর ক াপািসিট কত এ েলা বর করা, এসব করার পর া অ ালেগািরদম চািলেয় দয়া সহজ কাজ। তাই
তামােক চুর াকিটস কের এই িজিনস েলা আয়ে আনেত হেব।

িকছু বেলম:

Down Went Titanic


Clever Naming Pattern
Diagonal Sum

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
াফ িথওির: বল ম ােরজ বেলম
shafaetsplanet.com /planetcoding/

শাফােয়ত 8/15/2012

বশ িকছুিদন িডিপ িনেয় লখার পর আবার াফ িথওিরেত িফের এলাম। আজেক আমরা একটা সহজ িক ই ােরি ং বেলম দখেবা। বল ম ািরজ(Stable
Marriage) বেলম এক ধরেনর বাইপারটাইট ম ািচং বেলম,তেব এটা শখার জন অন কােনা অ ালেগািরদম জানার েয়াজন নই।

মেন কির n টা ছেল আর n টা মেয় আেছ। এখন তােদর মেধ িবেয় িদেত হেব এমন ভােব যেনা িবেয় “ বল” হয়। েত েকর সােথই েত েকর িবেয় দয়া স ব তেব
িতটা ছেল আর মেয়র িকছু পছ আেছ, েত েকই চাইেব তার পছে র মানুষেক িবেয় করেত। যিদ ছেল ৩জেনর নাম Tom,Bob,Peter , আর মেয় ৩জেনর নাম
Alice,Mary,Lucy হয় তাহেল ছেলেদর পছে র তািলকা হেত পাের এরকম:

তািলকাটা বিশ থেক কম পছে র েম করা হেয়েছ। যমন টম এিলসেক


বিশ পছ কের, লুিসেক কম পছ কের।

আবার মেয়েদর পছে র তািলকাটা হেত পাের এরকম:

এখন িকভােব িবেয় িদেল িবেয় বল হেব? আেগ বুঝা দরকার বল বলেত িক
বুঝাি । ধেরা িনেচর মেতা কের িবেয় দয়া হেলা:

এই ম ািচং/িবেয়টা বল না, কারণ টম লুিসর থেক মিরেক বিশ পছ


কের,আবার মির িপটােরর থেক টমেক বিশ পছ কের। তাই টম আর মির
িবেয় ভেঙ একসােথ চেল আসেত পাের। যিদ A,B ছেল আর C,D মেয় হয়
আর A-C এবং B-D ক িবেয় দয়া হয় তাহেল িবেয় বল হেবনা যিদ িনেচর
িট টেম ই সত হয়:

১. A যিদ C এর থেক D ক বিশ পছ কের।


২. D যিদ B এর থেক A ক বিশ পছ কের।

২িট টেম সত হেল A আর D িবেয় ভেঙ চেল আসেব! তেব যেকােনা


একটা টেম িমথ া হেল িবেয় বল হেব।

১৯৬২ সােল David Gale আর Lloyd Shapley মাণ কেরন, সমান


সংখ ক ছেল আর মেয়র জন সমসময় বল ম ােরজ বেলেমর একিট
সমাধান আেছ। তারা খুব সহজ একটা অ ালেগািরদম আিব ার কেরন সমস ািট
সমাধােন জন । অ ালেগািরদমিট এরকম:

১. থেম িতিট অিববািহত ছেল তার সবেথেক পছে র মেয়টােক াব


পাঠােব যােক স এখেনা াব পাঠায়িন, মেয়িট অলেরিড এনেগজড হেলও
সমস া নাই,একিট মেয়েক একািধক ছেল াব পাঠােত পাের। একিট
ছেল কখেনা একিট মেয়েক ইবার াব পাঠােবনা।

২. এবার িতটা মেয় তােক যারা াব পািঠেয়েছ তােদর মেধ থেক যােক
সবেথেক পছ তােক িনবািচত করেব,বািক সবাইেক বািতল কের িদেব।
মেয়িট আেগই কাওেক পছ কের থাকেল তােকও বািতল কের িদেব।

৩. এখেনা কও অিববািহত থাকেল ১ম ধােপর পুনরাবৃি হেব।

1/2
অ ালেগািরদমিট কেনা কাজ কের? ধির A-C এবং B-D এর িবেয় দয়া হয়েছ। তাহেল িবেয় ভাঙেব A যিদ D ক বিশ পছ কের এবং D যিদ A ক বিশ পছ কের।
িক উপেরর অ ালেগািরেম সটা স বনা। কারণ:

A যিদ D ক বিশ পছ কের তাহেল স D ক আেগ াব পাঠােব,D রািজ না হেল বা ছেড় িদেলই একমা C ক াব পাঠােব।

D যিদ A ক বিশ পছ কের তাহেল স অন য কাওেক ছেড় িদেয় A ক িবেয় করেব।


আর D যিদ A ক িবেয় না কের অন কাওেক কের তারমােন স অন কাওেকই বিশ পছ কের,এে ে িবেয় ভাঙার স াবনা নই।

এই অ ালেগািরমটা বল ম ািচং িদেব িঠকই তেব অপিটমাল রজা নাও িদেত পাের। িতিট ছেলর জন রজা অপিটমাল হেব,িক মেয়েদর জন অপিটমাল নাও হেত
পাের,অথাৎ এমন বল ম ািচং থাকেত পাের যটাও কােনা একিট মেয় আেরা পছে র কাওেক িবেয় করেত পারেতা। অথাৎ য াব পাঠােব তার জন রজা অপিটমাল
হেব।

অ ালেগািরদমিট কােড ইমি েম করা খুব সহজ। preference িল তামােক ইনপুট দয়া থাকেব। ক কােক াব পািঠেয়েছ, ক কার সােথ এখন এনেগজড এই
তথ েলা অ ােরেত রেখ সহেজই কাডটা িলেখ ফলেত পারেব। wikipedia ত দয়া সুেডােকাডটা এরকম:

Python

1 function stableMatching {
2 Initialize all m ∈ M and w ∈ W to free
3 while ∃ free man m who still has a woman w to propose to {
4 w = m's highest ranked such woman to whom he has not yet proposed
5 if w is free
6 (m, w) become engaged
7 else some pair (m', w) already exists
8 if w prefers m to m'
9 (m, w) become engaged
10 m' becomes free
11 else
12 (m', w) remain engaged
13 }
14 }

বেলম:
Light OJ: Employment
Codechef: Stable Marriage
Uva: Chemical Attraction
Codechef: Blocking

াফ িথওির িনেয় অন ান লখা

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

2/2
িমিনমাম ভারেট কভার বেলম
shafaetsplanet.com /planetcoding/

শাফােয়ত 10/4/2012

িমিনমাম ভারেট কভার একিট ািসক াফ বেলম। ধরা যাক একিট শহের িকছু রা া আেছ,এখন িত রা ায় মােড় আমরা পাহারাদার বসােত চাই। কােনা নােড
পাহারাদার বসােল স নােডর সােথ যু রা া েলা একাই পাহারা িদেত পাের। উপেরর ছিবেত নাড েলা হেলা রা ার মাড়। এখন সব কয়টা রা া পাহারা িদেত নূন তম
কয়জন পাহারাদার দরকার? ছিবেত লাল নাড েলােতা পাহারাদার বসােনা হেয়েছ। এটা অপিটমাল না,িনেচর ছিবর মত বসােল পাহারাদার কম লাগত:

এিট একিট NP-hard বেলম,অথাৎ এই বেলেমর কােনা পিলনিময়াল টাইম সিলউশন নই। তেব াফিট যিদ Tree হয় অথাত n-1 টা edge থােক আর কােনা
সাইেকল না থােক তাহেল ডাইনািমক া ািমং বা ম া া/বাইপারটাইট ম ািচং এর সাহােয বেলমিট সলভ করা স ব।

ডাইনািমক া ািমং সিলউশনটা আিম িব ািরত িলখিছ,তারপর ম া া/বাইপারটাইট ম ািচং িদেয় িকভােব করেত হয় িলখেবা।

িডিপ সিলউশেন ২িট কস আমােদর ল করেত হেব:

১. কােনা নােড পাহারাদার না বসােল তার সােথ সংযু সব নােড অবশ ই পাহারাদার বসােত হেব,এছাড়া সব রা া কভার হেব না। অথাৎ যিদ u আর v
সংযু থােক তাহেল u ত পাহারাদার না বসােল v ত অবশ ই বসােত হেব।
২. কােনা নােড পাহারাদার বসােল সংযু নাড েলােত পাহাদার বাসােনা বাধ তামূলক না তেব বসােল লাভ হেত পাের। তাই u ত পাহারাদার বসােল v
1/4
ত পাহারাদার একবার বিসেয় এবং একবার না বিসেয় দখেবা কানটা লাভজনক

সব িডিপর বেলেমর মেতা এখােনও একটা িরকািসভ ফাংশন িডফাইন করেবা। আমােদর ট হেব বতমােন কান নােড আিছ,এবং সই নােড কােনা পাহারাদার বসােনা
হেয়েছ নািক।

F(u,1) = বতমােন u ন র নােড আিছ এবং এই নােড পাহারাদার আেছ । f(u,1) িরটাণ করেব বািক নাড েলােত মাট পাহারাদার সংখ া।
F(u,0) = বতমােন u ন র নােড আিছ এবং এই নােড পাহারাদার নাই। f(u,0) িরটাণ করেব বািক নাড েলােত মাট পাহারাদার সংখ া।

ধির ১ ন র নােডর সােথ ২,৩,৪ ন র নাড যু ।

বুঝাই যাে ১ ন র নােড পাহারা না বসােল অবশ ই ২,৩,৪ সব েলায় পাহারা বসােত হেব। তাহেল আমরা বলেত পাির:

F(1,0)=F(2,1)+F(3,1)+F(4,1) + 0 ,অথাত ১ এর সােথ সংযু সব নাড েলােত পাহারা বসােল েয়াজনীয় মাট পাহারাদার সংখ া।

সবেশেষ ০ যাগ করিছ কারণ বতমান নােড পাহারাদার বসাইিন।

এবার F(1,1) এর মান বর কির। ১ ন র নােড পাহারা বসােল সংযু নাড েলােত পাহারা বসােলও চেল,না বসােলও চেল,তেব যটা অপিটমাল রজা দয় সটা আমরা
িনব:

F(1,1)=1+min ( F(2,1),F(2,0) ) +min ( F(3,1),F(3,0) ) +min ( F(4,1),F(4,0) )

১ ন র নােড পাহারাদার বসাি তাই সবেশেষ ১ যাগ হে , িত নােড একবার পাহারা বিসেয়,আবার না বিসেয় দখিছ কানটা অপিটমাল।

একটা ব াপার ল রাখেত হেব য প াের নাড িনেয় কখেনা িহসাব করেবানা। উপেরর ছিবেত ১ থেক ২ এ গেল parent[2]=1,তাই ২ থেক আবার ১ ন র নােড
যােবানা।

এবার base case এ আিস। কােনা নাড থেক নতুন কােনা নােড যাওয়া না গেল 1 বা 0 িরটান কের িদেত হেব,পাহারাদার বসােল 1,না বসােল 0। কােনা ি ত
একিট মা নাড থাকেল ১ িরটাণ করেত হেব(িকছু বেলেম ০ ও িরটাণ করেত হেত পাের)।

Spoj এর PT07X(vertex cover) বেলমিট straight forward বেলম। এটার জন আমার কাডটা এরকম:

2/4
1 #define MAXN 100002
2 int dp[MAXN][5];
3 int par[MAXN];
4 vectoredges[MAXN];
5
6 int f(int u, int isGuard)
7 {
8 if (edges[u].size() == 0)
9 return 0;
10 if (dp[u][isGuard] != -1)
11 return dp[u][isGuard];
12 int sum = 0;
13 for (int i = 0; i < (int)edges[u].size(); i++) {
14 int v = edges[u][i];
15 if (v != par[u]) {
16 par[v] = u;
17 if (isGuard == 0)
18 sum += f(v, 1);
19 else
20 sum += min(f(v, 1), f(v, 0));
21 }
22 }
23 return dp[u][isGuard] = sum + isGuard;
24 }
25
26 int main()
27 {
28 memset(dp, -1, sizeof(dp));
29 int n;
30 scanf("%d", &n);
31 for (int i = 1; i < n; i++) {
32 int u, v;
33 scanf("%d%d", &u, &v);
34 edges[u].push_back(v);
35 edges[v].push_back(u);
36 }
37 int ans = 0;
38 ans = min(f(1, 1), f(1, 0));
39 printf("%d\n";, ans);
40 return 0;
41 }

আিম ি এর root সবসময় ১ ধের কাড িলেখিছ। ৩৮ ন র লাইেন মইন ফাংশেন root এ পাহারাদার একবার বিসেয় আর একবার না বিসেয় অপিটমাল রজা টা
িনি ।
ফাংশেন u হেলা current node,isguard কাের নােড পাহারাদার আেছ নািক নাই সটা িনেদশ কের।
১০ ন র লাইেন ি এর সাইজ ১ হেল ১ িরটাণ কের িদেয়িছ।
১৩ ন র লাইেন লুেপর িভতর current নাড থেক সব েলা child নােড যাি । কাের নােড পাহারাদার না থাকেল পেররটায় বসাি ,আর থাকেল ২ভােবই চ া
করিছ। ১৫ ন র লাইেনর কি শন িদেয় প াের নােড যেত িদি না।
সবেশেষ sum+isGuard িরটাণ করিছ। অথাত কাের নােড পাহারাদার থাকেল 1 যাগ করিছ,নাহল 0।

মাটামুিট এই হেলা িডিপ সিলউশন। ি ত সাইেকল না থাকায় এটা অবশ ই বাইপারটাইট াফ। ১৯৩১ সােল Dénes Kőnig মাণ কেরন কােনা বাইপারটাইট ােফ
maximum matching=minimum vertext cover। এটা াফ িথওিরর অেনক min-max িথওেরেমর একটা যখােন িকছু একটা ম াি মাইজ করেল অন
আেরকটা িকছু িমিনমাইজ হয়। তুিম যিদ ম াি মাম ম ািচং এর অ ালেগািরদম জােনা তাহেল ি টা বাইকালািরং কের ম ািচং বর করেলই ভারেট কভার বর হেয় যােব।
কাড সহজ হেলও complexity বেড় যােব,তাই নাড বিশ থাকেল কাজ করেবনা। আবার ম াি মাম ম ািচং যেহতু ম া - া এর একিট ভ ািরেয়শন তাই া চািলেয়ও

3/4
সমাধান করা স ব।

এরকম আেরকটা বেলম uva-10243(fire fire fire)। আিম থেম এটা সমাধান কের পের spoj এর টা কেরিছ।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
ি ডায়ািমটার
shafaetsplanet.com /planetcoding/

শাফােয়ত 1/7/2014

ি হেলা এমন একটা আনিডেরে ড াফ যটার সব নাড থেক সব নােড যাওয়া যায় এবং কােনা সাইেকল নই। এখন আমােদর ি এর সবেথেক দূেরর টা নাড খুেজ
বর করেত হেব, এেকই বলা হয় ি এর ডায়ািমটার।

মেন কেরা িকছু কি উটােরর মেধ নটওয়াক কবল লাগােনা হেয়েছ িনেচর ছিবর মেতা কের। এখন তুিম জানেত চাইেতই পােরা কান িট কি উটার সবেথেক দূের
আেছ।

এটা বর করা খুব সহজ, এজন তামার জানেত হেব িবএফএস বা িডএফএস এর য কান একটা। আনিডেরে ড ি ত যেকান নাড কই ট ধরা যায়, আমরা মেন কির
উপেরর ধূসর নাডটা ি এর ট।

আমােদর থম কাজ কাজ হেলা ট হেত সবেথেক দূেরর নাডটা খুেজ বর করা। সই নাডটােক মেন কির X । একািধক নােডর দূর সবেথেক দূেরর নােডর দূরে র
সমান হেলও সমস া নই, যেকান একটােক িসেল করেত হেব। এই কাজটা আমরা িডএফএস/িবএফএস চািলেয় বর করেত পাির।

এখন ২য় কাজ হেলা X নাড থেক আেরকিট িডএফএস/িবএফএস চািলেয় X থেক সবেথেক দূেরর নাড খুেজ বর করা। মেন কির নাডটা হেলা Y।
1/4
X আর Y এর মধ কার দূর ই ি এর ডায়ািমটার! উপেরর ছিবেত ডায়ািমটার ৭।

মাণ:

আমরা যিদ মাণ করেত পাির ১ম ধােপ খুেজ পাওয়া X সবসময়ই ডায়ািমটােরর একটা া হেব তাহেলই অ ালেগািরদমটা মাণ হেয় যায়। কারণ X যিদ িনি তভােব
ডায়ািমটােরর একটা া হয় তাহেল ২য় ধাপটা অবশ ই সিঠক, X থেক সবেথেক দূেরর নাডই হেব ি এর ডায়ািমটার।

এটা আমরা মাণ করেবা “ ফ বাই কন ািডকশন” এর সাহােয । এটা ব ল ব ব ত একটা প িত। আমরা মাণ করেত চাই X িন যই় কােনা ডাযা় িমটােরর া । িক
তা যিদ না হয,় অথাৎ X কােনা ডাযা় িমটােরর া না হেল এমন একটা ডাযা় িমটার থাকেব যার ই া (ধির) a এবং b, এখােন a এবং b যেকােনা িট নাড হেত
পাের(X ছাড়া) । a-b ডাযা় িমটার ব বহার কের আমরা দখােবা এমন আেরকটা ডাযা় িমটার পাওযা় স ব যটা a-b এর চেয় বড় বা সমান এবং যার এক াে X আেছ।
(উে খ , X হেলা ট থেক সবেচেয় দূেরর একটা নাড)।

এখন আিব ািল(arbitrarily) িট নাড a আর b িসেল কির। নাড িটর মধ কার পাথ েটর কােছ য নােড এেস িমলেব সটার নাম দই h, অথাৎ h হেলা নাড
ইটার কমন অ ানেস র। (অেনেকই হয়েতা বুেঝ গেছা আমরা এখােন lowest common ancestor এর কথা বলিছ)।

2/4
িক ট থেক b এর দূর , ট থেক X এর দূরে র কম বা সমান হেত বাধ , বিশ হেবনা কারণ ট থেক সবেথেক দূেরর নাড হেলা X।

অথাৎ:

distance(root,b)<=distance(root,X)

আবার এটাও িনি ত য ট থেক b যত দূের, h থেক b এর দূর তার থেক কম বা সমান। (সমান হেব যিদ h আর ট একই নাড হয় অথাৎ a আর b যিদ েটর
ইপােশ থােক)

distance(h,b)<=distance(root,b)

তাহেল,

distance(h,b)<=distance(root,b)<=distance(root,X)

distance(h,b)<=distance(root,X)

তাহেল আমরা h-b পাথটা root-X পাথ িদেয় িরে স কের িদেল এবং h-x এর মেধ পাথ বিসেয় িদেল(যিদ h আর x সমান না হয়) অবশ ই আেগর সমান বা আেগর থেক
বড় একটা পাথ পােবা!

3/4
তারমােন আমরা য X ক বাদ িদেয় যই ইটা নাডই িসেল কিরনা কন, X ক িনেয় তার থেক বড় বা সমান একটা পাথ পাওয়া যােব। তারমােন X অবশ ই
ডায়ািমটােরর একটা া !

কমে ি িট:

িবএফএস/িডএফএস এর কমে ি িটর সমান: O(V+E) যখােন V হেলা নাডসংখ া এবং E হেলা এজ সংখ া।

এই অ ালেগািরদমটা জনােরল ােফ কাজ করেবনা, ধু ি এর ে করেব। জনােরল ােফ লংেগ পাথ বর করার বেলম এন-িপ হাড, আর
ডায়ািমটার বর করার বেলম লংেগ পাথ বেলেমরই শাল কস।

Farthest Nodes in a Tree

Farthest Nodes in a Tree (II)

হ ািপ কািডং!

কৃ ত তা ীকার:

http://stackoverflow.com/questions/20010472/proof-of-correctness-algorithm-for-diameter-of-a-tree-in-graph-theory

http://apps.topcoder.com/forums/?module=Thread&threadID=668470&start=0&mc=12#1216875

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
লংেগ পাথ বেলম
shafaetsplanet.com /planetcoding/

শাফােয়ত জুলাই ২১,


২০১৬

তামােক একটা আনওেয়েটড াফ এবং একটা সাস নাড দয়া আেছ। তামােক সাস নাড থেক সেবা দেঘ র পাথ বর করেত হেব। এটাই হেলা লংেগ পাথ
বেলম। হেলা িকভােব বেলমটা সলভ করেব?

এটা আমার খুবই ি য় একটা ই ারিভউ । এখন পয ায় ৭-৮টা ই ারিভউেত আিম এই কেরিছ, মা ২জন সহেজই উ র িদেত পেরেছ, ১জন িহ স দয়ার পর
পেরেছ, বািকরা সবাই ভুল উ র িদেয়েছ। অ ালেগািরদম কােস এ+ অেনেকই পায়, িক এধরেণর করেল বাঝা যায় ক াি েডট আসেল কতখািন জােন।

টা করার পর সবাই থেম য ভুল কের সটা হেলা িজে স কের না সেবা দেঘ র পােথর সং া িক, আিম চাইেল িট নােডর মেধ অসীম সংখ কবার আসা-যাওয়া কের
দঘ অসীম কের ফলেত পাির। তাই লংেগ পােথর আেরা ভােলা কােনা সং া দরকার সমাধান করা জন । ধরা যাক আিম এমন একটা লংেগ পাথ চাই যখােন কােনা
নােড একবােরর বিশ যাওয়া যােব না। এখন আর দঘ অসীম হবার কােনা সুেযাগ নই।

ছিবেত ১ ন র নাড থেক সেবা দেঘ র পাথ দখােনা হেয়েছ যার দঘ হেলা ৪ (১->২->৫->৪-
>৬)।

সমাধান িনেয় িচ া করার আেগ পেরর হেলা াফটা িক িডেরে ড নািক আনিডেরে ড। ধের নাও াফটা
আনিডেরে ড এবং সেবা ১০০,০০০ টা নাড থাকেত পাের।

এই বেলেমর অেনক ধরেণর ভূ ল সমাধান িদেত দেখিছ ক াি েডটেদর, যমন:

কও কও ােফর এজ েলার ওেয়ট -১ ধের শেট পাথ বর করার চ া কের। এটা কােনাভােবই
কাজ করেব না, ইনিফিনিট লুেপ আটেক যােব।
কও কও ডায়নািমক া ািমং ব বহার কের সমাধান করেত চ া কের, এটাও কাজ করেব না এবং
লুেপ আটেক যােব।
মা া ব বহার করেত চায় অেনেক িক সটাও কাজ করেব না।

তাহেল সমাধান টা িক? মেন কির াফটার নাড সংখ া nn। যেহতু nn এর মান অেনক বড় হেত পাের,
তাই অবশ পিলেনািময়াল সিলউশন দরকার। এখন এমন একটা ােফর কথা িচ া কেরা যটায় সাস
থেক লংেগ পােথর দঘ হেলা n−1n−1। যমন িনেচর াফটা:

এই াফিটেত লংেগ পােথর দঘ হেলা n−1n−1 যখােন n=6n=6। তারমােন হেলা


াফটােত এমন একটা সাস নাড আেছ যখান থেক যা া কের সব েলা নাড একবার কের
মণ করা যায় কােনা নাড পুনরাবিৃ না কেরই। এ ধরেণর পাথেক বলা হয় হ ািম ন পাথ!
তুিম যিদ াফিথওির িনেয় িকছুটা পড়ােলখা কের থােকা তাহেল অবশ জানার কথা য হ ািম ন
পাথ বেলম একটা এন-িপ কমি ট (NP-complete) বেলম। এন-িপ কমি ট কােনা
বেলমেক পিলনিময়াল সমেয় সমাধান করার কােনা উপায় এখন পয কােরা জানা নই।

দখেতই পাে া হ ািম ন পাথ বেলমেক খুব সহেজই লংেগ পাথ বেলেম কনভাট করা
যায়। একটা ােফ কােনা সাস থেক এমন একটা লংেগ পাথ বর করেত হেব যন পােথর
দঘ হয় n−1n−1, এটাই হ ািম ন পাথ বেলম। লংেগ পাথ বেলমেক পিলনিময়াল
সমেয় সমাধান করা গেল হ ািম ন পাথ বেলমও সমাধান হেয় যত!

তাহেল দখেতই পাি য লংেগ পাথ বেলেমর কােনা পিলনিময়াল সিলউশন নই। নাড
সংখ া যিদ খুব অ হয় তাহেল ব াক ািকং কের এই সমস া সমাধান করা স ব, িক এটার
কমে ি িট এ েপােননিশয়াল(exponential)। লংেগ পাথ হেলা একটা এন-িপ হাড
বেলম।
1/2
এখন হেলা কন হ ািম ন পাথ বেলম এন-িপ কমি ট িক লংেগ পাথ এন-িপ হাড? যিদ এটার উ র না জেন থােকা তাহেল আমার এই লখাটা পেড় ফেলা।

হ ািপ কািডং

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

2/2
অ ালেগািরদম গম িথওির – ১
shafaetsplanet.com /planetcoding/

শাফােয়ত অে াবর ২২,


২০১৫

আমরা বা েব য সব খলাধুলা কির স েলােত আমরা খলার েতই বেল িদেত পাির না ক খলােত িজতেব, আমরা এটাও ধের িনেত পাির না য সব খেলায়াড়ই সবসময়
সরা চাল িদেব। এছাড়া অেনক খলায় ভােগ রও সহায়তা দরকার হয়। যমন তাস খলায় আমরা জািন না িতপে র কােছ িক িক কাড আেছ, বা লুডু খলায় আমরা জািন
না ছ া বা ডাইস এ কখন কান সংখ াটা আসেব। এই িসিরেজ সময় আমরা মূলত মা এমন সব গম িনেয় কাজ করেবা যার িনেচর বিশ েলা আেছ:

১. গেমর বাড, চাল ইত ািদ স েক পূ না তথ আমােদর কােছ আেছ, িতপ িক অব ায় আেছ সটাও আমরা জািন।
২. খলায় কােনা ভােগ র সহায়তা দরকার হয় না।
৩. খলা শেষ কও একজন িজতেব বা হারেব।
৪. খলায় ইজন মা খেলায়াড় থাকেব, থম ও ি তীয় খেলায়াড় পালাবদল কের চাল িদেত থাকেব।
৫. ইজন খেলায়াড়ই খলার যেকােনা সময় সবেথেক সরা চালিট িদেব, কও কােনা ভুল চাল িদেব না। কােনা খেলায়ােড়র জেয়র স াবনা থাকেল স অবশ ই িজতেব,
স াবনা না থাকেল িতপে র ভুেল স কখেনা িজতেত পারেব না। এককথায়, িতটা খেলায়াড় সবসময় ‘অপিটমাল’ চালিট িদেব।

আমরা য ধরেণর গম েলা দখেবা স েলা উপেরর শত েলা মেন চেল, অ ালেগািরদম গম আেরা অেনক রকম হেত পাের। এই লখাটা পড়ার আেগ ডাইনািমক া ািমং
এর বিসক িনেয় জানা থাকেল বুঝেত সুিবধা হেব।

এই ধরেনর খলায় একদম েত বা খলার মােঝ খলার িনয়ম েলা দেখ এবং ই খেলায়ােড়র বতমান অব া দেখই বেল দয়া যায় য ইজনই অপিটমাল চাল িদেল ক
খলায় িজতেব। বা েব এ ধরেণর খলা বািরং মেন হেলও গম িথওিরর বা ব জীবেন অেনক ব বহার আেছ, অথনীিত, রাজনীিত, জীবিব ান ইত ািদেত গম িথওির অেনক
ব বহার হয়, তেব এই িটউেটািরয়ােল আমরা গম িথওিরর একটা ছােটা সাবেসট ‘অ ালেগািরদম গম’ িনেয় জানেবা।

ছােটােবলায় িটিভেত ম াগািজন অনু ােন একটা খলা দেখিছলাম, টিবেল িকছু মােবল রাখা থােক, একজন দশকেক েজ িনেয় আসা হয়। দশেকর সােথ উপ াপক একটা
খলা খেল এরকম, থম চােল দশক বা ১ম খেলায়াড় ২টা, ৩টা বা ৫টা মােবল তুেল িনেত পারেব, পেরর চােল উপ াপক বা ২য় খেলায়াড় ২,৩ বা ৫টা মােবল তুেল িনেত
পারেব, এরপর দশক আবার একই ভােব মােবল তুলেব। এভােব চলেত থাকেব যত ণ না কােরা পে আর চাল দয়া স ব না হয়। শষবার য মােবল েলা তুেলেছ স
খলাটা িজেত যােব।

অনু ােন দখা যত এেকর পর এক দশক আসেছ আর হের যাে , কােনাভােবই উপ াপকেক হারােনা স ব হে না। আমরা এখন খলাটােক িবে ষণ করেলই বুেঝ যােবা
কন তােক হারােনা স ব হয় িন সবেথেক বুি মান দশেকর পে ও।

এই খলায় খেলায়াররা কােনা সময় িক অব ােন আেছ সটা জানার জন আমােদর ইটা তথ দরকার, বতমােন কয়টা মােবল আেছ, এবং কার চাল দয়ার পালা। যিদ ৫টা
মােবল থােক তাহেল এখন য খেলায়ােড়র চাল দয়ার পালা স একটা ‘উইিনং পিজশন’ বা ‘িবজয়ী অব া’ ত চেল িগেয়েছ, স কােনা ভুল না করেল তােক আর হারােনা
স ব না, ৫টা মােবল তুেল িনেয় স খলাটা শষ কের িদেব। িক টিবেল যিদ ১টা বা ০টা মােবল থােক তাহেল য খেলায়ােড়র চাল দবার পালা স ‘লুিজং পিজশন’ বা
‘পরািজত অব া’ য় চেল িগেয়েছ। আমরা এখন দখােবা য টিবেল মােবেলর সংখ া যতই হাক না কন, থম খেলায়ার অথাৎ য এখন চাল িদেব পরািজত অব া না িবজয়ী
অব ায় আেছ আেগই জেন যাওয়া স ব। আমরা ধের িনি কােনা খেলায়ারই ভুল চাল িদেব না।

মেন কির টিবেল মােবল আেছ nn টা।

৩টা িজিনস আমােদর মাথায় রাখেত হেব:

১. যসব অব া থেক আর কােনা চাল দয়া স ব না স েলা পরািজত অব া বা লুিজং পিজশন। যমন এই খলায় n=1n=1 এবং n=0n=0 হেলা লুিজং পিজশন।
এ েলােক টািমনাল পিজশন বলা হয় কারণ এই অব া থেক আর কােনা চাল দয়া স ব না।

২. যিদ আমরা টািমনাল পিজশেন না থািক তাহেল দখেত হেব কােনা চাল িদেয় িতপ েক একটা লুিজং পিজশেন ফেল দয়া যায় নািক। যিদ যায় তাহেল বতমান খেলায়ার
উইিনং পিজশন এ আেছ। যমন n=5n=5 হেল আিম চাইেল ২, ৩ বা ৫িট মােবল তুেল িনেয় টিবেল ৫-২=৩িট অথবা ৫-৩=২িট অথবা ৫-৫=০ িট মােবল রেখ িদেত
পাির। আমরা আেগই জািন n=0n=0 একটা লুিজং পিজশন যখান থেক কােনা খেলায়ােড়র পে জতা স ব না। যেহতু টিবেল ৫টা মােবল থাকেল িতপ েক লুিজং
পিজশেন িনেয় যাওয়া স ব হে , n=5n=5 একটা উইিনং পিজশন, বতমান খেলায়াড় কােনা ভুল না করেল তােক এই অব া থেক িকছুেতই হারােনা স ব না।

৩. বতমান অব া থেক কােনা চাল িদেয় িতপ েক একটা লুিজং পিজশেন িনেয় যাওয়া না গেল বতমান খেলায়ার লুিজং পিজশেন আেছ, িতপ ভুল না করেল তার পে
আর িকছুেতই জতা স ব না।

1/2
এখন আমরা সহেজই য কােনা n এর জন বতমান খেলায়াড় িক অব ায় আেছ বর কের ফলেত পাির িনেচর কাড িদেয়:

Python

1 def can_win(n):
2 if n==0 or n==1: return 0
3 if(can_win(n-2)==0 or can_win(n-3)==0 or can_win(n-5)==0):
4 return 1
5 return 0

আমরা িতটা nn এর জন িনেচর মত আউটপুট পােবা:

n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

can_win(n) 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0

০ মােন হেলা লুিজং পিজশন, ১ মােন উইিনং। এখান থেক য n=15n=15 এর জন বতমান খেলায়াড় কখেনা িজতেত পারেব না। ১৫টা মােবল থেক ২, ৩ বা
৫টা মােবল তুেল আমরা ১৩, ১২ বা ১০টা মােবল রেখ িদেত পাির, িক টিবল থেক দখা যাে সব েলাই উইিনং পিজশন, তাই বতমান অব া থেক জতা স ব না।
িটিভর সই অনু ােন যিদ উপ াপক ১৫িট মােবল িনেয় দশকেক থম খেলায়াড় বািনেয় খলা কের এবং স যিদ বুি মান হয় তাহেল তােক হারােনা অস ব!

আিম িনি ত এখন তামরা বুেঝ িগেয়েছা িকভােব এধরেণর সমস া সমাধান করেত হয়। িচ া করার মেতা িকছু সমস া িদলাম, সব েলাই উপেরর সমস াটার মেতা:

১. এিলস আর বব একটা খলা খলেছ, তােদর কােছ একটা সংখ া আেছ p=1p=1। িত চােল একজন খেলায়ার pp এর সােথ ২ থেক ৯ এর িভতর একটা সংখ া ণ
করেত পাের। ণ করার পর সংখ াটা xx এর থেক বড় হেয় গেল স িজেত যােব। xx এর মান দয়া আেছ, এিলস সবসময় থম চাল দয়। খলায় ক িজতেব? (UVA
847)

২. UVA 11489

৩. আেরকটু কিঠন সমস া সমাধান করেত চাইেল UVA 10891

পেরর পেব অ ালেগািরদম গম এর সবেথেক পূ ণ িবষয় “িনম গম” িনেয় আেলাচনা করেবা।

রফাের :

https://www.topcoder.com/community/data-science/data-science-tutorials/algorithm-games/

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

2/2
অ ালেগািরদম গম িথওির-২ (িনম গম)
shafaetsplanet.com /planetcoding/

শাফােয়ত জানুয়াির ৩,
২০১৬

আেগর পেব গম িথওির িকছু বিসক িশেখিছ, এবােরর পেব আমরা জানেবা িনম- গম িনেয়। িনম- গম খুবই পূ ণ কারণ অেনক ধরেণর গমেক িনম গম এ পা র কের
ফলা যায়।

িনম- গম এ ইজন খেলায়ার আর িকছু পাথেরর প(pile) থােক। িত চােল একজন খেলায়াড় যেকােনা একটা প থেক এক বা একািধক পাথর তুেল িনেত পাের।
কও চাল িদেত ব াথ হেল হের যােব। অথাৎ শষ পাথরটা য তুেল িনেয়েছ স গেম িজতেব।

উপেরর ছিবেত ৩টা পাথেরর প দখা যাে , থমটায় ৬টা, ি তীয়টায় ৯টা এবং ত ৃতীয়টায় ৩টা পাথর আেছ।

আেগর গম লার মেতা এখােনও েত ক খেলায়াড় অপিটমাল প িতেত খলেব, কও কােনা ভুল চাল িদেব না। তামােক কান
েপ কয়িট পাথর আেছ সটা দেখ বলেত হেব থম খেলায়ার িজতেব নািক হারেব।

এখন মেন কেরা nn টা েপ যথা েম a1,a2…..,ana1,a2…..,an টা পাথর আেছ। খলায় থম খেলায়াড় হারেব
ধুমা যিদ xorsum=a1⊕a2⊕….⊕an=0xorsum=a1⊕a2⊕….⊕an=0 হয়। এখােন ⊕ িদেয় xor
অপােরটর বুঝােনা হে ।

উপেরর ছিবর উদাহরেণ xorsum=6⊕9⊕3=12!=0xorsum=6⊕9⊕3=12!=0 । এখােন xorsum ন না, তাই


অপিটমাল প িতেত খলেল থম খেলায়াড়েক হারােনা স ব না।

এখন হেলা এটা কন আর িকভােব কাজ করেছ? xorsum=0xorsum=0 যিদ লুিজং ট হেয় থােক তাহেল বতমান
খেলায়াড় যভােবই চাল িদক না কন স গমটােক একটা উইিনং ট এ িনেয় যােব।

মেন কেরা n=4n=4 এবং প েলােত পাথেরর সংখ ার সট {9,7,11,5}{9,7,11,5}। এেদরেক বাইনািরেত িনেচর মত কের
িলিখ:

1 0 0 1 (= 9)
0 1 1 1 (= 7)
1 0 1 1 (= 11)
0 1 0 1 (= 5)

আমরা বাইনাির সংখ া েলােক একটা ৪×৪৪×৪ ি ড িহসােব িচ া করেত পাির। ল কেরা িতটা কলােমই জাড় সংখ ক 11 আেছ, তাই xorsum=0xorsum=0
হেব, এটা একটা লুিজং ট। এখন বতমান খেলায়াড় একটা প বেছ িনেয় িকছু পাথর উিঠেয় িনেলা। স এই কাজটা যভােবই ক ক, কােনা একটা সািরর অ ত ১িট
11 ক 00 ত পিরবতন করেত হেব। ফেল অ ত একটা কলােম িবেজাড় সংখ ক 11 থেক যােব এবং xorsum>0xorsum>0 হেয় যােব।

তারমােন বতমান ট এ xorsum=0xorsum=0 হেল তুিম যভােবই চাল দাও না কেনা xorsum>0xorsum>0 হেয় যােব।

এখন বতমান ট এ যিদ xorsum>0xorsum>0 হয় তাহেল দখােনা যায় য বতমান খেলায়ােড়র পে এমন চাল দয়া স ব যােত গমটা লুিজং ট এ চেল যায়,
অথাৎ xorsum=0xorsum=0 হেয় যায়।

মেন কেরা পাথেরর সংখ ার সট {5,14,9,5}{5,14,9,5}।

0 1 0 1 =(5)
1 1 1 0 =(14)
1 0 0 1 =(9)
0 1 0 1 = (5)

বাম থেক ২য় এবং ৩য় কলােম িবেজাড় সংখ ক 11 আেছ, তাই xorsum>0xorsum>0 হেব। এখন আিম এমন চাল িদেত চাই যেনা xorsum=0 হেয় যায়।
এজন থেমই সবেথেক বােমর কলামটা খুেজ বর করেবা যটাই িবেজাড় সংখ া 1 আেছ, এে ে সটা ২য় কলাম। এবার ২য় কলােম 11 আেছ এমন একটা রা বেছ

1/3
িনেবা , এে ে সটা হেত পাের থম, ি তীয় বা চতুথ রা। এবার সই রা এর ২য় কলােমর 11 টােক 00 বািনেয় দাও এবং অন ান কলােমর 00 বা 11 ক এমন ভােব
পিরবতন কেরা যন িতটা কলােম জাড় সংখ ক পাথর থােক। তাহেলই xorsum=0xorsum=0 হেয় গেলা!

তারমােন বতমান ট এ xorsum>0xorsum>0 হেল বতমান খেলায়াড় সহেজই এমন চাল িদেত পারেব যেনা xorsum=0xorsum=0 হেয় যায়।

তাহেল দখা যাে লুিজং ট (xorsum=0xorsum=0) থেক যভাবই চাল দয়া হাক না কেনা ধুমা উইিনং ট ( xorsum>0xorsum>0) এ যাওয়া
যায়, আবার বুি মােনর মত খলেল উইিনং ট (xorsum>0xorsum>0) থেক সবসময় লুিজং ট এ যাওয়া যায় (xorsum=0xorsum=0) । তাই েত
xorsum>0xorsum>0 হেল থম খেলায়াড়েক কখেনাই হারােনা স ব না স যিদ অপিটমাল প িতেত খেল।

এখন আমরা িনম গম এর িকছু ভ ািরেয়শন দিখ।

িমেজরা(Misere) িনম

Misere একটা শ । িমেজরা িনমেগম এ য খেলায়ার শষ পাথরটা তুেল িনেব স হের যােব। িমেজরা িনম এও xorsum>0xorsum>0 উইিনং পিজশন।
তেব থম খেলায়াড়েক ােটিজ িকছুটা পিরবতন করেত হেব। শষ চােল সব েলা পাথর তুেল না িনেয় একটা মা পাথর রেখ িদেত হেব, ি তীয় খেলায়াড় তখন শষ
পাথরটা তুলেত বাধ হেব। তেব যিদ িতটা েপই িঠক ১টা কের পাথর থােক তখন আর xorsum িদেয় কাজ হেব না। তখন দখেত হেব েপর সংখ া জাড় নািক
বেজাড়। যিদ বেজাড় সংখ া প থােক এবং িতটােত ১টা কের পাথর থােক তাহেল বতমান খেলায়াড়েক হারােনা স ব না।

াইম পাওয়ার গম

একটা সংখ া nn দয়া আেছ। একজন খেলায়াড় তার চােল nn ক কােনা একটা াইম সংখ ার পাওয়ার িদেয় ভাগ করেত পাের। সংখ াটা যিদ ১ হেয় যায় তাহেল বতমান
খেলায়াড় িজেত যােব।
ল কেরা যেকােনা সংখ া n ক িকছু াইম সংখ ার ণফল িহসােব লখা যায়। যমন n=56700n=56700 হেল আমরা িলখেত পাির
n=(2×2)×(3×3×3×3)×(5×5)×(7)=22×34×52×71n=(2×2)×(3×3×3×3)×(5×5)×(7)=22×34×52×71। এখন তুিম মেন কের ৪টা
পাথেরর প আেছ, এবং পাথেরর সংখ ার সট {2,4,2,1}{2,4,2,1}। এখন এটা িনম গম এ পিরণত হেয়েছ, তুিম যেকােনা একটা প থেক এক বা একািধক পাথর
তুেল িনেত পােরা!

িন ল(Nimble)

িন ল গম এ nn টা ঘর থােক যােদরেক 00 থেক n−1n−1 িদেয় িচি ত করা হয়। িতটা ঘের এক বা একািধক কেয়ন থােক। িনেচর ছিব দেখা:

িত চােল কােনা একটা ঘর থেক একটামা কেয়ন সিরেয় বােমর কােনা একটা
ঘের রাখা যায়। য চাল িদেত পারেব না স হের যােব। সব েলা পাথর যখন
০-তম ঘের চেল আসেব তখন আর চাল দয়া স ব হেব না।

ল কেরা ২ ন র ঘের ৩টা পাথর আেছ এবং িতটা কেয়নেক িঠক ২বার কের
সরােনা স ব। আবার ১ ন র ঘেরর িতিট কেয়নেক ১বার এবং ৪ ন র ঘেরর
িতিট কেয়নেক ৪ বার কের সরােনা স ব।

আমরা ii-তম ঘেরর িতটা কেয়নেক ii আকােরর পাথেরর প িহসােব িচ া করেত পাির কারণ কেয়নটা িঠক ii বার সরােনা স ব। তাহেল উপেরর উদাহরেণ পাথেরর েপর
সট হেব এরকম {1,1,2,2,2,4,4,4,4,4,4}{1,1,2,2,2,4,4,4,4,4,4} । ৬টা েপর আকার ৪ কারণ ৪ ন র ঘের ৬টা কেয়ন আেছ। এখন গমটা সাধারণ
িনমেগেম পিরণত হেয়েছ!

ম াি গম

একটা n×mn×m আকােরর ীড দয়া আেছ। িতিট ঘের িকছু পাথর রাখা আেছ। একজন খেলায়াড় যেকােনা একটা সািরর এক বা একািধক কলাম থেক িকছু পাথর
তুেল িনেত পাের। িত চােল অ ত একটা পাথর তুলেতই হেব। শষ পাথরটা য তুলেব স িজেত যােব।

2/3
এই গমটােকও সহেজ সাধারণ িনম গম এ পা র করা যায়। িতিট সািরর মাট পাথরসংখ ােক একটা প িহসােব
িচ া করেত হেব। তারপর xorsum বর করেলই কাজ শষ।

পাকার িনম

পাকার িনম হেলা একধরেণর বাগাস িনম। বাগাস িনম এ পাথর ধু তালাই যায় না, পাথর যাগও করা যায়।
পাকার িনম এর িনয়ম হেলা যেকােনা েপ এক বা একািধক পাথর যাগ করা যােব। কােনা প এর আকার যিদ
েত হয় mm তাহেল পাথর যাগ করার পেরও আকার mm এর বিশ হেত পারেব না। আর গমটা যােত অসীম
সময় ধের না চেল স জন কােনা খেলায়াড় kk বার এর বিশ পাথর যাগ করেত পারেব না।

এই গম এ যিদ থম খেলায়াড় উইিনং ট এ থােক (xorsum>0xorsum>0) তাহেল ২য় খেলায়াড় যখন িকছু পাথর যাগ করেব, থম খেলায়াড় পাথর েলা
সিরেয় ফেল গমটােক আবার এই ট এ িনেয় আসেব! তাই সাধারণ িনম এর মতই xorsumxorsum দেখ বেল দয়া যায় গম এ ক িজতেব।

পেরর পেব আমরা আেরা িকছু ভ ািরেয়শন দখেবা এবং ানিড সংখ া িনেয় জানেবা। এখন লাইটওেজ ত এই সমস া েলা সমাধান করার চ া কেরা। িনম এর আেরা িকছু
ভ ািরেয়শন পােব এখােন।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
অ ালেগািরদম গম িথওির ৩ ( াগ- াি সংখ া)
shafaetsplanet.com /planetcoding/

শাফােয়ত 4/16/2016

আমরা এখন িনম- গম িকভােব সমাধান করেত হয় জািন, এখন আমরা াি সংখ া িদেয় িকছু কে ািজট গম এর সমাধান করেবা।

একটা গম এর কথা িচ া কির যখােন ss টা পাথেরর একটা প(pile) আেছ, িতবার কােনা খেলায়াড় ১টা বা ২টা পাথর তুেল িনেত পাের, শষ পাথরটা য তুেল িনেব
স িজতেব। পাথেরর সংখ া দেখ তামােক বলেত হেব অপিটমাল প িতেত খলেল থম খেলায়াড় িজতেত পারেব িকনা। থম পব পেড় থাকেল এটা সমাধান করা তামার
জন খুবই সহজ। আমােদর সুেডােকাডটা হেব এরকম:

1 def can_win(s):
2 if s==0: return 0
3 if s==1: return 1
4 if(can_win(s-1)==0 or can_win(s-2)==0):
5 return 1
6 return 0

এখন ধেরা পাথেরর েপর সংখ া একটার বদেল যিদ nn টা এবং িতটা েপ s1,s2……sns1,s2……sn টা পাথর আেছ। কােনা খেলায়াড় যেকােনা একটা প
থেক ১ বা ২টা পাথর তুেল িনেত পাের, শষ পাথরটা য তুলেব স িজতেব। এবার িকভােব সমাধান করেব? এধরেণর গমেক কে ািজট গম বলা হয়।

আমরা িতটা েপর জন একটা াি সংখ া িনধারণ করেবা। একটা েপর াি সংখ া g হেল আমরা ধের িনেত পাির সই পটা িনমেগম এ gg টা পাথেরর একটা েপর
সমতুল । nn টা েপর জন আমরা nn টা াি সংখ া g[s1],g[s2]….g[sn]g[s1],g[s2]….g[sn] পােবা, এবং এরপর িনমেগেমর মেতা
g[s1]⊕g[s2]⊕……..gng[s1]⊕g[s2]⊕……..gn বর করেলই আমরা বুেঝ যােবা গমটায় ক িজতেব।

িতটা ট এর জন াি সংখ া বর করার িনয়ম হেলা, ওই প থেক অন যসব ট এ যাওয়া যায় স লার াি সংখ া থম বর করেত হেব। মেন কেরা তােদর
সট হেলা X={x1,x2,…}X={x1,x2,…}। এখন সবিন য সংখ াটা এই সট এ নাই সটাই হেব বতমান ট এর াি সংখ া। একটা উদাহরণ দখেল ব াপারটা
পির ার হেব।

মেন কেরা কােনা একটা েপ ০টা পাথর আেছ। আমােদর ট হেলা s=0s=0। আমরা জািন এটা একটা লুিজং পিজশন, আমরা ধের িনেত পাির s=0s=0 এর জন
াি সংখ া g[0]=0g[0]=0।

যিদ েপ ১টা পাথর থােক তাহেল s=1s=1। এখান থেক ১টা পাথর তুেল s=0s=0 ট এ যাওয়া যায়। সট XX এ তাহেল আেছ
X={g[0]}={0}X={g[0]}={0}। 11 হেলা সবিন সংখ া যা XX এ নই, তাহেল আমরা ধের িনেবা g[1]=1g[1]=1।

যিদ েপ ২টা পাথর থােক তাহেল s=2s=2। এখান থেক ১টা বা ২টা পাথর তুেল s=1s=1 বা s=0s=0 ট এ যাওয়া যায়। সট XX এ তাহেল আেছ
X={g[1],g[0]}={0,1}X={g[1],g[0]}={0,1}। 22 হেলা সবিন সংখ া যা XX এ নই, তাহেল আমরা ধের িনেবা g[2]=2g[2]=2।

যিদ েপ ৩টা পাথর থােক তাহেল s=3s=3। এখান থেক ১টা বা ২টা পাথর তুেল s=2s=2 বা s=1s=1 ট এ যাওয়া যায়। সট XX এ তাহেল আেছ
X={g[2],g[1]}={2,1}X={g[2],g[1]}={2,1}। 00 হেলা সবিন সংখ া যা XX এ নই, তাহেল আমরা ধের িনেবা g[3]=0g[3]=0।

একই ভােব িহসাব করেল তুিম পােব g[4]=1g[4]=1, g[5]=2g[5]=2 ইত ািদ।

এখন যিদ ৩টা েপ {5,2,3}{5,2,3} টা পাথর থােক তাহেল তুিম বলেত পােরা গমটা {g[5],g[2],g[3]}={2,2,0}{g[5],g[2],g[3]}={2,2,0} টা পাথর িনেয়
সাধারণ িনম গম খলার সমতুল । এখন তুিম xorsumxorsum দেখ বলেত পােরা খলাটায় ক িজতেব।

াি সংখ া বর করার জন সাধারণ সুেডােকাড হেত পাের এরকম:

1/3
1 def grundyNumber (current_state):
2 moves[] = possible positions to which I can move from current_state
3 set X;
4 for (all new_state in moves)
5 X.insert(grundyNumber(new_state));
6
7 int ret=0;
8 while (s.contains(ret)) ret++;
9 #ret is the smallest non-negative integer not in the set s;
10 return ret;

এ পয যিদ বুেঝ থােকা তাহেল িনেচর সমস াটা সমাধান কেরা:

একটা দাবার বােড kk টা কেয়ন রাখা আেছ। কােনা কেয়ন (x,y) ঘের থাকেল িত চােল কেয়নিটেক (x-2, y+1) অথবা (x-2, y-1) অথবা (x-1, y-2) অথবা
(x+1, y-2) ঘের সরােনা যায় , তেব কেয়নিট বােডর বাইের সরােনা যােব না।

িত চােল বতমান খেলায়াড় উপেরর িনয়ম মেন একটা কেয়ন সরােত পারেব। য খেলায়াড় কেয়ন সরােত পারেব না স হের যােব। তামােক কেয়ন েলার ানাংক দয়া
থাকেব, বলেত হেব খলায় ক িজতেব।

এই দাবার বােড িতটা ঘেরর জন াি সংখ া িহসাব করেল তুিম িনেচর মেতা একটা টিবল পােব:

2/3
ল কের দেখা যসব ঘর থেক অন কােনা ঘের যাওয়া যায় না তােদর াি সংখ া ০, তারমােন সসব
ঘর েলা হেলা লুিজং পিজশন। বািক ঘর েলার জন াি সংখ া িহসাব করেত হেল থেম একটা ঘর থেক
অন যসব ঘের যাওয়া যায় তােদর াি সংখ া িহসাব করেত হেব। মেন কেরা সই সংখ া েলার সট হেলা
SS। সবিন য নন- নেগিটভ সংখ া SS এ নই সটাই হেব বতমান ঘেরর াি সংখ া।

আজেক এই পয ই। াি সংখ া িকভােব িনণয় করেত হয় বুেঝ থাকেল এই সমস া েলা সমাধান কেরা। এই
প িতটা কন কাজ কের সটাও িচ া কের বর করার চ া কেরা।

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
ডাইনািমক া ািমং এ হােতখিড়-১( র কথা)
shafaetsplanet.com /planetcoding/

শাফােয়ত 4/28/2012

কনেট া ািমং করেত িগেয় আমরা অেনক িকছুই িশিখ, আমােদর াফ িথওিরর অ ালেগািরদম েলা িশখেত হয়, জিটল সব ডাটা াকচার চােখর পলেক ইমি েম করেত
হয়, এমনিক জ ািমিত পয িশখেত হয় আমােদর। তেব ায় সকেলই ীকার করেব আমরা যসব িশিখ তারমেধ সবেথেক শি ক একটা িবষয় হেলা ডাইনািমক া ািমং।
এই িসিরেজ আিম িকছু ািসক ডাইনািমক া ািমং বেলম িনেয় িব ািরত আেলাচনা করেবা য েলা পেড় তুিম অেনক েলা বেলম িনেজ সলভ কের ফলেত পারেব। আিম
জািন এরপর তুিম িনেজই এিগেয় যেত পারেব।

(এই িসিরজিট পড়া র করার আেগ তামােক যটা িশখেত সটা হেলা িরকাশন। তুিম এটা িশখেত পারেব ফািহম ভাইেয়র দা ণ এই লখািট পেড়, লখািটেত ডাইনািমক
া ািমং িনেয়ও আেলাচনা করা হেয়েছ।)

ডাইনািমক া ািমং কােনা িনিদ অ ালেগািরদম নয় বরং একিট বেলম সলিভং টকিনক যা ব বহার কের িবিভ সমস ােক খুবই কম সমেয়র মেধ সলভ করা যায়। িরেয়ল
লাইফ অেনক বেলম কম সমেয়র মেধ একমা ডাইনািমক া ািমং ব বহার কেরই করা স ব এবং িবেশষ কের বাংলােদেশর ন াশনাল কনেট েলােত ডাইনািমক া ািমং
বেলেমর একািধক বেলম সবসময় থােক।

এখন কােজর কথায় আিস। েতই কিঠন শ িদেয় ডাইনািমক া ািমং এর সং া বলেল য কও ভয় পেয় যােব, তাই আমরা করেবা ছা একটা উদাহরণ িদেয়,
তারপর িকছু ফমাল কথাবাতায় যােবা। ইটািলয়ান গিণতিবদ Leonardo Pisano Bigollo যােক আমরা িফেবানাি নােম িচিন খরেগােশর বংশবিৃ পযেব ণ করেত
িগেয় একটা না ার িসিরজ আিব ার কের বসেলন। িসিরজিট এরকম:

০, ১, ১, ২, ৩, ৫, ৮, ১৩, ২১………..

ল কেরা ১ম িট সংখ া ছাড়া িতিট সংখ া হেলা আেগর িট সংখ ার যাগফল। আমরা একিট ফাংশন ক না কির F(n) যা n তম িফেবানাি সংখ া িরটান কের,অথাত
F(n)=n তম িফেবানাি সংখ া।
তাহেল:

F(0)=0
F(1)=1
F(2)=F(1)+F(0)=1
F(3)=F(2)+F(1)=2
F(4)=F(3)+F(2)=3

তাহেল আমরা জনােরলভােব বলেতই পাির:

F(0)=0
F(1)=1
F(n)=F(n-1)+F(n-2)

এখােন F(0) এবং F(1) হেলা আমােদর িরকািসভ ফাংশেনর জন য বসেকস দরকার সটা। আমরা খুব সহেজ C++ এ কাড িলেখ িফেবানাি সংখ া বর করেত পাির:

C++

1/4
1 int F( int n ) {
2 if( n == 0 ) return 0;
3 if( n == 1 ) return 1;
4 return F( n-1 ) + F( n-2 );
5 }

এখন ধেরা তুিম F(6) ক কল করেল। স আবার কল করেব F(5) আর F(4) ক,এরা আরও িকছু ফাংশনেক কল করেব। আমরা ছিব আকাের দিখ ক কােক কল
করেব:

এখন খুব ভােলা কের িকছু ব াপার ল কেরা। ধেরা F(6) আেগ কল করেছ F(5) ক এবং তারপের কল করেছ F(4) ক এবং সবেশেষ এ েটার যাগফল তামােক
িদে । এখন ছিবেত দেখা,F(5) কল িদে F(4) এবং F(3) ক। যখন F(5) িহসাব করা শষ তখন অবশ ই F(5) যােদরেক কল িদে তােদর িহসাব করাও শষ
হেয় গেছ,তাই নয় িক? তারমােন F(5) িহসাব করেত িগেয় F(4) এবং F(3) আমরা িহসাব কের ফেলিছ,এমনিক F(2) ও িহসাব কের ফেলিছ । (F(1) আর F(0)
বস কস,তােদর মান আমরা থেকই জািন)।

এখন F(6) িক F(5) ক কল করার পর আবার F(4) ক কল করেছ। িক আমরােতা F(4) এর মান িহসাব কেরই ফেলিছ,িক দরকার আবার িহসাব করার? আেগর
মানটাই িক আমরা আবার ব বহার করেত পািরনা?

এখােনই আমরা একটা ছা ি কস খাটােবা। কােনা একিট ফাংশেনর িহসাব শষ হেয় গেল আমরা একিট টিবেল মানিট সভ কের রাখেবা। পরবিতেত একই ফাংশনেক
আবার কল করেল আমরা পুেরা িহসাব আবার না কের আেগর মানিট িরটান কের িদেবা।

C++

1 int dp[20];
2 // েত িডিপ অ ােরর সব েলা ইনেডে -১ বিসেয় নাও
3 // যমন for(int i=0;i<20;i++)dp[i]=-1; (এই কাজটা মইন ফাংশেন করেব)
4 // কােনা ঘের -১ থাকা মােন হে ঘরটা খািল
5 int F( int n ) {
6 if( n == 0 ) return 0;
7 if( n == 1 ) return 1;
8 if( dp[n]!=-1 ) return dp[n];
9 else
10 {
11 dp[n] = F( n-1 ) + F( n-2 );
12 return dp[n];
13 }
14 }

উপেরর কােড আমরা সব কাজ থম কােজর মেতা করিছ ধু সামান একটু memoization টকিনক ব বহার কেরিছ। েত dp অ ােরর সব েলা পিজশেন -১ রেখ
নাও,তারমােন সব েলা পিজশন খািল। তুিম যখন F(4) কল করেব তখন আেগ দেখা dp[4] খািল নািক,খািল হওয়া মােন এখনও িহসাব করা হয়িন,তাই F(4) এর মান
িহসাব কের dp[4] এ রেখ িরটান কের দাও। যিদ খািল না হয় তারমােন আেগই dp[4] এর মান িহসাব করা হেয় গেছ!! তাহেল তুিম ধু dp[4] িরটান কের দাও।

2/4
য সহজ কাজটা কের আমরা সময় বািচেয় ফললাম সটােকই কি উটার া ামার কিঠন ভাষায় বেল ডাইনািমক া ািমং বা িডিপ। আমরা যিদ মান েলা অ ােরেত সভ
কের না রাখতাম তাহেল এিক ফাংশন বারবার কল হেয় চুর সময় ন করেতা,তুিম িনেজ F(20) এর জন একবার সভ কের আেরকবার না কের পরী া কের দখেত পােরা
পাথক টা কতখািন।

৩িট বিশ থাকেল একিট বেলমেক িডিপ িদেয় সলভ করা স ব:


১. subproblems: বেলম েলােক ছােটা এক বা একািধক সাব বেলেম ভাগ করা যেত হেব। যমন F(4) এর মান বর করার বেলমটােক আমরা F(3) এবং
F(2) এই ইভােগ ভাগ কের ফলেত পাির। সাব বেলম েলা মুল বেলেমর অনু প হয়,অথাৎ যভােব মুল বেলম সলভ করা যায় সভােবই সাব বেলম সলভ করা যায়।

২. overlapping subproblems থােক। এটার মােন হেলা সাব বেলেমর েলার মেধ কমন অংশ থাকেব য কারেণ একই ফাংশন একািধক ফাংশন হেত কল
হেব।
যমন F(6) এবং F(5) এ েটা বেলেমর সাব বেলম েলার মধ F(4),F(3) ইত ািদ ওভারল ািপং। এ কারেণই আমরা অ ােরেত ভ ালু সভ কের রািখ। িনেচর ছিবিট
দেখা:

বােমর এই লাল িদেয় ঘরা সাবি েলা ডােনও আেছ। একািধক ােন থাকার কারেণই এেদর বলিছ ওভারল ািপং সাবি বা সাব বেলম। ফেল ডানপােশ আমরা একবার
এ েলােক কি উট কের টিবেল জিমেয় রাখিছ। পের বােমর অংেশ এেস ফ টিবল থেক মানটা দেখ িনি । জনােরলাইজ কের আেরকিট ছিব িদলাম:

ছিব: লাল নাডটা েটা সাব বেলমেক ওভারল াপ কেরেছ

৩. optimal substructure: এটা িফেবানাি র উদাহরণ িদেয় বুঝােনা কিঠন। ধেরা তামােক কােনা একটা ফাংশন G(x) এর ভ ালুেক িমিনমাইজ করেত বেলেছ
3/4
আর তুিম এটা জােনা য G(x) িনভর কের G(y) এবং G(z) এর উপর। এখন যিদ G(y) এবং G(z) ক িমিনমাইজ কের G(x) ক িমিনমাইজ করা যায় তাহেল
বেলমিটর optimal substructure াপািট আেছ। এমন হেতই পাের য G(y) ক িমিনমাইজ এবং G(z) ক িমিনমাইজ বা ম াি মাইজ িকছুই না কের G(x)
ক িমিনমাইজ করা যায়,তাহেল optimal substructure াপািট নই। যিদ সাব বেলেমর অপিটমাল সলুশন থেক মুল বেলেমর অপিটমাল সলুশন পাওয়া যায়
তাহেলই ধুমা এই াপািটটা আেছ বলা যােব।

িফেবানাি র বেলমটা আসেল ডাইনািমক া ািমং এর খুব বিশ ভােলা উদাহরন না কারণ কােনা িকছু ম াি মাইজ বা িমিনমাইজ করেত হয়না, তেব েত বুঝােনার জন
এটাই সবেথেক ভােলা উদাহরন।

থম পব এখােনই শষ। পরবতী পেব িডিপর ট িনেয় িকছু আেলাচনা করা হেব এবং 2d,3d অ াের ব বহার কের ফাংশেনর মান সংর ন করা দখােনা হেব। এখন
তামার হামওয়াক(!!) হেব binomial coefficient nCr এর মান ডাইনািমক া ািমং এর সাহােয বর করা। িরকাশনিট হেলা nCr =(n-1)Cr + (n-1)C(r-
1)। বস কস বর করার দািয় ও তামার। পরবতী পেব সমস ািটর সমাধান বলা হেব। hint: ২িড টিবেল মান সভ করেত হেব। আর সলভ করা চ া কেরা এই
বেলমিট: http://www.lightoj.com/volume_showproblem.php?problem=1006,এটা সলভ করেত পারেল তুিম িটউেটািরয়ালিট ভােলামত
বুেঝছ,না পারেল আেরকবার পেড়া এবং িচ া কেরা। িডিপ বেলম সলভ করেত হেলা চুর িচ া করেত হেব,িটউেটািরয়াল পেড় বিসক িজিনস ছাড়া খুব বিশ িকছু িশখেত
পারেবনা।
২য় পব

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
ডাইনািমক া ািমং এ হােতখিড়-২
shafaetsplanet.com /planetcoding/

শাফােয়ত ম ২৩,
২০১২

(১ম পব) (সব েলা পব)

১ম পেব আমরা জেনিছ ডাইনািমক া ািমং কােক বেল, বেলেম িক রকেমর বিশ থাকেল সটা ডাইনািমক া ািমং এর সাহােয সমাধান করা যায়। আমরা দেখিছ িডিপ
িদেয় িকভােব িফেবানাি সংখ ার িরকাশেনর রানটাইম অেনক কিমেয় আনা যায়। তেব িডিপ এমন একটা িজিনস য এতিকছু জেনও তুিম িকছুই সমাধান করেত পারেবনা
যিদনা খুব ভােলা কের াকিটস কেরা আর িচ া কেরা। তেব এটা েন ভেয়র একদমই িকছু নই, াকিটস করেত থাকেল িকছুিদন পর দখেব অেনক সহেজই িরকািসভ
ফাংশন বর কের িডিপ বেলম সলভ কের ফলেত পারেছা,আমার কাজ হেলা তামােক কিরেয় দয়া। সব শেষ hexabonacci নােমর একিট বেলম সলভ করেত
িদেয়িছলাম,আশা কির সবাই বেলমিট খুব সহেজই সমাধান কের ফেলেছ। সমাধান করেত না পারেল আিম বলেবা আেগর পবটা আেরকবার খুব ভােলাভােব পেড় ফলেত
আর কােনা জায়গায় না বুঝেল ম ব অংেশ জানােত। বেলমিটর সােথ িফেবানাি বেলমটার খুব একটা পাথক নই বেল আিম সমাধান িনেয় আেলাচনা করিছনা।

nn টা ব র মধ থেক rr টা ব কত ভােব নয়া যায়?

এখন আমরা nCrnCr এর মান িকভােব ডাইনািমক া ািমং এর সাহােয বর করা যায় সটা িনেয় আেলাচনা করেবা। nn টা িজিনেসর মধ◌্েয rr টা িজিনস কতভােব
নয়া যায় সটাই nCrnCr বা nCr(n,r)nCr(n,r)। এখন যেকােনা একিট িজিনেসর কথা িচ া কর। তুিম যিদ িজিনসটা না নাও তাহেল বািক n−1n−1 টা িজিনেসর
মধ◌্য থেক আেরা rr টা িজিনস িনেত হেব, সটা করা যায় nCr(n−1,r)nCr(n−1,r) ভােব। আর যিদ তুিম িজিনসটা নাও তাহেল বািক n−1n−1 টা িজিনেসর
মধ◌্েয থেক আেরা r−1r−1 টা িজিনস িনেত হেব, সটা করা যায় nCr(n−1,r−1)nCr(n−1,r−1) ভােব। এই ইটার যাগফলই হেলা মাট উপায়।

nCr=(n−1)Cr+(n−1)C(r−1)nCr=(n−1)Cr+(n−1)C(r−1)

আমরা যিদ মেন কির nCr(n,r) হেলা একিট ফাংশন যা n আর r এর মানেক প ারািমটার িহসােব হণ কের তাহেল আমরা উপেরর িরেলশন তােক এভােব িলখেত পাির:

nCr(n,r)=nCr(n−1,r)+nCr(n−1,r−1)nCr(n,r)=nCr(n−1,r)+nCr(n−1,r−1)

এবার হয়েতা িজিনসটা আেরা হেয়েছ তামার কােছ। িক িরকাশনটা শষ হেব কখন? অথাৎ বস কস িক? আমরা জািন nCr(n,1)=nnCr(n,1)=n এবং
nCr(n,n)=1nCr(n,n)=1 । এ িট শত বস কস িহসােব ব বহার করেল কাডটা হেব:

Python

1 def nCr(n, r):


2 if r==1: return n
3 if n==r: return 1
4 return nCr(n-1, r) + nCr(n-1, r-1)

ফাংশন কল েলা ল করেল দখেত পােব িফেবানাি র মেতা এখােনও একিট ফাংশন বার বার কল হে :

1/5
আমরা এই অিতির ফাংশন কল সহেজই এড়ােত পাির আেগর মেতা একটা টিবল রেখ। পাথক হেলা এবার টিবলটা হেব ২-িড,আর কােনা পাথক নই। আেগ
টিবলটার সব ঘের −1−1 রেখ িনেবা, −1−1 িদেয় বুঝাে ঘরিট খািল আেছ।

Python

1 table = [[-1 for i in range (0,50)] for i in range(0, 50)] //Create a 50*50 table with -1 in each cell
2 def nCr(n, r):
3 if r==1: return n
4 if n==r: return 1
5 if table[n][r] != -1:
6 return table[n][r]
7 table[n][r] = nCr(n-1, r) + nCr(n-1, r-1)
8 return table[n][r]

আমােদর সব েলা িডিপ কাডই মাটামুিট একটা ফরেমট মেন চলেব, সটা এরকম:

1 def function(state1, state2, ...., staten)


2
3 Return if reached any base case
4 Check table and return if the value is already computed
5 Calculate the value recursive for this state
6 Save the value in the table and return

nCrnCr এর ে প ারািমটার িছেলা nn এবং rr। বুঝেতই পারেছা যত েলা প ারািমটার থাকেব মান টিবেল সভ করার জন তত ডাইেমনশেনর টিবল লাগেব। ট
বিশ লাগেল মমিরও বিশ লােগ। অ ােরর িতিট ডাইেমনশেনর সাইজ েয়াজনমেতা প ারািমটার অনুসাের কমেবিশ হেব। প ারািমটারেক আমরা সাধারণত বেল থািক
ট(State)।

িডিপেত সবেথেক পূ ণ অংশ হেলা ট বুঝেত পারা। ধেরা তামােক ৫০িমিনেটর মেধ একটা াস ধরেত হেব। এখন রা ায় তুিম কান অব ায় আেছা সটা আিম
জানেত পারেবা যিদ তুিম আমােক িট তথ দাও: তুিম এই মু েত কান জায়গায় আেছা আর তুিম বাসা থেক বর হবার পর কয় িমিনট পার হেয়েছ। যমন হয়েতা তুিম
ফামেগেট আেছা আর বাসা থেক বর হবার পর ২০ িমিনট পার হেয়েছ। তুিম িক রেঙর জামা পেড়েছা বা তুিম কান জুতা পেড়েছা এটা িক এখােন পূ ণ না তাই এটা
“ ট” এর মেধ পেড়না।

০-১ ন◌্যাপস◌্যাক
কােনা এক রােত তুিম চুির করেত বর হেল!! ব ু র বাসায় জানালা িদেয় ঢুেক দখেল চুর িজিনসপ ,িক তামার চুির করার থেলেত জায়গা আেছ মা ১০ইউিনট,এর বিশ

2/5
িনেল থেল িছেড় যােব। িতটা িজিনেসর ওজন আেছ আর এেকক িজিনেসর মুল ও এেককরকম।

১. মািনব াগ: ১ পাউ , ১২০টাকা


২. কারম ােনর-বই: ৭ পাউ , ৪০০টাকা
৩. িডিভিড-কােলকশন: ৪ পাউ , ২৮০ টাকা
৪. ফলুদা-সম : ৩ পাউ , ১৫০টাকা
৫. ফুটবল: ভর: ৪ পাউ , ২০০টাকা

কােনা িজিনস িনেল পুেরাটাই িনেত হেব, ৪িট িডিভিডর ২িট তুিম িনেত পারেবনা, ফলুদা সমে র অেধক িছেড় আনেত পারেবনা। থমিদন চুির করেত িগেয়েছা এই জন িকছু
না ভেবই তুিম ফটাফট দািম িজিনস েলা ভরেত থাকেল। থেমই তুিম ৪০০টাকার কারম ােনর বই িনেয় িনেল,তারপর ১৫০টাকার ফলুদা সম িনেয় বাসায় িফের
আসেল, তামার লাভ হেলা ৫৫০ টাকা। বাসায় এেস িহসাব কের দখেল তুিম যিদ লাভীর মেতা (greedy) দামী িজিনস েলা আেগ না িনেয় একটু ভেব-িচে িনেত তাহেল
২৮০টাকার িডিভিড,২০০টাকার ফুটবল আর ১২০টাকার মািনব াগ িনেয় িফরেত পারেত, তামার লাভ হেতা ৬০০টাকা। greedy অ লেগািরদেম অপিটমাল রজা না
পাওয়ায় তুিম িচ া করেল সবরকেমর কি েনশেন চ া করেব, িতবার একটা কের িজিনস থেলেত ভরেব আর দখেব আর কত লাভ করা যায়, েয়াজেন িজিনসটা থেল থেক
নািমেয় রেখ আেরকিট িনেয় চ া করেব। এবং সুিবধার জন তুিম িলে র িসিরয়াল অনুযায়ী িজিনস িনেয় চ া করেব, ৩ ন র িজিনেসর পের ১ ন র িজিনস িনেত চ া
করেবনা। কােনা সময় তামার অব া বুঝােত ২টা তথ ই যেথ ।

১. তুিম এখন কত ন র িজিনস াই করেছা।


২. এখন পয তুিম কত ইউিনট িজিনস িনেয়েছা।

তুিম একটা ফাংশন িলেখ ফলেল যটা িজিনসপে র িল থেক অপিটমাল রজা বর কের িদেত পাের। ফাংশনিটর িরটান টাইপ আর প ারািমটার হেব এরকম:

1 func(int i,int w)

মেন কির i ন র ব িটর ভর হেলা weight[i] আর মূল cost[i]। আর ব ােগর capacity=CAP। িতবার তুিম i ন র িজিনসিট িনেত পােরা যিদ ব ােগ জায়গা থােক,
অথবা তুিম i ন র িজিনসিট না িনেয় i+1 তম িজিনস াই করেত পােরা। i ন র িজিনসিট যিদ তুিম নাও তাহেল লাভ হেব cost[i] + পরবিত েট লাভ , তাহেল আমরা
cost[i] যাগ কের পরবিত েট চেল িগেয় কত লাভ হয় সটা িহসাব করেবা।

1 if(w+weight[i]<=CAP)
2 profit1 = cost[i] + func(i + 1,w + weight[i])
3 else
4 profit1=0;

i ন র িজিনসিট যিদ তুিম না নাও তাহেলও লাভ বিশ হেত হেব তাই সটাও আমােদর িহসাব করেত হেব:

1 profit2=func(i+1,w) //নতুন ওজন যাগ হে না,i+1 তম ব িনেয় াই করিছ।

ল কেরা এে ে কাের িফট বা ওজেনর কােনা পিরবতন হে না, কােনা িকছু না িনেয়ই পেরর েট িগেয় দখিছ লাভ কত হেব। তাহেল সহেজই বাঝা যাে
অপিটমাল রজাে র জন আমােদর profit1 আর profit2 এর মেধ বড়টা িনেত হেব, সই মানটা আমরা িরটাণ কের িদেবা।

1 return max(profit1,profit2)

তাহেল যিদ তুিম func(1,0) কল কেরা তাহেল িরকাশন তামােক রজা বর কের িদেব। func(1,0) কল করার কারণ হেলা েত তুিম ১ ন র িজিনসটা িনেয় াই
করেব এবং েত ব ােগ স ূণ খািল। যখন সব েলা িজিনস িনেয় াই করা হেয় যােব তখন িরকাশন শষ হেব। যিদ nn িট িজিনস থােক তাহেল বস কস হেব:

1 if(i==n+1) //Base Case


2 return 0

3/5
ন িরটান করিছ কারণ সবিকছু নয়া হেয় গেল আর িফট করা স বনা। তামার বাঝার সুিবধার জন স ূণ একটা কাড িদেয় িদলাম:

এই কােড উপেরর উদাহরেণর ইনপুটটা িনেচর মেতা কের িদেল িদেল ৬০০ আউটপুট আসেব

4 10 //৫ টা িজিনস, ১০ ক াপািসিট


1 120 // িতটা িজিনেসর ওজন এবং দাম
4 280
3 150
4 200

আমরা উপেরর ইনপুেটর জন◌্য িকভােব ফাংশন কেল হে তার একটা িসমুেলশন দিখ:

ছিবেত িতটা নাড কাশ করেছ আমরা এখন কান িজিনসটা িনেয় কাজ করিছ এবং ব◌্যােগ কত ওজেনর িজিনস আেছ। তারপর িজিনসটা একবার ব◌্যােগ ভের(যিদ
জায়গা থােক) নতুন নােড যাি , আেরকবার না ভের নতুন জায়গায় যাি । নীল রঙ এর নাড েলা হেলা বস কস, কারণ আর কােনা িজিনস নয়ার মত নই। ল ◌্য
কর সবুজ রঙ এর নাডটায় একািধক পেথ আসা যায়, তাই আমরা িতিট নােডর িরটাণ ভ◌্যালু িডিপ অ◌্যােরেত সভ কের রাখেবা।

কমে ি িট:

আমােদর কােড িভ িভ ট সংখ◌্যা n∗capn∗cap টা যখােন nn হেলা িজিনস সংখ◌্যা আর capcap হেলা ব◌্যােগর ক◌্যাপািসিট। ফাংশেনর িভতর
4/5
কােনা লুপ নই। তাই মাট O(n∗cap)O(n∗cap) টাইম কমে ি িটেত কাডটা চলেব। িডিপ অ◌্যােরর আকার হেব n×capn×cap , তাই স
কমে ি িটও O(n \times cap)।
এখন ছা একটা , িডিপ বেলেম টাইম আর স কমে ি িট িভ হেব কখন?

এটাই হেলা ািসকাল 0-1 knapsack বেলম,ন াপস াক শ িটর অথ হেলা থেল। ০-১ নাম দয়ার কারণ হেলা তুিম কােনা িজিনস অেধক িনেত পারেবনা,হয় পুেরাটা
িনেব অথবা িনেবনা। fractional-knapsack বেল আেরক ধরেণর বেলম আেছ, সটার আেলাচনা অন কােনািদন হেব। ন াপস ােক সিলউশন ি করা িশখেত
িসিরেজর চতুথ পবটা দেখা।

এখন তামার এখন কাজ হেলা এটার স ূণ কাড ইমি েম করা। uva 10130 বেলমিট সলভ করেত চ া কেরা।

ডাইনািমক া ািমং এ ভােলা করার একমা উপায় হেলা চুর িচ া করা। তামােক অনুেরাধ করেবা পরবিত পব পড়ার আেগ অবশ ই আেগর পেবর সমস া েলা িনেয় খুব
ভােলা কের অ ত ১িদন িচ া করেব।

(সব েলা পব)


পেরর পব-কেয়ন চ ,রক াইি ং

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
ডাইনািমক া ািমং এ হােতখিড়-৩ (কেয়ন চ + রক াইি ং)
shafaetsplanet.com /planetcoding/

শাফােয়ত জুলাই ১৩,


২০১২

আেগর পব েলা পেড় থাকেল তুিম এখন ডাইনািমক া ািমং িনেয় বিসক ব াপার েলা িকছুটা িশেখ িগেয়েছা,যত বেলম সলভ করেব তত দ তা বাড়েব। িডিপেত আসেল কােনা িনিদ অ ালেগািরদম না থাকায় আমােদর িচ া করেত হয় অেনক বিশ,এেককিট িডিপ বেলম
এেকক ধরেণর, তেব তুিম যিদ ন াপস াক,কেয়ন চে র মেতা ািসক িকছু িডিপ বেলেমর সিলউশন জােনা তাহেল তুিম বুঝেত পারেব িকভােব তামার িচ ােক এিগেয় িনেয় যেত হেব,িকভােব িডিপর ট িনধারণ করেত হেব,তখন তুিম নতুন ধরেণর িডিপ বেলমও সলভ কের
ফলেত পারেব। আিম এরই মেধ nCrnCr িনণয় আর ০-১ ন াপস ােকর িডিপ সিলউশন িনেয় আেলাচনা কেরিছ,আেরা িকছু ািসক বা া াড বেলম িনেয় সামেন আেলাচনা করেবা।

কেয়ন চ :

এখন আমরা দখেবা কেয়ন চ বেলম। আসেল ন াপসাক শখার পের কেয়ন চ তুিম এমিনই পারেব তারপেরও িলখিছ যােত ব াপার েলা আর পির ার হয়।

তামার কােছ িকছু কেয়ন আেছ যােদর মূল 5,8,11,15,185,8,11,15,18 ডলার। িতটা কেয়ন অসীম সংখ কবার আেছ, তুিম যেকােনা কেয়ন যতবার ই া িনেত পােরা। তাহেল তামার coin অ ােরটা হেত পাের এরকম:

coin[] = {5, 8, 11, 15, 18};

এখন তামােক এই কেয়ন েলা িনেয় িনিদ কােনা ভ ালু বানােত হেব। ধির সংখ ািট হেলা makemake। make=18make=18 হেল আমরা 5+5+85+5+8 এভােব 1818 বানােত পাির। তামােক বলেত হেব কেয়ন েলা িদেয় ভ ালুিট বানােনা যায় নািক যায়না।
থেমই আমরা িচ া কির িডিপেত ট িক হেব। আমরা একিট একিট কেয়ন িনেয় সংখ ািট বানােত চ া করেত থাকেবা। তাহেল এই মু েত কান কেয়ন িনি সটা ট রাখেত হেব, আর আেগ যসব কেয়ন িনেয়িছ স েলার মাট ভ ালু কত সটা রাখেত হেব। ফাংশনিটর
নাম call হেল ােটাটাইপ হেব:

1 int call(int i,int amount)

এরপর অেনকটা আেগর মেতাই কাজ। থেম ii ন র কেয়ন িনেত চ া করেবা:

1 if(amount+coin[i]<=make)
2 ret1=call(i,amount+coin[i]);
3 else
4 ret1=0;

এখােন i+1i+1 কল না কের আবার ii কল করিছ কারন এক কেয়ন অেনকবার নয়া স ব। যিদ এক কেয়ন একািধক বার নয়া না যেতা তাহেল i+1i+1 ক কল িদতাম। amount+coin[i]amount+coin[i] যিদ makemake এর থেক বড় হয় তাহেল কেয়নিট
নয়া স বনা। কেয়ন যিদ না নই তাহেল আমরা পরবতী কেয়েন চেল যােবা:

1 ret2=call(i+1,amount);

ret1ret1 আর ret2ret2 এর কােনা একিট true হেলও make বানােনা যােব। তাহেল সবেশেষ িলখেবা:

1 return ret1|ret2;

আর বসেকস হেব হেলা, যিদ সব কেয়ন িনেয় চ া করার পর makemake বানােনা যায় তাহেল return 1, অন থায় return 0। স ূণ কাড:

1 int coin[]={5,8,11,15,18}; //value of coins available


2 int make; //our target value
3 int dp[6][100];
4 int call(int i,int amount)
5 {
6 if(i>=5) { //All coins have been taken
7 if(amount==make)return 1;
8 else return 0;
9 }
10 if(dp[i][amount]!=-1) return dp[i][amount]; //no need to calculate same state twice
11 int ret1=0,ret2=0;
12 if(amount+coin[i]<=make) ret1=call(i,amount+coin[i]); //try to take coin i
13 ret2=call(i+1,amount); //dont take coin i
14 return dp[i][amount]=ret1|ret2; //storing and returning.
15
16 }
17 int main()
18 {
19 // freopen("in","r",stdin);
20 while(cin>>make)
21 {
22 memset(dp,-1,sizeof(dp));
23 cout<<call(0,0)<<endl;
24 }
25 return 0;
26 }

এখন যিদ তামােক বলা হেতা য কােনা একিট ভ ালু কতবার বানােত হেব বলেত হেব তাহেল িক করেত? যমন ১৮ বানােনা যায় ২ ভােব, এে ে ret1|ret2 িরটান না কের ret1 + ret2 িরটান কের দাও,তাহেল যত ভােব বানােনা যায় সব েলা যাগ হেয় যাে । uva-
674 বেলমিটেত এটাই করেত বলা হেয়েছ,ঝটপট সলভ কের ফেলা।

এবার মজার একিট অপিটমাইেজশন দেখা। আমরা িতবার make ইনপুট নয়ার পর িডিপ অ াের নতুন কের initialize বা ি য়ার কেরিছ। যিদ সটা করেত না হেতা তাহেল অেনক কম সময় লাগেতা, কারণ একই মান বারবার িহসাব করা লাগেবনা। িক ি য়ার করেত হে
কারণ ফাংশনিট বাইেরর একিট াবাল ভ ািরেয়বেলর উপর িনভরশীল, “if(amount==make)return 1;” এই লাইনটাই ঝােমলা করেছ, makemake এর মান িত কেসর জন আলাদা, তাই িতবার নতুন কের সব িহসাব করেত হে । আমরা যিদ makemake
ক একটা ট িহসােব রািখ তাহেল কাজ হয় িক ট িবশাল হেয় যায়। এর থেক আমরা সমস াটােক উ ায় ফিল। মেন কেরা তামার কােছ েত ২০ টাকা আেছ, িবিভ অ ামাউে র কেয়ন দান কের িদেয় তামােক ন টাকা বানােত হেব। কাডটা এবার হেব এরকম:

1/3
1 int coin[]={5,8,11,15,18}; //value of coins available
2 int make=18; //we will try to make 18
3 int dp[6][100];
4 int call(int i,int amount)
5 {
6 if(i>=5) { //All coins have been taken
7 if(amount==0)return 1;
8 else return 0;
9 }
10 if(dp[i][amount]!=-1) return dp[i][amount]; //no need to calculate same state twice
11 int ret1=0,ret2=0;
12 if(amount-coin[i]>=0) ret1=call(i,amount-coin[i]); //try to take coin i
13 ret2=call(i+1,amount); //dont take coin i
14 return dp[i][amount]=ret1|ret2; //storing and returning.
15
16 }
17 int main()
18 {
19 // freopen("in","r",stdin);
20 memset(dp,-1,sizeof(dp));
21 while(cin>>make)
22 {
23 cout<<call(0,make)<<endl;
24 }
25 return 0;
26 }

খয়াল কের দেখা িঠক আেগর মেতাই কাজ কেরিছ, ধু যাগ করার জায়গায় িবেয়াগ কের makemake থেক ন বানােনার চ া কেরিছ। লাভটা হেলা এখন ফাংশনিট কােনা পিরবতনশীল াবাল ভ ািরেয়বেলর উপর িনভর কেরনা, তাই মইন ফাংশেন িডিপ অ াের লুেপর
মেধ ি য়ার করা দরকার নাই। িতবার কেয়ন একই থাকেছ বেল এই ি কসটা কাজ করেছ, কেয়েনর মান পিরবতন হেল কাজ করেবনা। িডিপর বেলেম অেনকসময় ট েকস অেনক বিশ দয় যােত বার বার ি য়ার করেল টাইম িলিমট পাস না কের।

কমে ি িট
িডিপ অ ােরর সাইজ হেব কেয়ন সংখ া × সেবা যত ভ ালু বানােত হেব। তাহেল মমির কমে ি িট O(numberofcoin×make)O(numberofcoin×make).
িডিপ অ ােরর িতটা সলই ভরাট করা লাগেত পাের, তাই টাইম কমে ি িটও এখােন O(numberofcoin×make)O(numberofcoin×make)। যিদ িভতের কােনা এ া লুপ চলেতা তাহেল সটাও টাইম কমে ি িটর সােথ যাগ হেতা।

লাইটওেজেত 1231 – Coin Change (I) বেলেম িকছু কেয়ন িদেয় একিট ভ ালু কয়ভােব বানােনা যায় সটা বর করেত বেলেছ, তেব িতিট কেয়ন সেবা কয়বার ব বহার করা যােব সটা বলা আেছ, i ন র কেয়ন
Ciব◌ারব◌্যবহ◌ারকর◌ায◌াব ◌।এইকন◌্ড ি◌শনট◌াদ◌ুইভ◌াব ◌ত◌ুমি◌হ◌্য◌ান◌্ড ◌লকরত ◌প◌ার ◌◌া।৩য়একটি◌স◌্ট ◌টর◌াখত ◌প◌ার ◌◌াCiব◌ারব◌্যবহ◌ারকর◌ায◌াব ◌।এইকন◌্ড ি◌শনট◌াদ◌ুইভ◌াব ◌ত◌ুমি◌হ◌্য◌া
য ◌ট◌াবল ◌দি◌ব ◌য ◌ট◌াবল ◌দি◌ব ◌iনম◌্ব রত◌ুমি◌কয়ব◌ারনি◌য় ◌ছ ◌◌া,নম◌্ব রত◌ুমি◌কয়ব◌ারনি◌য় ◌ছ ◌◌া,C_{i}$ বার ব বহার হেয় গেল পরবতী কেয়েন চেল যাও।

1 int call(int i, int taken_i, int amount)

২য় উপায় হেলা ফাংশেনর িভতের CiCi পয একিট লুপ চািলেয় কেয়নিট যতবার নয়া স ব ততবার িনেয় অ ামাউ িট বানােত চ া কেরা, এে ে মমির কম লাগেব। তাহেল আজেকর ২য় কাজ হেলা এই বেলমটা সলভ করা।

কেয়ন চ বেলেমর আেরকিট নাম হেলা subset sum problem,কারণ িকছু ন েরর সট থেক একিট সাবেসট আমােদর িনেত হয় যটার যাগফল এক িনিদ ভ ালুর সমান।

রক- াইি ং বেলম

তামােক একিট ২িড ি ড দয়া হেলা:

-1 2 5
4 -2 3
1 2 10

তুিম েত আেছা (০,০) সেল। তুিম ধু ৩িদেক যেত পােরা:

(i + 1, j)
(i + 1,j – 1)
(i + 1, j + 1)

িতিট সেল গেল তামার পেয়ে র সােথ ওই সেলর সংখ ািট যাগ হয়। তুিম সেবা কত পেয় বানােত পারেব? এই বেলমেক রক াইি ং বেলমও বলা হয়।
উপেরর ি েড সেবা পেয় 7 = -1+-2+10। এই বেলেমর জন :

ট: তুিম এখন কান সল এ আেছা


এক থেক অন েট যাওয়ার উপায়: িতটা সল থেক ৩িদেক যাবার চ া কেরা, যিদেক সেবা পেয় পােব সটা িরটাণ কেরা।
বসেকস: যিদ ি েডর বাইের চেল যাও তাহেল আর িকছু নয়া যােবনা, ণ িরটাণ কেরা।

C++

2/3
1 #define inf 1 << 28
2 int mat[][10] = {
3 { -1, 2, 5 },
4 { 4, -2, 3 },
5 {
6 1, 2, 10,
7 }
8 };
9 int dp[10][10];
10 int r = 3, c = 3;
11 int call(int i, int j)
12 {
13 if (i >= 0 && i < r and j >= 0 and j < c) //if still inside the array
14 {
15 if (dp[i][j] != -1)
16 return dp[i][j];
17 int ret = -inf;
18 //try to move to 3 direction,also add current cell's point
19 ret = max(ret, call(i + 1, j) + mat[i][j]);
20 ret = max(ret, call(i + 1, j - 1) + mat[i][j]);
21 ret = max(ret, call(i + 1, j + 1) + mat[i][j]);
22 return dp[i][j] = ret;
23 }
24 else
25 return 0; //if outside the array
26 }
27 int main()
28 {
29 // READ("in");
30 mem(dp, -1);
31 printf("%d\n", call(0, 0));
32 return 0;
33 }

৩িদেক মুভ করার কি শন কেনা দয়া হেয়েছ? adjacent ৪িট সেল মুভ করেত িদেল সমস া কাথায় হেতা? তাহেল একিট সাইেকল তির হেতা,একিট ফাংশেনর কাজ শষ হবার আেগই িরকাশেন ঘুের ফাংশনিট আবার কল হেতা,এই সিলউশন কাজ করেতা না। এখােন
আমরা য ৩িদেক মুভ করিছ তােত কােনা সাইেকল তির হে না, অথাৎ কােনা ট থেক কের সই েট আবার িফের আসেত পারিছনা। সাইেকল যিদ তির হেতা তাহেল িরকািসভ ফাংশন আজীবন চলেতই থাকেতা। তাই িডিপ সিলউশন লখার সময় অবশ ই খয়াল
রাখেত হেব সাইেকল তির হে নািক।

1004 – Monkey Banana Problem এই বেলমটা অেনকটা উপেরর বেলেমর মেতা,সলভ করেত কােনা সমস া হেবনা। তুিম যিদ িবএফএস/িডএফএস পােরা তাহেল uva-11331 বেলমিট সলভ কের ফেলা, (িহ :বাইকালািরং+ন াপস াক)। এছাড়া এ েলা
াই কেরা:

Uva 11137: Ingenuous Cubrency(Coin change)


Codeforces 118D: Caesar’s Legions(4 state)
Light oj 1047: Neighbor House
Timus 1017: Staircases

চ া কেরা সব েলা বেলম সলভ করেত,আটেক গেল সমস া নাই,িচ া করেত থােকা,এছাড়া ন াপস াক আর কেয়ন চ স িকত যত েলা পােরা বেলম সলভ কের ফেলা, যেহতু তুিম এখন বিসক পরবতী পব েলােত িডেটইলস কিমেয় নতুন নতুন বেলম আর টকিনক িনেয়
বিশ আেলাচনা করেবা।
হ ািপ কািডং!
সব েলা পব

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
ডাইনািমক া ািমং এ হােতখিড়-৪
shafaetsplanet.com /planetcoding/

শাফােয়ত 8/25/2012

০-১ ন াপস াক,কেয়ন চ বেলেম আশা কির তামার এখন দ তা এেস িগেয়েছ। এই পেব আমরা দখেবা LIS, একই সােথ দখেবা িকভােব িডিপেত সিলউশন ি
করেত হয় ,এটা িনেয় তামােদর অেনেকরই সমস া হেয়েছ বেল জািনেয়েছা। এছাড়া আেগর পেব light oj 1231 বেলমিট সলভ করেত বেলিছলাম,আমার সিলউশন
পােব লখার একদম শেষ।

থেমই কির LIS এবং এটার সিলউশন ি করা িদেয়। LIS হেলা Longest increasing subsequence। মেন কেরা তামােক একিট অ াের বা
sequence দয়া আেছ:
এই অ াের থেক িকছু সংখ া মুেছ িদেয় এবং অডার িঠক রেখ আমরা িবিভ
subsequence পেত পাির। যমন:

57
592
034
0234
73
5 0 9 2 7 3 4 ( ন িট সংখ া বাদ দয়া হেয়েছ)
….

একটা sequence এ n িট সংখ া থাকেল subsequence থাকেত পাের মাট 2^n িট( কন??)। increasing subsequence (IS) এ িতটা সংখ া তার
আেগর সংখ ািটর থেক বড় হেব। উপের ১ম , ৩য়, ৪থ subsequence েলা increasing। যত েলা IS আেছ তারমেধ সবেথেক বড়টা খুেজ বর করাই আমােদর
ল । উপের ৪ন রিটর length ৪ এবং সব েলা IS এর মেধ এটাই সব থেক বড়।
বেলমটােক াফ িদেয় মেডিলং করেল খুব সহেজ সলভ করা যায়। াফ িথওির না জানেলও কােনা সমস া হেবনা, াফ দখাি খািল বাঝার সুিবধার জন । থেমই মেন
কির অ ােরর িতিট ইনেড হেলা একিট কের নাড:

এখন িট শত খয়াল কেরা। u ন র নাড থেক v ন ের নােড যাওয়া যােব যিদ:

১. v>u হয়। কারণ আমােদর মূল sequence এর অডার িঠক রাখেত


হেব।
২. value[v]>value[u] হয়,কারণ sequence টা increasing
হেত হেব।

তাহেল ১ থেক ২ এ যেত পারেবানা কারন value[1] < value[2],তেব ১ থেক


৩ এ যেত পারেবা। তাহেল আমরা ােফর edge েলা আিক:

দখেত িহিজিবিজ হেলও ভয় পাবার িকছু নাই,উপেরর শত িট মেন াফিট আকা


হেয়েছ। ােফর যেকােনা পাথ অনুসরণ করেল আমরা একটা ইনি িসং িসেকােয় পােবা। যমন ােফ ২-৬-৭ পােথ গেল ০-৩-৪ সাবিসেকােয় টা পােবা। তাহেল
বুঝেতই পারেছা সবেথেক ল া পথটাই আমার সিলউশন, যতদূের যেত পারেবা িসেকােয় তত বড় হেব, এে ে একিট path এ য কয়িট নাড আেছ সটাই পােথর
দঘ ।

মেন কির আমােদর একটা ফাংশন আেছ longest(u) যটা u ন র নাড থেক longest path িরটান কের। যমন longest(6)=2 কারণ ৬ ন র নাড থেক খািল
৬-৭ এই পােথ যাওয়া যায়। এখন ল কেরা:

1/5
কােনা নাড থেক longest path হেব সই নাড থেক যসব নােড
যাওয়া যায় স েলা থেক longest path এর maximum + ১।

আমরা সহেজই একটা িরকািসভ িরেলশন বর কের ফলেত পাির:

longest(2)=1+max(longest(3),longest(4),longest(5),longest(6),longest(7))
longest(1)=1+max(longest(3),longest(5))
longest(3) =1 (এটা একটা বসেকস কারণ ৩ থেক কাথাও যাওয়া যায়না)

…………
অথাৎ u থেক v1,v2,v3…,vk নােড যাওয়া গেল:
longest(u)=1+max(longest(v1),longest(v2)….,longest(vk))

এখন আমরা সহেজই কাড কের িতটা নাড থেক longest path বর কের ফলেত পাির:

C++

2/5
1 #define mx 1000
2 int n=7;
3 int value[]={-100000,5,0,9,2,7,3,4};
4 int dp[mx],dir[mx];
5 int longest(int u)
6 {
7 if(dp[u]!=-1) return dp[u];
8 int maxi=0;
9 for(int v=u+1;v<=n;v++) //১ম শত,v>u
10 {
11 if(value[v]>value[u]) //২য় শত, value[v]>value[u]
12 {
13 if(longest(v)>maxi) //সেবা মানটা িনেবা
14 {
15 maxi=longest(v);
16 dir[u]=v;
17
18 }
19 }
20 }
21 dp[u]=1+maxi; //১ যাগ হেব কারণ u ন র নাডটাও পােথর মেধ আেছ
22 return dp[u];
23 }
24 int main()
25 {
26 READ("in");
27 memset(dp,-1,sizeof dp);
28 memset(dir,-1,sizeof dir);
29 int LIS=0,start;
30 for(int i=1;i<=n;i++)
31 {
32 printf("longest path from: %d\n",longest(i));
33 if(longest(i)>LIS)
34 {
35 LIS=longest(i);
36 start=i;
37 }
38 }
39 printf("LIS = %d Starting point %d\n",LIS,start);
40 return 0;
41 }
42

longest(u) িতটা নাড u থেক longest path িরটান কের,এেদর মেধ আবার যটা ম াি মাম সটাই আমােদর LIS। এই সিলউশনটা কমে ি িট O(n^2)
(আেরা ভােলা একটা সিলউশন আেছ বাইনারী সাচ ব বহার কের)। এখন সিলউশন ি করার পালা।
আসেল মুল কাজটা আমরা উপেরর কােডই কের ফলিস। dir[] নােমর একিট অ াের রেখিছ য িতটা নােডর জন য িডেরকশেন সেবা মান পাওয়া যায় সটা সভ
কের রােখ। কােনা নাড থেক অন কাথাও যাওয়া না গেল িডেরকশন হেব -১। এখন সিলউশন ফাংশন হেব এরকম:

C++

3/5
1 void solution(int start)
2 {
3 while(dir[start]!=-1)
4 {
5 printf("index %d value %d\n",start,value[start]);
6 start=dir[start];
7 }
8 }

অথাৎ িডেরকশন অ াের দেখ আমরা সামেন যােবা যত ণ যাওয়া যায়।

এখােন ল করার িকছু িবষয় হেলা উপেরর াফিটেত কােনা সাইেকল নই দেখ আমরা িডিপ করেত পেরিছ,এধরেণর াফেক বলা হয় directed acyclic graph বা
ড াগ। কােনা বেলমেক তুিম যিদ ড াগ এ কনভাট করেত পােরা তাহেল খুব ভােলা স াবনা আেছ য বেলমিট িডিপ চািলেয় সলভ করা যােব। ােফ সাইেকল থাকেল
longest path একিট np-complete বেলম,অথাৎ পিলনিময়াল সিলউশন জানা নই। এখন একিট : একটা sequence এর কয়িট LIS আেছ সটা বর
করেত বলা হেল িক করেব? িচ া কের জানাও :-)।

আমরা জািন ০-১ন াপস ােক ট থােক ২টা, সে ে িডেরকশন অ ােরর টও হেব ২টা। িনেচর কাডটা দেখা:

C++

1 int dir[][]={{-1}};
2 int dp[][]={{-1}};
3 int func(int i,int w) //i ন র আইেটম িনেয় চ া করা হে ,w ওজেনর িজিনস নয়া হেয়েছ
4 {
5 .........
6 //BASE CASE
7 .........
8
9 if(w+weight[i]<=CAP) //i ন র িজিনসিট িনেবা
10 profit1=cost[i]+func(i+1,w+weight[i])
11 else
12 profit1=0;
13 profit2=func(i+1,w) // i ন র িজিনসিট িনেবা না
14 if(profit1>profit2){dir[i][w]=1; return dp[i][w]=profit1;}
15 else {dir[i][w]=2; return dp[i][w]=profit2;}
16 }

ন াপস ােকর কাডটােক সামন পিরবতন কের িডেরকশন রাখা হেয়েছ। আমােদর starting state হেলা (i=1,w=0),কারণ েত আমরা ১ ন র িজিনসটা িনেয় াই
করেবা এবং এখন পয নয়া িজিনেসর ওজন ০। িডিপ শষ হবার পর যিদ:

dir[i][w] = ১ হয় তাহেল i ন র িজিনসিট িনেবা, i ি কের আমরা চেল যােবা (i+1,w+weight[i]) েট।
dir[i][w] = ২ হয় তাহেল i ন র িজিনসিট িনেবা না,i ি না কেরই আমরা চেল যােবা (i+1,w) েট।
dir[i][w] = -১ হেল আমরা থেম যােবা।

এটাই হেলা িডিপর সিলউশন ি ে র মূল কথা। িডিপ অ ােরর পাশাপািশ িডেরকশন অ ােরেত সভ কের রাখেবা কান ট থেক কান েট যাি সটা। এরপর
starting state থেক িডেরকশন অনুযায়ী আগােত থাকেবা আর ি করেবা।

4/5
আজেকর পব এখােনই শষ। light oj 1231 এর সিলউশন: http://pastebin.com/vmpWp0g1, mod করার অংশটা বুঝেত না পারেল এই লখাটা দেখা।
সলভ করার জন বেলম:

Diving for gold


Sense of Beauty
Bicolored Horses
Testing the CATCHER
How Many Dependencies?
Longest Path

পেরর পব-িবটমা িডিপ


সব েলা পব

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
ডাইনািমক া ািমং এ হােতখিড়-৫
shafaetsplanet.com /planetcoding/

শাফােয়ত 12/17/2012

আশা কির তুিম এখন lis,knapsack,coin-change বেলম সলভ করেত পােরা খুব সহেজই, িডিপর সিলউশন ি করেতও তামার সমস া হয়না। এখন আমরা
একটু অন রকম িডিপ দখেবা যটার নাম িবটমা িডিপ। নামটা েন ভয় লাগেলও িজিনসটা সহজ, অেনক ে ই িবটমা িডিপ বেলম পড়ার সােথ সােথ সিলউশন মাথায়
চেল আেস। তেব এই পবটা পড়ার আেগ তামােক িবট িনেয় কাজ করা িশখেত হেব, যমন কােনা িনিদ পিজশেনর িবট অন করা/অফ করা ইত ািদ। এজন তুিম এই
চমৎকার িটউেটািরয়ালটা দখেত পােরা, পুেরাটা খুবই ভােলা কের পড়েব কারণ এটা তামােদর অেনক জায়গায় কােজ লাগেব। আিম এই িটউেটািরয়ােল িবট অপােরশন িনেয়
িলখিছনা কারণ অ াসি ক হেয় যােব।

আমরা েতই ৩িট ফাংশন িডফাইন কির।

C++

1 int Set(int N,int pos){return N=N | (1<<pos);}


2 int reset(int N,int pos){return N= N & ~(1<<pos);}
3 bool check(int N,int pos){return (bool)(N & (1<<pos));}

Set ফাংশনিট N সংখ ািটর pos তম পিজশেনর িবট ১ কের দয়, reset ফাংশনিট 0 কের দয় এবং check ফাংশনিট pos তম িবেট িক আেছ সটা িরটাণ কের।
যেকােনা িবটমা িডিপ বেলেম ফাংশন ৩িট দরকার হেব, িবেশষ কের Set এবং check।

আমরা একটা বেলম িদেয় কির। মেন কেরা তামােক nটা দাকান থেক n টা িজিনস িকনেত হেব। িজিনস েলা িকনেত তামার a0,a1,a2,…,a(n-1) টাকা
লােগ। তামার শহরটা খুব অ ূত,তুিম যখন একটা িজিনস িকেন আেরক দাকােন যাও তখন সই দাকানদার তামার আেগর কনা িজিনস েলা দেখ তার দাকােনর িজিনেসর
দাম বািড়েয় দয়!! কত দাম বাড়ােব সটা িনভর করেব তুিম আেগ আেগ কান কান দাকােন িগেয়েছা সটার উপর। ধেরা n=2, তাহেল তামােক িনেচর মেতা একটা
ম াি দয়া থাকেব:

10 10
90 10

এখন,

যিদ (i==j) হয় তাহেল matrix[i][j]=matrix[i][i]=i’তম িজিনসিটর আসল দাম।


যিদ (i!=j) হয় তাহেল matrix[i][j]=j’তম িজিনসিট আেগ িকনেল i’তম িজিনসিটর সােথ যাগ হওয়া বাড়িত দাম।

তুিম যিদ েত ০ তম িজিনসটা িকেনা তাহেল দাম পড়েব ১০টাকা, এরপর ১ন র িজিনসটা িকনেল সটার দাম হেব ১০+৯০ টাকা, কারণ matrix[1][0]=০ ন র
িজিনেসর আেগ ১ ন র িজিনস িকনেল যাগ হওয়া বাড়িত দাম=৯০ আর ১ ন র িজিনেসর আসল দাম=১০, তাহেল মাট খরচ ১০+(১০+৯০)=১১০। িক তুিম যিদ ১ন র
িজিনসটা আেগ িকেনা তাহেল মাট খরচ ১০+(১০+১০)=৩০ টাকা।
বুঝেতই পারেছা তামার কাজ হেলা খরচ িমিনমাইজ করা। n এর মান সেবা ১৫।

n এর মান খুব কম বেল িবটমা িডিপ িদেয় বেলমিট সহেজই সলভ করা যােব। িডিপেত আমােদর থম কাজ হেলা ট িনণয় করা। এই কনাকাটার যেকােনা সময়
আমােদর অব া িক িক তথ িদেয় কাশ করা যায়? “এখন পয কান কান িজিনস কনা হেয়েছ” এই তথ টাই যেথ , তাইনা? এটা জানেল আমরা পরবিত আেরকিট িজিনস
কনার সময় বাড়িত কত খরচ যাগ হেব জানেত পারেবা, পরবিতেত যই িজিনসটা িকনেল মাট খরচ কম হেব সটা আমরা িকনেবা। মেন কির এখন কথা হেলা টটা
রাখেবা িক ভােব?

একটা উপায় হেলা n িট িজিনেসর জন এভােব nটা ট রাখা function(a0,a1,a1,….an-1), িক n এর মান বদলােল তুিম প ারািমটার সংখ া বদলােব িক ভােব?
আর ১৫িট প ারািমটার িনেয় কাজ করেল কাডটা ভয়াবহ জিটল হেয় যােব।

1/5
২য় উপায় হেলা িবটমা । একিট ইি জাের ৩২িট িবট থােক। আমরা সই সুিবধাটাই িনেবা। ১ ন র িবট 1 হেল আমরা ১ ন র িজিনসটা িনেয়িছ, ০ হেল নইিন। ৩ ন র
িবট 1 হেল আমরা ৩ ন র িজিনসটা িনেয়িছ, ০ হেল নইিন। ১ এবং ৩ ন র িবট ইটাই 1 হেল আমরা ২টা িজিনসই িনেয়িছ।

েত আমােদর ট থাকেব 0 বা বাইনািরেত “000000”। তারমােন আমরা কােনা িজিনস এখনও িকিনিন। ০তম এবং ১তম িজিনস কনা হেয় গেল ট হেব 3 বা
“000011” এবং n=2 এর জন এটাই আমােদর base case। n=4 এর জন base case হেলা 15 বা “0001111”। leading zero িনেয় িচ া করা
দরকার নই, এটা বাঝার সুিবধােথ দয়া হেয়েছ। একটু িচ া করেলই বুঝেত পারেব mask=(2^n)-1 হেল সটা হেব base case কারণ তখন বাইনািরেত থম n টা
িবট ১ থাকেব, আমরা তখন ন িরটাণ কের িদেবা তখন কারণ আর কােনা িজিনস কনা বািক নই।

C++

1 int dp[(1<<15)+2];
2 int call(int mask)
3 {
4 if(mask==(1<<n)-1) return 0;
5 if(dp[mask]!=-1) return dp[mask];
6 //Rest of the calculation
7 }

বসেকস বুঝলাম, এরপের আমােদর কাজ হেব যসব িজিনস কনা হয়িন স লা িনেয় চ া কের দখা। mask এর i তম পিজশেন যিদ ০ থােক তাহেল i তম িজিনসিট
কনা এখনও বািক আেছ।

C++

1 int dp[(1<<15)+2];
2 int call(int mask)
3 {
4 if(mask==(1<<n)-1) return 0;
5 if(dp[mask]!=-1) return dp[mask];
6 //Rest of the calculation
7 int ans=1<<28; //Infinite, a large value
8 for(int i=0;i<n;i++)
9 {
10 if(check(mask,i)==0)
11 {
12 //Rest of the code
13 }
14 }
15 return dp[mask]=ans;
16 }

আমরা n পয লুপ চািলেয় বর কের িনলাম কানটা কানটা নয়া বািক আেছ। এখন i তম িজিনসটার আসল দাম হেলা price=w[i][i]। এই price এর সােথ w[i][j]
যাগ হেব যিদ i!=j হয় এবং j ন র িজিনসটা আেগই কনা হেয় থােক। mask এর j তম িবট চক কের আমরা বলেত পাির j তম িজিনসটা কনা হেয়েছ নািক।

C++

2/5
1 int dp[(1<<14)+2];
2 int call(int mask)
3 {
4 if(mask==(1<<n)-1) return 0;
5 if(dp[mask]!=-1) return dp[mask];
6 int ans=1<<28;
7 for(int i=0;i<n;i++)
8 {
9 if(check(mask,i)==0)
10 {
11 int price=w[i][i];
12 for(int j=0;j<n;j++)
13 if(i!=j and check(mask,j)!=0) price+=w[i][j];
14 int ret=price+call(Set(mask,i));
15 ans=min(ans,ret);
16 }
17 }
18 return dp[mask]=ans;
19 }
20
21

j এর লুপটা িদেয় আমরা মাট দাম বর কের িনলাম। এখন i তম িজিনসিট িকনেল পরবিত ট িক হেব? ধু mask এর i তম িবটিট 1 কের িদেত হেব। আমরা
call(Set(mask,i)) এভােব i তম িজিনস িকেন পরবিত েট চেল গলাম। এভােব িতিট িজিনস িকেন যটায় দাম িমিনমাম হয় সটা িরটাণ কের িদলাম। কাজ শষ!
স ূণ কাড:

C++

3/5
1 int w[20][20];
2 int n;
3 int dp[(1<<15)+2];
4 int call(int mask)
5 {
6 if(mask==(1<<n)-1) return 0;
7 if(dp[mask]!=-1) return dp[mask];
8 int mn=1<<28;
9 for(int i=0;i<n;i++)
10 {
11 if(check(mask,i)==0)
12 {
13 int price=w[i][i];
14 for(int j=0;j<n;j++)
15 {
16 if(i!=j and check(mask,j)!=0)
17 {
18 price+=w[i][j];
19 }
20 }
21 int ret=price+call(Set(mask,i));
22 mn=min(mn,ret);
23 }
24 }
25 return dp[mask]=mn;
26 }
27 int main()
28 {
29 mem(dp,-1);
30 cin>>n;
31 for(int i=0;i<n;i++)
32 {
33 for(int j=0;j<n;j++)
34 {
35 scanf("%d",&w[i][j]);
36 }
37 }
38 int ret=call(0);
39 printf("%d\n",ret);
40
41 return 0;
42 }
43
44
45
46

আমােদর call ফাংশনিট কয়িট িভ েট থাকেত পাের? n িট িবেটর িতিট হয় ০ হেব নাহয় ১ হেব, তাহেল ট থাকেত পাের 2^15 িট। আর িভতের একটা n^2
লুপ চলেছ তাই মাট complexity (2^n)*(n^2)।

িবটমা িডিপ চনার সবেথেক সহজ উপায় n এর মান দখা। n এর মান ১৬ বা তার কম হেল খুব ভােলা স াবনা আেছ য বেলমিটেক িবটমা িডিপ িদেয় সলভ করা
যােব।
িবটমা িডিপ কখন ব বহার করেবা? িবটমা লাগেব আমােদর তখনই যখন আেগর েট কান কান িজিনস/িডিজট/ নাড ইত ািদ ব বহার করা হেয়েছ স তথ িট আমার
বতমান েট লাগেব। সই তথ অনুযায়ী আমরা বতমান ট থেক নতুন িডিজট/ নাড ইত ািদ িনেবা এবং সই িবটিট অন কের িদেয় সামেনর েট যােবা। যখন n িট
িবট অন হেয় যােব তখন বসেকস িরটাণ কের িদেবা।

আমার সলভ করা থম িবটমা িডিপ হেলা uva 10651। আশা কির বেলমিট এখন সহেজই করেত পারেব। বেলমটায় একিট মাে র সাহােয কােনা সময় বােডর
4/5
িক অব া সই তথ টা রাখেব, এবং স অব ায় যত েলা চাল দয়া স ব সব েলা িদেয় িমিনমামটা িরটাণ কের িদেব।

আপাতত এ েলাই িছেলা িবটমা িডিপর বিসক। সামেনর পব েলােত আেরা িব ািরত আেলাচনার চ া করেবা। এখন িনেচর বেলম েলা সলভ করার চ া কেরা, ১ম
বেলমিট িনেয় এই পেব আেলাচনা কেরিছ:
Pimp My Ride
False Mirror
Agent 47
Painful Bases

সব েলা পব

েগর র লার আপেডট পেত রিজ ার করেত অনুেরাধ করিছ।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

5/5
িমিনমাম ভারেট কভার বেলম
shafaetsplanet.com /planetcoding/

শাফােয়ত 10/4/2012

িমিনমাম ভারেট কভার একিট ািসক াফ বেলম। ধরা যাক একিট শহের িকছু রা া
আেছ,এখন িত রা ায় মােড় আমরা পাহারাদার বসােত চাই। কােনা নােড পাহারাদার
বসােল স নােডর সােথ যু রা া েলা একাই পাহারা িদেত পাের। উপেরর ছিবেত
নাড েলা হেলা রা ার মাড়। এখন সব কয়টা রা া পাহারা িদেত নূন তম কয়জন পাহারাদার
দরকার? ছিবেত লাল নাড েলােতা পাহারাদার বসােনা হেয়েছ। এটা অপিটমাল না,িনেচর
ছিবর মত বসােল পাহারাদার কম লাগত:

এিট একিট NP-hard বেলম,অথাৎ এই বেলেমর কােনা পিলনিময়াল টাইম সিলউশন


নই। তেব াফিট যিদ Tree হয় অথাত n-1 টা edge থােক আর কােনা সাইেকল না
থােক তাহেল ডাইনািমক া ািমং বা ম া া/বাইপারটাইট ম ািচং এর সাহােয বেলমিট
সলভ করা স ব।

ডাইনািমক া ািমং সিলউশনটা আিম িব ািরত িলখিছ,তারপর ম া া/বাইপারটাইট


ম ািচং িদেয় িকভােব করেত হয় িলখেবা।

িডিপ সিলউশেন ২িট কস আমােদর ল করেত হেব:

১. কােনা নােড পাহারাদার না বসােল তার সােথ সংযু সব নােড অবশ ই


পাহারাদার বসােত হেব,এছাড়া সব রা া কভার হেব না। অথাৎ যিদ u আর v
সংযু থােক তাহেল u ত পাহারাদার না বসােল v ত অবশ ই বসােত হেব।
২. কােনা নােড পাহারাদার বসােল সংযু নাড েলােত পাহাদার বাসােনা
বাধ তামূলক না তেব বসােল লাভ হেত পাের। তাই u ত পাহারাদার বসােল v ত
পাহারাদার একবার বিসেয় এবং একবার না বিসেয় দখেবা কানটা লাভজনক

সব িডিপর বেলেমর মেতা এখােনও একটা িরকািসভ ফাংশন িডফাইন করেবা। আমােদর
ট হেব বতমােন কান নােড আিছ,এবং সই নােড কােনা পাহারাদার বসােনা হেয়েছ
নািক।

F(u,1) = বতমােন u ন র নােড আিছ এবং এই নােড পাহারাদার আেছ । f(u,1) িরটাণ করেব বািক নাড েলােত মাট পাহারাদার সংখ া।
F(u,0) = বতমােন u ন র নােড আিছ এবং এই নােড পাহারাদার নাই। f(u,0) িরটাণ করেব বািক নাড েলােত মাট পাহারাদার সংখ া।

ধির ১ ন র নােডর সােথ ২,৩,৪ ন র নাড যু ।

1/4
বুঝাই যাে ১ ন র নােড পাহারা না বসােল অবশ ই ২,৩,৪ সব েলায় পাহারা বসােত হেব। তাহেল আমরা বলেত
পাির:

F(1,0)=F(2,1)+F(3,1)+F(4,1) + 0 ,অথাত ১ এর সােথ সংযু সব নাড েলােত পাহারা বসােল


েয়াজনীয় মাট পাহারাদার সংখ া।

সবেশেষ ০ যাগ করিছ কারণ বতমান নােড পাহারাদার বসাইিন।

এবার F(1,1) এর মান বর কির। ১ ন র নােড পাহারা বসােল সংযু নাড েলােত পাহারা বসােলও চেল,না বসােলও
চেল,তেব যটা অপিটমাল রজা দয় সটা আমরা িনব:

F(1,1)=1+min ( F(2,1),F(2,0) ) +min ( F(3,1),F(3,0) ) +min ( F(4,1),F(4,0) )

১ ন র নােড পাহারাদার বসাি তাই সবেশেষ ১ যাগ হে , িত নােড একবার পাহারা বিসেয়,আবার না বিসেয় দখিছ কানটা অপিটমাল।

একটা ব াপার ল রাখেত হেব য প াের নাড িনেয় কখেনা িহসাব করেবানা। উপেরর ছিবেত ১ থেক ২ এ গেল parent[2]=1,তাই ২ থেক আবার ১ ন র নােড
যােবানা।

এবার base case এ আিস। কােনা নাড থেক নতুন কােনা নােড যাওয়া না গেল 1 বা 0 িরটান কের িদেত হেব,পাহারাদার বসােল 1,না বসােল 0। কােনা ি ত
একিট মা নাড থাকেল ১ িরটাণ করেত হেব(িকছু বেলেম ০ ও িরটাণ করেত হেত পাের)।

Spoj এর PT07X(vertex cover) বেলমিট straight forward বেলম। এটার জন আমার কাডটা এরকম:

2/4
1 #define MAXN 100002
2 int dp[MAXN][5];
3 int par[MAXN];
4 vectoredges[MAXN];
5
6 int f(int u, int isGuard)
7 {
8 if (edges[u].size() == 0)
9 return 0;
10 if (dp[u][isGuard] != -1)
11 return dp[u][isGuard];
12 int sum = 0;
13 for (int i = 0; i < (int)edges[u].size(); i++) {
14 int v = edges[u][i];
15 if (v != par[u]) {
16 par[v] = u;
17 if (isGuard == 0)
18 sum += f(v, 1);
19 else
20 sum += min(f(v, 1), f(v, 0));
21 }
22 }
23 return dp[u][isGuard] = sum + isGuard;
24 }
25
26 int main()
27 {
28 memset(dp, -1, sizeof(dp));
29 int n;
30 scanf("%d", &n);
31 for (int i = 1; i < n; i++) {
32 int u, v;
33 scanf("%d%d", &u, &v);
34 edges[u].push_back(v);
35 edges[v].push_back(u);
36 }
37 int ans = 0;
38 ans = min(f(1, 1), f(1, 0));
39 printf("%d\n";, ans);
40 return 0;
41 }

আিম ি এর root সবসময় ১ ধের কাড িলেখিছ। ৩৮ ন র লাইেন মইন ফাংশেন root এ পাহারাদার একবার বিসেয় আর একবার না বিসেয় অপিটমাল রজা টা
িনি ।
ফাংশেন u হেলা current node,isguard কাের নােড পাহারাদার আেছ নািক নাই সটা িনেদশ কের।
১০ ন র লাইেন ি এর সাইজ ১ হেল ১ িরটাণ কের িদেয়িছ।
১৩ ন র লাইেন লুেপর িভতর current নাড থেক সব েলা child নােড যাি । কাের নােড পাহারাদার না থাকেল পেররটায় বসাি ,আর থাকেল ২ভােবই চ া
করিছ। ১৫ ন র লাইেনর কি শন িদেয় প াের নােড যেত িদি না।
সবেশেষ sum+isGuard িরটাণ করিছ। অথাত কাের নােড পাহারাদার থাকেল 1 যাগ করিছ,নাহল 0।

মাটামুিট এই হেলা িডিপ সিলউশন। ি ত সাইেকল না থাকায় এটা অবশ ই বাইপারটাইট াফ। ১৯৩১ সােল Dénes Kőnig মাণ কেরন কােনা বাইপারটাইট ােফ
maximum matching=minimum vertext cover। এটা াফ িথওিরর অেনক min-max িথওেরেমর একটা যখােন িকছু একটা ম াি মাইজ করেল অন
আেরকটা িকছু িমিনমাইজ হয়। তুিম যিদ ম াি মাম ম ািচং এর অ ালেগািরদম জােনা তাহেল ি টা বাইকালািরং কের ম ািচং বর করেলই ভারেট কভার বর হেয় যােব।
কাড সহজ হেলও complexity বেড় যােব,তাই নাড বিশ থাকেল কাজ করেবনা। আবার ম াি মাম ম ািচং যেহতু ম া - া এর একিট ভ ািরেয়শন তাই া চািলেয়ও
3/4
সমাধান করা স ব।

এরকম আেরকটা বেলম uva-10243(fire fire fire)। আিম থেম এটা সমাধান কের পের spoj এর টা কেরিছ।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
ডাইনািমক া ািমং: লংেগ কমন সাবিসেকােয়
shafaetsplanet.com /planetcoding/

শাফােয়ত 4/25/2014

ডাইনািমক া ািমং এর স বত সবেথেক পূ ণ িট উদাহরণ হেলা লংেগ কমন সাবিসেকােয় এবং এিডট িডসেট বর করা কারণ এেদর অেনক াি কাল
অ াি েকশন আেছ। এই লখাটা পড়ার আেগ আিম আশা করেবা তামরা িকছু বিসক ডাইনািমক া ািমং যমন কেয়ন চ , ন াপস াক পােরা। যিদ না পােরা তাহেল
আমার আেগর লখা েলা দখেত পােরা। এই লখায় লংেগ কমন সাবিসেকােয় বর করা, সিলউশন ি করাএবং সব েলা স াব সিলউশন বর করা দখেবা। তুিম যিদ
আেগই এসব টিপক িনেয় জােনা তাহেল লখার শেষ িরেলেটড বেলম সকশন দেখা, সখানকার শষ ৩টা বেলম সলভ করেত িকছুটা িচ া-ভাবনা করা লাগেব।

সাবিসেকােয়

মেন কেরা ১িট ি ং আেছ “ABC”। এই ি ংটা থেক শূ ন , এক বা একািধক অ র মুেছ িদেল যা থােক সটাই ি ংটার সাবিসেকােয় । “ABC” এর সাবিসেকােয় েলা
হেলা {“ABC” , “A”,”B”,”C”,AB”,”AC”,”BC”,” “}। সব েলা অ র মুেছ িদেল যা থােক, অথাৎ খািল বা এ িট(empty) ি ং ও একটা সাবিসেকােয় ।
িতটা অ েরর জন আমােদর হােত ২িট অপশন িছেলা, আমরা সটা িনেত পাির বা মুেছ ফলেত পাির। তাহেল ি ং এর দঘ n হেলা সাবিসেকােয় থাকেত পাের 2^n
টা।

লংেগ কমন সাবিসেকােয় (LCS)

িট ি ং এর মেধ যত েলা কমন সাবিসেকােয় আেছ তােদর মেধ সবেথেক ল াটাই লংেগ কমন সাবিসেকােয় (LCS)।

যমন “HELLOM” এবং “HMLLD” এর মেধ “H”, “HL”, “HLL”, “HM” ইত ািদ কমন সাবিসেকােয় আেছ। “HLL” হেলা লংেগ কমন সাবিসেকােয় যা
দঘ ৩।

টেফাস অ ালেগািরদম:

আমরা ব াক ািকং কের ২টা ি ং থেক সব েলা সাবিসেকােয় জনােরট করেত পাির। এরপের ২িট কের সাবিসেকােয় িনেয় ি ং কে য়ার কের দখেত পাির তারা “কমন”
িক না। আেগই দেখিছ মাট সাবিসেকােয় হেব 2^n টা , এরপের আবার এেদর মেধ কে য়ার করেত হেব! n এর মান ২০-২৫ পার হেলই এই অ ালেগািরদম শষ হেত
কেয়ক বছর লেগ যেত পাের! তাই আমােদর ভােলা অ ালেগািরদম দরকার।

ডাইনািমক া ািমং:

ডাইনািমক া ািমং এর মূল কথা িক মেন আেছ? বেলমটােক ছাট ছাট ভাগ কেরা, সই ভাগ েলা আেগ সলভ কেরা আর স েলা জাড়া লািগেয় বড় বেলমটার
সমাধান বর কের ফেলা। কেয়ন চে র সময় আমরা িতটা কেয়ন িনেয় বা ফেল িদেয় বািক কেয়ন েলার জন সলভ কেরিছ। এখােন িতটা ক ােরকটােরর জন সই কাজ
করেবা!

মেন কেরা “HELLOM” এবং “HMLLD” এেদর মেধ LCS বর করেত চাও। েত তুিম আেছা ২টা ি ং এরই থম ক ােরকটাের।

1/7
নীল রঙ িদেয় বুঝাে তুিম কান ি ং এর কান ক ােরকটাের আেছা। নীল রেঙর ক ােরকটার থেক কের বািক ি ংটুকুর জন তামােক বেলমটা সলভ করেত হেব।

এখন ল কেরা নীল রেঙর অ র িট একই। তারমােন তুিম িকছু িচ া না কেরই এই অ রটােক LCS এর মেধ ঢুিকেয় িদেত পােরা এবং বািক ি ংটুকুর জন িরকািসভিল
বেলমটা সলভ করেত পােরা।

আমরা H অ রটােক িনেয় িনেয়িছ। এখন ২িট ি ং এই আমরা ২য় অ ের আিছ। নীল অ র থেক বািক ি ংটুকুর জন আমরা এখন সলভ করেবা। তাহেল বেলমটা
ছাট হেয় গেলা, আমােদর “ELLOM”, আর “MLLD” এর মেধ র LCS বর করেত হেব।

এবার নীল রেঙর অ র িট একই না। তারমােন অ ত ১টােক বাদ িদেয় LCS িহসাব করেত হেব। আমরা একবার উপর থেক E বাদ িদেয় িহসাব করেবা, আেরকবার িনচ
থেক M বাদ িদেয় িহসাব করেবা।

2/7
তারমােন LCS(“ELLOM”,”MLLD”) বর করেত আমরা LCS(“LLOM”,”MLLD”) বর করেবা এবং LCS(“ELLOM”,”LLD”) বর করেবা। এই ইটার
মােঝ যটা বড় সটা িনেবা!

সব েলা ট ছিব এেক দখােবা না, তুিম িন য়ই বুেঝ গেছা আমােদর কাজ িক হেব। মেন কেরা ফাংশন calcLCS(i,j) থম ি ং এর i তম ক ােরকটার এবং ২য় ি ং
এর j তম ক ােরকটার থেক বািক ি ং এর LCS বর কের। অথাৎ i,j হেলা ১ম আর ২য় ি ং এর নীল রেঙর ক ােরকটার। আর ি ং িট হেলা A আর B। তাহেল
ফাংশনটা িডফাইন করা যায় এভােব:

calcLCS(i,j)=1+calcLCS(i+1,j+1) যিদ A[i]==B[j] হয়

calcLCS(i,j)=max(calcLCS(i+1,j) , calcLCS(i,j+1) যিদ A[i]!=B[j] হয়

িরকাসনটা রানটাইম ইেরার দয়ার আেগ শষ হেব না যিদ না বস- কস দাও। কান েটর জন আমরা িহসাব না কেরই উ র বেল িদেত পারেবা? িত ধােপ ি ং েলা
ছাট হেত হেত কান ি ং যিদ “এ িট” হেয় যায় তাহেল তার সােথ অন যেকান ি ং এর LCS ০ হেব।

calcLCS(i,j)=০ যিদ A[i]==NULL বা B[j]==NULL হয়।

একটু খয়াল করেলই দখেব একই ফাংশন বারবার কল হেব। তাই আমােদর মমরাইেজশন করেত হেব যটা আমরা অন সব িডিপ বেলেম কির। পুেরা কাডটা হেত পাের
এরকম:

LCS
C++

3/7
1 #define MAXC 1000
2 char A[MAXC],B[MAXC];
3 int lenA,lenB;
4 int dp[MAXC][MAXC];
5 bool visited[MAXC][MAXC];
6 int calcLCS(int i,int j)
7 {
8 if(A[i]=='\0' or B[j]=='\0') return 0;
9 if(visited[i][j])return dp[i][j];
10
11 int ans=0;
12 if(A[i]==B[j]) ans=1+calcLCS(i+1,j+1);
13 else
14 {
15 int val1=calcLCS(i+1,j);
16 int val2=calcLCS(i,j+1);
17 ans=max(val1,val2);
18 }
19 visited[i][j]=1;
20 dp[i][j]=ans;
21 return dp[i][j];
22 }
23 int main() {
24 scanf("%s%s",A,B);
25 lenA=strlen(A);
26 lenB=strlen(B);
27 printf("%d\n",calcLCS(0,0));
28 return 0;
29
30 }

সিলউশন ি :

এখন কথা হেলা LCS কত বড় সটােতা পলাম, িক ি ংটা পােবা িকভােব? এটাও খুব সহজ, calcLCS ফাংশনটা য পেথ এিগেয়েছ স পেথ এিগেয় গেলই আমরা
ি ংটা পেয় যােবা। আমরা আেরকটা ফাংশন িলখেত পাির, মেন কেরা ফাংশনটা হেলা printLCS(i,j)। এখােনও i,j িদেয় ি ং িটর ইনেড বুঝাে । এখন
A[i]==B[j] হেল আমরা অ রিটেক ি কের (i+1,j+1) েট চেল যােবা। আর A[i]!=B[j] হেল আেগই িহসাব করা িডিপ অ াের থেক dp[i+1][j] আর dp[i]
[j+1] এর মান দেখ সামেন আগােবা, যিদেক গেল ম াি মাম দঘ পাওয়া যােব সিদেক যােবা। িনেচর কাডটা দখেল পির ার হেব:

Printing LCS
C++

4/7
1 string ans;
2 void printLCS(int i,int j)
3 {
4 if(A[i]=='\0' or B[j]=='\0'){
5 cout<<ans<<endl;
6 return;
7 }
8 if(A[i]==B[j]){
9 ans+=A[i];
10 printLCS(i+1,j+1);
11 }
12 else
13 {
14 if(dp[i+1][j]>dp[i][j+1]) printLCS(i+1,j);
15 else printLCS(i,j+1);
16 }
17 }

অথাৎ আমােদর calcLCS ফাংশন যিদেক িগেয় সেবা মান পেয়েছ আমরা স পথ ধেরই আগাি ।

এখন আসেত পাের য সিলউশনেতা একািধক থাকেত পাের, সব েলা পােবা িকভােব? যমন “hello” আর “loxhe” এই ইটা ি ং এর LCS ইটা, “he” এবং
“lo”। সব েলা সিলউশন চাইেল ব াক ািকং করেত হেব। ধেরা printAll(i,j) ফাংশনটা সব েলা সিলউশন ি কের। আেগর মেতা যিদ A[i]==B[j] তাহেল
(i+1,j+1) এ যােবা। আর যিদ A[i]!=B[j] হয় তাহেল dp[i+1][j] আর dp[j][i+1] এর যটা বড় সিদেক আগােবা, পাথক হেলা যিদ dp[i+1][j]==dp[i]
[j+1] হয় তাহেল আমরা ইিদেকই আগােবা।

ALL LCS
C++

1 string ans;
2 void printAll(int i,int j)
3 {
4 if(A[i]=='\0' or B[j]=='\0'){
5 cout<<ans<<endl;
6 return;
7 }
8 if(A[i]==B[j]){
9 ans+=A[i];
10 printAll(i+1,j+1);
11 ans.erase(ans.end()-1); //Delete last character
12 }
13 else
14 {
15 if(dp[i+1][j]>dp[i][j+1]) printAll(i+1,j);
16 else if(dp[i+1][j]<dp[i][j+1]) printAll(i,j+1);
17 else
18 {
19 printAll(i+1,j);
20 printAll(i,j+1);
21 }
22 }
23 }

কাডটা অেনকটা আেগরমেতাই। “ans.erase(ans.end()-1);” এরকম একটা অিতির লাইন দখেত পাে া। এটার কাজ ি ং এর শষ ক ােরকটারটা মুেছ

5/7
ফলা। এটা কন করিছ? এই লাইনটা মুেছ ফলেল সমস া িক হেব? এটা তুিম িচ া কের বর কেরা, লাইনটা মুেছ চািলেয় দেখা িক হয়।

কমে ি িট:

ি ং িটর দঘ n এবং m হেল calcLCS() ফাংশনিট মাট n*m টা েট থাকেত পাের। তাহেল কমে ি িট O(n*m)।

াকিটস বেলম:

Longest Common Subsequence


The Twin Towers
History Grading
Is Bigger Smarter?

িরেলেটড বেলম ১: এিডট িডসেট ( লেভল-১)

তামােক ◌্িট ি ং A,B দয়া আেছ। তুিম ধুমা A ি ংটার উপর ৩টা অপােরশন করেত পােরা, কােনা একটা ক ােরকটার বদেল িদেত পােরা, কান ক ােরকটার মুেছ
ফলেত পােরা, যেকান পিজশেন নতুন ক ােরকটার ঢুকােত পােরা। তারমােন চ , িডিলট, ইনসাট হেলা তামার ৩টা অপােরশন। এখন তামার কাজ িমিনমাম অপােরশেন A
ি ংটােক B বানােনা। যমন “blog” ক “bogs” বানােত তুিম l মুেছ ফেল ি ং এর শেষ s ইনসাট করেত পােরা।
(িহ স: LCS এর মেতাই ইটা ইনেড i,j ক ট রাখেত হেব। এখন তুিম িচ া কেরা ি ং A থেক কান ক ােরকটার মুেছ ফলেল i,j এর পিরবতন িকরকম হেব।
িঠক সভােব বািক ২িট অপােরশেনর জন িকভােব i,j পিরবতন হেব সটা বর কেরা)
বেলম িলংক

িরেলেটড বেলম ২: লি েকা ািফকািল িমিনমাম লংেগ কমন সাবিসেকােয় ( লেভল-২)

২িট ি ং এর যত েলা LCS আেছ তােদর মধ থেক লি েকা ািফকািল িমিনমাম টা বর করেত হেব। “hello” আর “loxhe” এর মেধ লি েকা ািফকািল িমিনমাম
LCS হেলা “he”।
বেলম িলংক

িরেলেটড বেলম ৩: লংেগ কমন ইনি িসং সাবিসেকােয় ( লেভল-৩)

এই বেলেম ধু এমন সব সাবিসেকােয় িবেবচনা করেত হেব যারা ছাট থেক বড় সাজােনা। এেদর মেধ লংেগ কমন সাবিসেকােয় টা বর করেত হেব। বেলম িলংক

িরেলেটড বেলম ৪: িভ িভ লংেগ কমন সাবিসেকােয় ( লেভল-৩)

২িট ি ং এর মেধ কয়টা িভ িভ LCS আেছ বলেত হেব। ি ং এর দঘ সেবা ১০০০ হেত পাের, ব াক ািকং কের করা যােব না। বেলম িলংক
6/7
হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

7/7
ডাইনািমক া ািমং: ম◌্যাি চইন মাি ি েকশন
shafaetsplanet.com /planetcoding/

শাফােয়ত জুনe ১৮,


২০১৪

আমরা এবার আেরা একিট ািসক ডাইনািমক া ািমং বেলম দখেবা যটার নাম ম◌্যাি চইন মাি ি েকশন। এটা শখা খুবই পূ ণ কারণ এটার ধারণা
ব◌্যবহার কের অেনক ধরেণর সমস◌্যা সমাধান কের ফলা যায়। এই লখাটা পড়ার আেগ তামার ডাইনািমক া ািমং এর ধারণা থাকেত হেব। এছাড়া ম◌্যাি
িনেয়ও ধারণা থাকেত হেব।

আিম িনি ত তামরা সবাই ম◌্যাি েণর শত েলা জােনা, তাও আিম মেন কিরেয় িদেত চাই। ধির আমােদর িট ম◌্যাি আেছ A1,A2A1,A2 এবং তােদর
িডেমনশন m∗nm∗n আর p∗qp∗q। তাহেল কেয়কিট াপািট আমােদর জন◌্য পূ ণ:

ম ্যাি িট ণ করা যােব তখনই যিদ n=pn=p হয়। তারমােন থম ম ্যাি ে র কলাম সংখ ্যা, ি তীয় ম ্যাি ে র রা এর
সংখ ্যার সমান হেত হেব।

যিদ আেগর শত পূরণ হয় তাহেল ণ করার পর আমরা A3A3 ম ্যাি পােবা যার িডেমনশন m∗qm∗q।

ম য্ াি ণ করার সময় আমােদর িকছু সংখ ্যােক ণ কের যাগ করেত হয় য েলােক আমরা লার ণ বলেত পাির। আমােদর মাট
লার ণ করা লাগেব মাট m∗n∗qm∗n∗q বা m∗p∗qm∗p∗q বার।

তুিম িট ম◌্যাি খাতায় িলেখ ণ কের যাচাই কের দখেত পােরা ব◌্যাপার েলা। আেরকটা িজিনস মেন রাখেব য A1∗A2A1∗A2 আর A2∗A1A2∗A1 এক
না, অথাৎ অডার ভ কের আমরা ম◌্যাি ণ করেত পারেবা না।

এই লখায় যখন সংখ◌্যা েণর কথা বা ধু “ ণ” এর কথা বলা হেয়েছ তখন ম◌্যাি ণ করার সময় িভতের য সংখ◌্যা েলা ণ করেত হয় সটা বুঝােনা হেয়েছ।

তাহেল যিদ আমােদর ৩টা ম◌্যাি থােক A 1,A2,A3 যােদর িডেমনশন m∗nm∗n,n∗pn∗p, p∗qp∗q তাহেল A4=A1∗A2∗A3A4=A1∗A2∗A3
ম◌্যাি ে র িডেমনশন হেব m∗qm∗q। উপেরর ২য় াপািট থেকই এই ব◌্যাপারটা বাঝা যাে । এখন A 1*A2*A3 এই ম◌্যাি ণটা আমরা ইভােব
করেত পাির, ােকট িদেয় স েলা এভােব দখােনা যায়: (A1∗A2)∗A3,A1∗(A2∗A3)(A1∗A2)∗A3,A1∗(A2∗A3)। অথাৎ আমরা A1∗A2A1∗A2 এর
সােথ A3A3 ক ণ করেত পাির, অথবা A1A1 ক A2∗A3A2∗A3 এর সােথ ণ করেত পাির। তেব অডার অবশ◌্যই িঠক রাখেত হেব,
(A1∗A3)∗A2(A1∗A3)∗A2 এটা ভ◌্যািলড নাও হেত পাের।

বুঝেত পারেছা অডার িঠক রেখ অেনকভােব ােকট বিসেয় ণ করা যায়। িক িকভােব ােকট বসাি সটা খুবই পূ ণ। ধরা যাক A1,A2,A3A1,A2,A3 এর
িডেমনশন ১০×১০০, ১০০×৫, ৫×৫০।

তাহেল

(A1∗A2)∗A3(A1∗A2)∗A3 এই ােকিটং এ মাট সংখ◌্যা ণ করেত হেব (১০×১০০×৫) + (১০×৫×৫০) = ৭৫০০ বার
A1∗(A2∗A3)A1∗(A2∗A3) এই ােকিটং এ মাট সংখ◌্যা ণ করেত হেব (১০০×৫×৫০) + (১০×১০০×৫০) = ৭৫,০০০ বার
(এখােন মাি ি েকশন বলেত ম◌্যাি ণ করার সময় কয়বার িভতের লার ণ করা হে সটা বুঝােনা হেয়েছ, ৩ন র শত দেখা)

২য় উপােয় ১০ ণ বেড় িগেয়েছ ক◌্যালকুেলশেনর পিরমাণ! ম◌্যাি চইন মাি ি েকশন প িত ব◌্যাবহার কের আমরা এমন একটা “ ােকিটং” বর করেবা
যােত সংখ◌্যা েণর পিরমাণ সবেথেক কম হয়। তামােক A1,A2……..AnA1,A2……..An এরকম অেনক েলা ম◌্যাি ে র ধুমা িডেমনশন দয়া থাকেব,
বলেত হেব িমিনমাম কয়টা সংখ◌্যা ণ কের A1∗A2∗………..AnA1∗A2∗………..An বর করা যায়। আমরা ধের িনি িডেমনশন েলা ভ◌্যািলড, অথাৎ
থম শত পূ রণ কের।

আমরা িডভাইড এ কনেকায়ার প িতেত এটা সলভ করেবা। ডাইনািমক া ািমং দরকার হেব কারণ একই সাব বেলম বারবার আসেব। ধির nn এর মান ৫, তাহেল
A1,A2,A3,A4,A5A1,A2,A3,A4,A5 এই ৫টা ম◌্যাি আেছ, তুিম A1∗A2∗A3∗A4∗A5A1∗A2∗A3∗A4∗A5 বর করেত কয়টা সংখ◌্যা ণ
লােগ সটা বর করেত চাও। এখন দেখা আমরা িবিভ ভােব ম◌্যাি েলােক ইভােগ ভাগ কের ফলেত পাির, যমন একটা উপায় হেলা এরকম:
1/4
(A1∗A2)∗(A3∗A4∗A5)(A1∗A2)∗(A3∗A4∗A5)

তারমােন আমরা কান একটা ােকিটং এ Aleft=A1∗A2Aleft=A1∗A2 বর করেবা এবং কান একটা ােকিটং এ
Aright=A3∗A4∗A5Aright=A3∗A4∗A5 বর করেবা। আমরা জািননা িকভােব স েলা বর করেবা, তেব কও যিদ আমােদর বেল দয় AleftAleft আর
ArightAright বর করেত কয়টা সংখ◌্যা ণ করা লােগ তাহেল আমরা বেল িদেত পারেবা মাট কয়টা সংখ◌্যা ণ করা লােগ। মাট সংখ◌্যা েণর সংখ◌্যা হেব:

মাট েণর সংখ ্যা = AleftAleft িনণয় করেত েণর সংখ ্যা + ArightAright িনণয় করেত েণর সংখ ্যা +
Aleft∗ArightAleft∗Aright িনণয় করেত েণর সংখ ্যা

বা ৩য় শত থেক শষ টামটােক িলখেত পাির: AleftAleft এর রা সংখ ্যা× AleftAleft এর কলাম সংখ ্যা×ArightAright এর কলাম
সংখ ্যা

মাট েণর সংখ ্যা = AleftAleft িনণয় করেত েণর সংখ ্যা + ArightAright িনণয় করেত েণর সংখ ্যা + AleftAleft এর রা
সংখ ্যা×AleftAleft এর কলাম সংখ ্যা×ArightAright এর কলাম সংখ ্যা

তারমােন কও যিদ ম◌্যািজকািল AleftAleft এর ArightAright বর কের দয় তাহেলই আমরা মাট সংখ◌্যা বর করেত পারেবা।

িক আমরােতা আেরা অেনকভােব ভাগ করেত পারতাম, যমন:

(A1)∗(A2∗A3∗A4∗A5)(A1)∗(A2∗A3∗A4∗A5)

(A1∗A2∗A3)∗(A4∗A5)(A1∗A2∗A3)∗(A4∗A5)

(A1∗A2∗A3∗A4)∗(A5)(A1∗A2∗A3∗A4)∗(A5)

আমরা িতটা উপােয়ই ভাগ করেবা এবং ভাগ করার পর ম◌্যািজকািল AleftAleft এবং ArightAright িনণয় করেত কয়টা সংখ◌্যা ণ করা লােগ সটা বর কের
ফেল মাট সংখ◌্যা বর কের ফলেবা। যভােব ভাগ করেল মাট সংখ◌্যাটা িমিনমাম হয় সটাই আমার উ র!

তুিম যিদ িরকাশন ভােলা কের বুেঝ থােকা তাহেল এত েণ বুেঝ িগেয়েছা ম◌্যািজকািল িকভােব কাজটা করা হেব। বাম আর ডান পােশর ভাগ েলােক আমরা িরকািসভিল
সলভ কের ফলেবা একইভােব, অথাৎ স েলােক আবার অেনকভােব ভাগ কের অপিটমাল উ রটা বর কের আনেবা! তাহেল আমােদর অ◌্যালেগািরদম দাড়ােলা খুব সহজ:

যত উপােয় স ব ভাগ কেরা

িরকািসভিল ছাট ভাগ েলার জন ্য সমাধান কেরা

বাম আর ডান পাশ মাজ কের মাট েণর সংখ ্যা বর কেরা

সব েলা উপােয়র মধ ্েয সবেথেক ভােলাটা নাও

তাহেল িচ া কেরা আমােদর িরকাশেনর প◌্যারািমটার বা ট িক হেব? িক িক তথ◌্য আমােক িদেল আিম বেলমটা সলভ করেত পাির? আমার ধু জানা দরকার ইনপুট
ম◌্যাি েলার কান অংশ িনেয় আিম এখন কাজ করিছ। তারমােন আমরা র পেয় আর শেষর পেয় ট িহসােব রাখেবা।

int f(int beg, int end)

এরকম হেব ফাংশেনর প◌্যারািমটার বা ট। ff ফাংশনটা begbeg থেক endend পয ম◌্যাি েলােক সবেথেক অপিটমািল ণ করেল মাট কয়টা সংখ◌্যা
ণ করা লােগ সটা বেল িদেব! িরকাশন থামেব কখন? অথাৎ বস কসটা িক? যখন দখেবা একটা বা তারেথেক কম ম◌্যাি আেছ (b>=e)(b>=e) তখন আমরা
জািন একটা ণও করা লাগেবনা, শূ ন◌্য িরটাণ কের িদেবা।

2/4
তাহেল আমরা এখন একটা কাড িলেখ ফিল। সবেথেক ভােলা হয় যিদ তারআেগ তুিম িনেজই একবার চ া কেরা, সাহায◌্য না িনেয় সলভ করেত পারেল য আন পাওয়া
যায় তার তুলনা নই! আর না পারেলও মন খারােপর িকছু নই। ইনপুট িহসােব তুিম িতিট ম◌্যাি ে র রা এবং কলাম সংখ◌্যা িনেব। আউটপুট হেব অপােরশন
সংখ◌্যা।

ট পাওয়ার পের আমােদর কাজ হেব এক ট থেক অন◌্য েট িকভােব যােবা, অথাৎ িরকাের িরেলশনটা বর করা। এই বেলেম আমরা একটা কের িমডপেয়
িসেল কের বাম আর ডােনর পােশর জন◌্য বেলমটা িরকািসভিল সলভ করেবা এবং তােদর মাজ করেবা। িরকাের টা তাহেল হেব এরকম:

এবার আমরা এটােক কােড পা র কের ফিল:

C++

1 #define MAX 100


2 int row[MAX], col[MAX];
3 int dp[MAX][MAX];
4 bool visited[MAX][MAX];
5 int f(int beg,int end)
6 {
7 if(beg>=end)return 0;
8 if(visited[beg][end])return dp[beg][end];
9 int ans=1<<30; //২^৩০ ক ইনিফিনিট ধরিছ
10 for(int mid=beg; mid<end;mid++) // ইভােগ ভাগ করিছ
11 {
12 int opr_left = f(beg, mid); //opr = multiplication operation
13 int opr_right = f(mid+1, end);
14 int opr_to_multiply_left_and_right = row[beg]*col[mid]*col[end];
15 int total = opr_left + opr_right + opr_to_multiply_left_and_right;
16 ans = min(ans, total);
17 }
18 visited[beg][end] = 1;
19 dp[beg][end] = ans;
20 return dp[beg][end];
21 }
22
23 int main()
24 {
25 int n;
26 cin>>n;
27 rep(i,n)cin>>row[i]>>col[i];
28 cout<<f(0,n-1)<<endl;
29 }

খুবই সহজ একটা কাড, ইভােগ ভাগ করিছ আর ছাট ভাগটা সলভ করিছ। একই অংেশর জন◌্য বারবার সলভ করেত চাইনা তাই িডিপ অ◌্যােরেত সভ কের রাখিছ,
যিদ দিখ কান একটা ট আেগ িভিজট করা হেয়েছ তখন পুেরােনা রজা িরটাণ কের িদি !

কমে ি িট:

beg আর end এর মান হেত পাের 11 থেক n পয । তাহেল িভ ট আেছ ায় n2n2 টা। িতটা েট আবার nn পয লুপ চলেত পাের। তাহেল টাইম
কমে ি িট O(n^3)। মমির লাগেব O(n2)O(n2)।

িরেলেটড বেলম:
3/4
সরাসির ম◌্যাি চইন মাি ি েকশেনর বেলম হয়েতা তুিম কনেটে পােবনা তেব এভােব ই া েক ট ধের িবিভ ভােব ভাগ করার আইিডয়া িদেয় অেনক বেলম
সলভ করেত পারেব য কারেণ এটা শখা এত পূ ণ

১. http://www.spoj.com/problems/MIXTURES/

২. Cutting Sticks

[ধন◌্যবাদ শা ভাই এবং তানভীর ভাইেক অেনক েলা ভুল ধের দয়ার জন◌্য]

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
ব াক ািকং: পারমুেটশন জনােরটর
shafaetsplanet.com /planetcoding/

শাফােয়ত সে র ২০,
২০১৬

[পুরােনা লখা, নতুন কের িছেয় িলেখ আবার কাশ করা হেলা]

এই লখাটা পড়ার আেগ অবশ ই িরকাসন স েক ভােলা ধারণা থাকেত হেব।

সাচে েসর আকার ছােটা হেল এটা খুবই কাযকর একটা প িত। সাচে স হেলা কতটুকু অংশজুেড় তামার সিলউশন থাকেত পাের সইটুকু। যমন তামােক যিদ
১০সাইেজর িট সট িদেয় বর করেত বেল ২য় সট ১মিটর সাবেসট িকনা তাহেল খুব সহেজ তুিম ব াক াক কের 210=1024210=1024 িট সট বর কের সব েলার
সােথ িমিলেয় দখেত পােরা, িক সেটর আকার ১০০ হেল তামার এভােব সিলউশন বর করার জন এই জীবনকাল যেথ নয়!

যসব বেলেমর পিলনিময়াল কােনা সিলউশন আমরা এখেনা জািননা অথাৎ NP বা NP-hard ক াটাগিরর বেলম স েলােক ব াক াক কেরই সমাধান করেত হয়।
ব াক ািকং কাড লখার আেগ কমে ি িটর ব াপাের খুব সতক থাকেত হেব।

এখন আমরা দখেবা িকভােব ব াক াক কের 00 থেক n−1n−1 পয সংখ া েলার িতিট পারমুেটশন বর করা যায়। যিদ n=2n=2 হয় তাহেল পারমুেটশন েলা
হেব:

সহেজ বাঝার জন আমরা পারমুেটশন েলােক একটা ি আকাের দিখ:

এই ি ত ট থেক যেকােনা পেথ আগােত থাকেল একটা কের পারমুেটশন পাওয়া যােব। আমরা একটা িরকািসভ ফাংশন িলখেবা যটা এই ি এর সব েলা পেথ একবার
কের ঘুের আসেব। আমােদরেক সিত সিত অ াডেজেসি ম াি িদেয় ি বািনেয় ফলা দরকার নই, ছিবটা দয়া হেয়েছ সহেজ বাঝার জন ।

মেন কেরা আমােদর ফাংশেনর নাম হেলা generate(idx)generate(idx)। idxidx মােন হেলা এখন আমরা idxidx তম পিজশেন একটা সংখ া বসােত চাই।
1/3
িনেচর সুেডােকাডিট দেখা, এরপর আিম ব াখ া করিছ:

1 procedure generate(idx)
2 if idx == n
3 print position
4 return
5 for i from 0 to n
6 if taken[i] = False
7 taken[i] <- true
8 position[idx] = i
9 generate(idx+1)
10 taken[i] <- false

৫ ন র লাইেন আিম 00 থেক nn পয একিট লুপ চািলেয়িছ। ৬ ন র লাইেন দখিছ য ii সংখ ািট এরই মেধ নয়া হেয়েছ নািক। যিদ না নয়া হেয় থােক তাহেল
idxidx তম পিজশেন ii বিসেয় িরকািসভিল idx+1idx+1 বািক পিজশন েলার জন বেলমটা সলভ করিছ।

ই ােরি ং ব াপার হেলা িরকািসভিল generate(idx+1)generate(idx+1) এর জন সলভ করার পর আমরা taken[i] <- false কের িদি । কারণ ii তম
সংখ াটা idxidx পিজশেন বসােনার পর আবার সই পিজশন থেক ii ক ফেল িদেয় i+1i+1 ক একই পিজশেন বিসেয় িরকািসভিল সলভ করেবা।

ব াক ািকং করার জনােরল আইিডয়াটা হেলা:

১. িতিট ফাংশন কেল স াব অপশন েলার একিট বাছাই কেরা।


২. বািক অপশন েলা থেক িরকািসভিল সমাধান বর করার চ া কেরা।
৩. বাছাই করা অপশনিট ফেল িদেয় অন আেরকিট িনেয় আবার চ া কেরা।

এখন তামার কাজ হেব সুেডােকাডটােক আসল কােড পা র করা। যিদ এটা পােরা তাহেল তুিম আেরা িকছু একইরকম সমস া সহেজই সমাধান করেত পারেব। যমন
তামােক যিদ একটা ি ং “abcd” িদেয় বলা হয় সবরকম পারমুেটশন জনােরট করেত তাহেল একইভােব সহেজই করেত পারেব। িক ি ংটায় যিদ এই ক ােরকটার
একািধকবার থােক ( যমন “abbcdd”) তাহেল একটু ঝােমলায় পড়েব, দখেব একই পারমুেটশন বারবার জনােরট হে । এটা এড়ােত তামােক একটা াগ রেখ একই
পিজশেন একই ক াের ার একািধকবার বিসেয় িরকিসভিল সলভ করা ব করেত হেব।

াকিটেসর জন িনেচর সমস া েলা সমাধান কেরা:

Determine The combination


Prime Ring problem
House of santa clause
All Walks of length n
Following orders

আপাতত এখােনই শষ, পেরর পেব ব াক ািকং িদেয় সমাধান করা যায় এমন িকছু সমস া দখেবা।

2/3
AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
মডুলার অ ািরথেমিটক
shafaetsplanet.com /planetcoding/

শাফােয়ত 1/20/2012

−১৭−১৭ ক ৫৫ িদেয় ভাগ করেল ভাগেশষ কত হয়? ২১০০০২১০০০ ক ১৭১৭ িদেয় ভাগ করেল ভাগেশষ কত হয় সটা িক তুিম ওভারে া এিড়েয় িনণয় করেত পারেব?
O(n)O(n) এ পারেল O(log2n)O(log2⁡n) কমে ি িটেত পারেব? যিদ কােনা একিট উ র “না” হয় তাহেল এই পা তামার জন । তেব তুিম যিদ মডুলার
ইনভাস বা এডভা ড িকছু িশখেত পা িট খুেলা তাহেল তামােক আপাতত হতাশ করেত হে ।

িস/জাভা সহ বিশভাগ া ািমং ল াং েয়েজ এ %% ক ভাগেশষ অপােরটর ধরা হয়। xx ক mm িদেয় ভাগকের ভাগেশষ বর করার অথ x%mx%m এর মান বর
করা অথবা আমরা বলেত পাির xx ক mm িদেয় mod করা। “determine answer modulo 1000” এ কথািটর অথ হেলা উ রেক ১০০০১০০০ িদেয় mod
কের তারপর আউটপুট িদেত হেব।

একিট সমস া িদেয় কির। তামার ১০০িট বই আেছ,তুিম কয়ভােব বই েলা সাজােত পারেব? খুব সহজ, ১০০!১০০! (১০০ ফ া িরয়াল) ভােব সাজােত পারেব। ১০০!
১৫৮ িডিজেটর িবশাল একিট সংখ া। তাই আিম তামােক বেলমটা সহজ কের িদলাম,ধেরা তুিম xx উপােয় বই েলা সাজােত পারেব,তাহেল তামােক xx কত সটা বলেত
হেব। অথাত ১০০! বর কের ৯৭৯৭ িদেয় ভাগ কের ভাগেশষটা বর করাই তামার সমস া। (Determine 100 factorial modulo 97)

এটা িকভােব করেব? ১০০!১০০! এর মান তুিম বর করেত পারেবনা ৬৪৬৪িবট আনসাইনড ইি জার িদেয়ও, এরা ২৬৪−১২৬৪−১ পয সংখ া িনেয় কাজ করেত পাের,
তাই ওভারে া হেব। িক আমরা জািন আমােদর উ র কখেনাই 97 এর বড় হেবনা কারণ কােনা সংখ ােক m িদেয় mod করা হেল সংখ ািট m এর থেক বড় হেত
পারেবনা।

আমরা এ ধরেণর সমস া সমাধান করেত সাহায িনেবা িট সুে র:

(a+b)%m=((a%m)+(b%m))%m(a+b)%m=((a%m)+(b%m))%m
(a∗b)%m=((a%m)∗(b%m))%m(a∗b)%m=((a%m)∗(b%m))%m

nn সংখ ক ন র a1,a2…ana1,a2…an এর জন সু িট ব বহার করেত পারেব।

উপেরর সমস ািটেত ২য় সু িট লাগেব। তামার বর করা দরকার ১০০! %৯৭ অথাত:
(১০০*৯৯*৯৮*………..*১)%৯৭
তুিম যটা করেব সটা হেলা ণ করার সময় ২য় সুে র মত কের mod করেত থাকেব,তাহেল কােনা সময়ই overflow ঘটেবনা কারণ mod করেল িত েপ সংখ ািট
ছােটা হেয় যাে । এটার কাড হেত পাের এরকম:

C++

1 int fact=1;
2 for(int i=1;i<=100;i++)
3 {
4 fact=((fact%97)*(i%97))%97;
5 }
6 printf("%d\n",fact);
7

এটার আউটপুট আসেব ০। অথাত ১০০! % ৯৭ =০। একটু খয়াল করেলই বুঝেব এখােন আমরা ২য় সু িট েয়াগ কেরিছ ২িট কের সংখ া িনেয়।

সু িট কেনা কাজ কের সটা জানা দরকার। আিম ১ম সু িটর মাণ দখাি ,২য়িটও একইভােব করা যায়। মানিট আমার িনেজর মত কের করা।

ধির (x+y)%৫ এর মান আমােদর বর করেত হেব। এখন যিদ x%5=c1x%5=c1 আর y%5=c2y%5=c2 হয়,তাহেল xx ক আমরা িলখেত পাির
5n1+c15n1+c1 এবং yy ক িলখেত পাির 5n2+c25n2+c2 যখােন n1n1 আর n2n2 িট ইি জার। এটা একদম বিসক ল,আশা কের বুঝেত সমস া
হে না। এখন:

1/5
(x+y)%5(x+y)%5
= (5n1+c1+5n2+c2)%5(5n1+c1+5n2+c2)%5
= (5n1+5n2+c1+c2)%5(5n1+5n2+c1+c2)%5 ——(১)

এখােন 5n1+5n25n1+5n2 অবশ ই 55 এর মাি পল,তাই আমরা িলখেত পাির


5n1+5n2=5N5n1+5n2=5N যখােন N=n1+n2N=n1+n2
এবং c1+c2=Cc1+c2=C
তাহেল (১) থেক পাি :
(5N+C)%5(5N+C)%5

এখন পির ার বাঝা যাে য উ র হেলা C%5C%5। CC ক আবার mod করেত হেলা কারণ c1+c2c1+c2 এর মান 5 এর থেক বড় হেতই পাের। এখন

((x%5)+(y%5))%5((x%5)+(y%5))%5——–(২)
=((5n1+c1)%5)+((5n2+c2)%5))%5((5n1+c1)%5)+((5n2+c2)%5))%5
(5n1+c1)%5=c1(5n1+c1)%5=c1
(5n2+c2)%5=c2(5n2+c2)%5=c2

তাহেল ২ ক িলখেত পাির:


(c1+c2)%5=C%5(c1+c2)%5=C%5

তাহেল ১ম সু িট মািণত হেলা। তারমান যাগ কের mod করা আর আেগ mod কের তারপর যাগ কের আবার mod করা একই কথা। সুিবধা হেল সংখ ািট কােনা
েপই বিশ বড় হেত পােরনা। েণর ে ই একই সু েযাজ ।

নেগিটভ সংখ ার mod িনেয় একটু আলাদা ভােব কাজ করেত হয়। িস ত −17%5−17%5 এর মান দখায় -২। িক সচরাচর আমরা ভাগেশেষর য সং া ব বহার
কির তােত x%m=px%m=p হেল গািণিতকভােব

m এর সবেথেক বড় থেক বড় মাি পল যটা xx এর থেক ছাট সই সংখ ািটেক xx থেক িবেয়াগ করেল য সংখ ািট পাওয়া যায় সটাই pp।

যমন 23%523%5 এর ে ৫×৪=২০৫×৪=২০ হেলা ৫৫ এর সবেথেক বড় মাি পল যটা ২৩২৩ এর থেক ছাট,তাই
23%5=23−(5×4)=323%5=23−(5×4)=3। −17%5−17%5 এর খয়াল কেরা −20−20 হেলা ৫৫ এর সবেথেক বড় মাি পল যেট −১৭−১৭
থেক ছাট,তাই উ র হেব ৩৩।
এই কসটা handle করা একিট উপায় হেলা নেগিটভ সংখ ািটেক একিট 55 এর মাি পল এর সােথ যাগ করা যন সংখ ািট ০ থেক বড় হেয় যায়,তারপের mod করা।
যমন:

-17%5
=(-17+100)%5
=83%5
=3

এটা উপেরর সুে র মােণর মত কেরই কাজ কের,একটু তােলই মাণ করেত পারেব। নেগিটভ সংখ ার mod িনেয় কনেটে সবসময় সতক থাকেব,এটা wrong
answer খাওয়ার একটা বড় কারণ হেত পাের।

এবার আিস সুপিরিচত big mod সমস ায়। সমস ািট হেলা তামােক (ab)%m(ab)%m এর মান বর করেত হেব, aa,bb,mm তামােক বেল দয়া হেব,সব েলার
range 2^31 পয হেত পাের। ১০০! % ৯৭ বর করার মত কের সহেজই তুিম overflow না খেয় মানিট বর করেত পারেব,সমস া হেলা তুিম লুপ চািলেয় একিট
একিট ণ কের 2200000000022000000000 বর করেত চাইেল উ র পেত পেত স বত না া শষ কের আসেত পারেব। আমরা চাইেল
2/5
O(log2n)O(log2⁡n) এ এটা করেত পাির।
ল কেরা

21002100
=(250)2(250)2
এবং
(250)(250)
=(225)2(225)2

এখন বেলা 250250 বর করেত িক 226226, 227227 ইত িদ বর করার দরকার আেছ নািক 225225 পয বর কের square কের িদেলই হে ? আবার
225225 পয আসেত (212)2(212)2 পয বর কের square কের সােথ ২ ণ কের িদেলই যেথ ,অিতির ২ ণ করিছ সংখ ািট িবেজাড় স কারেণ। িত
েপ ণ করার সময় mod করেত থাকেব যােত overflow না হয়। recursion ব বহার কের কাডিট লখা জেলর মত সাজা:

C++

1 #define i64 long long


2 i64 M;
3 i64 F(i64 N,i64 P)
4 {
5 if(P==0) return 1;
6 if(P%2==0)
7 {
8 i64 ret=F(N,P/2);
9 return ((ret%M)*(ret%M))%M;
10 }
11 else return ((N%M)*(F(N,P-1)%M))%M;
12 }
13

ম ব অংেশ “হাসান” একিট িবগ মেডর সু র িরকাশন-ি এর ছিবর িলংক িদেয়েছ, ছিবটা এরকম:

3/5
মডুলার অ ািরথেমিটক ব বহার কের িবশাল আকােরর ফলাফল ক আমরা ছাট কের আনেত পাির ফলাফেল িবিভ াপািটেক ন না কের,তাই এটা গিণেত খুব পূ ণ।
া ািমং কনেটে ায়ই িবিভ বেলেম মডুলার অ ািরথেমিটক েয়াজন পড়েব,িবেশষ কের counting আর combinatorics এ যখােন ফলাফল অেনক বড় হেত
পাের,ফ া িরয়াল িনেয় কাজ করেত হেত পাের।

ভাগ করার সময় ণ,আর যােগর মত সু িট কাজ কেরনা ,এটার জন তামােক extended euclid আর modular inverse জানেত হেব।

িসিপউর জন mod খুব costly একটা অপােরশন। যাগ, েণর থেক mod করেত অেনক বিশ সময় লােগ। অ েয়াজেন mod ব বহার করেল কাড time limit
exceed করেত পাের,তাই overflow হবার আশংকা না থাকেল সব জায়গায় mod করা দরকার নই। আমার একিট কাড ৩ সেকে time limit exceed হবার
পর খািল িকছু mod সিরেয় ১.৩ সেক নািমেয় এেনিছ।

এখন িচ া করার জন একিট বেলম। ধেরা তামােক একিট অেনক বড় সংখ া(bigint) িদেয় সটােক ২৩১২৩১ এর ছাট একিট সংখ া িদেয় mod করেত বলা হেলা।
O(length_of_bigint)O(length_of_bigint) কমে ি িটেত িকভােব করেব?
সাহায :

২৩=(০*১০+২)*১০ + ৩
১২৩৯=(((০*১০+১)*১০ + ২)*১০ +৩)*১০+৯

াকিটেসর জন বেলম:
http://uva.onlinejudge.org/external/3/374.html
http://uva.onlinejudge.org/external/101/10127.html

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes


4/5
5/5
াইম জনােরটর (Sieve of Eratosthenes)
shafaetsplanet.com /planetcoding/

শাফােয়ত 7/16/2011

াচীনকাল থেকই গিণতিবদরা মাথা ঘামাে ন াইম না ার বা মৗিলক সংখ া িনেয়। াইম না ার েলা মেধ লুিকেয় আেছ িব য়কর িকছু সৗ য। যেকােনা কে ািজট বা
যৗিগক সংখ ােক একািধক াইেমর ণফল িহসােব মা একভােব লখা যায়,িঠক যমন সব যৗিগক পদাথ একািধক মৗিলক পদােথর সম েয় তির। াচীনকাল থেকই
মানুষ াইম িনেয় গেবষণা করেছ,চলেছ এখেনা। গাউস,ফামা,ইউলােরর মত িকংবদি গিণতিবদরা কাজ কেরেছন াইম িনেয়।

sieve
ত গিতেত াইম সংখ া বর করার একিট প িত আিব ার কেরন Eratosthenes,২০০ ি পূ েবর একজন ীক গিণতিবদ,িব ািন ও কিব। ২২০০ বছেররও পুরােনা
সই প িত ব বহার কের আমরা আধুিনক কি উটাের াইম জনােরট কির,খুব কম সমেয় বর করা যায় ১০ কািটর িনেচ সব াইম সংখ া। এই অ ালেগািরদমিট sieve of
Eratosthenes নােম পিরিচত, া ািমং এর জগেত সু রতম অ ালেগািরদম েলার মেধ এিট একিট।

sieve এর শাি ক অথ হেলা ছাকিন যা অ েয়াজনীয় অংশ ছেট ফেল (A sieve, or sifter, separates wanted elements from unwanted
material using a woven screen such as a mesh or net)। Eratosthenes এর ছাকিন যৗিগক সংখ া েলােক ছেট ফেল দয়।

Sift the Twos and sift the Threes,


The Sieve of Eratosthenes.
When the multiples sublime,
The numbers that remain are Prime
(Traditional,collected from wikipedia)

আমরা জািন াইম সংখ া হেলা সসব সংখ া যােদর ১ এবং সই সংখ িট ব িতত কােনা সংখ া িদেয় ভাগ করা যায়না, যমন ২,৩,৫,৭,২৯ ইত ািদ। অন ভােব বলা যায়
সসব সংখ াই াইম যােদরেক সংখ ািটর বগমূেলর সমান বা ছােটা কােনা াইম িদেয় ভাগ করা যায় না । এই সং াটাই অ ালেগািরদেমর মূল অংশ,তাই আেগ আমরা এটা
বুঝেত চ া করব। ফমালভােব মাণ না কের ব পারিট বুঝােনার চ া কির। যেকােনা সংখ ােক আমরা কেয়কিট াইেমর ণফল িহসােব িলখেত পাির যােদর াইম ফ া র
বলা হয়:

n=p1*p2*p3….*pk

n যিদ িনেজই াইম হয় তাহেল n=p1(=n)। অন থায় অবশ ই একািধক াইম ফ া র থাকেত হেব। এবার িচ া কেরা কােনা সংখ া c ক িট সংখ ার ণফল
c=a*b িহসােব িলখেল a আর b এর একিট অবশ ই সংখ ািটর বগমূেলর থেক ছাট,অন িট বড়। a,b েটা সংখ াই c এর বগমূেলর থেক বড় হেল ণফল c থেক বড়
হেতা (িঠক যমন c=a+b হেল a বা b এর একিট c এর অেধেকর থেক ছাট অন িট বড়)।

এবার n=p1*p2*p3….*pk ত িফের আিস। p1,p2,p3 ইত ািদর মেধ য কােনা ২িট যিদ n এর বগমূল থেক বড় হয় তাহেল তােদর ণফল n ক ছািড়েয়
যােব,তাই নয় িক? সেবা একিট াইম ফ া র বগমূেলর বাইের যেত পাের,বািক েলা ক অবশ ই িভতের থাকেত হেব।

তাহেল আমরা িনি ত য যৗিগক সংখ া ক তার বগমূেলর থেক ছাট কােনা াইম িদেয় ভাগ করা যােব। ২য় সং ািট এখন আমােদর কােছ পির ার: ” সসব সংখ াই
াইম যােদরেক সংখ ািটর বগমূেলর সমান বা ছােটা কােনা াইম িদেয় ভাগ করা যায় না ”। বুঝেত না পারেল আেরকবার ভােলা কের িচ া কের িনেচর অংশ পেড়া।

এবার আমরা আমােদর ছাকিন চালু কির এবং াইম বর কির। ২৫ এর িনেচর সব াইম আমরা বর করব। ২৫ এর বগমূল ৫, তাই ২৫ বা তার থেক ছাট কান সংখ ােক
অবশ ই ৫ বা তার থেক ছাট কােনা াইম িদেয় ভাগ করা যােব।
২ একিট াইম কারণ ২ ক তার বগমূেলর িনেচ কােনা সংখ া িদেয় ভাগ করা যায়না। তাহেল ২ এর মাি পল েলা কও াইম নয় কারণ তােদর ২ িদেয় ভাগ করা
যায়, স েলােক আমরা কেট দই:

২,৪,৬,৮,১০,১২,১৪,১৬,১৮,২০,২২,২৪

1/2
২ এর পেরর সংখ া ৩। ৩ যিদ াইম না হেতা তাহেল ৩ এর বগমূেলর িনেচর কােনা াইম ৩ ক বাদ িদেয় িদত, যেহতু ৩ বাদ পেড়িন তাই সং ামেত ৩ াইম। ৩ এর
মাি পল েলা ক বাদ দই:

৩,৬,৯,১২,১৫,১৮,২১,২৪

পেরর সংখ া ৪। ৪ বাদ পেড় িগেয়েছ আেগই। তারপর আেছ ৫। ৫ যিদ াইম না হেতা তাহেল আেগই ছাকিনেত কাটা পড়ত, ৫এর মাি পল েলােক কেট দই:

৫,১০,১৫,২০,২৫

আমােদর আর কাটাকািট েয়াজন নই। ২৫ এর বগমূল ৫, তাই ২৫এর িনেচর সব সংখ ার বগমূল ৫ থেক ছাট। সুতরাং ২৫ এর িনেচর সকল যৗিগক সংখ া ৫ বা তার
িনেচর কােনা াইম িদেয় িবভাজ । যেহতু আমরা ২,৩,৫ এর সব মাি পল কেট িদেয়িছ,বািক সংখ েলা অবশ ই াইম। ছাকিনর উপর থেক স েলা সং হ কের নই:

২,৩,৫,৭,১১,১৩,১৭,১৯,২৩

আমরা িসেভর একটা কাড দিখ:

C++

1 bool status[1100002];
2 void siv()
3 {
4 int N=1000000;
5 int sq=sqrt(N);
6 for(int i=4;i<=N;i+=2) status[i]=1;
7 for(int i=3;i<=sq;i+=2){
8 if(status[i]==0)
9 {
10 for(int j=i*i;j<=N;j+=i) status[j]=1;
11 }
12 }
13 status[1]=1;
14 }
15

status অ ােরটা িদেয় িনেদশ কের একিট সংখ া াইম নািক কে ািজট। status[i]=0 হেল i একিট াইম। েত সব ইনেডে ০ আেছ, আমরা উপেরর
অ ালেগািরদম অনুযায়ী নন াইম সংখ া েলােক কেট িদেবা, অথাৎ j যিদ নন- াইম হয় status[j]=1 কের িদেবা। ৮ ন র লাইেন েতই ২ এর সব মাি পল কেট
িদলাম। এরপেরর পেরর লুপটা ৩ থেক কের ২ কের বাড়ােবা কারণ জাড় সংখ া িনেয় আর িচ া করা দরকার নই। ১০ ন র লাইেন এেস যিদ status[i]=0 পাই
তাহেল অ ালেগািরদম অনুযায়ী i অবশ ই াইম কারণ i এখনও কাটা পেড়িন, এবার i এর সব েলা মাি পল কেট িদেবা, এজন j এর লুপ করেবা 2*i থেক এবং
বাড়ােবা i পিরমাণ। আমােদর কাজ শষ, নন- াইম সংখ া েলা সব কেট িদেব িভতেরর লুপিট, এখন status[i] এর মান দেখ আমরা i াইম িকনা বর করেত পারেবা।

িসভ িদেয় াইম জনােরট কের খুব সহেজ কান সংখ ার াইম ফ া র বা উৎপাদেক িবে ষণ করা যায়। এই কাজটা তামার হােতই থাকেলা :)।

িসেভ িতিট সংখ া াইম নািক নন- াইম সটা আমরা একিট বুিলয়ান অ াের িদেয় চক কির। যত পয াইম জনােরট করব তত সাইেজর অ াের লাগেব। ১০^৮
আকােরর অ ের অেনক মেমাির দখল কের। মেমাির অপিটমাইজ করার জন অসাধারণ একিট প িত হেলা িবট ব বহার করা,এেক bitwise িসভ বলা হয়। একিট
ইি জাের ৩২িট িবট থােক যার িতিটেক আমরা াগ িহসােব ব বহার করেত পাির, সটা িনেয় িব ািরত আেলাচনা পােব এখােন।

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

2/2
িবটওয়াই িসভ(Bitwise sieve)
shafaetsplanet.com /planetcoding/

শাফােয়ত 11/5/2011

িবটওয়াইজ িসভ াইম সংখ া বর করার জন চিলত অ ালেগািরদম Sieve of Eratosthene এ মমিরর ব বহার অেনক কিমেয় আনা যায়! সাধারণ িসেভ N পয
াইম জনােরট করেল N সাইেজর একিট অ াের িডে য়ার করেত হয়। অ েরর িতিট এিলেম একিট কের াগ িহসােব কাজ কের যটা দেখ আমরা বুিঝ একিট সংখ া
াইম নািক কে ািজট। িবটওয়াই িসেভ আমরা াগ িহসােব ইি জার বা বুিলয়ান এর বদেল সরাসির িবট ব বহার করেবা।

এ িটউেটািরয়াল পড়ার আেগ িট িবষয় তামােক জেন আসেত হেব


১. Sieve of Eratosthene এর সাধারণ ভাসণ,তুিম এটা আমার এই পা িট পেড় িশখেত পারেব সহেজই।

২. িস/িস++ এ িবটওয়াই অপােরটেরর ব বহার। এটাও খুব সহেজ িশখেত পারেব এখান থেক। িটউেটািরয়ালিটর ১ম ২িট অংশ খুব ভােলা কের পেড় ফেলা,িবটমা
িডিপ,িবএফএস যখন িশখেব তখন অেনক কােজ লাগেব।

আশা কির এখন তুিম িবটওয়াই অপােরটর স েক অেনক িকছু জােনা,সাধারণ িসভ িলখেত কােনা সমস া হয়না তামার। এবার আমরা িশখেবা িবটওয়াইজ িসভ।

সাধারণ িসেভ status বা flag অ ােরটার কাজ িক? এই অ ােরর ইনেডে র মান দেখ আমরা বলেত পাির একিট সংখ া াইম িকনা। ধরলাম তামার status অ ােরটা
ইি জার টাইেপর। িতিট ইি জােরর মধ আেছ ৩২িট িবট। আমরা কেনা এত েলা িবট ব বহার করেবা খািল ০ বা ১ িনেদশ করেত? আমরা অ ােরর যেকােনা ইনেডে র
িতিট িবট িদেয় একিট সংখ া িনেদশ করেত পাির।

তুিম যখন ইি জার অ ােরেত ১-৭ পয াইম জনােরট কর, তামার অ ােরর অব া বাইনািরেত থােক এরকম:

C++

1 status[১]=০০০........০০(৩২িট শূ ন )
2 status[২]=০০০........০১(৩১িট শূ ন ,১িট ১)
3 status[৩]=০০০........০১(৩১িট শূ ন ,১িট ১)
4 status[৪]=০০০........০০(৩২িট শূ ন )
5 status[৫]=০০০........০১(৩১িট শূ ন ,১িট ১)
6 status[৬]=০০০........০০(৩২িট শূ ন )
7 status[৭]=০০০........০১(৩১িট শূ ন ,১িট ১)

িতিট ইনেডে ৩১িট িবট কােনা কােজ লাগেছনা অথচ এই িবশাল সংখ ক অব ব ত িবট আমরা সহেজই কােজ লাগােত পাির। আমরা ধের িনেবা:

C++

1 status[০] এর
2 >>> শূ ন তম িবট ০ এর াইমািলিট িনেদশ কের (সবেথেক ডােনর িবট==০ তম িবট)
3 >>> ১ম িবট ১ এর াইমািলিট িনেদশ কের (সবেথেক ডােনর িবট==০ তম িবট)
4 >>> ২য় িবট ২ এর াইমািলিট িনেদশ কের
5 >>> ৩য় িবট ৩ এর াইমািলিট িনেদশ কের
6 .........................
7 >>> ৩১তম িবট ৩১ এর াইমািলিট িনেদশ কের
8
9 status[১] এর
10 >>> শূ ন তম িবট ৩২ এর াইমািলিট িনেদশ কের
11 >>> ১ম িবট ৩৩ এর াইমািলিট িনেদশ কের
12 ...............
13
14 status[২] এর
15 >>> শূ ন তম িবট ৬৪ এর াইমািলিট িনেদশ কের
16 >>> ১ম িবট ৬৫ এর াইমািলিট িনেদশ কের

তাহেল ১-৭ পয াইম জনােরট করেল তামার অ ােরর অব া দাড়ােব:


1/3
status[১]= ০০০০…….১০১০১১০০( মাট ৩২িট িবট) (সবেথেক ডােনর িবট==০ তম িবট)

৭িট সংখ ার কাজ একিট ইনেডে ই শষ!!। ধু ৭িট নয়,আসেল ৩১িট সংখ ার কাজ শষ হেব ১িট ইনেড (কারণ িত ইনেডে র ৩১িট িবট ব বহার করিছ আমরা)।
এখন হেলা কােনা সংখ ার াইমািলিট কত ন র ইনেডে র কত ন র িবট িদেয় িনেদশ করা হেব? খুব সহজ, সংখ ািট i হেল i/৩২ ন র ইনেডে র i%৩২ ন র িবট
আমােদর চক করেত হেব। তাহেল i=১ হেল চক করেবা ০ ন র ইনেডে র ১ ন র িবট, i=৩৩ হেল চক করেবা ১ ন র ইনেডে র ১ ন র িবট ইত ািদ। ( ন বসড
ইনেডি ং)

কািডং অংশ একদম সহজ। তুিম যেহতু িবটওয়াজ অপােরটেরর ব বহার জােনা, কােনা সংখ ার pos তম িবেট ১ বা ০ আেছ নািক সহেজই চক করেত পারেব। pos তম
িবেট িনেজর ই ামত ১ বা ০ বসােতই পারেব। আমােদর এখােন ০ বসােনা দরকার নই,১ বসােত পারেলই চলেব। িট ফাংশন িলেখ ফিল:

C++

1 bool Check(int N,int pos){return (bool)(N & (1<<pos));}


2 int Set(int N,int pos){ return N=N | (1<<pos);}

এবার িসভ িলেখ ফিল:

C++

1 int N =100,prime[100];
2 int status[100/32];
3 void sieve()
4 {
5 int i, j, sqrtN;
6 sqrtN = int( sqrt( N ) );
7 for( i = 3; i <= sqrtN; i += 2 )
8 {
9 if( check(status[i/32],i%32)==0)
10 {
11 for( j = i*i; j <= N; j += 2*i )
12 {
13 status[j/32]=Set(status[j/32],j % 32) ;
14 }
15 }
16 }
17 puts("2");
18 for(i=3;i<=N;i+=2)
19 if( check(status[i/32],i%32)==0)
20 printf("%d\n",i);
21 }
22

ল কেরা,আমরা সাধারণ িসেভর মত কেরই সব িলেখিছ,তেব status[i] এর মান চক করার বদেল status[i/32] এর i%32 ন র িবেটর মান চক কেরিছ।
িবটওয়াইজ িসভ ব বহার কের ১০^৮ পয াইম তুিম জনােরট কের ফলেত পারেব। সাধারণ িসেভর থেক সময় + মমির কম লাগেব। সাধারণ ণ,ভাগ অপােরশেনর
থেক িবেটর অপােরশন েলা ত কাজ কের। আমরা আেরা িকছু অপিটমাইেজশন করেত পাির। যমন তুিম উপের দয়া িটউেটািরয়াল পেড় থাকেল জােনা য কাওেক ২ িদেয়
ণ করা আর সংখ ািটর বাইনািরেক ১ ঘর বােম িশফট করা একই কথা। আবার ২ িদেয় ভাগ করা আর ১ ঘর ডােন িশফট করা একই কথা,৩২ িদেয় mod করা আর ৩১ িদেয়
AND করা একই কথা। তাহেল আমরা িনেচর মত কের কাডিট িলখেত পাির:

C++

2/3
1 int status[(mx/32)+2];
2 void sieve()
3 {
4 int i, j, sqrtN;
5 sqrtN = int( sqrt( N ) );
6 for( i = 3; i <= sqrtN; i += 2 )
7 {
8 if( Check(status[i>>5],i&31)==0)
9 {
10 for( j = i*i; j <= N; j += (i<<1) )
11 {
12 status[j>>5]=Set(status[j>>5],j & 31) ;
13 }
14 }
15 }
16 puts("2");
17 for(i=3;i<=N;i+=2)
18 if( Check(status[i>>5],i&31)==0)
19 printf("%d\n",i);
20 }
21

ফাংশন ব বহার না কের ম াে া ব বহার করেল আেরা কম সময় লাগেব। া ািমং কনেটে খুব কমই িবটওয়াইজ িসভ ব বহার করা দরকার হয়,সাধারণ িসেভই কাজ চেল।
তারপেরও এটা িশখেল িবেটর কনেস েলা িকছুটা পির ার হেব,অন কােনা বেলেম হয়েতা মমির কিমেয় ফলেত পারেব। ডাইনািমক া ািমং এ আমরা ায়ই
িবটমাে র ব বহার কির মূলত মমির কমােনার জন ।

তামার ইি েমে শন সিঠক নািক চক করেত িনেচর সমস ািট সমাধান কের ফেলা:
http://www.spoj.pl/problems/TDPRIMES/

( নাট: অেনেকর ভূ ল ধারণা আেছ য bool টাইেপর ভ ািরেয়বেলর আকার ১িবট। আসেল bool এর আকার ৮িবট বা এক বাইট,char এর সমান। এর কারণ হেলা
কি উটার ১ বাইেটর ছােটা মমির সগেম েক অ াে স করেত পােরনা, তাই ভ ািরেয়বেলর নূন তম আকার ১ বাইট)

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
কি েনেটাির : অ াের েম এবং িড- র েম গণনা
shafaetsplanet.com /planetcoding/

শাফােয়ত 5/8/2013

কনেট া ািমং এর একটা দা ণ ব াপার হেলা কনেটে েদর ধু ভােলা া ািমং জানেলই হয়না, সােথ ভােলা গিণতও জানা দরকার হয়। িবেশষ কের কি েনটির আর
াবািবিলিটেত ভােলা ধারণা থাকেল অেনক ধরেণর বেলম সলভ কের ফলা যায়।

৪িট টুিপ পাশাপািশ সাজােনা আেছ, টুিপ েলােক যথা েম ১,২,৩,৪ সংখ া েলা িদেয় িচ দয়া হেয়েছ। এখন টুিপ েলােক এেলােমেলা কের কতভােব সাজােনা যােব? আমরা কেয়কভােব
সািজেয় চ া কির:

১,২,৩,৪
১,৩,২,৪
১,৪,২,৩
১,৩,৪,২
…….
……
৪,৩,২,১

মাট কতভােব সাজােনা যােব? কেলেজ কের আসা অংক থেক তুিম সহেজই বলেত পারেব factorial(৪)=২৪factorial(৪)=২৪ ভােব সাজােনা যায়। এটােক আমরা একটু
া ামােরর দ ৃি ভ ী থেক দিখ। ৪টা জায়গা বা ট আেছ, িতিট েট ১িট কের টুিপ বসােনা যায়। এখন থম েট ১,২,৩ বা ৪ এর যেকােনা একটা বসােল:

১,_,_,_

থম েট টুিপ কত ভােব বসােনা যায়? অবশ ই ৪ ভােব। এখন ২য় েট কয়ভােব বসােনা যায়? একটা টুিপ আমরা বিসেয় ফেলিছ আেগরটায়, তাই ২য় েট বসােত পারেবা ৪-১=৩
ভােব। িঠক এভােব ৩য় েট ২ভােব এবং ২য় েট ১ ভােব। তাহেল মাট উপায় ৪×৩×২×১=২৪৪×৩×২×১=২৪ টা। ৪টার জায়গায় nn টা টুিপ থাকেল িক করেত? আমরা া ামার
তাই বারবার ক কের িহসাব না কের ধুম কের একটা ফাংশন িলেখ ফিল। মেন কেরা ফাংশনটা হেলা permutation(n)। n=0n=0 হেল সাজােনা যায় ১ ভােব, তাহেল:

permutation(0)=0permutation(0)=0

n>0n>0 হেল থম েট বসােনা যায় nn ভােব, এরপের সমস াটা ছােটা হেয় দাড়ায় “n−1n−1 টা টুিপ n−1n−1 টা েট কতভােব বসােনা যায়?” অথাৎ সমস াটা
permutation(n−1)permutation(n−1) হেয় যায়। সােথ ণ হেব nn কারণ কাের েট nn ভােব বিসেয়িছ। তাহেল িলখেত পাির:

permutation(n)=n×permutation(n−1)permutation(n)=n×permutation(n−1)

আশা কির ব াপারটা পির ার। সহজ ব াপারটা িনেয় এত কথা বললাম যােত িরকাশনটা পির ার হয় যটা কােজ লাগেব িডের েম গাণার জন ।

এখন ধেরা ১,২,৩,৪ এই ৪টা টুিপর মািলক হেলা যথা েম সািকব, নািসর, তািমম, রিহম। তারা খুবই ভােলা ব ু বেল িঠক করেলা একজন আেরকজেনর টুিপ পেড় ি েকট খলেত যােব।
কও তার িনেজর টুিপ পড়েত পারেবনা, তাহেল ব ু থাকেবনা! এখন কতভােব তারা টুিপ পড়েত পারেব?

গিণেতর ভাষায় এর নাম িডের েম , এমন কয়িট পারমুেটশন আেছ যখােন কও তার িনেজর জায়গায় নই।

১,৩,২,৪ িড- র েম নয় কারন সািকব আর রিহম তােদর িনজ িনজ টুিপই পেড় আেছ(১ ও ৪ ন র) ! ২,১,৪,৩ একিট িড- র েম , সবাই তার ব ু র টুিপ পেড়েছ।

আমরা একটা ফাংশন বানােবা d(n)d(n) যটা nn টা টুিপ কতভােব সাজােনা যায় যােত কও তার িনেজর টুিপ না পায় সটা বর কের দয়।

থম মানুষ সািকেবর কােছ ৪-১=৩টা চেয়স আেছ, স ১ ন র বােদ যেকােনা টুিপ িনেত পাের। মেন করলাম স তািমেমর টুিপ িনেলা। এখন ২টা ঘটনা ঘটেত পাের:

1/3
১. পেরর বার তািমম িনেলা সািকেবর টুিপ। এখন ৪-২=২ জন মানুষ বািক, টুিপও বািক িঠক ৪-২=২ টা।

২. পেরর বার তািমম সািকব ছাড়া অন কােরা টুিপ িনেলা। এখন মানুষ বািক ৪-১=৩ জন। তািমম যেহতু সািকেবর টুিপ িনে না তাই ওটােকই তার িনিষ টুিপ ধরেত
হেব, আর বািক সবার কােছ িনিষ টুিপ হেলা তার িনেজর টুিপটা। তাহেল এখন ৪-১=৩ জন মানুেষর জন ৪-১=৩ টা কের চেয়স আেছ। ল কেরা

ই ে ই মানুষ আর টুিপর সংখ া সমান থাকেছ। ৪ এর জায়গায় n ধের ২টা কি শন িমিলেয় সহেজই িরকািসভ িরেলশনটা িলখেত পাির:

d(n)=(n−1)∗(d(n−1)+d(n−2))d(n)=(n−1)∗(d(n−1)+d(n−2))
বস কস: d(1)=0,d(2)=1d(1)=0,d(2)=1

এই িরকাসনটা কাড করার সময় মাথায় রাখেত হেব য একই ফাংশন অেনকবার কল হে ,তাই িডিপ টিবেল মান েলা সভ কের রাখেত হেব। তুিম ডাইনািমক া ািমং িনেয় পড়ােলখা
করেত পােরা এ স েক জানেত।

এবার আেরকটা মজার উপােয় বেলমটা সলভ কির। nCrnCr বা (nr)(nr) এর সােথ তামরা পিরিচত, nn টা িজিনস থেক rr িট িজিনস কতভােব নয়া যায় সটাই কাশ কের
(nr)(nr) । nn টা টুিপেক মাট সাজােনা যায় nn! উপায়। এর মেধ যসব পারমুেটশেন অ ত একিট টুিপ িনেজর জায়গায় আেছ তােদর বাদ িদেল িডের েম পাওয়া যায়। nn িট
টুিপ থেক ১ িট টুিপ নয়া যায় (n1)(n1) উপােয়, ১িট টুিপেক িনেজর জায়গায় রেখ বািক n−1n−1 টা টুিপেক সাজােনা যায় (n−1)!(n−1)! উপােয়। তাহেল
n!−(n1)×(n−1)!n!−(n1)×(n−1)! বর করেলই িডের েম বর হেয় যাে না? কারণ আমরা মাট উপায় থেক যসব পারমুেটশনেক অ ত ১ জন িনেজর জায়গায় আেছ
তােদর বাদ িদি । (n1)(n1) িদেয় ণ িদি কারণ িতবার ১জন ক িফ ড কের n−1n−1 জনেক পারমুেটশন করেতিস।

িক এখােন একটা বড় সমস া আেছ। ধেরা তুিম তািমেমর টুিপেক তািমেমর কােছই রেখ বািক টুিপ েলা কয়ভােব সাজােনা যায় বর করেল। আবার নতুন কের সািকেবরটা সািকেবর কােছ
রেখ বািক েলা কয়ভােব সাজােনা যায় বর করেল। ভােলামত িচ া কের দখ যসব পারমুেটশেন সািকেবরটা সািকেবর কােছ আেছ আর তািমেমরটা তািমেমর কােছ আেছ স েলা িক
২বার গণনা করা হেয় গেলা না? (n1)×(n−1)!(n1)×(n−1)! এ এই কারেণ িকছু পারমুেটশন একািধক বার ক ালকু েলট করা হেয় যােব। স েলা আমরা িকভােব বাদ িদেবা?
আমরা ১টা সংখ া িফ ড কের যখন েনিছ তখন যসব পারমুেটশেন ২টা সংখ া িফ ড স েলা একািধক বার েণ ফেলিছ, স েলা আমরা বাদ িদেয় দই।
(n1)×(n−1)!(n1)×(n−1)! থেক বাদ িদেয় িদেবা (n2)×(n−2)!(n2)×(n−2)! । একটু িচ া করেল বুঝেত পারেব এখােনও সমস া আেছ, যখােন ৩টা িফ ড স েলােকও
2/3
আমরা বাদ িদেয় িদি !! তাহেল সটা আবার যাগ কের দাও। মাথা িলেয় গেল ভ ান ডায়া ােমর কথা িচ া কেরা:

ভ ান ডায়া ােম ৩টা অংেশর কমন এিরয়া বর করেত আমরা সব েলা অংশ যাগ কির, তারপর যসব অংশ িট বুে আেছ স েলা বাদ দই, য েলা ৩িট বেৃ আেছ স েলা আবার
যাগ কের দই, ব ৃ আেরা বিশ থাকেল এভােব যাগ িবেয়াগ চলেতই থােক। িট সট A,BA,B হেল |A∪B|=|A|+|B|−|A∩B||A∪B|=|A|+|B|−|A∩B|। িঠক এই
কাজিট করেবা এখােন। আমােদর ফমূলা হেব:

n!−(n1)×(n−1)!+(n2)×(n−2)!−..…+(−1)k×(nk)×(n−k)!+….+(−1)nn!−(n1)×(n−1)!+(n2)×(n−2)!−..…+(−1)k×(nk)×(n−k)!+….+(−1)n

আমরা একবার যাগ করিছ, একবার িবেয়াগ করিছ, এভােব অ েয়াজনীয় অংশ বাদ িদেয় ফলাফল পেয় যাি । এ িজিনসটারই রাশভারী নাম হেলা ইন ু শন-এ ু শন ি ি পাল।

আজ এ পয ই। সলভ করার জন বেলম:


www.topcoder.com/stat?c=problem_statement&pm=2013
http://uva.onlinejudge.org/external/112/11282.html
http://www.lightoj.com/volume_showproblem.php?problem=1095

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
াবািবিলিট: এ েপে ড ভ ালু
shafaetsplanet.com /planetcoding/

শাফােয়ত 2/25/2017

মেন কেরা তুিম লুডু খলেত িগেয় একটা ডাইস বা ছ া িনেয় রাল করেছা। এখন তামার যেকােনা একটা সংখ া পাবার াবািবিলিট কত? বিসক াবািবিলিট যিদ জেন
থােকা তাহেল তুিম সহেজই বলেত পারেব য উ রটা হেলা 1616। াবািলিট 1616 এর মােনটা কী এখােন? এর মােন হেলা, তুিম যিদ ছ াটা িনেয় অসীম সংখ কব বার
খলেত থােকা তাহেল ছয় ভােগর এক ভাগ বার তুিম 11 পােব, অন আেরকভাগ বার তুিম 22 পােব, অন আেরকভাগ বার তুিম 33 পােব ইত ািদ। যমন তুিম 600600
বার খলেল, 11 থেক 66 পয িতটা সংখ া 100100 বার কের পােব। এটােতা গেল গািণিতক িহসাব, বা েব 600600 বার খলেত গেল দখা যােব িতটা
100100 বার না পেয় হয়েতা িকছুটা কমেবিশ হেব। িক তুিম যত বিশবার খলেব তত সংখ া েলা 66 ভােগর 11 ভােগর খুব কাছাকািছ চেল আসেব, অসীমবার
খলেল আমরা ধের িনেত পাির য িতটা সংখ া সমান সংখ কবার কের পােব কারণ িতটা সংখ া আসার াবািবিলিট একই।

এখন হেলা, ছ া িদেয় যিদ আমরা অসীমসংখ ক বার খিল তাহেল য সংখ া েলা পােবা তার গড় মান কত? এটােকই বেল এ েপে ড ভ ালু। কােনা একটা
এ েপিরেম অসীম সংখ ক বার করা হেল গেড় য ফলাফলটা পাওয়া যায় সটার নামই এ েপে ড ভ ালু। একটা ছ ার সব েলা সংখ ার যাগফল হেলা
1+2+3+4+5+6=211+2+3+4+5+6=21 এবং যেকােনা সংখ া পাবার াবািবিলিট 1616। এ েপে ড ভ ালু বর করেত হেল সরাসির সব সংখ া যাগ না
কের িতটা সংখ া সােথ সই সংখ া পাবার াবািবিলিট ণ কের িদেত হেব। এই ে এ েপে ড ভ ালু হেব
1⋅16+2⋅16+3⋅16+4⋅16+5⋅16+6⋅16=16(1+2+3+4+5)=3.51⋅16+2⋅16+3⋅16+4⋅16+5⋅16+6⋅16=16(1+2+3+4+5)=3.5।
তারমােন তুিম অসীম সংখ কবার খলেল গেড় িতবার তুিম 3.53.5 পােব। এখােন ল করার মেতা ব াপার হেলা, আমােদর ছ ায় 3.53.5 কাথায় লখা নই, এটা হেলা
অসীম সংখ ক বার এ েপিরেম কের া গড় মান।

তুিম যিদ গিণত বাদ িদেয় িনেজর মত কের ভােবা তাহেলও ব াপারটা সহেজই বুঝেত পারেব, 3.53.5 হেলা 11 থেক 66 এর িঠক মােঝর সংখ া, যেকােনা সংখ া পাবার
াবািবিলিট যখন সমান, অসীমবার খলেল গেড় মাঝখােনর সংখ াটা পাওয়াইেতা াভািবক।

এখন মেন কেরা কােনা কারেণ ছ ার িকছু পাশ ভারী, িকছু পাশ হালকা, তাই িতটা
সংখ া পাবার াবািবিলিট একই না। িতবার ছুেড় মারেল x পাবার াবািবিলিট হেলা
p(x)p(x) এবং অবশ ই
p(1)+p(2)+…+p(6)=1p(1)+p(2)+…+p(6)=1। তাহেল এ েপে ড
ভ ালু কত হেব? খুবই সহজ, আেগর বার িতটা সংখ ার সােথ 1616 ণ কেরেছা,
এবার x এর সােথ ণ করেব p(x)p(x)। এ েপে ড ভ ালু তাহেল হেব
E=p(1)∗1+p(2)∗2+…+p(6)∗6E=p(1)∗1+p(2)∗2+…+p(6)∗6।

আমরা একটা সাধারণ ফমূলা বর করার চ া করিছ যা সবসময় কােজ লাগেব। যিদ ছ ায় ৬িট পাশ না থেক nn টা পাশ থােক তাহেল িক হেব? তাহেল ছ া শ টা ব বহার
করা যােব না, ডাইস বলেত হেব! তেব এ েপকেটড ভ ালুর ফমূলায় তমন পিরবতন আসেব না, এখন আমরা যাগ করেবা nn টা টাম।
E=p(1)∗1+p(2)∗2+…+p(n)∗n=∑ni=1p(i)⋅iE=p(1)∗1+p(2)∗2+…+p(n)∗n=∑i=1np(i)⋅i।

আমরা আেরা জনােরলাইেজশন করেত পাির, আমরা এত ণ ধেরিছ nn টা পােশ 11 থেক nn পয িতটা সংখ া একবার কের আেছ। এখন আমরা ধেরা ডাইেসর ii
তম সাইেড য সংখ া লখা আেছ সটা হেলা x(i)x(i) এবং ডাইস ছুেড় মারেল ii তম সাইডটা পাবার াবািবিলিট আেগর মেতাই p(i)p(i)। এখন ফমূলাটা হেব
E=p(1)∗x(1)+p(2)∗x(2)+…+p(n)∗x(1)=∑ni=1p(i)⋅x(i)E=p(1)∗x(1)+p(2)∗x(2)+…+p(n)∗x(1)=∑i=1np(i)⋅x(i)। সহজভােব
বলেত গেল িতটা ii এর জন আমরা ii তম সাইেড য সংখ াটা লখা আেছ সটােক ii তম সাইড পাবার াবািবিলিট িদেয় ণ করিছ এবং সব েলা ণফল যাগ কের
িদি ।

তুিম যখন গিণেতর উপর কােনা একােডিমক বই পড়েব তখন দখেব এ েপে ড ভ ালুর সং ায় উপেরর ফমূলাটাই দয়া আেছ, সােথ Random Variable িনেয় িকছু
কথাবাতা আেছ। আমােদর উদাহরেণ random variable হেলা ডাইেসর গােয় লখা সংখ া যটার মান হেব পাের x(1),x(2),…,x(n)x(1),x(2),…,x(n)। ধু
ডাইস না, যেকােনা এ েপিরেমে র ে ই তুিম উপেরর ফমূলা কােজ লাগােত পারেব।

আমরা এত ণ যা িশখলাম সটা িদেয় কেয়কিট সমস া সমাধান কের ফিল।

সমস া ১:

ধেরা তামার কােছ একটা কেয়ন আেছ, এই কেয়েনরও এক পাশ একটু ভারী, কেয়নটা একবার টস করেল হড পাবার াবািবিলিট 0.40.4 এবং টইল পাবার াবািবিলিট
1−0.4=0.61−0.4=0.6। তুিম কেয়নটা টস করেছা যত ণ না পয হড পাও। হড পাবার জন গেড় (এ েপে ড) তামার কয়বার কেয়ন টস করা লাগেব?

1/3
মেন কেরা য গেড় EE বার কেয়ন টস করেল তুিম হড পােব। এখােন মেন রাখেত হেব, িতটা কেয়ন টস একটা াধীন বা ইি েপে ট ইেভ , তারমােন একবার টস করেল
য ফলাফল পােব তারউপর পরবিত টেসর ফলাফেলর কােনা স ক নই। এখন এ েপিরেমে র ফলাফল আমােদর ইরকম হেত পাের:

তুিম একটা টইল পেয়ছ, একটা টস ন হেলা, তামােক এখেনা গেড় EE বার টস করেত হেব। এ েপে ড ভ ালু 0.4(1+E)0.4(1+E)। িরকাসেনর
ধারণাটা এখােন কােজ লাগেছ।
তুিম একটা হড পেয়ছ, তামার আর টস করা দরকার নই। এ েপে ড ভ ালু (0.6)⋅(1)(0.6)⋅(1)।

সবিমিলেয় গেড় তামােক E=0.4⋅(1+E)+(0.6)⋅(1)E=0.4⋅(1+E)+(0.6)⋅(1) বার কেয়ন টস করেত হেব। এটােক ঘুিরেয় িলখেল আমরা পােবা
1.66671.6667। এরমােন অসীম সংখ কবার এ েপিরেম করেল তুিম গেড় 1.66671.6667 টা টেসর পেরই হড পােব।

সমস া ২:

তামার কােছ একটা কেয়ন আেছ যটা টস করেল হড িকংবা টইল পাবার াবািবিলিট হেলা p(h)p(h) এবং p(t)(t)। পরপর িট হড পেত হেল গেড় (এ েপে ড)
কয়বার টস করেত হেব?

মেন কেরা EE বার টস করেল তুিম পরপর ইিট হড পােব। এখন তুিম যিদ থমবার টইল পাও তাহেল একটা টস ন হেব এবং তামােক গেড় আেরা
p(t)⋅(1+E)p(t)⋅(1+E) বার টস করেত হেব। িক তুিম যিদ থমবার হড পাও তাহেল িট ঘটনা ঘটেত পাের, পেরর বার তুিম টইল পােব এবং আেরা
p(t)⋅(1+E)p(t)⋅(1+E) বার টস করেত হেব, অথবা পেররবার তুিম আেরকটা হড পােব এবং আর টস করা দরকার নই। সব েলা ঘটনা একসােথ করেল এ েপে ড
ভ ালু হেব E=p(h)⋅(1+p(t)⋅(1+E)+p(h)⋅1)+p(t)⋅(1+E)E=p(h)⋅(1+p(t)⋅(1+E)+p(h)⋅1)+p(t)⋅(1+E)। িনেচর ছিবেত আবােরা ব াখ া করা
আেছ সূ টা:

যিদ কেয়নটা ফয়ার কেয়ন হয়, অথাৎ p(h)=p(t)=0.5p(h)=p(t)=0.5 হয় তাহেল EE এর মান হেব 66, তুিম যাচাই কের দখেত পােরা।

এখন হেলা ইিটর বদেল পরপর nn টা হড পেত চাইেল কয়বার টস করেত হেব? এটা তুিম িচ া কের বর কেরা, না পারেল উ র আেছ এই সাইেট।

সমস া ৩:

একটা কেয়ন nn বার টস করা হেল তুিম এ েপে ড কয়িট হড পােব?

থেম িচ া কের যিদ কেয়ন ১বার টস করা হয় তাহেল তুিম গেড় (এ েপে ড) কয়িট হড পােব? 0.5 াবািবিলিট য তুিম ১িট হড পােব, বািক 0.5 াবািবিলিটেত তুিম
একটাও হড পােব না। তাহেল এ েপে ড ভ ালু হেলা 0.5⋅1+0.5⋅0=0.50.5⋅1+0.5⋅0=0.5। এর মােন হেলা তুিম যিদ অসীমসংখ ক বার এ েপিরেম কেরা
এবং িত এ েপিরেমে ১বার কের কেয়ন টস কেরা তাহেল গেড় তুিম িতবার 0.50.5 িট হড পােব।

nn বার টস করেল তামােক এই ভ ালুটাই nn বার যাগ করেত হেব:


(0.5⋅1+0.5⋅0)+(0.5⋅1+0.5⋅0)+…(n times)=n⋅0.5(0.5⋅1+0.5⋅0)+(0.5⋅1+0.5⋅0)+…(n times)=n⋅0.5 । এর মােন হেলা তুিম যিদ
অসীমসংখ ক বার এ েপিরেম কেরা এবং িত এ েপিরেমে nn বার কের কেয়ন টস কেরা তাহেল গেড় তুিম িতবার n×0.5n×0.5 িট হড পােব।

একইরকম আেরকটা সমস া হেলা, nn িট িশ াথী আেছ, েত কেক বলা হেলা 1 থেক 100 এর মেধ একটা সংখ া িলখেত। অসীম সংখ কবার এ েপিরেম টা করা
হেল গেড় কতজন িশ াথী ১ থেক ৯ এর মেধ কােনা একটা সংখ া িলখেব? ধের নাও িতিট সংখ া লখার াবািবিলিট সমান (যিদও বা েব এ েপিরেম টা করা হেল সটা
সিত হেব না, মানুষ িকছু িকছু সংখ ােক বিশ পছ কের!)।

2/3
সমস া ৪:

nn টা হড পেত হেল তামােক এ েপে ড কয়বার কেয়ন টস করেত হেব?

এই সমস াটােক আমরা িরকািসভিল সলভ করেবা। মেন কেরা nn টা হড পেত হেল E(n) বার কেয়ন টস করেত হেব। এখন যিদ একটা হড পাই তাহেল আমার আেরা
n−1n−1 টা কেয়ন লাগেব যার জন আমােক আেরা E(n−1)E(n−1) বার টস করেত হেব। িক যিদ একটা টইল পাই তাহেল আমােক আেরা E(n)E(n) বার টস
করেত হেব।

তাহেল মাট কেয়ন টস করেত হেব E(n)=0.5⋅(1+E(n−1))+0.5⋅(1+E(n))E(n)=0.5⋅(1+E(n−1))+0.5⋅(1+E(n)) বার। এটােক সরল করেল পােব
E(n)=E(n−1)+2E(n)=E(n−1)+2। এখন আমােদর িরকাসন থামােনার জন একটা বস কস দরকার। যিদ আমােদর 0 টা হড লােগ তাহেল আর টস করা
দরকার নই, E(0)=0E(0)=0।

সমস া ৫:

এই সমস াটা ২০১৭’র NCPC কনেটে র ি িলিমনািরেত আিম সট কেরিছলাম। তামার কােছ nn টা বা আেছ, েত সব েলা বা অফ। িতটা মুভ এ তুিম
random একটা বা িসেল করেত পােরা। এখন বা টা যিদ অফ থােক তাহেল তুিম একটা কেয়ন টস করেব, যিদ হড পাও তাহেল বা টা অন করেব, যিদ টইল পাও
তাহেল িকছুই করেব না। আর বা টা যিদ আেগই অন থােক তাহেল সই মুেভ তামার িকছুই করা দরকার নই। এ েপে ড কয়টা মুেভ তুিম সব েলা বা অন করেত
পারেব? কেয়নটা ফয়ার কেয়ন না, িতবার টইল পাবার াবািবিলিট p।

এই বেলমও িরকািসভিল সলভ করেত হেব। তামার মুলত জানা দরকার বতমােন কয়টা বা অন আেছ। ধেরা বতমােন xx টা বা অন আেছ এবং এ েপে ড মুভ লাগেব
e(x) িট। তাহেল অলেরিড অন আেছ এমন বা িসেল করার াবািবিলিট xnxn, সে ে এ েপে ড মুভ লাগেব আেরা \fractxn(1+e(x))\fractxn(1+e(x))
িট। অলেরিড অফ আেছ এমন বা িসেল করার াবািবিলিট n−xnn−xn। সে ে আবার ২িট ঘটনা ঘটেত পাের, pp াবািবিলিটেত তুিম টইল পােব এবং আেরা
e(x)e(x) িট মুভ লাগেব, অথবা 1−p1−p াবািবিলিটেত হড পােব এবং আেরা e(x+1)e(x+1) িট মুভ লাগেব।

সবিমিলেয় ইকুেয়শনটা হেব


e(x)=xn⋅(1+e(x))+n−xn⋅(p⋅(1+e(x))+(1−p)⋅(1+e(x+1))e(x)=xn⋅(1+e(x))+n−xn⋅(p⋅(1+e(x))+(1−p)⋅(1+e(x+1))

এ েপে ড ভ ালু িনেয় আেরা জানেত কাডেশেফর এই আিটেকলিট পড়েত পােরা। াকিটস করার জন lightoj’র াবািবিলিট সকশনটা দেখা।

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3
রিবন-কাপ ি ং ম ািচং
shafaetsplanet.com /planetcoding/

শাফােয়ত 12/1/2016

রিবন-কাপ (Rabin-carp) একিট ি ং ম ািচং অ ালেগািরদম। িট ি ং দয়া থাকেল এই অ ালেগািরদমিট বেল িদেত পাের য ২য় ি ংিট থম ি ং এর সাবি ং িকনা। রিবন-
কাপ রািলং হ াশ টকিনক ব বহার কের ি ং ম ািচং কের। যিদও ি ং ম ািচং এর জন কএমিপ অ ালেগািরদম ব বহার করাই ভােলা, িক রিবন-কাপ শখা পূ ণ মূলত রািলং
হ াশ িকভােব কাজ কের সটা শখার জন ।

এই লখাটা পড়ার আেগ মডুলার অ ািরথেমিটক স েক জেন আসেত হেব।

ি ং ম ািচং করার সময় থম ি ং টােক আমরা বলেবা ট ট (Text) এবং ি তীয়িটেক প াটান (Pattern)। আমােদর কাজ হেলা ট ট এর মেধ প াটান খুেজ বর করা।

থেম আমরা একটা টেফাস অ ালেগািরদেমর কথা ভািব। আমরা ট ট এর িতটা সাবি ং বর কের প াটােনর সােথ িমিলেয় দখেত পাির:

ছিবেত abacbaabacba ট ট এর িভতর acbacb প াটানটা খাজা হে ।

1 function naive_matching(text, pattern){


2 n = text.size()
3 m = pattern.size()
4 for(i = 0; i < n; i++) {
5 for(j = 0; j < m && i + j < n; j++)
6 if(text[i + j] != pattern[j]) break; // mismatch found, break the inner
7 loop
8 if(j == m) // match found
9 }
}

নইভ ি ং ম ািচং অ ালেগািরদেমর কমে ি িট O(n∗m)O(n∗m), যখােন nn হেলা ট ট এর দঘ এবং mm হেলা প াটান এর দঘ ।

আমােদর যিদ িট ি ং তুলনা করার সময় একটা একটা ক াের ার না দেখ ইি জােরর মেতা O(1)O(1) এ তুলনা করেত পারতাম তাহেল আমরা খুব ত ি ং ম ািচং করেত
পারতাম। হ ািশং টকিনক ব বহার কের আমরা ি ং ক ইি জাের পিরণত করেত পাির। রিবন-কাপ অ ালেগািরদম এ সটারই সুিবধা নয়া হেয়েছ।

আমরা যেকান ি ংেক একটা Base-BBase-B সংখ া িহসােব ক না করেত পাির যখােন BB এর মান অ াসিকেত যত েলা ক াের ার আেছ তার সমান বা বড়। তাহেল
আমরা একটা ফাংশন িলখেত পাির যটা ss ক Base-BBase-B সংখ া থেক Base-10Base-10 সংখ ায় পা র করেব। এটাই হেত পাের আমােদর হ াশ ফাংশন:

Hash(s)=s0⋅Bm−1+s1⋅Bm−2+…+sm−1⋅B1+sm−1⋅B0Hash(s)=s0⋅Bm−1+s1⋅Bm−2+…+sm−1⋅B1+sm−1⋅B0

এই ফাংশেন প ারািমটার িহসােব একটা ি ং পাঠােনা হেয়েছ। sisi িদেয় বুঝােনা হেয়েছ ii তম ক াের ােরর অ াসিক ভ ালু। এই হ াশ ফাংশন িদেয় যেকােনা ি ং এর জন িভ
িভ হ াশভ ালু পাওয়া যােব। িক সমস া হেলা ওভারে া, হ াশভ ালুর মান সহেজই ৬৪-িবট এর বড় হেয় যােব। এই জন আমােদরেক হ াশ ভ ালুটােক MM িদেয় ভাগ কের
ভাগেশষ (modulo) িনেত হেব। তাহেলই সংখ াটা MM এর থেক ছােটা হেয় যােব:

Hash(s)=(s0⋅Bm−1+s1⋅Bm−2+…+sm−1⋅B1+sm−1⋅B0)modMHash(s)=(s0⋅Bm−1+s1⋅Bm−2+…+sm−1⋅B1+sm−1⋅B0)modM

িক এইে ে সমস া হেলা একািধক ি ং এর হ াশভ ালু একই হেয় যেত পাের। এই সমস াটােক বলা হয় হ াশ কিলশন (hash collision)। তেব BB এবং MM যিদ
াইম সংখ া হয় এবং MM এর মান অেনক বড় হয় তাহেল কিলশন করার স াবনা খুব কেম যায়। (তেব স াবনা কেম গেলও একদম ণ হেয় যায় না, য জন রিবন কােপরও
worse case complexity O(n∗m)O(n∗m), স কথায় পের আসিছ)

এখন থেমই আমােদর কাজ হেব প াটােনর হ াশ ভ ালু বর করা। এরপর ট ট এর িতটা mm দেঘ র সাবি ং এর জন হ াশভ ালু বর কের
Hash(pattern)Hash(pattern) এর সােথ িমিলেয় দখেত হেব। এখন হেলা িতটা mm দেঘ র সাবি ং এর জন হ াশভ ালু িকভােব বর করেবা? যিদ িতটা
সাবি ং ক তুিম উপেরর হ াশ ফাংশেন পাঠাও তাহেল কমে ি িট হেয় যােব O(n∗m)O(n∗m)। আমােদরেক একটা প িত বর করেত হেব যন ি ং এর উপর ধু একটা লুপ
চািলেয়ই O(n)O(n) এ িতটা mm দেঘ র সাবি ং এর জন হ াশভ ালু বর করা যায়। এখােনই রািলং হ াশ প িত কােজ লাগেব।

মেন কেরা HiHi হেলা ss এর ii তম ইনেডে র হেয়েছ এমন mm দেঘ র ি ং এর হ াশ ভ ালু। তাহেল আমরা িলখেত পাির:

Hi=si⋅Bm−1+si+1⋅Bm−2+…+si+m−1⋅B0Hi=si⋅Bm−1+si+1⋅Bm−2+…+si+m−1⋅B0

1/4
এখন যিদ m=3m=3 হয় তাহেল H0H0 এবং H1H1 ক িলখেত পাির:

Ho=so⋅B2+s1⋅B1+s2Ho=so⋅B2+s1⋅B1+s2

H1=s1⋅B2+s2⋅B1+s3H1=s1⋅B2+s2⋅B1+s3

এখন দেখা H1H1 ক িকভােব H0H0 এর মাধ েম কাশ করা যায়:

H1=((so⋅B2+s1⋅B1+s2)–(so⋅B2))×B+s3H1=((so⋅B2+s1⋅B1+s2)–(so⋅B2))×B+s3
H1=(H0–So∗B2)⋅B+s3H1=(H0–So∗B2)⋅B+s3

সাধারণভােব বলা যায়:

Hi=(Hi−1–Si−1⋅Bm−1)⋅B+si+m−1Hi=(Hi−1–Si−1⋅Bm−1)⋅B+si+m−1

এখন এই সূ ব বহার কের খুব সহেজই O(n)O(n) এ িতটা mm দেঘ র সাবি ং এর হ াশ ভ ালু বর করা যােব। েত থম mm ক াের ােরর জন হ াশভ ালু বর কের
িনেয় এরপর রািলং হ াশ প িতেত বািক েলা বর যােব।

রিবন-কােপর একটা িস++ কাড দিখ:

Rabin-carp
C++

1 //Implementation of Rabin Carp String Matching Algorithm


2 //https://github.com/Shafaet/Programming-Contest-
3 Algorithms/blob/master/Useful%20C%2B%2B%20Libraries/rabin-carp.cpp
4 #include <bits/stdc++.h>
5 using namespace std;
6
7 typedef long long i64;
8
9 //Returns the index of the first match
10 //Complexity O(n+m), this is unsafe because it doesn't check for collisons
11
12 i64 Hash(const string &s, int m, i64 B, i64 M){
13 i64 h = 0 , power = 1;
14 for(int i = m-1;i>=0;i--){
15 h = h + (s[i] * power) % M;
16 h = h % M;
17 power = (power * B)%M;
18 }
19 return h;
20 }
21 int match(const string &text, const string &pattern) {
22 int n = text.size();
23 int m = pattern.size();
24 if(n < m)return -1;
25 if(m == 0 or n == 0)
26 return -1;
27
28 i64 B = 347, M = 1000000000+7;
29
30 //Calculate B^(m-1)
31 i64 power = 1;
32 for(int i=1;i<=m-1;i++)
33 power = (power * B) % M;
34
35 //Find hash value of first m characters of text
36 //Find hash value of pattern
37 i64 hash_text = Hash(text, m, B, M);

2/4
38 i64 hash_pattern = Hash(pattern, m, B, M);
39
40 if(hash_text == hash_pattern){ //returns the index of the match
41 return 0;
42 //We should've checked the substrings character by character here as hash collision might happen
43 }
44
45 for(int i=m;i<n;i++){
46
47 //Update Rolling Hash
48 hash_text = (hash_text - (power * text[i-m]) % M) % M;
49 hash_text = (hash_text + M) % M; //take care of M of negative value
50 hash_text = (hash_text * B) % M;
51 hash_text = (hash_text + text[i]) % M;
52
53 if(hash_text==hash_pattern){
54 return i - m + 1; //returns the index of the match
55 //We should've checked the substrings character by character here as hash collision might happen
56 }
57 }
58 return -1;
59 }
60
61
62 int main() {
63 cout<<match("HelloWorld", "ello")<<endl;
64 return 0;
}

এই কােডর কমে ি িট O(n+m)O(n+m)। িক এখােন একটা বড় সমস া আেছ। যখন hash_text আর hash_pattern িমেল যাে তখন আমরা ধের িনি য
ি ং িট িমেল িগেয়েছ। িক আেগ বেলিছলাম য ভাগেশষ(mod) নয়ার কারেণ একািধক ি ং এর একই হ াশভ ালু আসেত পাের (কিলশন হেত পাের)। স ে এই কাড
ভুল আউটপুট িদেব।

কিলশেনর কারেণ ভুল এড়ােনার একটা উপায় হেলা, যখনই hash_text = hash_pattern হেব তখন আবার লুপ চািলেয় ক াের ার বাই ক াের ার িমিলেয় দখা। িক
সে ে worse case কমে ি িট O(n∗m)O(n∗m) হেয় যাে যটা ট ফােসর কমে ি িটর সমান।

আেরকটা উপায় হেলা ডাবল হ ািশং করা। ডাবল হ ািশং মােন হেলা িভ িভ B এবং M ব বহার কের িতটা ি ং এর জন িট কের হ াশ ভ ালু বর করেবা। সে ে ই
জায়গােতই কিলশেনর স াবনা খুবই কেম যােব। চাইেল ২বােরর বিশও হ ািশং করা যায়। ডাবল হ ািশং করেল া ািমং কনেটে বিশভাগ সময় পার পেয় যাওয়া যােব, িক
বা ব ে এটা খুব একটা ভােলা উপায় না, কারণ কিলশেনর স াবনা কেম গেলও একদম শূ ন হেয় যাে না।

এসব কারেণ রিবন-কাপ ি ং ম ািচং এর জন তমন একটা ব বহার করা হয় না। িক রািলং হ াশ টকিনক অেনক ধরেণর সমস া সমাধান করেত কােজ লােগ য কারেণ আমরা
রিবন-কাপ িশিখ।

িচ া করার জন সমস া:

তামােক িট ি ং s1,s2s1,s2 দয়া আেছ। তামােক এেদর লংেগ কমন সাবি ং এর দঘ বর করেত হেব। অথাৎ সবেথেক বড় ি ং বর করেত হেব যটা িট ি ং এরই
সাবি ং।

সমাধান:

থেম িচ া কেরা যেকােনা ইি জার kk এর জন িক তুিম বর করেত পারেব য kk দেঘ র কােনা লংেগ কমন সাবি ং আেছ নািক। এটা সহেজই O(n)O(n)
কমে ি িটেত বর করা যােব রািলং হ াশ ব বহার কের। s1s1 এর িতটা kk দেঘ র সাবি ং এর হ াশভ ালু বর কেরা, এরপর s2s2 এর িতটা kk দেঘ র সাবি ং এর
হ াশভ ালু বর কেরা। যিদ কােনা হ াশভ ালু কমন থােক তারমােন kk দেঘ র কােনা লংেগ কমন সাবি ং আেছ।

এখন লংেগ কমন সাবি ং এর সেবা দঘ হেত পাের maxlen=min(s1.length,s2.length)maxlen=min(s1.length,s2.length)। এখন তুিম 00
থেক maxlenmaxlen এর উপর বাইনাির সাচ চািলেয় সহেজই সমস াটা সমাধান করেত পারেব। কমে ি িট হেব O(n⋅logn)O(n⋅logn)।

হ ািপ কািডং!

3/4
রফাের : টপেকাডার

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
িডেরকশন অ াের
shafaetsplanet.com /planetcoding/

শাফােয়ত 1/25/2013

অেনক সময়ই এমন বেলম থােক যখােন বলা হয় তুিম একটা ২-িড অ ােরর কােনা এক পিজশেন আেছা, সখান থেক তুিম উপের-িনেচ-বােম-ডােন যেত পারেব। অথবা
দাবার বােড একটা ঘাড়া আেছ, তােক ৮টা িদেক মুভ করােনা যায়, এখন কােনা একটা পিজশেন শেট পােথ যেত হেব। িবিগনার কাডাররা এ ধরেণর বেলেম ছা
একটা ি কস না জানার কারেণ কােডর সাইজ িবশাল বািনেয় ফেল।

িডেরকশন অ ােরর ি কসটা যারা যােননা এ ধরেণর বেলেম তােদর কাড হয় অেনকটা এরকম:

C++

1 int x=5,y=3,row=5,col=5,nx,ny;
2 nx=x+1; ny=y;
3 if(nx>=1 && nx<=row && ny>=1 && ny<=col)
4 {
5 DO SOMETHING
6 }
7 nx=x-1; ny=y;
8 if(nx>=1 && nx<=row && ny>=1 && ny<=col)
9 {
10 DO SOMETHING
11 }
12 nx=x; ny=y+1;
13 ............
14 ............
15 ............

এভােব বারবার একই লাইন িলখেত িলখেত কােডর চহারা ভয়াবহ হেয় যায়, আর কাওেক কাড দখেত িদেল তারও পাগল হবার অব া হয়! ৮ িডেরকশেন মুভ করা
গেলেতা কথাই নই। সবেথেক বড় সমস া হেলা এক জায়গায় চ করেল সবজায়গায় চ করেত হয়।

একটা improvement হেত পাের if(nx>=1 && nx<=row && ny>=1 && ny<=col) এই লাইেনর কি শনটা একটা ম াে া বািনেয় ফলা। যমন:

C++

1 #define valid(nx,ny) nx>=1 && nx<=row && ny>=1 && ny<=col

এখন if(valid) িলখেলই হে । এরপের DO SOMETHING অংেশর কাজ েলাও একটা ফাংশন বািনেয় ফলেল ঝােমলা িকছুটা কেম, এখন খািল ম াে া বা
ফাংশেন চ করেল সব জায়গায় চ হেয় যােব। তারপেরও বার বার কি শন চক বা ফাংশন কল করেত হে আমােদর। এজন আমরা ব বহার করেবা িডেরকশন
অ াের। ৪ িদেক মুভ করা যায় এটার অথ হেলা:

১. current row এর সােথ ১ যাগ এবং current col এর সােথ ০ যাগ


২. current row এর সােথ -১ যাগ এবং current col এর সােথ ০ যাগ
৩. current row এর সােথ ০ যাগ এবং current col এর সােথ ১ যাগ
৪. current row এর সােথ ০ যাগ এবং current col এর সােথ -১ যাগ

তারমােন x,y পিজশন থেক উপের যেত হেল (x,y)+(1,0) করেত হেব, িনেচ যেত (x,y)+(-1,0) করেত হেব, একই ভােব ডােন-বােম যেত যাগ করেত হেব ধু y
এর সােথ।

1/4
আমরা িট অ াের িডে য়ার কির এভােব:

C++

1 int fx[]={+1,-1,+0,+0};
2 int fy[]={+0,+0,+1,-1};

fx[] িদেয় বুঝাি row এর সােথ কত যাগ করেবা এবং fy িদেয় বুঝাি y এর সােথ কত যাগ করেবা। এবার কাজ খুব সহজ হেয় গেলা:

C++

1 #define valid(nx,ny) nx>=1 && nx<=row && ny>=1 && ny<=col


2 int x=5,y=3,row=5,col=5,nx,ny;
3 for(int k=0;k<4;k++)
4 {
5 int nx=x+fx[k]; //Add fx[k] with current row
6 int ny=y+fy[k]; //Add fy[k] with current col
7 if(valid(nx,ny)
8 {
9 DO SOMETHING;
10 }
11 }

তুিম ৮ িদেক যেত চাইেল অ ােরটা হেব এরকম:

C++

1 int fx[]={+0,+0,+1,-1,-1,+1,-1,+1};
2 int fy[]={-1,+1,+0,+0,+1,+1,-1,-1};

একটু িচ া করেলই তুিম দাবার ঘাড়ার মুেভর জেন ও িডেরকশন অ াের িলখেত পারেব। ৩-িড তও এটা কাজ করেব, তখন fx[] নােমর আেরকটা অ াের লাগেব।
তুিম যিদ স ূণ কাড চাও তাহেল এই িবএফএস এর কাডটা দখেত পােরা:

2/4
C++

1 //Problem link:http://acm.timus.ru/problem.aspx?space=1&num=1145
2 #define rep(i,n) for(int i=0; i<(int)n; i++)
3 #define pb(x) push_back(x)
4 #define mem(x,y) memset(x,y,sizeof(x));
5 #define pii pair<int,int>
6 #define pmp make_pair
7 #define uu first
8 #define vv second
9 using namespace std;
10 #define READ(f) freopen(f, "r", stdin)
11 #define WRITE(f) freopen(f, "w", stdout)
12
13 int fx[]={1,-1,0,0};
14 int fy[]={0,0,1,-1};
15 int mr,mc,mx=0;
16 char w[1000][1000];
17 int d[1000][1000];
18 int r,c;
19 void bfs(int x,int y,int dep)
20 {
21 mem(d,63);
22 d[x][y]=0;
23 queue<pii>q;
24 q.push(pii(x,y));
25 while(!q.empty())
26 {
27 pii top=q.front(); q.pop();
28 if(d[top.uu][top.vv]>mx)
29 {
30 mx=d[top.uu][top.vv];
31 mr=top.uu;
32 mc=top.vv;
33 }
34 rep(k,4)
35 {
36 int tx=top.uu+fx[k];
37 int ty=top.vv+fy[k];
38 if(tx>=0 and tx<r and ty>=0 and ty<c and w[tx][ty]=='.' and d[top.uu][top.vv]+1<d[tx][ty])
39 {
40 d[tx][ty]=d[top.uu][top.vv]+1;
41 q.push(pii(tx,ty));
42 }
43 }
44 }
45 }
46 int main(){
47 // READ("in");
48 int sx,sy,cc=0;
49 cin>>r>>c;
50 swap(r,c);
51 rep(i,r)
52 cin>>w[i];
53 rep(i,r)
54 rep(j,c)
55 if(w[i][j]=='.'){sx=i;sy=j;cc++;}
56 bfs(sx,sy,0);
57 mx=0;
3/4
58 bfs(mr,mc,0);
59 if(cc==1) mx=0;
60 cout<<mx<<endl;
61 return 0;
62 }
63
64
65

এই কাডটা ধু িডেরকশন অ ােরর ব বহার দখােনার জন , বেলমটার সিলউশন বর করার কাজ তামার, ি এর ডায়ািমটার বর করেত বলা হেয়েছ বেলমটায়।

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

4/4
িমট ইন দ া িমডল টকিনক
shafaetsplanet.com /planetcoding/

শাফােয়ত 2/2/2014

িমট ইন দ া িমডল খুবই এিলেগ একটা বেলম সলিভং টকিনক। এটার কাজ হেলা বেলমটােক িঠক ইভােগ ভাগ কের ফেল তারপর সই ইভাগেক কােনাভােব মাজ
কের বেলমটা সলভ করা। তেব িডভাইড এ কনেকায়ােরর সােথ এটার পাথক হেলা িডভাইড এ কনেকায়াের ই ভােগ ভাগ করার পর ছাট ভাগ েলােক বারবার ভাগ
করা হয়, িমট ইন দ া িমডেল আমরা ধু একবার ভাগ করেবা।

আমরা িকছু বেলম দখেবা য েলােক িমট ইন দ া িমডেলর সাহােয সলভ করা স ব।

বেলম ১: সাম অফ ফার


(দরকাির নেলজ: বাইনাির সাচ)

তামােক ৪টা nn সাইেজর অ াের A,B,C,D দয়া আেছ। িতটা অ াের থেক এ া িল একটা কের ভ ালু িসেল করেত হেব যন তােদর যাগফল ০ হয়।
যমন n=3n=3 এবং A={1,2,3}, B={-1,-4,-5}, C={1,5,8}, D={9,8,5} হেল 1+(−4)+8−5=01+(−4)+8−5=0 হেত পাের একটা সিলউশন।

সিলউশন-১
থেমই মাথায় য সিলউশন আেস সটা হেলা ৪টা নে ড লুপ চািলেয় সব কি েনশেন সংখ া েলােক যাগ কের দখা। এটার কমে ি িট হেব O(n4)O(n4)। যিদ
n=1000n=1000 হয় তাহেল া ামটা শষ হেত কেয়ক ঘ া লেগ যােব।

আমােদর ৪টা মান a,b,c,da,b,c,d দরকার যােত a+b+c+d=0a+b+c+d=0 হয়। এটােক লখা যায়, (a+b)=−(c+d)(a+b)=−(c+d)। a ভ ালুটা
পােবা A অ াের থেক, b পােবা B অ াের, c পােবা C অ াের থেক এবং d পােবা D অ াের থেক।

এখন িট নে ড লুপ চািলেয় A এবং B অ াের িদেয় যত েলা কি েনশন বানােনা যায় সব েলা বর কের ফিল। তাহেল আমরা সব েলা (a+b) পেয় গলাম। সব েলা
ভ ালুেক সট কের রােখা বা ম ােপ ইনসাট কের রােখা।

আবার িট নে ড লুপ চািলেয় C এবং D অ াের িদেয় যত েলা কি েনশন বানােনা যায় সব েলা বর কির। এখন পলাম সব েলা c+d। িতটা c+d এর জন a+b
খুেজ বর কেরা আেগর সেটড ভ ালুেত বাইনাির সাচ চািলেয় বা ম ােপর মেধ খুেজ।

এখন আমােদর কমে ি িট হেলা O(n2*logn2) । যিদ ভ ালু েলা ছােটা হয় তাহেল ম ােপর জায়গায় সাধারণ বুিলয়ান াগ ব বহার কের O(n 2) এ সলভ করা স ব।

বেলম ২: কেয়ন চ
(দরকাির নেলজ: বাইনাির সাচ, ব াক ািকং অথবা িবটমা ব বহার কের সব েলা সাবেসট জনােরশন)

ধেরা তামার কােছ িকছু কেয়ন আেছ। বলেত হেব এ েলা থেক িকছু কেয়ন ব বহার কের িনিদ একটা ভ ালু তির করা যায় নািক। কােনা কেয়ন একবােরর বিশ ব বহার
করা যােবনা। যমন কেয়ন েলা যিদ হয় ১,৩,৬,১০ তাহেল তুিম ১৩ বা ১১ বানােত পারেব িক ৫০ বা ২ িকছুেতই বানােত পারেবনা। কেয়েনর সংখ া সেবা ৩০টা।

সিলউশন
মেন কির কেয়ন লার মান হেত পাের ১ থেক ১০০ পয । তুিম যিদ ডাইনািমক া ািমং জােনা তাহেল িন য়ই ভাবেছা এটােত খুব সহজ বেলম, সব েলা কেয়েনর ভ ালুর
যাগফল সেবা হেত পাের ৩০*১০০, তাহেল ৩০*(৩০*১০০) কমে ি িটেত খুব সহেজ বেলমটা সলভ করা যােব। এবার আিম বেলমটােক কিঠন কের দই, ধির
কেয়ন েলার ভ ালু হেত পাের ১ থেক ১০^৯। এখন কমে ি িট হেয় গেলা ৩০*(৩০*১০^৯)। এটা ডাইনািমক া ািমং িদেয় সলভ করা স বনা, মমির বা টাইম
কােনাটােতই কুিলেয় উঠেবনা। এখন িক করা যেত পাের? এখােন ল করার িবষয় হেলা কেয়েনর সংখ া অেনক কম!

কেয়েনর সংখ া মা ৩০ হেলও ৩০টা কেয়েনর একটা সেটর সাবেসট সংখ া ২^৩০। তারমােন সেবা ২^৩০টা িভ ভ ালু তির করা যােব কেয়ন েলা িদেয়। তাই
ব াক ািকং কের সব েলা ভ ালু জনােরট করা পিসবল না। িক কেয়ন যিদ ১৫টা হেতা তাহেল ২^১৫=৩২৭৬৮টা সাবেসট থাকেতা এবং সব েলা ভ ালু আমরা জনােরট
করেত পারতাম ব াক াক কের! এই পয পড়ার পর একটু থেম িকছু ণ িচ া কেরা িকভােব বেলমটা সলভ করা স ব। এরপের িনেচর অংশ পেড়া।

আমরা কেয়ন েলােক ই ভােগ ভাগ কের ফিল। িতটা ভােগ আেছ ১৫টা কের কেয়ন। এখন থম ভােগর ১৫টা কেয়ন িনেয় সব েলা ভ ালু জনােরট কের একটা
অ ােরেত রেখ দাও, মেন কির অ ােরটার নাম A। একই ভােব ২য় ১৫টা কেয়ন িনেয় সব েলা ভ ালু জনােরট কের আেরকটা অ ােরেত রেখ দাও, মেন কির অ ােরটার নাম
B। B অ ােরটােক সট কের ফেলা, A ক সট করার দরকার নই।

এখন বািক কাজ সহজ। মেন কেরা তামােক X ভ ালুটা বানােত হেব। A অ ােরর উপর লুপ চািলেয় সব েলা ভ ালু চক কেরা। i তম ভ ালু যিদ হয় A[i] তাহেল তুিম চক
1/3
কেরা B অ ােরেত X-A[i] ভ ালুটা আেছ নািক। যিদ থােক তাহেল তুিম X বানােত পারেব!! B তুিম সট কের রেখেছা, তাহেল বাইনাির সাচ কেরই X-A[i] আেছ নািক চক
করেত পারেব। একটু ভাবেলই বুঝেত পারেব A অ ােরেত থম ১৫টার সবরকম কি েনশন আেছ, তাই X-A[i] ক A ত খাজার কােনা দরকার নাই।

n টা কেয়েনর জন তাহেল কমে ি িট হেব O(2(n/2)*log2(n/2)), কারণ আমরা 2 (n/2) টা ভ ালুর জন বািক অেধেকর উপর বাইনাির সাচ করিছ।

বেলম ৩: বাইিডেরকশনাল সাচ


(দরকাির নেলজ: াফ িথওির)

একটা ােফ িট নাড দয়া আেছ, নাড িটর মেধ শেট পাথ বর করেত হেব।

সিলউশন:
মাটামুিট িনি ত াফ িথওির যারা পােরা তারা মাথা চুলিকেয় ভাবেছা, এটা কােনা বেলম হেলা? িবএফএস িদেয়ইেতা সলভ করা যায়। িক এখােন আমরা িচ া করিছ
িবশাল ােফর কথা যখােন িবিলয়ন িবিলয়ন নাড আর এজ থাকেত পাের।

িবএফএস এ িতটা নাড থেক তার অ াডেজেস নাড েলােত যেত হয়, স েলা থেক আবার তার অ াডেজেস নাড েলােত যেত হয়। িতটা নােডর অ াডেজেস
নাড সংখ ােক বলা হয় নাডটা িড ী। এখন যিদ িতটা নােডর এভােরজ িড ী হয় p আর শেট পাথ যিদ হয় k তাহেল তামােক মাটামুিট O(pk) টা নাড এ ে ার
করেত হেব।

যিদ তুিম সাস আর ডি েনশন ই পাশ থেক সাচ কেরা যত ণনা তারা একসােথ িমলেছ তাহেল কমি ি িট হেয় যােব O(p k/2)। আেগর কেয়ন চ বেলম সলভ
কেরই বুঝেত পারেছা এই অেধক হওয়াটা এ েপােননিশয়াল কমে ি িটর ে এটা খুবই িসগিনিফেক উ িত।

াফ িরেলেটড আেরা িট ই ােরি ং বেলম হেলা:


১. ফসবুেকর ােফ জন ইউজােরর মেধ িমউচুয়াল আেছ নািক বর করেত হেব
২. ধারণা করা হয় সাস াল নটওয়ােক যেকােনা জন মানুেষর দূর সেবা ৬িট নাড। িট ইউজারেনম ইনপুট িদেল িকভােব এটা ভিরফাই করেব?

রফাের : ইনেফা এিরনা


কৃ ত তা: মাহবুবুল হাসান শা ভাইেক ধন বাদ সাম অফ ফার বেলেমর সিলউশেন ভুল ধিরেয় দয়ার জন ।

সলভ করার জন বেলম:


Coin Change(IV)
Sum of Four
Funny Knapsack

কান থাকেল কেমে র ঘের জানাও বা যাগােযাগ কেরা: shafaet[dot]csedu@gmail[dot]com। অনুেরাধ করিছ যেথ িচ াভাবনা আর চ া না কের
2/3
কােনা কাড িডবাগ করেত পাঠােবনা।

হ ািপ কািডং!

AccessPress Staple | WordPress Theme: AccessPress Staple by AccessPress Themes

3/3

You might also like