আমার একমত হতে হবে যে প্রথমবার আপনি কোনও ও (লগ এন) অ্যালগরিদম দেখলে এটি বেশ অদ্ভুত ... পৃথিবীতে সেই লোগারিদম কোথা থেকে এসেছে? যাইহোক, দেখা যাচ্ছে যে বিগ-ও স্বরলিপিতে আপনি লগ টার্ম পেতে পারেন এমন বিভিন্ন উপায় রয়েছে। এখানে কয়েকটি দেওয়া হল:
বারবার একটি ধ্রুবক দ্বারা বিভাজন
যে কোনও সংখ্যা নিন; বলুন, ১.. একটি সংখ্যা কম বা তার সমান পাওয়ার আগে আপনি কতবার n কে দুই দ্বারা ভাগ করতে পারবেন? 16 এর জন্য, আমাদের এটি আছে
16 / 2 = 8
8 / 2 = 4
4 / 2 = 2
2 / 2 = 1
লক্ষ করুন যে এটি শেষ করতে চারটি পদক্ষেপ গ্রহণ শেষ ends মজার বিষয় হল, আমাদের সেই লগটি 2 16 = 4. হুমম ... 128 এর কি?
128 / 2 = 64
64 / 2 = 32
32 / 2 = 16
16 / 2 = 8
8 / 2 = 4
4 / 2 = 2
2 / 2 = 1
এটি সাতটি পদক্ষেপ নিয়েছে এবং লগ 2 128 = 7. এটি কি কাকতালীয় ঘটনা? নাঃ! এর জন্য একটি ভাল কারণ আছে। মনে করুন যে আমরা একটি সংখ্যা 2 দ্বারা 2 বার বার করব। তারপরে আমরা n / 2 নম্বর পেয়েছি i । যদি আমরা এই মানটি সর্বাধিক 1 এর মানের জন্য সমাধান করতে চাই তবে আমরা পাই
এন / 2 আমি ≤ 1
n ≤ 2 i
লগ 2 এন ≤ i
অন্য কথায়, আমরা যদি একটি পূর্ণসংখ্যা বাছাই করি যেমন আমি লগ 2 এন করি, তবে অর্ধেক i টি বারে n ভাগ করে নেওয়ার পরে আমাদের একটি মান হবে যা সর্বনিম্ন 1। যার মধ্যে সবচেয়ে ছোট আমি এটির জন্য গ্যারান্টিযুক্ত মোটামুটি লগ 2 এন, সুতরাং যদি সংখ্যাটি পর্যাপ্ত পরিমাণে ছোট না হওয়া পর্যন্ত আমাদের কাছে একটি অ্যালগরিদম থাকে যা 2 দিয়ে বিভক্ত হয়, তবে আমরা বলতে পারি যে এটি ও (লগ এন) পদক্ষেপে শেষ হয়।
একটি গুরুত্বপূর্ণ বিশদটি হ'ল আপনি যে ধ্রুবকটি দ্বারা n কে ভাগ করছেন (যতক্ষণ না এটি একের চেয়ে বড়) ততই গুরুত্বপূর্ণ নয়; আপনি যদি ধ্রুবক কে দ্বারা ভাগ করেন তবে এটি লগ কে এন পদক্ষেপ গ্রহণ করবে 1 টি পৌঁছাতে Thus সুতরাং কোনও অ্যালগরিদম যা বারবার কিছু ভগ্নাংশ দ্বারা ইনপুট আকারকে ভাগ করে দেয় তার অবসানের জন্য O (লগ এন) পুনরাবৃত্তি প্রয়োজন। এই পুনরাবৃত্তির জন্য অনেক সময় লাগতে পারে এবং তাই নেট রানটাইমটি ও (লগ এন) হওয়া দরকার না, তবে পদক্ষেপের সংখ্যা লোগারিথমিক হবে।
তাহলে এটি কোথায় আসে? একটি ক্লাসিক উদাহরণ বাইনারি অনুসন্ধান , একটি মানের জন্য বাছাই করা অ্যারে অনুসন্ধানের জন্য একটি দ্রুত অ্যালগরিদম। অ্যালগরিদম এইভাবে কাজ করে:
- অ্যারেটি যদি খালি থাকে তবে ফিরে আসুন যে উপাদানটি অ্যারেতে উপস্থিত নেই।
- অন্যথায়:
- অ্যারের মাঝারি উপাদানটি দেখুন।
- এটি আমরা যে উপাদানটির সন্ধান করছি তার সমান হলে সাফল্য ফিরে আসুন।
- এটি যদি আমরা যে উপাদানটির সন্ধান করছি তার চেয়ে বেশি হলে:
- অ্যারের দ্বিতীয়ার্ধটি ফেলে দিন।
- পুনরাবৃত্তি
- এটি যদি আমরা যে উপাদানটির সন্ধান করছি তার চেয়ে কম হলে:
- অ্যারের প্রথমার্ধটি ফেলে দিন।
- পুনরাবৃত্তি
উদাহরণস্বরূপ, অ্যারেতে 5 অনুসন্ধান করা
1 3 5 7 9 11 13
আমরা প্রথমে মাঝারি উপাদানটি দেখতে চাই:
1 3 5 7 9 11 13
^
যেহেতু 7> 5, এবং অ্যারে বাছাই করা হয়েছে তাই আমরা একটি সত্যের জন্য জানি যে 5 সংখ্যাটি অ্যারের পিছনের অর্ধে থাকতে পারে না, তাই আমরা কেবল এটি বাতিল করতে পারি। এই পাতার
1 3 5
সুতরাং এখন আমরা এখানে মাঝারি উপাদান তাকান:
1 3 5
^
3 <5 থেকে, আমরা জানি যে অ্যারের প্রথমার্ধে 5 উপস্থিত হতে পারে না, তাই আমরা প্রথমার্ধের অ্যারে ছেড়ে দিতে পারি
5
আবার আমরা এই অ্যারের মাঝখানে তাকান:
5
^
যেহেতু এটি আমরা ঠিক খুঁজছি এমন নম্বর, তাই আমরা জানাতে পারি যে 5 আসলে অ্যারেতে রয়েছে।
তাহলে এটি কতটা দক্ষ? ঠিক আছে, প্রতিটি পুনরাবৃত্তির উপর আমরা বাকি অ্যারে উপাদানগুলির কমপক্ষে অর্ধেকটি ফেলে দিই। অ্যারেটি খালি হওয়ার সাথে সাথে অ্যালগোরিদম থমকে যায় বা আমরা যে মানটি চাই তা পাই। সবচেয়ে খারাপ ক্ষেত্রে, উপাদানটি নেই, সুতরাং উপাদানগুলি শেষ না হওয়া পর্যন্ত আমরা অ্যারের আকার অর্ধেক রেখে চলেছি। এটি কতক্ষণ সময় নেয়? ঠিক আছে, যেহেতু আমরা অর্ধেক বার বার অ্যারে কাটতে থাকি, তাই আমরা বেশিরভাগ ও (লগ এন) পুনরাবৃত্তিতে সম্পন্ন হব, যেহেতু আমরা চালানোর আগে আর (অর্ধেক) এর চেয়ে অর্ধেকের বেশি অ্যারে কাটাতে পারি না অ্যারের উপাদানগুলির বাইরে।
বিভাজন এবং বিজয়ের সাধারণ কৌশল অনুসরণ করে অ্যালগরিদমগুলি (সমস্যাটিকে টুকরো টুকরো করে কেটে ফেলা, সেই সমস্যাগুলি একত্রে সমাধান করা, আবার সমস্যাটিকে আবার একসাথে রেখে দেওয়া) একই কারণে তাদের মধ্যে লোগারিথিক পদ থাকতে পারে - আপনি কিছু বস্তুকে কাটতে পারবেন না ও (লগ এন) বারের চেয়ে অর্ধেক বেশি। আপনি এর এক দুর্দান্ত উদাহরণ হিসাবে মার্জ সাজ্টে দেখতে চাইতে পারেন ।
প্রক্রিয়াকরণ এক সময় এক অঙ্কের মান
বেস -10 নম্বর এন এ কতগুলি সংখ্যা রয়েছে? ঠিক আছে, যদি সংখ্যায় কে ডিজিট থাকে, তবে আমাদের কাছে সবচেয়ে বড় সংখ্যাটি 10 কে এর একাধিক । বৃহত্তম কে-অঙ্কের সংখ্যাটি 999 ... 9, কে গুন, এবং এটি 10 কে + 1 - 1 সমান is ফলস্বরূপ, আমরা যদি জানি যে এর মধ্যে n এর সংখ্যা রয়েছে, তবে আমরা জানি যে n এর মান হয় সর্বাধিক 10 কে + 1 - 1. আমরা এন এর ক্ষেত্রে কে এর জন্য সমাধান করতে চাইলে আমরা পাই
n ≤ 10 কে + 1 - 1
n + 1 ≤ 10 কে + 1
লগ 10 (এন + 1) ≤ কে + 1
(লগ 10 (এন + 1)) - 1 ≤ কে
যা থেকে আমরা পেয়েছি যে কে প্রায় এন এর বেস -10 লোগারিদম। অন্য কথায়, n এর সংখ্যার সংখ্যা হ'ল ও (লগ এন)।
উদাহরণস্বরূপ, আসুন দুটি বড় সংখ্যক যুক্ত করার জটিলতা সম্পর্কে চিন্তা করি যা কোনও মেশিন শব্দের সাথে ফিট করার জন্য খুব বড়। মনে করুন যে আমাদের 10 নম্বর বেসে প্রতিনিধিত্ব করা আছে, এবং আমরা সংখ্যাগুলি এম এবং এন কল করব। এগুলি যুক্ত করার একটি উপায় হ'ল গ্রেড-স্কুল পদ্ধতির মাধ্যমে - একবারে এক অঙ্কের বাইরে সংখ্যা লিখুন, তারপরে ডান থেকে বাম দিকে কাজ করুন। উদাহরণস্বরূপ, 1337 এবং 2065 যুক্ত করার জন্য, আমরা সংখ্যাগুলি লিখে লিখে শুরু করব
1 3 3 7
+ 2 0 6 5
==============
আমরা শেষ সংখ্যাটি যুক্ত করি এবং 1:
1
1 3 3 7
+ 2 0 6 5
==============
2
তারপরে আমরা দ্বিতীয় থেকে শেষের ("পেনাল্টিমেট") অঙ্কটি যুক্ত করব এবং 1টি বহন করব:
1 1
1 3 3 7
+ 2 0 6 5
==============
0 2
এরপরে, আমরা তৃতীয় থেকে শেষ ("অ্যান্টিপেনলিটমেট") অঙ্কটি যুক্ত করব:
1 1
1 3 3 7
+ 2 0 6 5
==============
4 0 2
অবশেষে, আমরা চতুর্থ থেকে শেষের ("প্রাক-পূর্বপরিচয়" ... আমি ইংরাজিকে ভালবাসি) সংখ্যা যুক্ত করি:
1 1
1 3 3 7
+ 2 0 6 5
==============
3 4 0 2
এখন, আমরা কত কাজ করেছি? আমরা প্রতি ডিজিটে মোট ও (1) কাজ করি (এটি ধ্রুব পরিমাণ কাজের কাজ), এবং সেখানে ও (সর্বোচ্চ {লগ এন, লগ এম}) মোট অঙ্ক রয়েছে যাতে প্রক্রিয়া করা প্রয়োজন। এটি মোট ও (সর্বোচ্চ {লগ এন, লগ এম}) জটিলতা দেয় কারণ আমাদের দুটি সংখ্যায় প্রতিটি অঙ্ক দেখতে হবে।
অনেক অ্যালগরিদম কোনও বেসে একবারে এক ডিজিট কাজ করা থেকে সেগুলিতে একটি ও (লগ এন) শব্দ পান। একটি সর্বোত্তম উদাহরণ হ'ল রেডিক্স সাজান , যা একসাথে এক অঙ্কের সংখ্যাকে সাজায় । র্যাডিক্স সাজানোর অনেক স্বাদ রয়েছে, তবে এগুলি সাধারণত ও (এন লগ ইউ) সময়ে চালিত হয়, যেখানে ইউ সবচেয়ে বড় সম্ভাব্য পূর্ণসংখ্য যা সাজানো হচ্ছে orted এর কারণ হ'ল ধরণের প্রতিটি পাসে ও (এন) সময় লাগে এবং সর্বাধিক সংখ্যক ও (লগ ইউ) সংখ্যার বাছাইয়ের জন্য মোট ও (লগ ইউ) পুনরাবৃত্তি প্রয়োজন। অনেক উন্নত অ্যালগরিদম, যেমন গ্যাবোর সবচেয়ে সংক্ষিপ্ত-পাথ অ্যালগরিদম বা ফোর্ড-ফুলকারসন সর্বাধিক-প্রবাহ অ্যালগরিদমের স্কেলিং সংস্করণে তাদের জটিলতায় লগ শব্দ রয়েছে কারণ তারা একবারে এক ডিজিট কাজ করে।
আপনি কীভাবে এই সমস্যাটি সমাধান করেন সে সম্পর্কে আপনার দ্বিতীয় প্রশ্ন হিসাবে, আপনি এই সম্পর্কিত প্রশ্নটি দেখতে চাইতে পারেন যা আরও উন্নত অ্যাপ্লিকেশনটি আবিষ্কার করে। এখানে বর্ণিত সমস্যার সাধারণ কাঠামো দেওয়া, আপনি এখন সমস্যার ফলস্বরূপ একটি লগ টার্ম আছে জানেন যখন কীভাবে চিন্তা করবেন সে সম্পর্কে আরও ভাল ধারণা অর্জন করতে পারেন, সুতরাং যতক্ষণ না আপনি উত্তরটি দিয়েছেন ততক্ষণ আমি উত্তরটি দেখার বিরুদ্ধে পরামর্শ দেব কিছু চিন্তা।
আশাকরি এটা সাহায্য করবে!
O(log n)
হিসাবে দেখা যেতে পারে: আপনি যদি সমস্যার আকার দ্বিগুণ করেন তবেn
আপনার অ্যালগরিদমের জন্য কেবল আরও ধাপের ধ্রুব সংখ্যা প্রয়োজন।