আমি যতটা সম্ভব সাধারণ ও সাধারণ গণিতের তুলনায় সামান্য আনুষ্ঠানিক সংজ্ঞা পছন্দ করতাম।
আমি যতটা সম্ভব সাধারণ ও সাধারণ গণিতের তুলনায় সামান্য আনুষ্ঠানিক সংজ্ঞা পছন্দ করতাম।
উত্তর:
তাত্ক্ষণিক দ্রষ্টব্য, এটি সম্ভবত থি নোটেশন "Θ" (যা একটি দ্বিমুখী সীমাবদ্ধ) এর সাথে বিগ ও স্বরলিপিটি (যা একটি উচ্চ সীমানা) বিভ্রান্ত করছে । আমার অভিজ্ঞতা হিসাবে, এটি আসলে অ-একাডেমিক সেটিংসে আলোচনার সাধারণ। যে কোনও বিভ্রান্তির জন্য ক্ষমা চাইছি।
বিগ হে জটিলতা এই গ্রাফটি দিয়ে ভিজ্যুয়ালাইজ করা যায়:
বিগ-ও স্বরলিপিটির জন্য আমি যে সহজ সংজ্ঞা দিতে পারি তা হ'ল:
বিগ-ও স্বরলিপিটি একটি অ্যালগরিদমের জটিলতার তুলনামূলক উপস্থাপনা।
সেই বাক্যে কয়েকটি গুরুত্বপূর্ণ এবং ইচ্ছাকৃতভাবে নির্বাচিত শব্দ রয়েছে:
- আপেক্ষিক: আপনি কেবল আপেলের সাথে আপেল তুলনা করতে পারেন। পূর্ণসংখ্যার একটি তালিকা বাছাই করে এমন একটি অ্যালগরিদমের সাথে গাণিতিক গুণণের জন্য আপনি কোনও অ্যালগরিদমকে তুলনা করতে পারবেন না। পাটিগণিত অপারেশনগুলি করতে দুটি অ্যালগরিদমের তুলনা (একটি গুণ, একটি সংযোজন) আপনাকে অর্থপূর্ণ কিছু বলবে;
- উপস্থাপনা: বিগ-ও (এর সহজতম আকারে) একক ভেরিয়েবলের সাথে অ্যালগরিদমের মধ্যে তুলনা হ্রাস করে। এই পরিবর্তনশীলটি পর্যবেক্ষণ বা অনুমানের ভিত্তিতে বেছে নেওয়া হয়। উদাহরণস্বরূপ, বাছাইকরণ অ্যালগরিদমগুলি সাধারণত তুলনা ক্রিয়াকলাপগুলির (তাদের আপেক্ষিক ক্রম নির্ধারণের জন্য দুটি নোডের তুলনা) এর উপর ভিত্তি করে তুলনা করা হয়। এটি ধরে নিয়েছে যে তুলনা ব্যয়বহুল। তবে তুলনা কম হলেও অদলবদল ব্যয়বহুল কী? এটি তুলনা পরিবর্তন করে; এবং
- জটিলতা: 10,000 টি উপাদান বাছাই করতে যদি আমার এক সেকেন্ড সময় লাগে তবে দশ মিলিয়ন বাছাই করতে কত সময় লাগবে? এই উদাহরণে জটিলতা অন্য কোনও কিছুর সাথে আপেক্ষিক পরিমাপ।
আপনি যখন বাকীটি পড়েছেন তখন ফিরে আসুন এবং উপরেরটিটি আবার পড়ুন।
বিগ-ও-এর সেরা উদাহরণটি আমি পাটিগণিত করা সম্পর্কে ভাবতে পারি। দুটি নম্বর নিন (123456 এবং 789012)। স্কুলে আমরা শিখেছি প্রাথমিক গাণিতিক অপারেশনগুলি হ'ল:
- সংযোজন;
- বিয়োগ;
- গুণ; এবং
- বিভাগ।
এর প্রতিটিই একটি অপারেশন বা সমস্যা a এগুলি সমাধান করার একটি পদ্ধতিকে অ্যালগরিদম বলা হয় ।
সংযোজন সহজতম। আপনি সংখ্যাগুলি ডানদিকে (ডানদিকে) রেখেছেন এবং ফলাফলটিতে সংযোজনের শেষ সংখ্যাটি লিখতে একটি কলামে অঙ্কগুলি যুক্ত করুন। এই সংখ্যার 'দশক' অংশটি পরবর্তী কলামে পৌঁছেছে।
আসুন ধরে নেওয়া যাক যে এই সংখ্যাগুলির সংযোজনটি এই অ্যালগরিদমের সবচেয়ে ব্যয়বহুল অপারেশন। এটি যুক্তিযুক্ত যে এই দুটি সংখ্যা একসাথে যুক্ত করতে আমাদের একসাথে 6 টি সংখ্যা যুক্ত করতে হবে (এবং সম্ভবত একটি 7 তম বহন করবে)। যদি আমরা একসাথে দুটি 100 অঙ্কের সংখ্যার যোগ করি তবে আমাদের 100 টি সংযোজন করতে হবে। আমরা যুক্ত করে থাকেন দুই 10,000 অঙ্ক সংখ্যার আমরা 10,000 সংযোজন করতে হবে।
প্যাটার্নটি দেখুন? জটিলতা (অপারেশন সংখ্যা হচ্ছে) সরাসরি ডিজিটের সংখ্যা সমানুপাতিক এন অধিক সংখ্যায়। আমরা এটিকে ও (এন) বা লিনিয়ার জটিলতা বলি ।
বিয়োগটি একই রকম (আপনি বহন করার পরিবর্তে orrowণ গ্রহণের প্রয়োজন হতে পারে) বাদে।
গুণ বহুগুণ। আপনি সংখ্যাগুলি লাইন করুন, নীচের সংখ্যায় প্রথম অঙ্কটি নিন এবং উপরের সংখ্যার প্রতিটি অঙ্কের বিপরীতে এটিকে গুণ করুন এবং প্রতিটি অঙ্কের মধ্য দিয়ে। সুতরাং আমাদের দুটি 6 সংখ্যা সংখ্যার গুণিত করতে আমাদের অবশ্যই 36 টি গুণ করতে হবে। শেষের ফলাফলটি পেতে আমাদের 10 বা 11 টি কলাম যুক্ত হতে পারে।
আমাদের যদি দুটি 100-সংখ্যার নম্বর থাকে তবে আমাদের 10,000 টি গুণ এবং 200 টি যোগ করতে হবে। দুই মিলিয়ন ডিজিটের সংখ্যার জন্য আমাদের এক ট্রিলিয়ন (10 12 ) গুণ এবং দুই মিলিয়ন সংযোজন করতে হবে।
যেহেতু অ্যালগোরিদমটি n- স্কোয়ার সহ স্কেল করে , এটি হে (এন 2 ) বা চতুর্ভুজ জটিল । আরেকটি গুরুত্বপূর্ণ ধারণা প্রবর্তনের জন্য এটি একটি ভাল সময়:
আমরা কেবল জটিলতার সবচেয়ে উল্লেখযোগ্য অংশ সম্পর্কে যত্নশীল।
চমত্কার বুঝতে পারে যে আমরা অপারেশনগুলির সংখ্যাটি এইভাবে প্রকাশ করতে পারি: n 2 + 2n। তবে আপনি যেমনটি লক্ষ লক্ষ অঙ্কের দুটি সংখ্যার সাথে আমাদের উদাহরণ থেকে দেখেছেন, দ্বিতীয় শব্দ (2 এন) তুচ্ছ হয়ে যায় (সেই পর্যায়ে মোট অপারেশনের 0.0002% অ্যাকাউন্টিং)।
কেউ লক্ষ করতে পারেন যে আমরা এখানে সবচেয়ে খারাপ পরিস্থিতি ধরে নিয়েছি। Digit ডিজিটের সংখ্যাগুলিকে গুন করার সময়, যদি তাদের একটির 4 টি সংখ্যা থাকে এবং অন্যটির 6 টি সংখ্যা থাকে, তবে আমাদের কেবল 24 গুণ রয়েছে। তবুও, আমরা সেই 'এন' এর জন্য সবচেয়ে খারাপ পরিস্থিতি গণনা করি, অর্থাৎ যখন উভয়ই 6 সংখ্যার হয়। তাই বিগ-ও স্বরলিপিটি একটি অ্যালগরিদমের সবচেয়ে খারাপ পরিস্থিতি সম্পর্কিত।
পরবর্তী সেরা উদাহরণটি আমি ভাবতে পারি টেলিফোন বইটি, সাধারণত হোয়াইট পৃষ্ঠাগুলি বা অনুরূপ নামে পরিচিত তবে এটি দেশ থেকে দেশে পরিবর্তিত হয়। তবে আমি সেই ব্যক্তির কথা বলছি যা লোককে উপাধি এবং তারপরে আদ্যক্ষর বা প্রথম নাম, সম্ভবত ঠিকানা এবং তারপরে টেলিফোন নম্বর দ্বারা তালিকাবদ্ধ করে।
এখন আপনি যদি একটি কম্পিউটারকে ১,০০,০০০ নাম সম্বলিত একটি টেলিফোন বইতে "জন স্মিথ" এর জন্য ফোন নম্বর সন্ধানের নির্দেশ দিচ্ছিলেন তবে আপনি কী করবেন? এস এর সূচনা কতদূর শুরু হয়েছে তা অনুমান করা (আপনি ধরুন যে আপনি পারবেন না) আপনি কী করবেন?
একটি সাধারণ বাস্তবায়ন হতে পারে মাঝখানে খোলা, 500,000 তম নিয়ে এবং এটি "স্মিথ" এর সাথে তুলনা করুন। যদি এটি "স্মিথ, জন" হয়ে থাকে, আমরা কেবল সত্যিই ভাগ্যবান হয়েছি। আরও সম্ভবত সম্ভবত "জন স্মিথ" সেই নামের আগে বা পরে থাকবে। যদি এর পরে থাকে তবে আমরা ফোন বইয়ের শেষ অর্ধেকটি অর্ধেক করে আবার করব। যদি এটি এর আগে থাকে তবে আমরা ফোন বইয়ের প্রথম অর্ধেকটি অর্ধেক করে আবার করব। ইত্যাদি।
এটিকে বাইনারি অনুসন্ধান বলা হয় এবং এটি প্রোগ্রামিংয়ে প্রতিদিন ব্যবহার করা হয় আপনি তা বুঝতে পেরেছেন কি না।
সুতরাং আপনি যদি দশ মিলিয়ন নামের একটি ফোনের বইয়ের কোনও নাম খুঁজতে চান তবে আপনি প্রায় 20 বার এটি করে কোনও নাম খুঁজে পেতে পারেন। অনুসন্ধান অ্যালগরিদমের তুলনায় আমরা সিদ্ধান্ত নিই যে এই তুলনাটি আমাদের 'এন'।
- 3 নামের ফোনের বইয়ের জন্য এটি 2 টি তুলনা (সর্বাধিক) লাগে।
- 7 এর জন্য এটি সর্বোচ্চ 3 নেয়।
- 15 এর জন্য এটি 4 নেয়।
- ...
- 1,000,000 এর জন্য এটি 20 নেয়।
এটি হতবাকভাবে ভাল, তাই না?
বিগ-ও পদগুলিতে এটি হ'ল (লগ এন) বা লোগারিথমিক জটিলতা । এখন প্রশ্নে থাকা লগারিদমটি ln (বেস ই), লগ 10 , লগ 2 বা অন্য কোনও বেস হতে পারে। এটি এখনও ও (লগ এন) ঠিক ও (2 এন 2 ) এবং ও (100n 2 ) উভয়ই ও (এন 2 ) এর সাথে গুরুত্বপূর্ণ নয়।
এই মুহুর্তে এটি ব্যাখ্যা করা সার্থক যে বিগ হে একটি অ্যালগরিদম সহ তিনটি কেস নির্ধারণ করতে ব্যবহার করতে পারেন:
- সেরা কেস: টেলিফোন বইয়ের সন্ধানে, সেরা ক্ষেত্রে হ'ল আমরা একটি তুলনা করে নামটি পাই। এটি ও (1) বা ধ্রুবক জটিলতা ;
- প্রত্যাশিত কেস: এটি উপরে আলোচনা হিসাবে ও (লগ এন); এবং
- সবচেয়ে খারাপ কেস: এটি ও (লগ এন)।
সাধারণত আমরা সেরা ক্ষেত্রে সম্পর্কে যত্নশীল না। আমরা প্রত্যাশিত এবং সবচেয়ে খারাপ ক্ষেত্রে আগ্রহী। কখনও কখনও এর একটি বা অন্যটি আরও গুরুত্বপূর্ণ হবে be
টেলিফোনের বইটিতে ফিরুন।
আপনার যদি একটি ফোন নম্বর থাকে এবং একটি নাম খুঁজতে চান? পুলিশের কাছে একটি বিপরীত ফোন বই রয়েছে তবে এই ধরণের চেহারাগুলি সাধারণ লোকেরা অস্বীকার করে। তারা নাকি? প্রযুক্তিগতভাবে আপনি কোনও সাধারণ ফোন বইতে কোনও সংখ্যা উল্টাতে পারেন। কিভাবে?
আপনি প্রথম নামটি শুরু করুন এবং সংখ্যাটি তুলনা করুন। যদি এটি একটি ম্যাচ হয়, দুর্দান্ত, যদি না হয়, আপনি পরের দিকে যান। আপনাকে এইভাবে এটি করতে হবে কারণ ফোন বইটি আনর্ডার্ড করা হয়েছে (যাই হোক ফোন নম্বর দ্বারা)।
সুতরাং ফোন নম্বর প্রদত্ত একটি নাম সন্ধান করতে (বিপরীত চেহারা):
- সেরা কেস: ও (1);
- প্রত্যাশিত কেস: ও (এন) (500,000 এর জন্য); এবং
- সবচেয়ে খারাপ কেস: ও (এন) (1,000,000 এর জন্য)।
এটি কম্পিউটার বিজ্ঞানের বেশ বিখ্যাত সমস্যা এবং একটি উল্লেখের দাবি রাখে। এই সমস্যায় আপনার কাছে N টি শহর রয়েছে। এই শহরগুলির প্রত্যেকটি একটি নির্দিষ্ট দূরত্বে একটি রাস্তা দিয়ে 1 বা আরও বেশি শহরের সাথে সংযুক্ত is ট্র্যাভেলিং সেলসম্যান সমস্যা হ'ল প্রতিটি শহরে যে সংক্ষিপ্ততম ভ্রমণটি দেখা যায় তা সন্ধান করা।
সহজ লাগছে? আবার চিন্তা কর.
আপনার যদি 3 টি শহর A, B এবং C এর সাথে সমস্ত জোড়ার মধ্যে রাস্তা থাকে তবে আপনি যেতে পারেন:
- এ → বি → সে
- এ → সি → বি
- বি → সি → এ
- বি → এ → সি
- সি → এ → বি
- সি → বি → এ
ঠিক আছে, আসলে এর চেয়ে কম কারণ এগুলির কয়েকটি সমতুল্য (উদাহরণস্বরূপ, তারা ঠিক একই বিপরীতে একই রাস্তা ব্যবহার করে)।
বাস্তবে, 3 টি সম্ভাবনা রয়েছে।
- এটিকে 4 টি শহরে নিয়ে যান এবং আপনার কাছে 12 টি সম্ভাবনা রয়েছে।
- 5 দিয়ে এটি 60।
- 6 360 হয়ে যায়।
এটি গাণিতিক ক্রিয়াকলাপ যা ফ্যাকটোরিয়াল বলে । মূলত:
- 5! = 5 × 4 × 3 × 2 × 1 = 120
- 6! = 6 × 5 × 4 × 3 × 2 × 1 = 720
- 7! = 7 × 6 × 5 × 4 × 3 × 2 × 1 = 5040
- ...
- 25! = 25 × 24 ×… × 2 × 1 = 15,511,210,043,330,985,984,000,000
- ...
- 50 টাকা! = 50 × 49 ×… × 2 × 1 = 3.04140932 × 10 64
সুতরাং ট্র্যাভেলিং সেলসম্যান সমস্যার বিগ-ও হ'ল ও (এন!) বা ফ্যাকটোরিয়াল বা সংযুক্তিগত জটিলতা ।
আপনি 200 টি শহরে পৌঁছানোর সময় পর্যন্ত traditionalতিহ্যবাহী কম্পিউটারগুলির সাথে সমস্যার সমাধানের জন্য মহাবিশ্বের পর্যাপ্ত সময় বাকি নেই।
আমার মনে হয় কিছু।
আরেকটি বিষয় আমি একটি দ্রুত উল্লেখ করতে চেয়েছিলেন একটি জটিলতা যে কোনো অ্যালগরিদম যে (ঢ হে একটি ) আছে বলা হয় বহুপদী জটিলতা বা সমাধেয় হয় বহুপদী সময় ।
ও (এন), ও (এন 2 ) ইত্যাদি সমস্ত পলিনামিয়াল সময়। বহুবিধ সময়ে কিছু সমস্যা সমাধান করা যায় না। বিশ্বে কিছু জিনিস ব্যবহৃত হয় কারণ এটি। পাবলিক কী ক্রিপ্টোগ্রাফি একটি প্রধান উদাহরণ। খুব বড় সংখ্যার দুটি প্রধান কারণ খুঁজে পাওয়া নিরঙ্কুগতভাবে শক্ত। এটি না থাকলে আমরা যে পাবলিক কী সিস্টেমগুলি ব্যবহার করি তা ব্যবহার করতে পারি না।
যাইহোক, এটি আমার (আশাবাদী সরল ইংরাজী) বিগ ও (সংশোধিত) এর ব্যাখ্যা জন্য।
এটি দেখায় যে ইনপুট আকারের উপর ভিত্তি করে একটি অ্যালগোরিদম স্কেল।
ও (এন 2 ) : চতুর্ভুজ জটিল হিসাবে পরিচিত
লক্ষ্য করুন যে আইটেমের সংখ্যা 10 এর গুণক দ্বারা বৃদ্ধি পায় তবে সময় 10 2 এর গুণক দ্বারা বৃদ্ধি পায় । মূলত, এন = 10 এবং তাই ও (এন 2 ) আমাদের স্কেলিং ফ্যাক্টর এন 2 দেয় যা 10 2 ।
ও (এন) : লিনিয়ার জটিলতা হিসাবে পরিচিত
এবার আইটেমের সংখ্যা 10 এর গুণক দ্বারা বৃদ্ধি পায় এবং সময়টিও তাই হয়। n = 10 এবং তাই ও (এন) এর স্কেলিং ফ্যাক্টর 10।
ও (1) : কনস্ট্যান্ট জটিলতা হিসাবে পরিচিত
আইটেমের সংখ্যা এখনও 10 এর গুণক দ্বারা বাড়ছে, তবে হে (1) এর স্কেলিং ফ্যাক্টরটি সর্বদা 1 হয়।
ও (লগ এন) : লোগারিদমিক জটিলতা হিসাবে পরিচিত
গণনা সংখ্যা কেবল ইনপুট মান একটি লগ দ্বারা বৃদ্ধি করা হয়। তাই এই ক্ষেত্রে, প্রতিটি গণনার অভিমানী 1 সেকেন্ড সময় লাগে, ইনপুট লগ n
সময় প্রয়োজন, অত হয় log n
।
এটি এর সংক্ষেপে। তারা গণিতগুলি হ্রাস করে তাই এটি সঠিকভাবে এন 2 বা তারা যা কিছু বলুক তা নাও হতে পারে তবে এটিই স্কেলিংয়ের প্রভাবশালী উপাদান হবে।
বিগ-ও স্বরলিপি (যাকে "অ্যাসিপটোটিক গ্রোথ" স্বীকৃতিও বলা হয়) হ'ল আপনি যখন উত্সের নিকটে ধ্রুবক উপাদান এবং স্টাফ অগ্রাহ্য করেন তখন "চেহারা দেখতে" কাজ করে । আমরা কীভাবে জিনিস স্কেল সম্পর্কে কথা বলতে এটি ব্যবহার করি ।
বুনিয়াদি
"পর্যাপ্ত" বড় ইনপুটগুলির জন্য ...
f(x) ∈ O(upperbound)
এর অর্থ f
"এর চেয়ে দ্রুত আর বৃদ্ধি পায় না"upperbound
f(x) ∈ Ɵ(justlikethis)
মানে f
"হুবহু হ'ল"justlikethis
f(x) ∈ Ω(lowerbound)
মানে f
"ধীর কোন বৃদ্ধি চেয়ে"lowerbound
বড় হে স্বরলিপি ধ্রুব কারণের যত্ন সম্পর্কে না: ফাংশন 9x²
"ঠিক হত্তয়া মত" বলা হয় 10x²
। অ-অ্যাসিম্পটোটিক স্টাফগুলি ("উত্সের নিকটবর্তী সামগ্রী" বা "সমস্যার আকার ছোট হলে কী হয়") সম্পর্কে বিগ-ও অ্যাসিম্পটোটিক স্বরলিপিও যত্নবান নয় : ফাংশনটি "হুবহু বাড়ার মতো" বলা হয় ।10x²
10x² - x + 2
আপনি কেন সমীকরণের ছোট অংশগুলিকে উপেক্ষা করতে চান? কারণ আপনি বৃহত্তর এবং বৃহত্তর স্কেলগুলি বিবেচনা করার সাথে সাথে তারা সমীকরণের বড় অংশগুলি দ্বারা সম্পূর্ণরূপে বামন হয়ে যায়; তাদের অবদান বামন এবং অপ্রাসঙ্গিক হয়ে ওঠে। (উদাহরণ বিভাগ দেখুন।)
আরেকটি উপায় রাখুন , আপনি অসীমের দিকে যাওয়ার সাথে সাথে অনুপাতটি সবই about আপনি যদি যথাযথভাবে সময় নেয় তবে এটি ভাগ করে দিলে O(...)
আপনি বড় ইনপুটগুলির সীমাতে একটি ধ্রুবক ফ্যাক্টর পাবেন। স্বজ্ঞাতভাবে এটি উপলব্ধি করে: ফাংশনগুলি "স্কেলের মতো" একে অপরকে পেতে যদি আপনি একটিকে গুণ করতে পারেন। আমরা যখন বলি ...
actualAlgorithmTime(N) ∈ O(bound(N))
e.g. "time to mergesort N elements
is O(N log(N))"
... এর অর্থ হ'ল "যথেষ্ট পরিমাণে" সমস্যাটির জন্য এন মাপ (আমরা যদি উত্সের কাছাকাছি জিনিসগুলি অগ্রাহ্য করি), সেখানে কিছু ধ্রুবক উপস্থিত রয়েছে (উদাহরণস্বরূপ, 2.5, সম্পূর্ণভাবে তৈরি) যেমন:
actualAlgorithmTime(N) e.g. "mergesort_duration(N) "
────────────────────── < constant ───────────────────── < 2.5
bound(N) N log(N)
ধ্রুবক অনেক পছন্দ আছে; প্রায়শই "সেরা" পছন্দটি অ্যালগরিদমের "ধ্রুবক ফ্যাক্টর" হিসাবে পরিচিত ... তবে আমরা প্রায়শই এটিকে উপেক্ষা করে থাকি যেমন আমরা অ-বৃহত্তম শর্তাদি উপেক্ষা করি না (কেন তারা সাধারণত গুরুত্ব দেয় না তার জন্য কনস্ট্যান্ট ফ্যাক্টর বিভাগ দেখুন)। উপরের সমীকরণকে আপনি একটি আবদ্ধ হিসাবেও ভাবতে পারেন, বলেছিলেন "" সবচেয়ে খারাপ পরিস্থিতিতে, সময়টি কখনই মোটামুটি থেকে খারাপ হতে পারে না N*log(N)
, 2.5 এর একটি ফ্যাক্টরের মধ্যে (আমরা যে ধ্রুব কারণের বিষয়ে খুব বেশি যত্ন নিই না) " ।
সাধারণভাবে, O(...)
সবচেয়ে দরকারী এটি কারণ আমরা প্রায়শই খারাপ পরিস্থিতি সম্পর্কে যত্নশীল। যদি f(x)
প্রসেসর বা মেমরির ব্যবহারের মতো "খারাপ" কিছু উপস্থাপন করে তবে " f(x) ∈ O(upperbound)
" এর অর্থ " upperbound
প্রসেসর / মেমরির ব্যবহারের সবচেয়ে খারাপ পরিস্থিতি"।
অ্যাপ্লিকেশন
খাঁটি গাণিতিক নির্মাণ হিসাবে, বিগ-ও স্বরলিপি প্রক্রিয়াজাতকরণ সময় এবং মেমরির বিষয়ে কথা বলতেই সীমাবদ্ধ নয়। স্কেলিং অর্থবহ, এমন কোনও কিছুর অ্যাসিম্পটিকগুলি নিয়ে আলোচনা করতে আপনি এটি ব্যবহার করতে পারেন, যেমন:
N
একটি পার্টিতে মানুষের মধ্যে সম্ভাব্য হ্যান্ডশেকের সংখ্যা ( Ɵ(N²)
বিশেষত N(N-1)/2
, তবে কী বিষয় তা "এটি" পছন্দ করে "আঁশ" N²
)উদাহরণ
উপরের হ্যান্ডশেক উদাহরণের জন্য, একটি ঘরে সবাই অন্যের হাত কাঁপায়। যে উদাহরণে #handshakes ∈ Ɵ(N²)
,। কেন?
কিছুটা ব্যাক আপ নিন: হ্যান্ডশেকের সংখ্যা হ'ল এন-পছন্দ -2 বা N*(N-1)/2
(এন এর প্রতিটি লোকই এন -1 অন্যান্য লোকের হাত কাঁপায়, তবে এই দ্বিগুণ গণনাগুলি তাই 2 দ্বারা বিভক্ত হয়ে গেছে):
তবে, খুব সংখ্যক লোকের জন্য, রৈখিক শব্দটি N
বামন করা হয় এবং কার্যকরভাবে অনুপাতের 0 টি অবদান রাখে (চার্টে: মোট বাক্সের চেয়ে তির্যকটিতে খালি বাক্সগুলির ভগ্নাংশটি অংশীদার সংখ্যা আরও বড় হওয়ার সাথে সাথে ছোট হয়)। সুতরাং স্কেলিং আচরণটি order N²
, বা হ্যান্ডশেকের সংখ্যা "N² এর মতো বৃদ্ধি পায়"।
#handshakes(N)
────────────── ≈ 1/2
N²
এটি এমনভাবে মনে হয় যেমন চার্টের ত্রিভুজ (N * (N-1) / 2 চেকমার্কগুলিতে) খালি বাক্সগুলিও সেখানে ছিল না (এন 2 চেকমার্কগুলি asyptotically)।
("প্লেইন ইংলিশ" থেকে অস্থায়ী বিচ্যুতি :) আপনি যদি নিজের কাছে এটি প্রমাণ করতে চান তবে আপনি অনুপাতের ভিত্তিতে কিছু সরল বীজগণিত সম্পাদন করতে পারেন এটি একাধিক পদে বিভক্ত করার জন্য ( lim
যার অর্থ "সীমাতে বিবেচনা করা হয়েছে", যদি আপনি এটিকে উপেক্ষা করেন তবে এটি দেখেনি, এটি "এবং এন সত্যই বড়") এর জন্য কেবল স্বরলিপি
N²/2 - N/2 (N²)/2 N/2 1/2
lim ────────── = lim ( ────── - ─── ) = lim ─── = 1/2
N→∞ N² N→∞ N² N² N→∞ 1
┕━━━┙
this is 0 in the limit of N→∞:
graph it, or plug in a really large number for N
TL; ড: করমর্দন 'মত দেখাচ্ছে' সংখ্যা x² এত বড় মানের জন্য, যে লিখে যদি আমরা ছিলাম অনুপাত # করমর্দন / x² যে, আসলে আমাদের দরকার নেই ঠিক x² করমর্দন এমনকি দেখা যাবে না দশমিকের মধ্যে একটি ইচ্ছামত বড় যখন।
যেমন এক্স = 1 মিলিয়ন, অনুপাত # হ্যান্ডশেক / এক্স²: 0.499999 ...
বিল্ডিং অন্তর্দৃষ্টি
এটি আমাদের মত বিবৃতি দিতে দেয় ...
"যথেষ্ট পরিমাণে ইনপুটসাইজ = এন এর জন্য, যদি আমি ইনপুট আকার দ্বিগুণ করি তবে ধ্রুবক ফ্যাক্টরটি কী তা বিবেচনা করে না ...
এন → (2 এন) = 2 ( এন )
N² → (2N) ² = 4 ( N² )
cN³ → c (2N) 8 = 8 ( সিএন³ )
সি লগ (এন) → সি লগ (২ এন) = (সি লগ (২)) + ( সি লগ (এন) ) = (স্থির পরিমাণ) + ( সি লগ (এন) )
সি * 1 → সি * 1
এটি হে (এন 1.000001 ) এর চেয়ে কম , যা আপনি মূলত রৈখিক কল করতে রাজি হতে পারেন
2 এন → 2 2 এন = (4 এন ) ............ অন্যভাবে রাখুন ...... 2 এন → 2 এন + 1 = 2 এন 2 1 = 2 2 এন
[গাণিতিকভাবে ঝুঁকির জন্য, আপনি ছোটখাটো সিডেনোটেসের জন্য বিলোপকারীদের উপর মাউস দিতে পারেন]
(ক্রেডিট সহ https://stackoverflow.com/a/487292/711085 ণের সাথে )
(প্রযুক্তিগতভাবে ধ্রুবক ফ্যাক্টরটি আরও কিছু রহস্যজনক উদাহরণগুলিতে গুরুত্বপূর্ণ হতে পারে তবে আমি উপরের জিনিসগুলি বাক্যযুক্ত করেছি (উদাহরণস্বরূপ লগ (এন)) যেমন এটি না করে)
এগুলি প্রবৃদ্ধির রুটি এবং মাখন অর্ডার যা প্রোগ্রামার এবং প্রয়োগকৃত কম্পিউটার বিজ্ঞানীরা রেফারেন্স পয়েন্ট হিসাবে ব্যবহার করেন। তারা সব সময় এই দেখতে। (সুতরাং আপনি যখন প্রযুক্তিগতভাবে ভাবতে পারেন "ইনপুট দ্বিগুণ করা একটি ও (√N) অ্যালগরিদমকে ১.৪১৪ গুণ ধীর করে তোলে," এটি লোগারিথিকের চেয়ে খারাপ তবে লিনিয়ারের চেয়েও ভাল "বলে মনে করা ভাল))
ধ্রুবক কারণ
সাধারণত, আমরা নির্দিষ্ট ধ্রুবক কারণগুলি কী তা যত্নশীল করি না, কারণ ফাংশনটি যেভাবে বৃদ্ধি পায় সেগুলি তারা প্রভাবিত করে না। উদাহরণস্বরূপ, দুটি অ্যালগরিদম দুটি O(N)
সম্পূর্ণ হতে সময় নিতে পারে তবে একটির অপরের চেয়ে দ্বিগুণ ধীর হতে পারে। কলকারখানাটি অনুকূল ( অপ্টিমাইজেশনের অকাল কখন? ) অপরিহার্যকরণ কারন ফ্যাক্টরটি খুব বড় না হলে আমরা সাধারণত খুব বেশি যত্ন করি না ; এছাড়াও আরও ভাল বিগ-ও দিয়ে অ্যালগরিদম বাছাইয়ের কাজটি প্রায়শই প্রস্থের আদেশ দিয়ে কর্মক্ষমতা উন্নত করে।
কিছু অ্যাসিম্পোটোটিক্যালি উচ্চতর অ্যালগরিদম (উদাহরণস্বরূপ একটি তুলনা O(N log(log(N)))
না করা বাছাই করা) এত বড় একটি ধ্রুবক ফ্যাক্টর (যেমন 100000*N log(log(N))
) বা ওভারহেড থাকতে পারে যা O(N log(log(N)))
অপ্রকাশ্যের মতো তুলনামূলকভাবে বড় + 100*N
, এমনকি "বিগ ডেটা" তেও এটি ব্যবহার করা খুব কমই উপযুক্ত।
ও (এন) কেন কখনও কখনও আপনি সবচেয়ে ভাল করতে পারেন, অর্থাত্ আমাদের কেন ডেটাস্ট্রাকচার দরকার
O(N)
আপনার যদি আপনার সমস্ত ডেটা পড়ার দরকার হয় তবে অ্যালগরিদমগুলি কিছুটা অর্থে "সেরা" অ্যালগরিদম। পড়া খুব আচরণ ডেটার একটি গুচ্ছ একটি হল O(N)
অপারেশন। এটিকে মেমোরিতে লোড করা সাধারণত O(N)
(বা আপনার যদি হার্ডওয়্যার সমর্থন থাকে তবে দ্রুত হয়, বা আপনি ইতিমধ্যে ডেটাটি পড়ে থাকলে কোনও সময় নেই)। তবে, যদি আপনি প্রতিটি টুকরো ডেটা স্পর্শ করেন বা এমনকি দেখুন (বা এমনকি প্রতিটি অন্যান্য টুকরো ডেটাও), আপনার অ্যালগরিদম O(N)
এই চেহারাটি সম্পাদন করতে সময় নেবে । আপনার আসল অ্যালগরিদমটি কতক্ষণ সময় নেয় না কেন, এটি কমপক্ষে হবে O(N)
কারণ সমস্ত ডেটা দেখার জন্য এটি সময় ব্যয় করেছিল।
লেখার খুব অভিনয়ের জন্যও একই কথা বলা যেতে পারে । সকল আলগোরিদিম যা আউট এন জিনিষ মুদ্রণ এন সময় লাগবে কারণ আউটপুট অন্তত যে দীর্ঘ (যেমন সব একাধিক বিন্যাসন (পুনরায় সাজাতে উপায়ে) n কার্ড খেলে একটি সেট আউট মুদ্রণ গৌণিক হল: O(N!)
)।
এটি ডেটা স্ট্রাকচারের ব্যবহারকে অনুপ্রাণিত করে : একটি ডেটা স্ট্রাকচারের জন্য কেবল একবার (সাধারণত O(N)
সময়) উপাত্ত পড়া দরকার হয় , সাথে সাথে প্রাকৃতিকভাবে কিছু প্রচ্ছন্ন পরিমাণ (যেমন O(N)
বা O(N log(N))
বা O(N²)
) আমরা ছোট রাখার চেষ্টা করি। তারপর, ডাটা স্ট্রাকচার পরিবর্তন (সন্নিবেশ / মুছে দেওয়া / ইত্যাদি) এবং ডেটার উপর উপার্জন প্রশ্নের যেমন খুব সামান্য সময় লাগবে O(1)
বা O(log(N))
। তারপরে আপনি প্রচুর পরিমাণে প্রশ্ন তৈরি করতে এগিয়ে যান! সাধারণভাবে, আপনি সময়ের আগে যত বেশি কাজ করতে ইচ্ছুক, তত কম কাজ আপনাকে পরে করতে হবে।
উদাহরণস্বরূপ, বলুন যে আপনার কাছে লক্ষ লক্ষ রাস্তার অংশের দ্রাঘিমাংশ এবং দ্রাঘিমাংশ স্থানাঙ্ক ছিল এবং সমস্ত রাস্তার ছেদগুলি খুঁজতে চেয়েছিলেন।
O(N)
তবে কেবল একবার কাজ করার নিষ্পাপ পদ্ধতিটি করতে সমস্যা হবে না তবে আপনি যদি এটি বহুবার করতে চান (এই ক্ষেত্রে, N
বার, প্রতিটি বিভাগের জন্য একবার), আমরা ' O(N²)
কাজ করতে হবে , বা 1000000² = 1000000000000 ক্রিয়াকলাপ করতে হবে। ভাল নয় (একটি আধুনিক কম্পিউটার প্রতি সেকেন্ডে প্রায় এক বিলিয়ন অপারেশন করতে পারে)।O(N)
সময় মতো সমস্ত কিছু প্রাক-প্রসেস করে একটি সামান্য ব্যয় প্রদান করি । তারপরে, এটির কী দ্বারা কিছু অনুসন্ধান করতে এটি কেবল গড়ে ধীরে ধীরে সময় নেয় (এই ক্ষেত্রে, আমাদের কীটি দ্রাঘিমাংশ এবং দ্রাঘিমাংশ স্থানাঙ্কগুলি, একটি গ্রিডকে কেন্দ্র করে; আমরা সংলগ্ন গ্রিডস্পেসগুলি অনুসন্ধান করি যার মধ্যে কেবল 9 টি রয়েছে, যা একটি ধ্রুব)।O(N²)
পরিচালনাযোগ্যের হাতে চলে যায় O(N)
এবং হ্যাশ টেবিল তৈরি করতে আমাদের যা করতে হয়েছিল তা হল একটি সামান্য ব্যয়।গল্পটির নৈতিকতা: একটি ডেটা স্ট্রাকচার আমাদের ক্রিয়াকলাপকে ত্বরান্বিত করতে দেয়। আরও বেশি, উন্নত ডেটা স্ট্রাকচার আপনাকে অবিশ্বাস্যভাবে চালাক উপায়ে অপারেশনগুলিকে একত্রিত করতে, বিলম্ব করতে বা উপেক্ষা করতে দেয়। বিভিন্ন সমস্যার বিভিন্ন উপমা থাকতে পারে তবে তারা সকলেই এমন উপায়ে ডেটা সংগঠিত করতে জড়িত যেগুলি আমাদের যত্ন নিয়ে এমন কিছু কাঠামো কাজে লাগায়, বা যা আমরা কৃত্রিমভাবে বুককিপিংয়ের জন্য চাপিয়ে দিয়েছি। আমরা সময়ের পূর্বে কাজ করি (মূলত পরিকল্পনা ও আয়োজন), এবং এখন বারবার করা কাজগুলি অনেক সহজ!
ব্যবহারিক উদাহরণ: কোডিংয়ের সময় বৃদ্ধির আদেশগুলি ভিজ্যুয়ালাইজ করা
অ্যাসিপটোটিক স্বরলিপি, এর মূল অংশে, প্রোগ্রামিং থেকে একেবারেই পৃথক। অ্যাসিপটোটিক নোটেশনটি কীভাবে স্কেল করে এবং বিভিন্ন ক্ষেত্রে বিভিন্ন ক্ষেত্রে কীভাবে ব্যবহার করা যায় তা চিন্তা করার জন্য একটি গাণিতিক কাঠামো। এটি বলেছে ... আপনি কোডিংয়ের জন্য এইভাবে অ্যাসিম্পটোটিক স্বরলিপি প্রয়োগ করেন ।
বুনিয়াদি: যখনই আমরা আকারের A এর সংকলনে (যেমন একটি অ্যারে, একটি সেট, কোনও মানচিত্রের সমস্ত কী ইত্যাদি) প্রতিটি উপাদানের সাথে ইন্টারঅ্যাক্ট করি বা লুপের একটি পুনরাবৃত্তি সম্পাদন করি, এটি আকারের গুণকের গুণক আমি কেন "একটি গুণক গুণক" বলব? - কারণ লুপ এবং ফাংশনগুলির (প্রায় সংজ্ঞা অনুসারে) গুণমান চলমান সময় রয়েছে: পুনরাবৃত্তির সংখ্যা, লুপে কতবার কাজ হয়েছে (বা ফাংশনগুলির জন্য: আপনি যে বার কল করেছেন তার সংখ্যা ফাংশন, সময় ফাংশনে কাজ)। (যদি আমরা কোনও অভিনব কাজ না করি, যেমন লুপগুলি ছেড়ে যান বা লুপটি তাড়াতাড়ি প্রস্থান করুন, বা যুক্তির উপর ভিত্তি করে ফাংশনটিতে নিয়ন্ত্রণ প্রবাহ পরিবর্তন করুন যা খুব সাধারণ holds) এখানে সিউডোকোডের সাথে ভিজ্যুয়ালাইজেশন কৌশলগুলির কয়েকটি উদাহরণ রয়েছে।
(এখানে, x
গুলি কাজের ধ্রুবক সময় ইউনিট, প্রসেসরের নির্দেশাবলী, দোভাষীর অপকডগুলি যাই হোক না কেন উপস্থাপন করে)
for(i=0; i<A; i++) // A * ...
some O(1) operation // 1
--> A*1 --> O(A) time
visualization:
|<------ A ------->|
1 2 3 4 5 x x ... x
other languages, multiplying orders of growth:
javascript, O(A) time and space
someListOfSizeA.map((x,i) => [x,i])
python, O(rows*cols) time and space
[[r*c for c in range(cols)] for r in range(rows)]
উদাহরণ 2:
for every x in listOfSizeA: // A * (...
some O(1) operation // 1
some O(B) operation // B
for every y in listOfSizeC: // C * (...
some O(1) operation // 1))
--> O(A*(1 + B + C))
O(A*(B+C)) (1 is dwarfed)
visualization:
|<------ A ------->|
1 x x x x x x ... x
2 x x x x x x ... x ^
3 x x x x x x ... x |
4 x x x x x x ... x |
5 x x x x x x ... x B <-- A*B
x x x x x x x ... x |
................... |
x x x x x x x ... x v
x x x x x x x ... x ^
x x x x x x x ... x |
x x x x x x x ... x |
x x x x x x x ... x C <-- A*C
x x x x x x x ... x |
................... |
x x x x x x x ... x v
উদাহরণ 3:
function nSquaredFunction(n) {
total = 0
for i in 1..n: // N *
for j in 1..n: // N *
total += i*k // 1
return total
}
// O(n^2)
function nCubedFunction(a) {
for i in 1..n: // A *
print(nSquaredFunction(a)) // A^2
}
// O(a^3)
আমরা যদি কিছুটা জটিল কিছু করি তবে আপনি সম্ভবত দৃশ্যমানভাবে কী ঘটছে তা কল্পনা করতে পারবেন:
for x in range(A):
for y in range(1..x):
simpleOperation(x*y)
x x x x x x x x x x |
x x x x x x x x x |
x x x x x x x x |
x x x x x x x |
x x x x x x |
x x x x x |
x x x x |
x x x |
x x |
x___________________|
এখানে, আপনি অঙ্কন করতে পারেন সবচেয়ে স্বল্পতম স্বীকৃত রূপরেখাটি যা গুরুত্বপূর্ণ; একটি ত্রিভুজটি দ্বিমাত্রিক আকার (0.5 এ ^ 2), যেমন একটি বর্গক্ষেত্র দ্বি-মাত্রিক আকার (A ^ 2); এখানে দুজনের ধ্রুবক ফ্যাক্টর উভয়ের মধ্যে অ্যাসিপটোটিক অনুপাতেই রয়ে গেছে, তবে, আমরা এটিকে সমস্ত কারণের মতো উপেক্ষা করি ... (এই কৌশলটির আমি এখানে যাচ্ছি না এমন কিছু দুর্ভাগ্য সূক্ষ্মতা রয়েছে; এটি আপনাকে বিভ্রান্ত করতে পারে।)
অবশ্যই এর অর্থ এই নয় যে লুপ এবং ফাংশনগুলি খারাপ; বিপরীতে, তারা আধুনিক প্রোগ্রামিং ভাষার বিল্ডিং ব্লক এবং আমরা তাদের ভালবাসি। তবে, আমরা দেখতে পাচ্ছি যেভাবে আমরা আমাদের ডেটা (কন্ট্রোল ফ্লো ইত্যাদি) এর সাথে লুপগুলি এবং ফাংশনগুলি এবং শর্তাবলীর বুনন করি তা আমাদের প্রোগ্রামের সময় এবং স্থান ব্যবহারের অনুকরণ করে! যদি সময় এবং জায়গার ব্যবহার কোনও সমস্যা হয়ে দাঁড়ায়, তা হ'ল আমরা যখন বুদ্ধিমানতার সাথে অবলম্বন করি এবং কোনও সহজভাবে বৃদ্ধির ক্রম হ্রাস করার জন্য একটি সহজ অ্যালগরিদম বা ডেটা স্ট্রাকচার আমরা খুঁজে পাইনি। তবুও, এই ভিজ্যুয়ালাইজেশন কৌশলগুলি (যদিও তারা সবসময় কাজ করে না) আপনাকে সবচেয়ে খারাপ সময়ে চলার সময় নির্দোষ অনুমান করতে পারে।
এখানে অন্য একটি জিনিস যা আমরা চাক্ষুষরূপে চিনতে পারি:
<----------------------------- N ----------------------------->
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x
x x x x x x x x
x x x x
x x
x
আমরা কেবল এটি পুনরায় সাজিয়ে দেখতে পারি এবং এটি ও (এন):
<----------------------------- N ----------------------------->
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x|x x x x x x x x|x x x x|x x|x
অথবা আপনি O (N * লগ (এন)) মোট সময় জন্য ডেটা লগ (এন) পাস করতে পারেন:
<----------------------------- N ----------------------------->
^ x x x x x x x x x x x x x x x x|x x x x x x x x x x x x x x x x
| x x x x x x x x|x x x x x x x x|x x x x x x x x|x x x x x x x x
lgN x x x x|x x x x|x x x x|x x x x|x x x x|x x x x|x x x x|x x x x
| x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x|x x
v x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x|x
নিরবিচ্ছিন্নভাবে তবে আবার উল্লেখ করার মতো: আমরা যদি একটি হ্যাশ (উদাহরণস্বরূপ অভিধান / হ্যাশ টেবিল লুক) সম্পাদন করি তবে এটি হে (1) এর একটি উপাদান। এটা বেশ দ্রুত।
[myDictionary.has(x) for x in listOfSizeA]
\----- O(1) ------/
--> A*1 --> O(A)
যদি আমরা খুব জটিল কিছু করি, যেমন একটি পুনরাবৃত্ত ফাংশন বা বিভাজন এবং বিজয়ী অ্যালগরিদম সহ, আপনি মাস্টার উপপাদ্য (সাধারণত কাজ করে) ব্যবহার করতে পারেন , বা হাস্যকর ক্ষেত্রে আকরা-বাজি থিওরেম (প্রায় সর্বদা কাজ করে) আপনি সন্ধান করেন উইকিপিডিয়ায় আপনার অ্যালগরিদমের চলমান সময়।
তবে প্রোগ্রামাররা এ জাতীয় কিছু মনে করে না কারণ শেষ পর্যন্ত অ্যালগোরিদম স্বজ্ঞাততা কেবল দ্বিতীয় প্রকৃতিতে পরিণত হয়। আপনি অদক্ষ কিছু কোড করা শুরু করবেন এবং তাত্ক্ষণিকভাবে ভাববেন "আমি কি চূড়ান্তভাবে অক্ষম কিছু করছি ? " যদি উত্তরটি "হ্যাঁ" হয় এবং আপনি এটি প্রকৃত পক্ষে বিবেচনা করে থাকেন তবে আপনি জিনিসগুলি দ্রুত চালিত করতে বিভিন্ন পদক্ষেপের কথা চিন্তা করতে পারেন (উত্তরটি প্রায়শই "হ্যাশটেবুল ব্যবহার করুন", খুব কমই "গাছ ব্যবহার করুন", এবং খুব কমই কিছুটা জটিল জটিল)।
এমোরিটাইজড এবং গড়-কেস জটিলতা
"Amorised" এবং / অথবা "গড় কেস" এর ধারণাটিও রয়েছে (নোট করুন যে এগুলি আলাদা)।
গড় কেস : এটি কোনও ক্রিয়াকলাপের প্রত্যাশিত মানের জন্য বিগ-ও স্বরলিপি ব্যবহারের চেয়ে বেশি নয় rather সাধারণ ক্ষেত্রে যেখানে আপনি সমস্ত ইনপুট সমান সম্ভাবনা হিসাবে বিবেচনা করেন, গড় ক্ষেত্রে চলমান সময়ের গড় is কুইকোর্টের সাথে উদাহরণস্বরূপ, যদিও সবচেয়ে খারাপ ঘটনা O(N^2)
কিছু সত্যই খারাপ ইনপুটগুলির ক্ষেত্রে হয়, গড় কেসটি স্বাভাবিক O(N log(N))
(সত্যিই খারাপ ইনপুট সংখ্যায় খুব কম, খুব কম যে আমরা এগুলিকে লক্ষ্য করি না)।
অ্যামোরাইটিজড সবচেয়ে খারাপ-কেস : কিছু ডেটা স্ট্রাকচারের মধ্যে সবচেয়ে খারাপ জটিলতা থাকতে পারে যা বড়, তবে গ্যারান্টি দেয় যে আপনি যদি এই কাজগুলি বেশিরভাগ ক্ষেত্রে করেন তবে আপনার গড় কাজ গড় পরিমাণ খারাপের চেয়ে ভাল হবে। উদাহরণস্বরূপ, আপনার কাছে এমন একটি ডেটা স্ট্রাকচার থাকতে পারে যা সাধারণত ধ্রুব O(1)
সময় নেয় । তবে, মাঝে মাঝে এটি 'হিচাপ' হয়ে যায় এবং O(N)
একটি এলোমেলো অপারেশনের জন্য সময় নেয় , কারণ সম্ভবত এটির জন্য কিছু বুককিপিং বা আবর্জনা সংগ্রহ বা অন্য কিছু করা দরকার ... তবে এটি আপনাকে প্রতিশ্রুতি দেয় যে এটি যদি হিচাপ করে তোলে তবে এটি এন এর জন্য আবার হিচাপ করবে না আরও অপারেশন। সবচেয়ে খারাপ ক্ষেত্রে O(N)
ব্যয়টি এখনও অপারেশন অনুসারে, তবে বহু রানের তুলনায় মোড়ক ব্যয়O(N)/N
=O(1)
অপারেশন প্রতি। যেহেতু বড় অপারেশনগুলি পর্যাপ্ত বিরল, তাই প্রচুর পরিমাণে মাঝেমধ্যে কাজের কাজটি একটি ধ্রুবক উপাদান হিসাবে বাকী কাজের সাথে মিশ্রিত হিসাবে বিবেচনা করা যেতে পারে। আমরা বলি যে পর্যাপ্ত সংখ্যক কলগুলির জন্য কাজটি "amorised" হয়েছে যা এটি asyptotically অদৃশ্য হয়ে যায়।
অনুমান বিশ্লেষণের জন্য সাদৃশ্য:
তুমি গাড়ি চালাও। মাঝেমধ্যে, আপনাকে গ্যাস স্টেশনে যেতে 10 মিনিট ব্যয় করতে হবে এবং তারপরে 1 মিনিট গ্যাস দিয়ে ট্যাঙ্কটি রিফিল করতে হবে। আপনি যখন প্রতিবার নিজের গাড়িটি নিয়ে এই জায়গায় গেছেন (গ্যাস স্টেশনে 10 মিনিট গাড়ি চালানো ব্যয় করুন, একটি গ্যালনের ভগ্নাংশটি পূরণ করতে কয়েক সেকেন্ড ব্যয় করুন), এটি খুব অকার্যকর হবে। তবে আপনি যদি প্রতি কয়েকদিনে একবার এই ট্যাঙ্কটি পূরণ করেন, গ্যাস স্টেশনে গাড়ি চালানোর জন্য 11 মিনিট যথেষ্ট পরিমাণে ভ্রমণের জন্য "অমিতবিত" করা হয়, আপনি এটি উপেক্ষা করতে পারেন এবং আপনার সমস্ত ট্রিপগুলি ভান করতে পারে 5% দীর্ঘ longer
গড়-মামলার এবং মোড়বিহীন নিকৃষ্টতম মামলার মধ্যে তুলনা:
যদিও, আপনি যদি কোনও আক্রমণকারীর পক্ষে যুক্তিসঙ্গতভাবে উদ্বিগ্ন হন তবে আরও অনেক অন্যান্য অ্যালগরিদমিক আক্রমণকারী ভেক্টরকে এমোরিটাইজেশন এবং গড়-কেস ছাড়াও উদ্বিগ্ন হতে হবে))
গড়-কেস এবং আমোরাইজেশন উভয়ই স্কেলিংকে মাথায় রেখে চিন্তা করার এবং ডিজাইনের জন্য অবিশ্বাস্যভাবে কার্যকর সরঞ্জাম।
( এই সাবটোপিকটিতে আগ্রহী হলে গড় কেস এবং মোড়বিহীন বিশ্লেষণের মধ্যে পার্থক্য দেখুন ))
বহুমাত্রিক বিগ-ও
বেশিরভাগ সময়, লোকেরা বুঝতে পারে না যে কর্মক্ষেত্রে একাধিক পরিবর্তনশীল রয়েছে। উদাহরণস্বরূপ, একটি স্ট্রিং-অনুসন্ধান অ্যালগরিদমে আপনার অ্যালগরিদমতে সময় লাগতে পারে O([length of text] + [length of query])
, অর্থাৎ এটি দুটি ভেরিয়েবলের মতো লিনিয়ার O(N+M)
। অন্যান্য আরও নিষ্পাপ আলগোরিদিমগুলি হতে পারে O([length of text]*[length of query])
বা O(N*M)
। একাধিক ভেরিয়েবল উপেক্ষা করা আমি অ্যালগরিদম বিশ্লেষণে দেখতে পাওয়া সবচেয়ে সাধারণ ওভারসাইটগুলির মধ্যে একটি এবং অ্যালগরিদম ডিজাইনের সময় আপনাকে প্রতিবন্ধক করতে পারি।
পুরো গল্প
মনে রাখবেন যে বিগ-ও পুরো গল্প নয়। আপনি ক্যাচিং ব্যবহার করে, ক্যাশে-বিস্মৃত করে, ডিস্কের পরিবর্তে র্যামের সাথে কাজ করে, সমান্তরাল ব্যবহার করে বা সময়ের আগে কাজ করে বাধা বাধা এড়ানোর মাধ্যমে কিছু অ্যালগরিদমকে দ্রুতগতিতে গতিতে পারেন - এই কৌশলগুলি প্রায়শই হয় ক্রম-বৃদ্ধির ক্রম থেকে স্বতন্ত্র থাকে "বিগ-ও" স্বরলিপি, যদিও আপনি প্রায়শই সমান্তরাল অ্যালগরিদমের বিগ-ও সংকেতটিতে করের সংখ্যা দেখতে পাবেন।
এছাড়াও মনে রাখবেন যে আপনার প্রোগ্রামের লুকানো বাধাগুলির কারণে, আপনি সম্ভবত অ্যাসিম্পটোটিক আচরণের যত্ন নেবেন না। আপনি একটি সীমাবদ্ধ সংখ্যার সাথে কাজ করতে পারেন উদাহরণস্বরূপ:
O(N log(N))
কুইকোর্টটি ; আপনি সন্নিবেশ বাছাই করতে চান, যা ছোট ইনপুটগুলিতে ভাল সম্পাদন করে। এই পরিস্থিতিগুলি প্রায়শই বিভাজন এবং বিজয়ী অ্যালগরিদমগুলিতে আসে, যেখানে আপনি সমস্যাটিকে ছোট এবং ছোট সাব-প্রবলেমে ভাগ করে দেন যেমন পুনরাবৃত্তি বাছাই, দ্রুত ফুরিয়ার রূপান্তর বা ম্যাট্রিক্স গুণন।অনুশীলনে, এমনকি অ্যালগরিদমের মধ্যেও একই বা অনুরূপ অ্যাসিপোটোটিক পারফরম্যান্স রয়েছে, তাদের আপেক্ষিক যোগ্যতা আসলে অন্যান্য জিনিস দ্বারা চালিত হতে পারে যেমন: অন্যান্য পারফরমেন্সের কারণগুলি (কুইকোর্ট এবং সংহতকরণ উভয়ই) O(N log(N))
, তবে সিপিইউ ক্যাশের সুবিধা নেয়); বাস্তবায়নের স্বাচ্ছন্দ্যের মতো অ-কর্মক্ষমতা বিবেচনা; কোনও লাইব্রেরি উপলব্ধ কিনা এবং গ্রন্থাগারটি কতটা নামী এবং পরিচালনাযোগ্য।
প্রোগ্রামগুলি 500MHz কম্পিউটার বনাম 2GHz কম্পিউটারে ধীরে চলবে। আমরা এটিকে সত্যিকার অর্থেই রিসোর্স সীমার অংশ হিসাবে বিবেচনা করি না, কারণ আমরা মেশিন রিসোর্সের ক্ষেত্রে উদাহরণস্বরূপ স্কেলিংয়ের কথা ভাবি (যেমন প্রতি ক্লকচক্র) প্রতি সেকেন্ডে নয়। তবে, অনুরূপ জিনিস রয়েছে যা 'গোপনে' পারফরম্যান্সকে প্রভাবিত করতে পারে, যেমন আপনি অনুকরণের অধীনে চলছেন কিনা, বা সংকলকটি অনুকূলিত কোড রয়েছে কিনা। এগুলি কিছু প্রাথমিক ক্রিয়াকলাপগুলিকে আরও বেশি সময় নিতে পারে (এমনকি একে অপরের তুলনায় আপেক্ষিক) বা এমনকি কিছু অপারেশনকে তাত্পর্যপূর্ণ করে তোলে (এমনকি একে অপরের সাথে সম্পর্কিতও) operations বিভিন্ন বাস্তবায়ন এবং / বা পরিবেশের মধ্যে প্রভাবটি ছোট বা বড় হতে পারে। আপনি কি এই ছোট্ট অতিরিক্ত কাজটি করতে ভাষা বা মেশিনগুলি স্যুইচ করেন? এটি আরও শতাধিক কারণে (প্রয়োজনীয়তা, দক্ষতা, সহকর্মী, প্রোগ্রামার উত্পাদনশীলতা,
উপরের বিষয়গুলি যেমন প্রোগ্রামিং ভাষা ব্যবহার করা হয় তার নির্বাচনের প্রভাবের মতো প্রায় কখনওই ধ্রুবক ফ্যাক্টরের অংশ হিসাবে বিবেচনা করা হয় না (এটি হওয়া উচিত নয়); তবুও তাদের এ বিষয়ে সচেতন হওয়া উচিত কারণ কখনও কখনও (যদিও খুব কম) তারা জিনিসগুলিকে প্রভাবিত করতে পারে। Cpython মধ্যে উদাহরণস্বরূপ, নেটিভ অগ্রাধিকার কিউ বাস্তবায়ন এসিম্পটোটিকভাবে অ অনুকূল (হয় O(log(N))
বদলে O(1)
সন্নিবেশ না কি এটি-মিনিট আপনার পছন্দ জন্য); আপনি অন্য বাস্তবায়ন ব্যবহার করেন? সম্ভবত না, যেহেতু সি বাস্তবায়ন সম্ভবত দ্রুততর এবং অন্য কোথাও সম্ভবত একই রকম সমস্যা রয়েছে। ট্রেড অফস রয়েছে; কখনও কখনও তারা গুরুত্বপূর্ণ এবং কখনও কখনও তারা না।
( সম্পাদনা করুন : "সরল ইংরেজী" ব্যাখ্যাটি এখানেই শেষ হয়েছে))
গণিত সংযোজন
সম্পূর্ণতার জন্য, বড়-ও স্বরলিপিটির যথাযথ সংজ্ঞাটি নিম্নরূপ: এর f(x) ∈ O(g(x))
অর্থ হ'ল "ফ সংক্ষিপ্তভাবে কনস্ট * জি দ্বারা উপরের দিকে আবদ্ধ": এক্স এর কিছু সীমাবদ্ধ মানের নীচে সমস্ত কিছু উপেক্ষা করে একটি ধ্রুবক উপস্থিত রয়েছে |f(x)| ≤ const * |g(x)|
। (অন্যান্য চিহ্ন হিসাবে অনুসরণ করে আছেন: ঠিক O
উপায়ে ≤, Ω
। এর মানে হল ≥ আছে ছোট হাতের ধরন আছে: o
মানে <, এবং ω
মানে>।) f(x) ∈ Ɵ(g(x))
দুটি অর্থ হয় f(x) ∈ O(g(x))
এবং f(x) ∈ Ω(g(x))
(upper- এবং ছ দ্বারা নিম্ন-বেষ্টিত): অস্তিত্ব আছে কিছু ধ্রুবক যেমন যে চ সর্বদা "ব্যান্ড" এর মাঝে পড়ে থাকবে const1*g(x)
এবং const2*g(x)
। এটি আপনার পক্ষে শক্তিশালী অ্যাসিপটোটিক স্টেটমেন্ট এবং প্রায় সমতুল্য equivalent==
। (দুঃখিত, স্বচ্ছতার জন্য আমি এখন অবধি নিরঙ্কুশিত মান চিহ্নগুলির উল্লেখকে বিলম্বিত করার সিদ্ধান্ত নিয়েছি; বিশেষত কারণ আমি কম্পিউটার বিজ্ঞানের প্রসঙ্গে নেতিবাচক মূল্যবোধ কখনই দেখিনি।)
লোকেরা প্রায়শই ব্যবহার করবে = O(...)
, যা সম্ভবত আরও সঠিক 'কমপ্লেক্স-বিজ্ঞান' স্বরলিপি, এবং ব্যবহারের জন্য সম্পূর্ণ বৈধ; "f = O (...)" পড়ছে "f is অর্ডার ... / f xxx- দ্বারা আবদ্ধ ..." এবং "f এর এমন কিছু অভিব্যক্তি যা অ্যাসিপটিক্স ..." হিসাবে ভাবা হয়। আমাকে আরও কঠোর ব্যবহার করতে শেখানো হয়েছিল ∈ O(...)
। ∈
"" এর একটি উপাদান "এর অর্থ (এখনও আগের মতো পড়া)। এই বিশেষ ক্ষেত্রে, O(N²)
মত {উপাদানগুলি রয়েছে 2 N²
, 3 N²
, 1/2 N²
, 2 N² + log(N)
, - N² + N^1.9
, ...} এবং অসীম বড়, কিন্তু এটি এখনও একটি দল আছে।
ও এবং প্রতিসাম্য নয় (n = O (n²), তবে n² ও (এন) নয়, তবে Ɵ প্রতিসাম্যযুক্ত, এবং (যেহেতু এই সম্পর্কগুলি সমস্ত ট্রানজিটিভ এবং রিফ্লেক্সেটিভ)) therefore, সুতরাং, প্রতিসম ও ট্রানজিটিভ এবং রিফ্লেক্সেভ , এবং তাই সমান শ্রেণিতে সমস্ত ফাংশনের সেটকে পার্টিশন করে । একটি সমতুল্য শ্রেণি এমন জিনিসগুলির একটি সেট যা আমরা সমান বলে বিবেচনা করি। এর অর্থ, আপনি যে কোনও ক্রিয়াকলাপ চিন্তা করতে পারেন, আপনি শ্রেণীর একটি সাধারণ / অনন্য 'অ্যাসিপোটিক প্রতিনিধি' খুঁজে পেতে পারেন (সাধারণত সীমাটি গ্রহণ করে ... আমি মনে করি ); আপনি যেমন সমস্ত ইন্টিজারকে মতভেদ বা সন্নিবেশে গ্রুপ করতে পারেন ঠিক তেমন আপনি ছোট ছোট শর্তাদি উপেক্ষা করে functions এক্স-ইশ, লগ (এক্স) ^ 2-ইসহ ইত্যাদির সাথে সমস্ত ফাংশনকে গ্রুপ করতে পারেন (তবে কখনও কখনও আপনি এতে আটকে থাকতে পারেন) আরও জটিল ফাংশন যা তাদের কাছে পৃথক শ্রেণি)।
=
স্বরলিপি আরো সাধারণ একটা কারণ হতে পারে এবং এমনকি বিশ্ব বিখ্যাত কম্পিউটার বিজ্ঞানীরা কাগজপত্র ব্যবহার করা হয়। অতিরিক্তভাবে, এটি প্রায়শই এমন হয় যে কোনও নৈমিত্তিক সেটিংয়ে লোকেরা O(...)
যখন তাদের অর্থ বোঝায় Ɵ(...)
; এটি প্রযুক্তিগতভাবে সত্য কারণ জিনিসগুলির সেটটি Ɵ(exactlyThis)
একটি উপসেট O(noGreaterThanThis)
... এবং এটি টাইপ করা সহজ। ;-)
সম্পাদনা: তাত্ক্ষণিক দ্রষ্টব্য, এটি সম্ভবত থি নোটেশন (যা একটি উচ্চ এবং নিম্ন সীমানা উভয়) এর সাথে বিগ ও স্বরলিপি (যা একটি উচ্চ সীমানা) বিভ্রান্ত করছে । আমার অভিজ্ঞতায় এটি আসলে অ-একাডেমিক সেটিংসে আলোচনার সাধারণ। যে কোনও বিভ্রান্তির জন্য ক্ষমা চাইছি।
একটি বাক্যে: আপনার কাজের আকার বাড়ার সাথে সাথে এটি শেষ করতে কত সময় লাগবে?
স্পষ্টতই এটি কেবল ইনপুট হিসাবে "আকার" এবং আউটপুট হিসাবে "সময় নেওয়া" ব্যবহার করে - আপনি যদি মেমরির ব্যবহার ইত্যাদি সম্পর্কে কথা বলতে চান তবে একই ধারণা প্রযোজ্য lies
এখানে এমন একটি উদাহরণ রয়েছে যেখানে আমাদের এন টি-শার্ট রয়েছে যা আমরা শুকিয়ে যেতে চাই। আমরা ধরে নিব এটি শুকানোর স্থানে আনার জন্য এটি অবিশ্বাস্যভাবে দ্রুত হয়েছে (যেমন মানুষের মিথস্ক্রিয়াটি নগন্য নয়)। বাস্তব জীবনে তা অবশ্যই নয় ...
বাইরে একটি ওয়াশিং লাইন ব্যবহার করে: ধরে নেওয়া আপনার ওপেনের (1) সময়ে শুকনো ধোয়া ধীরে ধীরে বড় y তবে আপনার কাছে যা কিছু আছে তা একই সূর্য এবং তাজা বাতাস পাবে তাই আকারটি শুকানোর সময়কে প্রভাবিত করে না।
টাম্পল ড্রায়ার ব্যবহার করে: আপনি প্রতিটি ভারে 10 টি শার্ট রেখেছিলেন এবং তারপরে এক ঘন্টা পরে তা সম্পন্ন করা হবে। (প্রকৃত সংখ্যাগুলি এখানে উপেক্ষা করুন - তারা অপ্রাসঙ্গিক)) সুতরাং 50 টি শার্ট শুকানো 10 শার্ট শুকানোর হিসাবে প্রায় 5 গুণ সময় নেয় takes
সমস্ত কিছু এয়ারিং আলমারিতে রেখে দেওয়া: আমরা যদি সবকিছুকে একটি বড় গাদা করে রাখি এবং কেবল সাধারণ উষ্ণতা এটি করতে দিই, তবে মধ্য শার্টগুলি শুকিয়ে যেতে অনেক সময় লাগবে। আমি বিশদটি অনুমান করতে চাই না, তবে আমার সন্দেহ হয় এটি কমপক্ষে ও (এন ^ 2) - আপনি যখন ধোয়ার লোড বাড়িয়ে দেবেন, শুকানোর সময়টি তত দ্রুত বৃদ্ধি পায়।
"বিগ ও" স্বরলিপিটির একটি গুরুত্বপূর্ণ বিষয় হ'ল এটি কোনও নির্দিষ্ট আকারের জন্য কোন অ্যালগরিদম দ্রুততর হবে তা বলে না । জোড়গুলির অ্যারে বনাম (স্ট্রিং, পূর্ণসংখ্যা) একটি হ্যাশটেবল (স্ট্রিং কী, পূর্ণসংখ্যার মান) নিন। স্ট্রিংয়ের উপর ভিত্তি করে হ্যাশটেবলের একটি কী বা অ্যারেতে কোনও উপাদান খুঁজে পাওয়া কি দ্রুত? (উদাহরণস্বরূপ, অ্যারের জন্য, "স্ট্রিং অংশ প্রদত্ত চাবিটির সাথে মিলিত হয় এমন প্রথম উপাদানটি সন্ধান করুন।") হ্যাশটবেবলগুলি সাধারণত এমোরিটাইজড হয় (on = "গড়ে") ও (1) - একবার সেগুলি সেট আপ হয়ে গেলে, এটি নেওয়া উচিত একই সময় 100,000 এন্ট্রি টেবিলের মতো 100 এন্ট্রি টেবিলটিতে একটি এন্ট্রি সন্ধান করতে। একটি অ্যারেতে উপাদান খুঁজে বের করা (সূচকের পরিবর্তে সামগ্রীর উপর ভিত্তি করে) রৈখিক, অর্থাৎ ও (এন) - গড়ে, আপনাকে অর্ধেক প্রবেশদ্বারটি দেখতে হবে।
এটি কি দেখার জন্য একটি অ্যারের চেয়ে দ্রুত হ্যাশটেবল তৈরি করে? অগত্যা। আপনি যদি এন্ট্রিগুলির একটি খুব ছোট সংগ্রহ পেয়ে থাকেন তবে একটি অ্যারে আরও দ্রুত হতে পারে - আপনি যে সন্ধান করছেন তার হ্যাশকোড গণনা করতে যে সময় লাগে তা আপনি সমস্ত স্ট্রিং চেক করতে সক্ষম হতে পারেন। ডেটা সেটটি আরও বড় হওয়ার সাথে সাথে, হ্যাশটেবল শেষ পর্যন্ত অ্যারেটিকে হারাবে।
বিগ ও কোনও ফাংশনের বৃদ্ধির আচরণের উপরের সীমাটি বর্ণনা করে, উদাহরণস্বরূপ কোনও প্রোগ্রামের রানটাইম, যখন ইনপুটগুলি বড় হয়।
উদাহরণ:
ও (এন): যদি আমি ইনপুট আকারটি রানটাইম দ্বিগুণ করি
ও (এন 2 ): যদি ইনপুট আকারটি রানটাইম চতুর্ভুজ দ্বিগুণ করে
ও (লগ এন): ইনপুট আকারটি দ্বিগুণ হলে রানটাইম একের সাথে বেড়ে যায়
ও (2 এন ): ইনপুট আকারটি একের বেশি হলে রানটাইম দ্বিগুণ হয়
ইনপুট আকারটি সাধারণত ইনপুট উপস্থাপনের জন্য প্রয়োজনীয় বিটগুলির স্থান is
বিগ ও নোটেশনটি সাধারণত প্রোগ্রামাররা ইনপুট সেটের আকারের ফাংশন হিসাবে প্রকাশের জন্য কোনও গণনা (অ্যালগোরিদম) কতক্ষণ সময় নেয় তা প্রায় অনুমান হিসাবে বিবেচনা করা হয়।
ইনপুটগুলির সংখ্যা বৃদ্ধি হওয়ায় দুটি অ্যালগরিদম কত ভাল বাড়বে তা তুলনা করতে বিগ ও দরকারী।
আরও স্পষ্টভাবে বিগ ও স্বরলিপি কোনও ফাংশনের অ্যাসিম্পটোটিক আচরণ প্রকাশ করতে ব্যবহৃত হয়। এর অর্থ এটি অনন্তের কাছে যাওয়ার সাথে ফাংশনটি কীভাবে আচরণ করে।
অনেক ক্ষেত্রে একটি অ্যালগরিদমের "ও" নিম্নলিখিত সমস্যার মধ্যে পড়বে:
বিগ হে সেই কারণগুলিকে উপেক্ষা করে যা কোনও কার্যের বর্ধনের জন্য অর্থবহ উপায়ে অবদান রাখে না কারণ ইনপুটের আকার অনন্তের দিকে বৃদ্ধি পায়। এর অর্থ হ'ল ফাংশনটিতে যুক্ত বা গুণিত হওয়া ধ্রুবকগুলি কেবল উপেক্ষা করা হয়।
বিগ ও নিজেকে একটি সাধারণ উপায়ে "এক্সপ্রেস" করার একটি উপায়, "আমার কোড চালাতে কত সময় / স্থান লাগে?"
আপনি প্রায়শই O (n), O (n 2 ), O (nlogn) এবং আরও অনেক কিছু দেখতে পাবেন, এগুলি কেবল দেখানোর উপায়; কীভাবে একটি অ্যালগরিদম পরিবর্তন হয়?
ও (এন) এর অর্থ বিগ ও হ'ল এন, এবং এখন আপনি ভাবতে পারেন, "এন কী !?" ওয়েল "এন" হ'ল উপাদানগুলির পরিমাণ। ইমেজিং আপনি একটি অ্যারেতে একটি আইটেম সন্ধান করতে চান। আপনাকে প্রতিটি উপাদানকে এবং "আপনি কি সঠিক উপাদান / আইটেমটি" হিসাবে দেখতে হবে? সবচেয়ে খারাপ ক্ষেত্রে আইটেমটি সর্বশেষ সূচকে রয়েছে, যার অর্থ তালিকার আইটেমগুলির যতটা সময় লেগেছে তাই এটি জেনেরিক হওয়ার জন্য আমরা বলি "ওহে হায়, এন একটি যথাযথ মান হিসাবে দেওয়া হয়!" ।
সুতরাং আপনি বুঝতে পারবেন "এন 2 " এর অর্থ কী, তবে আরও সুনির্দিষ্ট হতে গেলে, এই চিন্তায় খেলুন আপনার একটি সরল, বাছাইকরণ অ্যালগরিদমের সহজতম উপায়; bubblesort। এই অ্যালগরিদমের প্রতিটি আইটেমের জন্য পুরো তালিকাটি দেখতে হবে।
আমার তালিকা
এখানে প্রবাহ হবে:
এটি ও এন 2 কারণ আপনার তালিকার সমস্ত আইটেম "এন" আইটেমগুলি দেখতে হবে। প্রতিটি আইটেমের জন্য, আপনি সমস্ত আইটেম একবার করে দেখুন, তুলনা করার জন্য, এটিও "এন", সুতরাং প্রতিটি আইটেমের জন্য, আপনি "এন" বার দেখতে পান যার অর্থ এন * এন = এন 2
আমি আশা করি এটি আপনার মত এটি সহজ।
তবে মনে রাখবেন, সময় ও স্থানের পদ্ধতিতে নিজেকে বিস্তৃত করার একমাত্র উপায় বিগ ও।
বিগ হে একটি অ্যালগরিদমের মৌলিক স্কেলিং প্রকৃতি বর্ণনা করে।
প্রচুর তথ্য রয়েছে যা বিগ ও আপনাকে প্রদত্ত অ্যালগরিদম সম্পর্কে বলেন না। এটি হাড়কে কাটায় এবং কেবলমাত্র একটি আলগোরিদমের স্কেলিং প্রকৃতি সম্পর্কে তথ্য দেয়, বিশেষত কীভাবে "ইনপুট আকারের" প্রতিক্রিয়াতে একটি অ্যালগরিদম স্কেলের রিসোর্সগুলি (সময় বা স্মৃতি মনে করে) ব্যবহার করে।
একটি বাষ্প ইঞ্জিন এবং একটি রকেটের মধ্যে পার্থক্য বিবেচনা করুন। এগুলি কেবল একই জিনিসটির বিভিন্ন ধরণের (যেমন বলা যাক, একটি প্রিমাস ইঞ্জিন বনাম একটি লাম্বোরগিনি ইঞ্জিন) নয় তবে তারা মূলত নাটকীয়ভাবে বিভিন্ন ধরণের প্রপালশন সিস্টেম are কোনও বাষ্প ইঞ্জিন খেলনা রকেটের চেয়ে দ্রুত হতে পারে তবে কোনও বাষ্প পিস্টন ইঞ্জিন একটি কক্ষপথ লঞ্চ গাড়ির গতি অর্জন করতে সক্ষম হবে না। কারণ এই সিস্টেমগুলিতে প্রদত্ত গতির ("ইনপুট আকার") পৌঁছানোর জন্য প্রয়োজনীয় জ্বালানীর ("রিসোর্স ব্যবহার") এর সম্পর্কের সাথে বিভিন্ন স্কেলিং বৈশিষ্ট্য রয়েছে।
এটা কেন এত গুরুত্বপূর্ণ? কারণ সফ্টওয়্যার এমন সমস্যা নিয়ে কাজ করে যা আকারে ট্রিলিয়ন অবধি ভিন্ন হতে পারে। এক মুহুর্তের জন্য তা বিবেচনা করুন। চাঁদে ভ্রমণের জন্য প্রয়োজনীয় গতি এবং মানুষের চলার গতির মধ্যে অনুপাত 10,000: 1 এর চেয়ে কম এবং এটি ইনপুট আকারের সফ্টওয়্যারটির সীমার তুলনায় একেবারেই ক্ষুদ্র। এবং সফ্টওয়্যার ইনপুট আকারে জ্যোতির্বিজ্ঞানের পরিসরের মুখোমুখি হতে পারে কারণ কোনও অ্যালগরিদমের বিগ ও জটিলতার সম্ভাবনা রয়েছে, এটি কোনও মৌলিক মাপকাঠি প্রকৃতির, কোনও বাস্তবায়নের বিশদটি বোঝার জন্য।
ক্যানোনিকাল বাছাই উদাহরণ বিবেচনা করুন। বুদ্বুদ-বাছাইটি হ'ল (এন 2 ) যখন মার্জ-বাছাই হ'ল (এন লগ এন)। ধরা যাক আপনার দুটি বাছাই করার অ্যাপ্লিকেশন রয়েছে, অ্যাপ্লিকেশন এ যা বুদ্বুদ-সাজ্ট এবং অ্যাপ্লিকেশন বি ব্যবহার করে যা মার্জ-সাজান ব্যবহার করে, এবং ধরা যাক যে প্রায় 30 টি উপাদানগুলির ইনপুট আকারের জন্য বাছাই করার সময় অ্যাপ্লিকেশন বি এর চেয়ে 1000x দ্রুত হয়। যদি আপনাকে কখনও 30 টিরও বেশি উপাদানকে বাছাই করতে না হয় তবে স্পষ্টতই আপনার অ্যাপ্লিকেশন এটিকে পছন্দ করা উচিত, কারণ এই ইনপুট আকারে এটি আরও দ্রুত is যাইহোক, যদি আপনি খুঁজে পান যে আপনার দশ মিলিয়ন আইটেম বাছাই করতে পারে তবে আপনি যা প্রত্যাশা করবেন তা হ'ল অ্যাপ্লিকেশন বি এই ক্ষেত্রে অ্যাপ্লিকেশন এ এর চেয়ে হাজার গুণ বেশি দ্রুত শেষ হবে, পুরোপুরি প্রতিটি অ্যালগরিদমের স্কেলগুলির কারণে।
বিগ-ও এর সাধারণ জাতগুলি ব্যাখ্যা করার সময় আমি এখানে সরল ইংলিশ ব্যস্তিটিরি ব্যবহার করি
সব ক্ষেত্রে তালিকার নীচের অংশে তালিকার উপরে অ্যালগোরিদমগুলিকে বেশি পছন্দ করুন। তবে আরও ব্যয়বহুল জটিল শ্রেণিতে যাওয়ার ব্যয় উল্লেখযোগ্যভাবে পরিবর্তিত হয়।
হে (1):
কোন বৃদ্ধি নাই. সমস্যা যত বড় হোক না কেন, আপনি একই পরিমাণে এটি সমাধান করতে পারেন। এটি সম্প্রচারের সাথে কিছুটা সাদৃশ্য যেখানে ব্রডকাস্ট রেঞ্জের মধ্যে থাকা লোকের সংখ্যা নির্বিশেষে কোনও নির্দিষ্ট দূরত্বে সম্প্রচার করতে একই পরিমাণ শক্তি লাগে।
ও (লগ এন ):
এই জটিলতাটি ও (1) এর সমান এটি বাদে এটি কিছুটা খারাপ। সমস্ত ব্যবহারিক উদ্দেশ্যে, আপনি এটিকে একটি খুব বড় ধ্রুবক স্কেলিং হিসাবে বিবেচনা করতে পারেন। 1 হাজার থেকে 1 বিলিয়ন আইটেম প্রক্রিয়াকরণের মধ্যে কাজের পার্থক্যটি কেবল একটি ফ্যাক্টর সিক্স।
ও ( এন ):
সমস্যা সমাধানের ব্যয়টি সমস্যার আকারের সাথে সমানুপাতিক। আপনার সমস্যাটি যদি আকারে দ্বিগুণ হয়, তবে সমাধানের ব্যয় দ্বিগুণ। যেহেতু বেশিরভাগ সমস্যাগুলি কোনওভাবে কম্পিউটারে স্ক্যান করতে হয়, ডেটা এন্ট্রি, ডিস্কটি পড়তে বা নেটওয়ার্ক ট্রাফিক হিসাবে এটি সাধারণত একটি সাশ্রয়ী স্কেলিং ফ্যাক্টর।
ও ( এন লগ এন ):
এই জটিলতা ও ( এন ) এর সাথে খুব মিল । সমস্ত ব্যবহারিক উদ্দেশ্যে, দুটি সমান। জটিলতার এই স্তরটি এখনও সাধারণভাবে স্কেলেবল হিসাবে বিবেচিত হবে। অনুমানগুলি টুইট করে কিছু ও ( এন লগ এন ) অ্যালগোরিদমগুলি ও ( এন ) অ্যালগরিদমে রূপান্তরিত হতে পারে । উদাহরণস্বরূপ, কীগুলির আকারকে সীমাবদ্ধ করা O ( n লগ এন ) থেকে ও ( এন ) এ বাছাই হ্রাস করে ।
ও ( এন 2 ):
বর্গ হিসাবে প্রসারিত হয়, যেখানে n একটি বর্গাকার পাশের দৈর্ঘ্য length এটি "নেটওয়ার্ক এফেক্ট" এর সমান প্রবৃদ্ধির হার, যেখানে নেটওয়ার্কের প্রত্যেকে নেটওয়ার্কের সবাইকে চেনে। বৃদ্ধি ব্যয়বহুল। বেশিরভাগ স্কেলেবল সমাধান উল্লেখযোগ্য জিমন্যাস্টিকস না করে এই স্তরের জটিলতার সাথে অ্যালগরিদম ব্যবহার করতে পারে না। এটি সাধারণত অন্য সমস্ত বহু-জটিল জটিলতা - ও ( এন কে ) - তেও প্রযোজ্য ।
ও (2 এন ):
স্কেল করে না। আপনার তুচ্ছ আকারের কোনও সমস্যা সমাধানের কোন আশা নেই। কী এড়াতে হবে তা জানার জন্য এবং ও ( এন কে ) -তে থাকা আনুমানিক অ্যালগরিদমগুলি বিশেষজ্ঞদের জন্য দরকারী ।
বিগ ও একটি আলগোরিদিম তার ইনপুটটির আকারের তুলনায় কত সময় / স্থান ব্যবহার করে তার একটি পরিমাপ।
যদি একটি অ্যালগরিদম O (n) হয় তবে সময় / স্থান তার ইনপুট হিসাবে একই হারে বৃদ্ধি পাবে।
যদি একটি অ্যালগরিদম হয় ও (এন 2) ) হয় তবে এর ইনপুট স্কোয়ারের হারে সময় / স্থান বৃদ্ধি পাবে।
ইত্যাদি।
বিগ ও এর সরল ইংরেজী ব্যাখ্যা কী? সম্ভব এবং সহজ গণিত হিসাবে খুব কম আনুষ্ঠানিক সংজ্ঞা সহ।
বিগ-ও সংকেতের প্রয়োজনের সরল ইংরেজী ব্যাখ্যা :
আমরা যখন প্রোগ্রাম করি, আমরা একটি সমস্যা সমাধানের চেষ্টা করছি। আমরা যা কোড করি তাকে অ্যালগরিদম বলা হয়। বিগ ও স্বীকৃতি আমাদের অ্যালগরিদমগুলির আরও খারাপ কেস পারফরম্যান্সকে একটি মানসম্পন্ন উপায়ে তুলনা করতে দেয়। সময়ের সাথে সাথে হার্ডওয়্যার স্পেসগুলি পরিবর্তিত হয় এবং হার্ডওয়্যারের উন্নতিগুলি অ্যালগরিদমগুলি চালাতে সময় কমিয়ে আনতে পারে। তবে হার্ডওয়্যার প্রতিস্থাপনের অর্থ এই নয় যে সময়ের সাথে সাথে আমাদের অ্যালগরিদম কোনও উন্নত বা উন্নত, কারণ আমাদের অ্যালগরিদম এখনও একই is সুতরাং আমাদের বিভিন্ন অ্যালগরিদমের তুলনা করার অনুমতি দেওয়ার জন্য, কোনওটি ভাল কিনা তা নির্ধারণ করার জন্য, আমরা বিগ ও স্বরলিপি ব্যবহার করি।
একটি প্লেইন ইংরেজি ব্যাখ্যা কি বড় হে স্বরলিপি হল:
সমস্ত অ্যালগরিদম একই পরিমাণে চালিত হয় না এবং ইনপুটটিতে থাকা আইটেমগুলির সংখ্যার উপর ভিত্তি করে পরিবর্তিত হতে পারে, যাকে আমরা n বলব । এই উপর ভিত্তি করে আমরা আরও খারাপ কেস বিশ্লেষণ বিবেচনা, অথবা একটি যেমন রান-টাইম উপরের-বাউন্ড এন বৃহত্তর এবং বৃহত্তর পেতে। আমাদের এন অবশ্যই কী তা সম্পর্কে আমাদের সচেতন থাকতে হবে , কারণ বিগ ও নোটের অনেকগুলি এটিকে উল্লেখ করে।
সফ্টওয়্যার প্রোগ্রামগুলির গতি পরিমাপ করা খুব কঠিন এবং আমরা যখন চেষ্টা করি তখন উত্তরগুলি খুব জটিল এবং ব্যতিক্রম এবং বিশেষ ক্ষেত্রে ভরা হতে পারে। এটি একটি বড় সমস্যা, কারণ যখন আমরা "দ্রুততম" এটি অনুসন্ধান করার জন্য দুটি ভিন্ন প্রোগ্রামকে একে অপরের সাথে তুলনা করতে চাই তখন those সমস্ত ব্যতিক্রম এবং বিশেষ কেসগুলি বিভ্রান্তিকর এবং অপ্রয়োজনীয়।
এই সমস্ত অস্বাস্থ্যকর জটিলতার ফলস্বরূপ, লোকেরা সম্ভব ক্ষুদ্রতম এবং সর্বনিম্ন জটিল (গাণিতিক) এক্সপ্রেশনগুলি ব্যবহার করে সফ্টওয়্যার প্রোগ্রামগুলির গতি বর্ণনা করার চেষ্টা করে। এই এক্সপ্রেশনগুলি খুব অপরিশোধিত অনুমানের: যদিও কিছুটা ভাগ্যের সাথে, তারা কোনও সফ্টওয়্যারের টুকরোটি দ্রুত বা ধীর গতির "সারাংশ" গ্রহণ করবে।
যেহেতু এগুলি অনুমানযোগ্য, তাই আমরা পাঠকের কাছে সংকেত দেওয়ার জন্য একটি সম্মেলন হিসাবে "O" (বিগ ওহ) অক্ষরটি ব্যবহার করি যে আমরা একটি স্থূল ওভারসিম্প্লিফিকেশন করছি। (এবং এটি নিশ্চিত করার জন্য যে কেউ ভুলক্রমে ভাবছে না যে অভিব্যক্তিটি কোনওভাবেই সঠিক)
আপনি "ওহ" অর্থ হিসাবে "বা" আনুমানিক "এর আদেশে পড়লে আপনি খুব বেশি ভুল করতে পারবেন না। (আমি মনে করি বিগ-ওহ-এর পছন্দটি হাস্যরসের চেষ্টা হতে পারে)।
এই "বিগ-ওহ" এক্সপ্রেশনগুলি কেবলমাত্র যা করার চেষ্টা করে তা হ'ল আমরা সফ্টওয়্যারটির যে পরিমাণ ডেটা প্রক্রিয়া করতে হয় তার পরিমাণ বাড়ায় সফ্টওয়্যারটি কমে যায় তা বর্ণনা করে। যদি আমরা প্রক্রিয়া করা দরকার এমন পরিমাণের দ্বিগুণ হয়ে থাকে, তবে সফটওয়্যারটির কাজ শেষ করতে দ্বিগুণ প্রয়োজন কি? আর দশ বার? অনুশীলনে, খুব সীমিত সংখ্যক বিগ-ওহ এক্সপ্রেশন রয়েছে যা আপনার মুখোমুখি হবে এবং এটি সম্পর্কে উদ্বিগ্ন হওয়া দরকার:
ভাল:
O(1)
ধ্রুবক : ইনপুট যত বড় হোক না কেন প্রোগ্রামটি চালাতে একই সময় নেয়।O(log n)
লোগারিদমিক : প্রোগ্রামের রান-টাইম কেবল ধীরে ধীরে বৃদ্ধি পায়, এমনকি ইনপুটটির আকারেও বড় বৃদ্ধি ঘটে।খারাপ জন:
O(n)
লিনিয়ার : প্রোগ্রাম রান-টাইম ইনপুট আকারের সাথে আনুপাতিকভাবে বৃদ্ধি পায়।O(n^k)
বহুপদী : - ইনপুটটির আকার বাড়ার সাথে একটি বহুবচনীয় ফাংশন হিসাবে - প্রসেসিংয়ের সময়টি দ্রুত এবং দ্রুত বৃদ্ধি পায়।... এবং কুৎসিত:
O(k^n)
সূচকীয় সমস্যা মাপ এমনকি মধ্যপন্থী বৃদ্ধির সঙ্গে খুব দ্রুত প্রোগ্রাম রান টাইম বৃদ্ধির - এটি শুধুমাত্র সূচকীয় আলগোরিদিম সঙ্গে ছোট ডেটা সেট প্রক্রিয়া বাস্তবসম্মতভাবে।O(n!)
ফ্যাক্টরিয়াল প্রোগ্রামটির রান-সময়টি আপনি সবচেয়ে স্বল্পতম এবং সবচেয়ে তুচ্ছ-ডামাসে ডেটাসেট ব্যতীত যে কোনও কিছুর জন্য অপেক্ষা করার সামর্থ্যের চেয়ে দীর্ঘতর হবে।O(n log n)
যা ভাল বলে বিবেচিত হবে।
একটি সহজ সরল উত্তর হতে পারে:
বিগ হে সেই অ্যালগরিদমের জন্য সবচেয়ে খারাপ সময় / স্থানের প্রতিনিধিত্ব করে। অ্যালগরিদম কখনই এই সীমাটির বেশি জায়গা / সময় নেবে না। বিগ হে চরম ক্ষেত্রে সময় / স্থান জটিলতার প্রতিনিধিত্ব করে।
ঠিক আছে, আমার 2 সেন্সেন্ট।
বিগ-ও, হ'ল প্রোগ্রাম দ্বারা ব্যবহৃত সংস্থান বৃদ্ধি , সমস্যা সমস্যা-উদাহরণ-আকার
সংস্থান: মোট-সিপিইউ সময় হতে পারে, সর্বোচ্চ র্যামের স্থান হতে পারে। ডিফল্টরূপে সিপিইউ সময় বোঝায়।
বলুন সমস্যাটি "যোগফলটি অনুসন্ধান করুন",
int Sum(int*arr,int size){
int sum=0;
while(size-->0)
sum+=arr[size];
return sum;
}
সমস্যা-উদাহরণ = {5,10,15} ==> সমস্যা-উদাহরণ-আকার = 3, পুনরাবৃত্তি-ইন-লুপ = 3
সমস্যা-উদাহরণ = {5,10,15,20,25} ==> সমস্যা-উদাহরণ-আকার = 5 পুনরুক্তি-ইন-লুপ = 5
আকার "এন" এর ইনপুটটির জন্য প্রোগ্রামটি অ্যারেতে "n" পুনরাবৃত্তির গতিতে বাড়ছে। সুতরাং বিগ-ওকে এন হিসাবে প্রকাশ করা হয় (এন)
বলুন সমস্যাটি "সংমিশ্রণটি অনুসন্ধান করুন",
void Combination(int*arr,int size)
{ int outer=size,inner=size;
while(outer -->0) {
inner=size;
while(inner -->0)
cout<<arr[outer]<<"-"<<arr[inner]<<endl;
}
}
সমস্যা-উদাহরণ = {5,10,15} ==> সমস্যা-উদাহরণ-আকার = 3, মোট পুনরাবৃত্তি = 3 * 3 = 9
সমস্যা-উদাহরণ = {5,10,15,20,25} ==> সমস্যা-উদাহরণ-আকার = 5, মোট-পুনরাবৃত্তি = 5 * 5 = 25
আকার "এন" এর ইনপুটটির জন্য প্রোগ্রামটি অ্যারেতে "n * n" পুনরাবৃত্তির গতিতে বাড়ছে। সুতরাং বিগ-ও হ'ল এন 2 হ'ল ও (এন 2 ) হিসাবে প্রকাশিত
বিগ হে নোটেশন হল স্থান বা চলমান সময়ের নিরিখে একটি অ্যালগরিদমের উপরের সীমাটি বর্ণনা করার একটি উপায়। এন হ'ল সমস্যাটির উপাদানগুলির সংখ্যা (উদাহরণস্বরূপ একটি অ্যারের আকার, একটি গাছে নোডের সংখ্যা ইত্যাদি) আমরা চলমান সময়টিকে n বড় হওয়ার সাথে সাথে বর্ণনা করতে আগ্রহী।
যখন আমরা কিছু অ্যালগোরিদমকে ও (চ (এন)) বলে থাকি আমরা বলছি যে সেই অ্যালগরিদমের দ্বারা চলমান সময় (বা স্থান প্রয়োজন) কিছু ধ্রুবক সময়ের চেয়ে সর্বদা কম থাকে এফ (এন)।
বাইনারি অনুসন্ধানে ও (লগন) এর চলমান সময় রয়েছে তা বলতে গেলে এমন কিছু ধ্রুবক সি উপস্থিত থাকে যা আপনি লগ (এন) দ্বারা গুণন করতে পারেন বাইনারি অনুসন্ধানের চলমান সময়ের চেয়ে সর্বদা বড় হবে। এই ক্ষেত্রে আপনার সর্বদা লগ (এন) তুলনা করার কয়েকটি ধ্রুবক ফ্যাক্টর থাকবে।
অন্য কথায় যেখানে g (n) হ'ল আপনার অ্যালগরিদমের চলমান সময়, আমরা বলি যে g (n) = O (f (n)) কখন g (n) <= c * f (n) যখন এন> কে, কোথায় সি এবং কে কিছু ধ্রুবক।
" বিগ ও-এর সরল ইংরেজী ব্যাখ্যা কী? সম্ভাব্য এবং সাধারণ গণিতের যতটা কম আনুষ্ঠানিক সংজ্ঞা রয়েছে তার সাথে। "
এত সুন্দর একটি সহজ এবং সংক্ষিপ্ত প্রশ্ন কমপক্ষে একটি সমান সংক্ষিপ্ত উত্তরের প্রাপ্য বলে মনে হয়, যেমন একজন শিক্ষার্থী প্রশিক্ষণের সময় গ্রহণ করতে পারে।
বিগ ও স্বরলিপিটি কেবলমাত্র ইনপুট ডেটা ** পরিমাণের পরিপ্রেক্ষিতে * একটি অ্যালগোরিদম কতটা সময় চলতে পারে তা কেবল বলে দেয় ।
(* একটি দুর্দান্ত, একক-মুক্ত সময়ের অর্থে!)
(** যা এটি গুরুত্বপূর্ণ, কারণ মানুষ সবসময় আরও বেশি চায় more তারা আজ বা কাল বেঁচে থাকুক )
ঠিক আছে, বিগ ও নোটেশন সম্পর্কে এত বিস্ময়কর কী তা যদি তা করে?
ব্যবহারিকভাবে বলতে গেলে, বিগ ও বিশ্লেষণ এত দরকারী এবং গুরুত্বপূর্ণ কারণ বিগ ও অ্যালগরিদমের নিজস্ব জটিলতায় ফোকাসকে চৌকসভাবে রাখেন এবং জাভা স্ক্রিপ্ট ইঞ্জিন, সিপিইউর গতি, আপনার ইন্টারনেট সংযোগ এবং যেমন আনুপাতিকতার ধ্রুবক এমন কোনও কিছুকে সম্পূর্ণ উপেক্ষা করেন and ঐ সমস্ত বিষয় যা হয়ে দ্রুত হয়ে যেমন laughably মডেল হিসেবে পুরানো টি । বিগ ও কেবলমাত্র সেইভাবে পারফরম্যান্সকে কেন্দ্র করে যা বর্তমান বা ভবিষ্যতের মানুষের কাছে সমানভাবে গুরুত্বপূর্ণ।
বিগ ও স্বরলিপি কম্পিউটার প্রোগ্রামিং / ইঞ্জিনিয়ারিংয়ের সবচেয়ে গুরুত্বপূর্ণ নীতিতে সরাসরি একটি স্পটলাইট জ্বলজ্বল করে, এটি সমস্ত ভাল প্রোগ্রামারদের চিন্তাভাবনা এবং স্বপ্ন দেখতে চালিত করতে অনুপ্রাণিত করে: প্রযুক্তির ধীরগতির অগ্রযাত্রার বাইরেও ফলাফল অর্জনের একমাত্র উপায় একটি আরও উন্নত উদ্ভাবন করা অ্যালগরিদম ।
অ্যালগরিদম উদাহরণ (জাভা):
// given a list of integers L, and an integer K
public boolean simple_search(List<Integer> L, Integer K)
{
// for each integer i in list L
for (Integer i : L)
{
// if i is equal to K
if (i == K)
{
return true;
}
}
return false;
}
অ্যালগরিদম বর্ণনা:
এই অ্যালগরিদম একটি তালিকা অনুসন্ধান করে আইটেম অনুসারে আইটেমটি চাবি খুঁজছেন,
তালিকার প্রতিটি আইটেমকে চিহ্নিত করা, যদি এটি কী হয় তবে সত্যটি ফিরে আসুন,
কীটি না পেয়ে লুপটি শেষ হয়ে গেলে, মিথ্যা ফিরিয়ে দিন।
বিগ-ও স্বরলিপি জটিলতার উপরের সীমাটি উপস্থাপন করে (সময়, স্থান, ..)
টাইম জটিলতায় অন বিগ-ও খুঁজে পেতে:
সবচেয়ে খারাপ ক্ষেত্রে কত সময় লাগে (ইনপুট আকার সম্পর্কিত) গণনা করুন:
সবচেয়ে খারাপ-কেস: তালিকায় কীটি বিদ্যমান নেই।
সময় (সবচেয়ে খারাপ-কেস) = 4 এন + 1
সময়: ও (4 এন + 1) = ও (এন) | বিগ-ও-এ, ধ্রুবকরা অবহেলিত
ও (এন) ~ লিনিয়ার
বিগ-ওমেগাও রয়েছে, যা সেরা-কেসের জটিলতার প্রতিনিধিত্ব করে:
সেরা-কেস: কীটি প্রথম আইটেম।
সময় (সেরা-কেস) = 4
সময়: Ω (4) = ও (1) ~ তাত্ক্ষণিক \ ধ্রুবক
C
আরও ভাল হবে
বড় ও
f (x) = O ( g (x)) যখন x এ যায় (উদাহরণস্বরূপ, a = + ∞) এর অর্থ এমন একটি ফাংশন কে রয়েছে যা:
f (x) = k (x) g (x)
k এর কয়েকটি আশেপাশে আবদ্ধ (যদি a = + ∞, এর অর্থ এই যে এখানে N এবং M সংখ্যা রয়েছে যা প্রতি x> N, | k (x) | <এম) এর জন্য রয়েছে।
অন্য কথায়, সরল ইংরেজিতে: f (x) = O ( g (x)), x → a, এর অর্থ হ'ল a এর একটি প্রতিবেশী অঞ্চলে, f এর g এবং কিছু সীমাবদ্ধ ফাংশনের পণ্যগুলিতে বিভক্ত হয় ।
ছোট ও
যাইহোক, এখানে ছোট ও এর সংজ্ঞা তুলনা করার জন্য।
f (x) = o ( g (x)) যখন x এর অর্থ হয় যে এখানে কোনও ফাংশন রয়েছে যা:
f (x) = k (x) g (x)
কে (এক্স) 0 এ যায় যখন এক্স এ যায়।
উদাহরণ
sin x = O (x) যখন x → 0 হয়।
sin x = O (1) যখন x → + ∞,
x 2 + x = O (x) যখন x → 0,
x 2 + x = O (x 2 ) যখন x → + ∞,
ln (x) = o (x) = O (x) যখন x → + ∞ ∞
মনোযোগ! সমান চিহ্নের সাথে চিহ্নিতকরণ "=" একটি "জাল সমতা" ব্যবহার করে: এটি সত্য যে ও (জি (এক্স)) = ও (জি (এক্স)), তবে মিথ্যা যে ও (জি (এক্স)) = ও (জি) (এক্স)). একইভাবে, x → + ∞ "যখন" ln (x) = o (x) লিখতে ঠিক হয় তবে "o (x) = ln (x)" সূত্রটি কোনও অর্থহীন নয়।
আরও উদাহরণ
O (1) = O (n) = O (n 2 ) যখন n → + ∞ (তবে অন্যভাবে নয়, সমতাটি "নকল"),
ও (এন) + ও (এন 2 ) = ও (এন 2 ) যখন এন → + ∞ ∞
ও (ও (এন 2 )) = ও (এন 2 ) যখন এন → + ∞ ∞
ও (এন 2 ) ও (এন 3 ) = ও (এন 5 ) যখন এন → + ∞ ∞
এখানে উইকিপিডিয়া নিবন্ধটি: https://en.wikedia.org/wiki/Big_O_notation
বিগ ও স্বরলিপি হ'ল বর্ণনা করার একটি উপায় যা একটি অ্যালগরিদম কত তাড়াতাড়ি চালিয়ে দেবে স্বেচ্ছাসেবী সংখ্যার ইনপুট পরামিতিগুলি, যা আমরা "এন" বলব। এটি কম্পিউটার বিজ্ঞানের ক্ষেত্রে দরকারী কারণ বিভিন্ন মেশিনগুলি বিভিন্ন গতিতে পরিচালিত হয় এবং কেবল একটি এলগরিদম 5 সেকেন্ড নেয় বলে আপনাকে বেশি কিছু বলে না কারণ আপনি যখন একটি 4.5 গিগাহার্জ অক্টোর-কোর প্রসেসরের সাহায্যে একটি সিস্টেম চালাচ্ছেন, আমি হয়ত চলছি একটি 15 বছরের পুরানো, 800 মেগাহার্টজ সিস্টেম, যা অ্যালগরিদম নির্বিশেষে বেশি সময় নিতে পারে। সুতরাং সময়ের নিরিখে একটি অ্যালগরিদম কত দ্রুত চলে তা উল্লেখ করার পরিবর্তে আমরা বলি যে ইনপুট পরামিতিগুলির সংখ্যা বা "এন" এর ক্ষেত্রে এটি কত দ্রুত চলে। এইভাবে অ্যালগরিদমগুলি বর্ণনা করে আমরা কম্পিউটারের গতিটি বিবেচনায় না নিয়েই অ্যালগরিদমের গতির তুলনা করতে সক্ষম হয়েছি।
আমি নিশ্চিত না যে আমি এই বিষয়ে আরও অবদান রাখছি তবে তবুও আমি ভেবেছি ভাগ করে নেব: একবার আমি এই ব্লগ পোস্টটি বেশ কয়েকটি সহায়ক (খুব প্রাথমিক হলেও) বিগ ও-তে ব্যাখ্যা এবং উদাহরণ পেয়েছি :
উদাহরণস্বরূপ, এটি আমার কাছিমের মতো খুলির মধ্যে খালি মৌলিক বিষয়গুলি পেতে সহায়তা করেছে, তাই আমি মনে করি যে আপনি সঠিক দিকে এগিয়ে যাবার জন্য এটি 10 মিনিটের একটি সুন্দর উত্থান।
আপনি বড় ও সম্পর্কে জানতে সমস্ত আছে জানতে চান? আমিও.
সুতরাং বড় হে সম্পর্কে কথা বলতে, আমি এমন শব্দগুলি ব্যবহার করব যাগুলির মধ্যে কেবল একটি বীট রয়েছে। প্রতি শব্দ প্রতি শব্দ। ছোট শব্দ দ্রুত হয়। আপনি এই শব্দগুলি জানেন এবং আমিও করি We আমরা একটি শব্দ সহ শব্দগুলি ব্যবহার করব। তারা ছোট. আমি নিশ্চিত যে আমরা ব্যবহার করব এমন সমস্ত শব্দ আপনি জানতে পারবেন!
এখন, আপনি এবং আমি কাজের কথা বলি। বেশিরভাগ সময়, আমি কাজ পছন্দ করি না। আপনি কি কাজ পছন্দ করেন? আপনার ক্ষেত্রে এমনটি হতে পারে তবে আমি নিশ্চিত যে আমি তা করি না।
আমি কাজে যেতে পছন্দ করি না। আমি কাজের সময় কাটাতে পছন্দ করি না। আমার যদি উপায় থাকে তবে আমি কেবল খেলতে এবং মজাদার জিনিসগুলি করতে চাই। আপনি কি আমার মত একই অনুভব করেন?
এখন মাঝে মাঝে আমাকে কাজে যেতে হয়। দুঃখজনক হলেও সত্য। সুতরাং, আমি যখন কর্মে থাকি তখন আমার একটি নিয়ম থাকে: আমি কম কাজ করার চেষ্টা করি try আমার যতটা কাজ সম্ভব ততটুকু কাছে। তাহলে আমি খেলতে যাই!
সুতরাং এখানে বড় খবরটি: বড় হে আমাকে কাজ না করতে সাহায্য করতে পারে! আমি আরও বেশি সময় খেলতে পারি, যদি আমি বড় ওকে জানি তবে কম কাজ, আরও খেলা! এটিই বড় ও আমাকে করতে সহায়তা করে।
এখন আমার কিছু কাজ আছে। আমার এই তালিকাটি রয়েছে: এক, দুই, তিন, চার, পাঁচ, ছয়। আমি অবশ্যই এই তালিকায় সমস্ত জিনিস যুক্ত করা উচিত।
বাহ, আমি কাজ ঘৃণা করি। তবে ওহ ভাল, আমি এটি করতে হবে। তাই আমি এখানে যাই।
একটি প্লাস টু তিনটি… প্লাস থ্রি হ'ল ছয় ... এবং চারটি ... আমি জানি না। আমি হারিয়ে গিয়েছে. আমার মাথায় কাজ করা আমার পক্ষে খুব কঠিন। আমি এই ধরণের কাজের জন্য খুব বেশি যত্ন নিই না।
সুতরাং আসুন কাজ না। আসুন আপনি এবং আমি কেবল এটি কতটা শক্ত তা ভাবুন। ছয় নম্বর যুক্ত করতে আমার কতটা কাজ করতে হবে?
দেখা যাক. আমার অবশ্যই এক এবং দুটি যোগ করতে হবে, এবং তারপরে এটি তিনটি যুক্ত করতে হবে, এবং তারপরে চারটি যুক্ত করতে হবে ... সব মিলিয়ে আমি ছয়টি যুক্ত গণনা করব। এটি সমাধান করতে আমাকে ছয়টি যুক্ত করতে হবে।
এই গণিতটি কতটা শক্ত তা আমাদের জানানোর জন্য এখানে বড় হে comes
বিগ ও বলেছেন: এটি সমাধান করতে আমাদের অবশ্যই ছয়টি করা উচিত। এক থেকে ছয় পর্যন্ত প্রতিটি জিনিসের জন্য একটি যোগ করুন। ছয়টি ছোট ছোট বিট ... কাজের প্রতিটি বিট একটি অ্যাড।
ঠিক আছে, আমি এখন তাদের যুক্ত করার কাজ করব না। তবে আমি জানি এটা কতটা কঠিন হবে। এটি ছয় যুক্ত হবে।
ওহ না, এখন আমার আরও কাজ আছে। Sheesh। কে এই ধরণের জিনিস তৈরি করে ?!
এখন তারা আমাকে এক থেকে দশজন যোগ করতে বলে! আমি ওটা কেন করব? আমি এক থেকে ছয়টি যোগ করতে চাইনি। এক থেকে দশ পর্যন্ত যোগ করা ... ভাল… এটি আরও বেশি শক্ত হবে!
আর কত কষ্ট হবে? আমার আর কত কাজ করতে হবে? আমার কি কম বা কম পদক্ষেপের দরকার?
ঠিক আছে, আমি অনুমান করি আমাকে দশটি করতে হবে ... প্রতিটি কাজের জন্য এক থেকে দশজন করে। দশটি ছয়টিরও বেশি। এক থেকে ছয়জনের চেয়ে দশ থেকে দশটে যোগ করতে আমাকে আরও অনেক বেশি কাজ করতে হবে!
আমি এখনই যুক্ত করতে চাই না। আমি এটুকু যোগ করতে কতটা কঠিন হতে পারে তা চিন্তা করতে চাই। এবং, আমি আশা করি, যত তাড়াতাড়ি সম্ভব খেলব।
এক থেকে ছয় পর্যন্ত যোগ করা, এটি কিছু কাজ। তবে আপনি কি দেখেন, এক থেকে দশজন যোগ করার জন্য, এটি আরও কাজ?
বিগ হে আপনার বন্ধু এবং আমার। বিগ ও আমাদের কতটা কাজ করতে হবে তা চিন্তা করতে সহায়তা করে, তাই আমরা পরিকল্পনা করতে পারি। এবং, আমরা যদি বড় ও-এর বন্ধু হয় তবে তিনি আমাদের এমন কাজ চয়ন করতে সহায়তা করতে পারেন যা এতটা কঠিন নয়!
এখন আমাদের অবশ্যই নতুন কাজ করা উচিত। ওহ না. আমি এই কাজের জিনিস মোটেও পছন্দ করি না।
নতুন কাজটি হ'ল: এক থেকে শুরু করে সমস্ত কিছু যুক্ত করুন।
অপেক্ষা কর এন কি? আমি কি মিস করেছি? আপনি কী বলতে পারবেন না তা আমি কীভাবে এক থেকে এন যুক্ত করতে পারি?
ঠিক আছে, আমি n জানি না। আমাকে বলা হয়নি। আপনি ছিলেন? কোন? আচ্ছা ভালো. কাজেই আমরা কাজটি করতে পারি না। রক্ষে।
যদিও আমরা এখন কাজটি করব না, আমরা অনুমান করতে পারি যে এটি কতটা শক্ত হবে। আমরা এন জিনিস যোগ করতে হবে, তাই না? অবশ্যই!
এখন এখানে বড় হে আসেন এবং তিনি আমাদের বলবেন যে এই কাজটি কতটা কঠিন। তিনি বলেছেন: এক থেকে N পর্যন্ত সমস্ত কিছু যুক্ত করা হ'ল ও (এন)। এই সমস্ত জিনিস যুক্ত করতে, [আমি জানি আমি অবশ্যই n বার যোগ করব]] [1] এটি বড় ও! তিনি আমাদের জানান যে কোনও ধরণের কাজ করা কতটা কঠিন।
আমার কাছে, আমি বড় ও ধরণের, মনিব লোকের মতো ভাবি O সে কাজের বিষয়ে চিন্তা করে, তবে তা করে না। তিনি হয়তো বলতে পারেন, "এই কাজটি দ্রুত" " অথবা, তিনি বলতে পারেন, "সেই কাজটি এত ধীর এবং শক্ত!" তবে সে কাজটি করে না। তিনি কেবল কাজের দিকে নজর রাখেন এবং তারপরে তিনি আমাদের জানান যে এটি কতটা সময় নিতে পারে।
আমি বড় ও জন্য অনেক যত্ন করি। কেন? আমি কাজ করতে পছন্দ করি না! কেউ কাজ করতে পছন্দ করেন না। এজন্য আমরা সবাই বড় ওকে ভালবাসি! তিনি আমাদের জানান যে আমরা কত দ্রুত কাজ করতে পারি। তিনি আমাদের কঠোর পরিশ্রমের বিষয় চিন্তা করতে সহায়তা করেন।
ওহ, আরও কাজ। এখন, কাজটি করা যাক না। তবে, আসুন এটি করার পরিকল্পনা করুন, ধাপে ধাপে।
তারা আমাদের দশটি কার্ডের একটি ডেকে দিয়েছে। এগুলি সকলেই মিশে গেছে: সাত, চার, দুই, ছয়… সরাসরি মোটেও নয়। এবং এখন ... আমাদের কাজ তাদের বাছাই করা।
Ergh। মনে হচ্ছে অনেক কাজ!
আমরা কিভাবে এই ডেকটি বাছাই করতে পারি? আমার একটি পরিকল্পনা আছে.
আমি প্রতিটি জোড় কার্ড, জোড় জোড়, ডেকের মাধ্যমে, প্রথম থেকে শেষ পর্যন্ত দেখব। যদি একটি জোড়ায় প্রথম কার্ডটি বড় হয় এবং সেই জুটির পরবর্তী কার্ডটি ছোট হয় তবে আমি সেগুলিকে অদলবদল করি। অন্যথায়, আমি পরের জুটিতে যাই, এবং আরও অনেক কিছু ... এবং শীঘ্রই, ডেকটি সম্পন্ন হয়।
ডেক হয়ে গেলে, আমি জিজ্ঞাসা করি: আমি কি সেই পাসে কার্ডগুলি অদলবদল করেছিলাম? যদি তা হয় তবে আমি অবশ্যই এটিকে আবার শীর্ষ থেকে করব।
কিছু সময়ে, কোনও সময়ে, কোনও অদলবদল হবে না, এবং আমাদের ডেকের সাজানো হবে। অনেক বেশি কাজ!
ঠিক আছে, সেই নিয়মগুলির সাথে কার্ডগুলি বাছাই করা কতটা কাজ হবে?
আমার দশটি কার্ড আছে এবং বেশিরভাগ সময় - এটি হ'ল যদি আমার অনেক ভাগ্য না থাকে - ডেকের মাধ্যমে প্রতিবার দশ বার পর্যন্ত অদলবদল সহ আমাকে অবশ্যই দশ বার পর্যন্ত পুরো ডেকের মধ্য দিয়ে যেতে হবে।
বিগ হে, আমাকে সাহায্য করুন!
বিগ ও এসেছেন এবং বলেছেন: এন কার্ডগুলির একটি ডেকে এর জন্য, এইভাবে সাজানোর জন্য ও (এন স্কোয়ার) সময়ে সম্পন্ন হবে।
সে কেন এন স্কোয়ার্ড বলে?
ঠিক আছে, আপনি জানেন এন স্কোয়ার n বার n। এখন, আমি এটি পেয়েছি: ড কার্ডের মধ্য দিয়ে n বার কী হতে পারে তার এন কার্ডগুলি পরীক্ষা করা। এটি দুটি লুপ, প্রতিটি এন স্টেপ সহ। এটি এন স্কোয়ার অনেক কাজ করা। অনেক কাজ, অবশ্যই!
এখন যখন বড় ও বলছেন এটি ও (এন স্কোয়ার্ড) কাজ নেবে, তার অর্থ নাকের উপরে এন স্কোয়ারড যুক্ত নয়। এটি কিছুটা ছোট হতে পারে, কিছু ক্ষেত্রে। তবে সবচেয়ে খারাপ ক্ষেত্রে ডেকে সাজানোর জন্য এটি কাজের n স্কোয়ার ধাপের কাছাকাছি হবে।
এখন এখানেই রয়েছে বড় হে আমাদের বন্ধু।
বিগ ও এটি দেখায়: এন বড় হওয়ার সাথে সাথে, আমরা যখন কার্ডগুলি বাছাই করি তখন কাজের পুরানো খালি-যুক্ত জিনিসগুলির কাজের চেয়ে আরও বেশি পরিমাণে ক্ষতি হয়। আমারা কীভাবে এটা জানি?
ঠিক আছে, এন সত্যিকার অর্থে যদি বড় হয় তবে আমরা n বা n স্কোয়ারে কী যুক্ত করতে পারি তার কোনও যত্ন নেই।
বড় এন এর জন্য এন স্কোয়ার এন এর চেয়ে বেশি বড়।
বিগ ও আমাদের জানান যে জিনিসগুলিকে যুক্ত করার চেয়ে জিনিসগুলিকে বাছাই করা আরও শক্ত। ও (এন স্কোয়ার্ড) বড় এন এর জন্য ও (এন) এর চেয়ে বেশি। এর অর্থ: যদি এন সত্যিকার অর্থে বড় হয়ে যায়, তবে n বিষয়গুলির একটি মিশ্রিত ডেকে বাছাই করতে কেবল n মিশ্র জিনিস যুক্ত করার চেয়ে আরও বেশি সময় নেওয়া উচিত।
বিগ ও আমাদের জন্য কাজটি সমাধান করে না। বিগ ও আমাদের জানান যে কাজটি কতটা কঠিন।
আমার কাছে কার্ডের ডেক আছে আমি তাদের বাছাই করেছি। আপনি সাহায্য করেছেন। ধন্যবাদ।
কার্ডগুলি বাছাই করার আরও দ্রুত কোনও উপায় আছে? বড় হে আমাদের সাহায্য করতে পারে?
হ্যাঁ, আরও একটি দ্রুত উপায় আছে! এটি শিখতে কিছু সময় লাগে, তবে এটি কাজ করে ... এবং এটি বেশ দ্রুত কাজ করে। আপনি এটিও চেষ্টা করে দেখতে পারেন, তবে প্রতিটি পদক্ষেপের সাথে সময় দিন এবং আপনার জায়গাটি হারাবেন না।
একটি ডেক বাছাই করার এই নতুন উপায়ে, আমরা কিছুক্ষণ আগে যেভাবে কার্ড জোড় করেছিলাম তা পরীক্ষা করি না। এই ডেকটি বাছাই করার জন্য আপনার এখানে নতুন নিয়ম রয়েছে:
একটি: আমরা এখন যে ডেকের কাজ করি তার অংশে আমি একটি কার্ড বেছে নিই। আপনি চাইলে আমার জন্য একটি বেছে নিতে পারেন। (আমরা প্রথমবার এটি করি, "এখন আমরা যে ডেকের কাজ করি তার অংশটি" অবশ্যই পুরো ডেকটি is
দুই: আমি যে কার্ডটি বেছে নিয়েছি তাতে আমি ডেক ছড়িয়েছি। এই স্প্লে কি; আমি কিভাবে splay করব? ঠিক আছে, আমি একের পর এক শুরুর কার্ড থেকে নীচে যাই এবং আমি স্প্লে কার্ডের চেয়ে বেশি কার্ডের সন্ধান করি।
তিন: আমি শেষ কার্ড থেকে উপরে যাই এবং আমি স্প্লে কার্ডের চেয়ে কম কার্ডের সন্ধান করি।
আমি এই দুটি কার্ড একবার পেয়ে গেলে, আমি সেগুলিকে অদলবদল করে এবং অদলবদল করতে আরও কার্ড সন্ধান করতে যাই। এটি হ'ল, আমি দ্বিতীয় ধাপে ফিরে যাই এবং আপনি যে কার্ডটি বেছে নিয়েছিলেন তা আরও স্পষ্ট করে তুলি।
এক পর্যায়ে, এই লুপটি (দুই থেকে তিন পর্যন্ত) শেষ হবে। এটি শেষ হয় যখন এই অনুসন্ধানের দুটি অংশই স্প্লে কার্ডে মিলিত হয়। তারপরে, আমরা আপনার প্রথম ধাপে যে কার্ডটি বেছে নিয়েছি তা দিয়ে ডেক ছড়িয়ে দিয়েছি। এখন, প্রারম্ভের নিকটবর্তী সমস্ত কার্ড স্প্লে কার্ডের চেয়ে কম; এবং প্রান্তের কার্ডগুলি স্প্লে কার্ডের চেয়ে বেশি বেশি high কুল কৌশল!
চারটি (এবং এটি মজাদার অংশ): আমার এখন দুটি ছোট ডেক রয়েছে, একটি স্প্লে কার্ডের চেয়ে কম এবং আরও একটি উচ্চ। এখন আমি প্রতিটি ছোট ডেকে এক ধাপে যাই! এর অর্থ এটি, আমি প্রথম ছোট ডেকের প্রথম ধাপ থেকে শুরু করি এবং যখন সেই কাজটি করা হয়, আমি পরবর্তী ছোট ডেকের প্রথম ধাপ থেকে শুরু করি।
আমি অংশগুলিতে ডেক ভাঙ্গি, এবং প্রতিটি অংশ আরও ছোট এবং আরও ছোট বাছাই করি এবং কিছু সময়ে আমার আর কাজ করার দরকার নেই। এখন এটি সমস্ত নিয়ম সহ ধীর বলে মনে হতে পারে। তবে আমাকে বিশ্বাস করুন, এটা মোটেও ধীর নয়। জিনিস সাজানোর প্রথম উপায়ের তুলনায় এটি অনেক কম কাজ!
এই ধরণের কি বলা হয়? একে বলা হয় কুইক বাছাই! এই সাজানটি সিএআর হোয়ার নামে এক ব্যক্তি তৈরি করেছিলেন এবং তিনি এটিকে দ্রুত বাছাই করেছিলেন। এখন, দ্রুত বাছাই করা সারাক্ষণ ব্যবহৃত হয়!
কুইক বাছাই ছোট ছোট মধ্যে বড় ডেকে ব্রেক আপ। এটি বলার অপেক্ষা রাখে না, এটি ছোটগুলিতে বড় কাজগুলি ভেঙে দেয়।
হুম। আমি মনে করি সেখানে কোনও নিয়ম থাকতে পারে। বড় কাজগুলিকে ছোট করার জন্য এগুলি ভেঙে দিন।
এই বাছাই বেশ দ্রুত। কত তাড়াতাড়ি? বিগ ও আমাদের জানান: এই ক্ষেত্রে বাছাইয়ের জন্য (n লগ এন) কাজ করা দরকার।
এটি কি প্রথম বাছাইয়ের চেয়ে কম বা কম দ্রুত? বড় ও, দয়া করে সাহায্য করুন!
প্রথম সাজানো ছিল ও (এন স্কোয়ার্ড)। তবে কুইক বাছাই হল ও (এন লগ এন)। আপনি জানেন যে এন লগ এন বড় এন এর জন্য এন স্কোয়ারের চেয়ে কম, তাই না? ঠিক আছে, আমরা জানি যে কুইকটি বাছাই করা দ্রুত!
আপনি যদি একটি ডেক বাছাই করতে হয়, ভাল উপায় কি? ঠিক আছে, আপনি যা চান তা করতে পারেন তবে আমি দ্রুত বাছাই করতে চাই।
আমি দ্রুত বাছাই কেন করব? আমি অবশ্যই কাজ করতে পছন্দ করি না! আমি যত তাড়াতাড়ি সম্ভব কাজটি শেষ করতে চাই।
আমি কীভাবে জানতে পারি কুইক বাছাই কম কাজ? আমি জানি যে হে (এন লগ এন) ও (এন স্কোয়ার্ড) এর চেয়ে কম। ওগুলি আরও ছোট, সুতরাং দ্রুত বাছাই করা কম কাজ!
এখন আপনি আমার বন্ধু বিগ ওকে জানেন He তিনি আমাদের কম কাজ করতে সহায়তা করেন। এবং আপনি যদি বড় ওকে জানেন তবে আপনিও কম কাজ করতে পারেন!
তুমি আমার সাথে যা শিখেছ! তুমি অনেক আধুনিক! তোমাকে অনেক ধন্যবাদ!
এখন যে কাজ শেষ, আসুন খেলি!
[1]: প্রতারণা করার এবং এক সাথে সমস্ত সময়ে সমস্ত কিছু যুক্ত করার উপায় রয়েছে all গাউস নামের কিছু বাচ্চা আট বছর বয়সে এটি জানতে পেরেছিল। যদিও আমি তেমন স্মার্ট নই, সুতরাং আমাকে কীভাবে তিনি এটি করেছেন তা জিজ্ঞাসা করবেন না ।
সময়ের জটিলতা বোঝার জন্য আমার আরও সহজ উপায় আছে সময়ের জটিলতা গণনার জন্য তিনি সবচেয়ে সাধারণ মেট্রিক হ'ল বিগ ও স্বরলিপি। এটি সমস্ত ধ্রুবক কারণগুলি সরিয়ে দেয় যাতে চলমান সময়টি N এর সাথে সম্পর্কিত হিসাবে অনুমান করা যায় যেহেতু N অসীমের কাছে যায়। সাধারণভাবে আপনি এটি এরকমভাবে ভাবতে পারেন:
statement;
ধ্রুবক। জবানবন্দির চলমান সময় N এর সাথে পালটে যাবে না
for ( i = 0; i < N; i++ )
statement;
রৈখিক লুপের চলমান সময়টি সরাসরি N এর সাথে আনুপাতিক হয় When যখন এন দ্বিগুণ হয়, তখন চলমান সময়টিও ঘটে।
for ( i = 0; i < N; i++ )
{
for ( j = 0; j < N; j++ )
statement;
}
চতুর্ভুজ হয়। দুটি লুপের চলমান সময়টি N এর বর্গক্ষেত্রের সাথে সমানুপাতিক হয় যখন এন দ্বিগুণ হয়, চলমান সময় N * N দ্বারা বৃদ্ধি পায় When
while ( low <= high )
{
mid = ( low + high ) / 2;
if ( target < list[mid] )
high = mid - 1;
else if ( target > list[mid] )
low = mid + 1;
else break;
}
লোগারিথমিক। অ্যালগরিদমের চলমান সময়টি 2 টি 2 দ্বারা ভাগ করা যায় এমন সংখ্যার সাথে সমানুপাতিক This
void quicksort ( int list[], int left, int right )
{
int pivot = partition ( list, left, right );
quicksort ( list, left, pivot - 1 );
quicksort ( list, pivot + 1, right );
}
এন এন লগ (এন)। চলমান সময়টিতে এন লুপগুলি (পুনরাবৃত্ত বা পুনরাবৃত্ত) থাকে যা লোগারিদমিক হয়, সুতরাং অ্যালগরিদমটি লিনিয়ার এবং লোগারিদমিকের সংমিশ্রণ।
সাধারণভাবে, প্রতিটি আইটেমের সাথে এক মাত্রায় কিছু করা লিনিয়ার, প্রতিটি আইটেমের সাথে দুটি মাত্রায় কিছু করা চতুর্ভুজযুক্ত, এবং কার্যক্ষেত্রকে অর্ধেকভাগে ভাগ করা লোগারিথমিক। ঘনক, ঘৃণ্য এবং বর্গমূলের মতো আরও বিগ ও ব্যবস্থা রয়েছে তবে সেগুলি প্রায় সাধারণ নয়। বিগ হে সংকেতকে ও () হিসাবে বর্ণনা করা হয়েছে যেখানে পরিমাপ। কুইকোর্টের অ্যালগরিদমকে ও (এন * লগ (এন)) হিসাবে বর্ণনা করা হবে।
দ্রষ্টব্য: এর কোনওটিই সেরা, গড় এবং সবচেয়ে খারাপ পরিস্থিতি বিবেচনায় নেই। প্রত্যেকের নিজস্ব বিগ ও স্বরলিপি থাকবে। এছাড়াও মনে রাখবেন যে এটি একটি খুব সরল ব্যাখ্যা। বিগ ও সর্বাধিক সাধারণ, তবে এটি আমি দেখিয়েছি আরও জটিল। বড় ওমেগা, লিটল ও, এবং বড় থেটা-র মতো অন্যান্য স্বরলিপি রয়েছে। অ্যালগরিদম বিশ্লেষণ কোর্সের বাইরে আপনি সম্ভবত তাদের মুখোমুখি হবেন না।
আপনি হ্যারি পটার অর্ডার করুন বলুন: অ্যামাজন থেকে 8-ফিল্মের সংগ্রহ [ব্লু-রে] সম্পূর্ণ করুন এবং একই সময়ে একই ফিল্মের সংগ্রহ অনলাইনে ডাউনলোড করুন। আপনি কোন পদ্ধতিটি দ্রুত তা পরীক্ষা করতে চান। বিতরণ আসতে প্রায় এক দিন সময় নেয় এবং ডাউনলোডটি প্রায় 30 মিনিট আগে শেষ হয়েছিল। গ্রেট! সুতরাং এটি একটি দৃ tight় জাতি।
আমি যদি লর্ড অফ দ্য রিংস, টোবলাইট, দ্য ডার্ক নাইট ট্রিলজি ইত্যাদির মতো বেশ কয়েকটি ব্লু-রে মুভি অর্ডার করি এবং একই সাথে সমস্ত সিনেমা অনলাইনে ডাউনলোড করি তবে কী হবে? এবার, বিতরণটি এখনও সম্পূর্ণ হতে একদিন সময় নেয় তবে অনলাইন ডাউনলোড শেষ হতে 3 দিন সময় নেয়। অনলাইন শপিংয়ের জন্য, কেনা আইটেমের সংখ্যা (ইনপুট) বিতরণের সময়কে প্রভাবিত করে না। আউটপুট ধ্রুবক। আমরা এই ও (1) কল ।
অনলাইন ডাউনলোডের জন্য, ডাউনলোডের সময়টি মুভি ফাইলের আকারের (ইনপুট) সাথে সরাসরি আনুপাতিক। আমরা এটিকে ও (এন) বলি ।
পরীক্ষাগুলি থেকে, আমরা জানি যে অনলাইন শপিংগুলি অনলাইনে ডাউনলোডের চেয়ে ভাল les বড় হে স্বরলিপি বোঝা খুব গুরুত্বপূর্ণ কারণ এটি আপনাকে অ্যালগরিদমের স্কেলাবিলিটি এবং দক্ষতা বিশ্লেষণ করতে সহায়তা করে ।
দ্রষ্টব্য: বড় ও স্বরলিপিটি একটি অ্যালগরিদমের সবচেয়ে খারাপ পরিস্থিতি উপস্থাপন করে । আসুন ধরে নিই যে ও (1) এবং ও (এন) উপরের উদাহরণটির সবচেয়ে খারাপ পরিস্থিতি।
তথ্যসূত্র : http://carlcheo.com/compsci
ধরুন আমরা একটি অ্যালগরিদম এ সম্পর্কে কথা বলছি , যার আকার n এর একটি ডেটাসেট দিয়ে কিছু করা উচিত ।
তারপরে O( <some expression X involving n> )
সহজ ইংরাজীতে অর্থ:
আপনি যদি এটিকে কার্যকর করার সময় অশুভ হন তবে এটি এক্স (এন) অপারেশন সম্পূর্ণ হতে পারে।
ঘটনাচক্রে, সেখানে নির্দিষ্ট ফাংশন (যেমন তাদের মনে হয় বাস্তবায়নের এর এক্স (ঢ) যে বেশ প্রায়ই ঘটতে থাকে)। এই সুপরিচিত এবং সহজে তুলনায় হয় (উদাহরণ: 1
, Log N
, N
, N^2
, N!
, ইত্যাদি ..)
এ এবং অন্যান্য অ্যালগরিদম সম্পর্কে কথা বলার সাথে এগুলির তুলনা করার মাধ্যমে, অ্যালগরিদমগুলি তাদের অপারেশন (সবচেয়ে খারাপ ক্ষেত্রে) সম্পন্ন করতে পারে তার সংখ্যা অনুযায়ী র্যাঙ্ক করা সহজ ।
সাধারণভাবে, আমাদের লক্ষ্য সন্ধান করতে বা একটি আলগোরিদিম গঠন হতে হবে একজন এমনভাবে যে এটি একটি ফাংশন থাকবে X(n)
যে সম্ভব একটি সংখ্যায় কম হিসাবে আয়।
যদি আপনার মাথায় অনন্তের উপযুক্ত ধারণা থাকে তবে একটি সংক্ষিপ্ত বিবরণ রয়েছে:
বিগ হে স্বরলিপি আপনাকে একটি অসীম বড় সমস্যা সমাধানের ব্যয় বলে।
এবং আরো কিছু
ধ্রুব কারণগুলি নগণ্য
আপনি যদি এমন কোনও কম্পিউটারে আপগ্রেড করেন যা আপনার অ্যালগরিদমকে দ্বিগুণ দ্রুত চালাতে পারে, বড় হে নোটেশন এটি লক্ষ্য করবে না। ধ্রুবক ফ্যাক্টরের উন্নতিগুলি খুব ছোট যে এমনকি বড় ও স্বরলিপি যে স্কেলের সাথে কাজ করে তাও লক্ষ্য করা যায় না। নোট করুন যে এটি বড় ও স্বরলিখনের নকশার একটি ইচ্ছাকৃত অংশ।
যদিও একটি ধ্রুবক ফ্যাক্টরের চেয়ে "বড়" কিছু সনাক্ত করা যায়।
যার আকার "বৃহত্তর" প্রায় আনুমানিক হিসাবে বিবেচনা করার জন্য যথেষ্ট পরিমাণে গণনা করতে আগ্রহী হন, তখন বড় ও স্বরলিপিটি আপনার সমস্যা সমাধানের জন্য প্রায় ব্যয়।
উপরেরটি যদি তা বোঝায় না, তবে আপনার মাথায় অনন্তের একটি সুসংগত স্বজ্ঞাত ধারণা নেই এবং আপনার সম্ভবত উপরের সমস্ত বিষয়টিকে উপেক্ষা করা উচিত; এই ধারণাগুলি কঠোর করতে আমি জানি বা তারা ইতিমধ্যে স্বজ্ঞাতভাবে কার্যকর না হলে সেগুলি ব্যাখ্যা করার জন্য প্রথমে আপনাকে বড় ও স্বরলিপি বা অনুরূপ কিছু শেখানো। (যদিও, একবারে আপনি ভবিষ্যতে বড় ও স্বরলিপিটি ভালভাবে বুঝতে পারলে এই ধারণাগুলি পুনর্বিবেচনা করা সার্থক হতে পারে)
"বিগ ও" স্বরলিপিটির সরল ইংরেজী ব্যাখ্যা কী?
খুব দ্রুত দ্রষ্টব্য:
"বিগ ও"-তে ওকে "অর্ডার" (বা অবিকল "অর্ডার অফ") হিসাবে উল্লেখ করা হয়েছে
যাতে আপনি এটির আক্ষরিক ধারণা পেতে পারেন যে এটি তাদের তুলনা করার জন্য কিছু অর্ডার করার জন্য ব্যবহৃত হয়েছিল used
"বিগ ও" দুটি কাজ করে:
Notations
।সর্বাধিক ব্যবহৃত সাতটি স্বরলিপি রয়েছে
1
ধাপের সাথে একটি কাজ সম্পন্ন করে , এটি দুর্দান্ত, নং -১১ নির্দেশিতlogN
ধাপগুলি সহ কোনও কাজ সম্পূর্ণ করবে , এটির ভাল, অর্ডার নং 2N
পদক্ষেপগুলি সমেত একটি কার্য সমাপ্ত করুন , এর ন্যায্য আদেশ, নং 3O(NlogN)
পদক্ষেপগুলি দিয়ে কোনও কাজ শেষ করে , এটি ভাল নয়, অর্ডার নং 4N^2
পদক্ষেপগুলি দিয়ে কোনও কাজ শেষ করুন , এটি খারাপ, অর্ডার নং 52^N
পদক্ষেপগুলি দিয়ে কোনও কাজ সম্পন্ন করুন , এটি ভয়াবহ, অর্ডার নং 6N!
পদক্ষেপ সহ একটি কাজ সম্পন্ন করুন , এটি ভয়ানক, অর্ডার নং 7ধরা যাক আপনি স্বীকৃতি পেয়েছেন O(N^2)
, কেবল আপনিই পরিষ্কার নয় যে পদ্ধতিটি কোনও কাজ সম্পাদন করতে N * N পদক্ষেপ গ্রহণ করে, আপনি এটি দেখতেও পারেন যে O(NlogN)
এটির র্যাঙ্কিংয়ের চেয়ে ভাল নয় ।
কেবল আপনার আরও ভাল বোঝার জন্য দয়া করে লাইনের শেষে অর্ডারটি নোট করুন all সমস্ত সম্ভাবনা বিবেচনা করা হলে 7 টিরও বেশি স্বরলিপি রয়েছে।
সিএসে কোনও কাজ সম্পাদনের জন্য বিভিন্ন পদক্ষেপের সেটকে অ্যালগোরিদম বলে।
টার্মিনোলজিতে, বিগ হে নোটেশনটি একটি অ্যালগরিদমের কার্য সম্পাদন বা জটিলতা বর্ণনা করতে ব্যবহৃত হয়।
তদ্ব্যতীত, বিগ ও সবচেয়ে খারাপ পরিস্থিতি স্থাপন করে বা উচ্চ-সীমানা পদক্ষেপগুলি পরিমাপ করে।
আপনি সেরা ক্ষেত্রে বিগ-to (বিগ-ওমেগা) উল্লেখ করতে পারেন।
বড়-Ω (বড়-ওমেগা) স্বরলিপি (নিবন্ধ) | খান একাডেমি
সংক্ষিপ্ত বিবরণ
"বিগ ও" অ্যালগরিদমের কার্যকারিতা বর্ণনা করে এবং তা মূল্যায়ন করে।
বা এটিকে আনুষ্ঠানিকভাবে সম্বোধন করুন, "বিগ ও" অ্যালগরিদমগুলিকে শ্রেণিবদ্ধ করে এবং তুলনা প্রক্রিয়াটিকে মানিক করে তোলে।
এটি দেখার সহজ উপায় (সরল ইংরাজীতে)
আমরা কীভাবে ইনপুট পরামিতিগুলির সংখ্যা, কোনও অ্যালগোরিদমের চলমান সময়কে প্রভাবিত করে তা দেখার চেষ্টা করছি। যদি আপনার অ্যাপ্লিকেশনটির চলমান সময়টি ইনপুট পরামিতিগুলির সংখ্যার সাথে সমানুপাতিক হয়, তবে এটি এন বিগ হেতে বলা হয়।
উপরের বিবৃতিটি একটি ভাল শুরু তবে সম্পূর্ণ সত্য নয়।
আরও সঠিক ব্যাখ্যা (গাণিতিক)
অনুমান করা
এন = ইনপুট পরামিতি সংখ্যা
টি (এন) = আসল ফাংশন যা অ্যালগরিদমের চলমান সময়কে এন এর একটি ফাংশন হিসাবে প্রকাশ করে
সি = একটি ধ্রুবক
f (n) = একটি আনুমানিক ফাংশন যা অ্যালগরিদমের চলমান সময়টিকে n এর ক্রিয়া হিসাবে প্রকাশ করে
তারপরে যতদূর বিগ ও সম্পর্কিত, নীচের শর্তটি যতক্ষণ না সঠিক হয় ততক্ষণ আনুমানিক চ (এন) যথেষ্ট ভাল হিসাবে বিবেচিত হয়।
lim T(n) ≤ c×f(n)
n→∞
এন যেমন অসীমের কাছে আসে সমীকরণটি টি হয়, তত টি এন এর সি গুনের চেয়ে কম বা সমান হয়।
বড় হে স্বরলিপি এ হিসাবে লেখা হয়
T(n)∈O(n)
টি টি টি এন এর বড় ও তে থাকায় এটি পড়া হয়।
ইংরাজীতে ফিরুন
উপরের গাণিতিক সংজ্ঞার ভিত্তিতে, যদি আপনি বলেন যে আপনার অ্যালগোরিদমটি n এর একটি বড় ও, এর অর্থ এটি এন (ইনপুট পরামিতির সংখ্যা) বা দ্রুততর একটি ফাংশন । যদি আপনার অ্যালগোরিদমটি বিগ হে অফ এন হয়, তবে এটি স্বয়ংক্রিয়ভাবে এন স্কোয়ারের বিগ ও is
বিগ হে অফ মানে আমার অ্যালগরিদম কমপক্ষে এটির মতো দ্রুত চলে। আপনি আপনার অ্যালগোরিদমের বিগ ও সংকেতটির দিকে তাকাতে এবং এটি ধীর করতে পারেন না cannot আপনি কেবল এটির দ্রুত বলতে পারবেন।
পরীক্ষা করে দেখুন এই ইউসি Berkley থেকে বিগ হে এ একটি ভিডিও টিউটোরিয়ালের জন্য বাইরে। এটি আসলে একটি সাধারণ ধারণা। আপনি যদি প্রফেসর শেচক (ওরফে গড লেভেলের শিক্ষক) এর ব্যাখ্যাটি শুনতে পান তবে আপনি বলবেন "ওহ এ সবই!"!
বড় ও সংকেত সম্পর্কে আমি খুব দুর্দান্ত ব্যাখ্যা পেয়েছি বিশেষত এমন এক ব্যক্তির জন্য, যিনি গণিতে খুব বেশি নন।
https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/
অ্যালগরিদমের কার্যকারিতা বা জটিলতা বর্ণনা করতে কম্পিউটার বিজ্ঞানে বিগ ও স্বরলিপি ব্যবহার করা হয়। বিগ ও বিশেষত সবচেয়ে খারাপ পরিস্থিতি বর্ণনা করে এবং প্রয়োজনীয় কার্য সম্পাদনের সময় বা ব্যবহৃত অ্যালগরিদমের দ্বারা ব্যবহৃত স্থানের (যেমন মেমরি বা ডিস্কে) স্থান বর্ণনা করতে ব্যবহার করা যেতে পারে।
প্রোগ্রামিং পার্লস বা অন্য কোনও কম্পিউটার বিজ্ঞানের বই পড়া এবং গণিতে কোনও গ্রাউন্ডিং নেই এমন যে কেউ ও (এন লগ এন) বা অন্যান্য আপাতদৃষ্টিতে পাগল সিনট্যাক্সের উল্লেখ করে অধ্যায়গুলিতে পৌঁছেছে তখন সে একটি প্রাচীরের উপর আঘাত হানবে। আশা করি এই নিবন্ধটি আপনাকে বিগ ও এবং লোগারিদমের মূল বিষয়গুলি বোঝার জন্য সহায়তা করবে।
একজন প্রোগ্রামার হিসাবে প্রথম এবং একজন গণিতবিদ দ্বিতীয় (বা সম্ভবত তৃতীয় বা চতুর্থ) আমি বিগ ওকে ভালভাবে বোঝার সবচেয়ে ভাল উপায়টি পেয়েছি কোডে কিছু উদাহরণ তৈরি করা। সুতরাং, নীচে বর্ণন এবং যেখানে সম্ভব উদাহরণ সহ বিকাশের কয়েকটি সাধারণ অর্ডার দেওয়া হয়েছে।
হে (1)
ও (1) একটি অ্যালগরিদম বর্ণনা করে যা ইনপুট ডেটা সেটের আকার নির্বিশেষে সর্বদা একই সময়ে (বা স্থান) কার্যকর করা হবে।
bool IsFirstElementNull(IList<string> elements) { return elements[0] == null; }
চালু)
ও (এন) এমন একটি অ্যালগরিদম বর্ণনা করে যার কার্যকারিতা একরকম বৃদ্ধি পাবে এবং ইনপুট ডেটা সেট আকারের সরাসরি অনুপাতে। নীচের উদাহরণটিও দেখায় যে বিগ ও কীভাবে সবচেয়ে খারাপের পারফরম্যান্স দৃশ্যের পক্ষে; ফোর লুপের কোনও পুনরাবৃত্তির সময় একটি ম্যাচিং স্ট্রিং পাওয়া যেত এবং ফাংশনটি প্রথম দিকে ফিরে আসত তবে বিগ হে নোটেশন সর্বদা উপরের সীমাটি ধরে রাখবে যেখানে অ্যালগরিদম সর্বোচ্চ সংখ্যার পুনরাবৃত্তি সম্পাদন করবে।
bool ContainsValue(IList<string> elements, string value) { foreach (var element in elements) { if (element == value) return true; } return false; }
ও (এন 2 )
ও (এন 2 ) এমন একটি অ্যালগরিদম উপস্থাপন করে যার পারফরম্যান্স ইনপুট ডেটা সেট আকারের বর্গক্ষেত্রের সাথে সরাসরি আনুপাতিক। এটি আলগোরিদিমগুলির সাথে সাধারণ যা ডেটা সেটের উপরে নেস্টেড পুনরাবৃত্তিগুলি জড়িত। গভীর নেস্টেড পুনরাবৃত্তিগুলির ফলাফল ও (এন 3 ), ও (এন 4 ) ইত্যাদিতে হবে etc.
bool ContainsDuplicates(IList<string> elements) { for (var outer = 0; outer < elements.Count; outer++) { for (var inner = 0; inner < elements.Count; inner++) { // Don't compare with self if (outer == inner) continue; if (elements[outer] == elements[inner]) return true; } } return false; }
ও (2 এন )
ও (2 এন ) এমন একটি অ্যালগোরিদমকে বোঝায় যার বৃদ্ধি প্রতিটি সংযোজনের সাথে ইনপুট ডেটা সেটে দ্বিগুণ হয়। একটি ও (2 এন ) ফাংশনের বৃদ্ধির বক্ররেখাটি ক্ষণস্থায়ী - খুব অগভীর থেকে শুরু করে, তারপরে আবহাওয়াভাবে বাড়বে। ও (2 এন ) ফাংশনের উদাহরণ হ'ল ফিবোনাচি সংখ্যাগুলির পুনরাবৃত্ত গণনা:
int Fibonacci(int number) { if (number <= 1) return number; return Fibonacci(number - 2) + Fibonacci(number - 1); }
logarithms
লোগারিদমগুলি ব্যাখ্যা করতে কিছুটা কৌশলযুক্ত তাই আমি একটি সাধারণ উদাহরণ ব্যবহার করব:
বাইনারি অনুসন্ধান বাছাই করা ডেটা সেট অনুসন্ধান করতে ব্যবহৃত একটি কৌশল। এটি ডেটা সেটের মাঝারি উপাদানটি নির্বাচন করে কাজ করে যা মূলত মিডিয়ান হয় এবং এটি একটি লক্ষ্য মানের সাথে তুলনা করে। মানগুলি মিললে এটি সাফল্য ফিরে আসবে। যদি লক্ষ্য মান তদন্ত উপাদানটির মানের চেয়ে বেশি হয় তবে এটি উপাত্ত সেট এর উপরের অর্ধেক নেবে এবং এর বিপরীতে একই ক্রিয়াকলাপটি সম্পাদন করবে। অনুরূপভাবে, যদি লক্ষ্য মানটি তদন্ত উপাদানটির মানের চেয়ে কম হয় তবে এটি নিম্ন অর্ধের বিপরীতে অপারেশন সম্পাদন করবে। এটি প্রতিটি পুনরাবৃত্তির সাথে ডেটা সেট অর্ধেক অবিরত রাখবে যতক্ষণ না মান পাওয়া যায় বা যতক্ষণ না এটি আর ডেটা সেটকে বিভক্ত করতে না পারে।
এই ধরণের অ্যালগরিদমকে ও (লগ এন) হিসাবে বর্ণনা করা হয়। বাইনারি অনুসন্ধানের উদাহরণে বর্ণিত ডেটা সেটগুলির পুনরাবৃত্ত অর্ধবৃত্তির ফলে বর্ধনের বাঁক তৈরি হয় যা শুরুতে শৃঙ্গ হয় এবং আস্তে আস্তে চ্যাপ্টা হয়ে যায় ডেটা সেটগুলির আকার বাড়লে যেমন 10 আইটেমযুক্ত একটি ইনপুট ডেটা সেট সম্পূর্ণ হতে এক সেকেন্ড সময় নেয়, একটি ডেটা সেট 100 টি আইটেম সমেত দুই সেকেন্ড সময় নেয় এবং 1000 আইটেমযুক্ত ডেটা সেটটি তিন সেকেন্ড সময় নেয়। ইনপুট ডেটা সেটটির আকার দ্বিগুণ করা তার বৃদ্ধিতে খুব সামান্য প্রভাব ফেলবে কারণ অ্যালগরিদমের একক পুনরাবৃত্তির পরে ডেটা সেটটি অর্ধেক হয়ে যাবে এবং তাই কোনও ইনপুট ডেটা অর্ধেক আকার সেট করে সমান্তরালে। এটি বড় ডেটা সেটগুলির সাথে কাজ করার সময় বাইনারি অনুসন্ধানের মতো অ্যালগরিদমকে অত্যন্ত দক্ষ করে তোলে।
এটি একটি খুব সরলিকৃত ব্যাখ্যা, তবে আমি আশা করি এটি সর্বাধিক গুরুত্বপূর্ণ বিশদটি কভার করে।
ধরা যাক আপনার সমস্যার সাথে সম্পর্কিত অ্যালগরিদম কিছু 'কারণের' উপর নির্ভর করে, উদাহরণস্বরূপ আসুন এটি এন এবং এক্স তৈরি করুন let's
N এবং X এর উপর নির্ভর করে আপনার অ্যালগরিদমের জন্য কিছু অপারেশন প্রয়োজন হবে, উদাহরণস্বরূপ WORST ক্ষেত্রে এটির 3(N^2) + log(X)
কাজগুলি।
যেহেতু বিগ-ও ধ্রুবক ফ্যাক্টর (ওরফে 3) সম্পর্কে খুব বেশি যত্ন করে না, তাই আপনার অ্যালগরিদমের বিগ-ও O(N^2 + log(X))
। এটি মূলত অনুবাদ করে 'আপনার এলগরিদমকে এর সাথে সবচেয়ে খারাপ ক্ষেত্রে স্কেলের জন্য প্রয়োজনীয় পরিমাণ অপারেশন' অনুবাদ করে।
অ্যালগরিদম : সমস্যা সমাধানের জন্য পদ্ধতি / সূত্র
কীভাবে অ্যালগরিদমগুলি বিশ্লেষণ করবেন এবং কীভাবে আমরা একে অপরের সাথে অ্যালগরিদমগুলির তুলনা করতে পারি?
উদাহরণস্বরূপ: আপনাকে এবং এক বন্ধুকে 0 থেকে N পর্যন্ত সংখ্যার যোগফলের জন্য একটি ফাংশন তৈরি করতে বলা হয় You আপনি f (x) নিয়ে এসেছেন এবং আপনার বন্ধুটি g (x) নিয়ে আসে। উভয় ফাংশন একই ফলাফল, কিন্তু একটি পৃথক অ্যালগরিদম। অ্যালগরিদমগুলির দক্ষতার সাথে নিখুঁতভাবে তুলনা করার জন্য আমরা বিগ-ও স্বরলিপি ব্যবহার করি ।
বিগ-ও স্বরলিপি: ইনপুটটি যথেচ্ছভাবে বড় হওয়ার সাথে সাথে রানটাইম কীভাবে ইনপুটটির সাথে তুলনামূলকভাবে বাড়বে তা বর্ণনা করে ।
3 কী গ্রহণযোগ্য:
স্পেস জটিলতা: সময়ের জটিলতা বাদে আমরা স্পেস জটিলতা সম্পর্কেও যত্নশীল (একটি অ্যালগোরিদম কত স্মৃতি / স্পেস ব্যবহার করে)। ক্রিয়াকলাপের সময়টি পরীক্ষা করার পরিবর্তে, আমরা মেমরির বরাদ্দের আকারটি পরীক্ষা করি।