অ্যালগরিদমের "বিগ ও" নোটেশন সনাক্তকরণের জন্য এটি কি উপযুক্ত "বিধি"?


29

আমি বিগ ও নোটেশন এবং কীভাবে একটি অ্যালগোরিদম লেখা হয় তার উপর ভিত্তি করে এটি গণনা করার পদ্ধতি সম্পর্কে আরও শিখছি। অ্যালগরিদম বিগ ও স্বরলিপি গণনা করার জন্য আমি একটি "আকর্ষণীয় নিয়ম" পেয়েছি এবং আমি দেখতে চেয়েছিলাম যে আমি সঠিক পথে আছি কিনা বা পথ বন্ধ way

বড় ও স্বরলিপি: এন

function(n) {
    For(var a = 0; i <= n; i++) { // It's N because it's just a single loop
        // Do stuff
    }
}

বড় ও স্বরলিপি: এন 2

function(n, b) {
    For(var a = 0; a <= n; a++) {
        For(var c = 0; i <= b; c++) { // It's N squared because it's two nested loops
            // Do stuff
        }
    }
}

বড় ও স্বরলিপি: 2 এন

function(n, b) {
    For(var a = 0; a <= n; a++) {
        // Do stuff
    }
    For(var c = 0; i <= b; c++) { // It's 2N the loops are outside each other
        // Do stuff
    }
}

বড় ও স্বরলিপি: এনএলজিএন

function(n) {
    n.sort(); // The NLogN comes from the sort?
    For(var a = 0; i <= n; i++) {
        // Do stuff
    }
}

আমার উদাহরণ এবং পরবর্তী স্বরলিপি সঠিক? আমার সম্পর্কে আরও সচেতন হওয়া উচিত?


3
এটিকে সূত্রের পরিবর্তে থাম্বের নিয়ম বলুন এবং আপনি সম্ভবত সঠিক পথে আছেন on অবশ্যই এটি "ডু স্টাফ" ঠিক কী করে তার উপর সম্পূর্ণ নির্ভর করে। লগ (এন) সাধারণত এলগরিদম থেকে আসে যা কিছু ধরণের বাইনারি / ট্রি-জাতীয় পার্টিশন সম্পাদন করে। এখানে বিষয়ের একটি দুর্দান্ত ব্লগ পোস্ট' s
ড্যানিয়েল বি

15
2Nবিগ-ও স্বরলিপি হিসাবে এমন কোনও জিনিস নেই ।
ভের্টেক

15
@ জার্গডব্লিউমিত্যাগ কারণ ও (২ এন) = ও (এন) বিগ ও এর সংজ্ঞা অনুসারে
র‌্যাচেট ফ্রিক

3
@ জার্গডব্লিউমিত্যাগ: ট্রোলিংয়ের জন্য এটি সত্যিই জায়গা নয়।
ভের্টেক

3
@ ভার্টেক - আমি বিশ্বাস করি না জার্গডব্লিউমিতাগ উদ্দেশ্যমূলকভাবে ট্রলিং করছিল। আমার সাম্প্রতিক গবেষণায়, আমি কঠোর বিগ-ও স্বরলিপি এবং "প্রচলিত ভাষাগত" এর মধ্যে অনেক বিভ্রান্তি লক্ষ্য করেছি যা বিগ-ও, থেটা এবং অন্যান্য ডেরাইভেটিভগুলিতে মিশে থাকে। আমি বলছি না যে সাধারণ ব্যবহারটি সঠিক; শুধু যে এটি অনেক ঘটে।

উত্তর:


26

সাধারণত, বড়-ও স্বরলিপি জটিলতার ডিগ্রি বর্ণনা করে

বিগ-ও স্বরলিপি গণনা করতে:

  1. অ্যালগরিদম জটিলতার সূত্র চিহ্নিত করুন। ধরা যাক, উদাহরণস্বরূপ, অন্য একটির সাথে দুটি লুপ ভিতরে বাসা বাঁধে, তারপরে আরও তিনটি লুপ নেস্টেড হয় না:2N² + 3N
  2. সর্বাধিক শব্দ ব্যতীত সমস্ত কিছু সরিয়ে ফেলুন: 2N²
  3. সমস্ত ধ্রুবক অপসারণ:

অন্য কথায় দুটি লুপ অন্যের সাথে বাসা বাঁধে , তারপরে আরও তিনটি লুপ নেস্টেড হয় না (N²)

এটি অবশ্যই ধরে নেয় যে আপনার লুপগুলিতে যা আছে তা হল সহজ নির্দেশ simple যদি আপনার উদাহরণস্বরূপ লুপটির অভ্যন্তরে থাকে তবে আপনার অন্তর্নিহিত ভাষা / পাঠাগারটি প্রয়োগ করছে sort()এমন sort()বাস্তবায়ন করার জটিলতায় আপনাকে লুপটির জটিলতা বাড়াতে হবে।


কঠোরভাবে বলতে গেলে "সমস্ত ধাপগুলি সরিয়ে দিন" রূপান্তরিত 2N³হবে N। "সমস্ত সংযোজক এবং গুণক ধ্রুবগুলি অপসারণ করুন" সত্যের কাছাকাছি হবে।
জোছিম সৌর

@ জোয়াচিমসৌয়ার: N² = N * N, সেখানে কোনও ধ্রুবক নেই।
ভের্টেক

@ ভার্টেক: একই যুক্তি অনুসারে 2N = N+N
জোছিম সৌর

2
@ জোয়াচিমসৌয়ার, আপনার "কঠোরভাবে বলা" একেবারেই অপ্রচলিত as দেখুন এন.ইউইকিপিডিয়া.আর / উইকি / কনস্ট্যান্ট_( ম্যাথেমেটিক্স) । বহুবর্ষ সম্পর্কে কথা বলার সময়, "ধ্রুবক" সর্বদা কেবল গুণফলগুলিকেই বোঝায়, এক্সপোটেন্টগুলিকে নয়।
বেন লি

1
@ ভার্টেক, উপরে আমার মন্তব্য দেখুন। আপনার এখানে "ধ্রুবক" ব্যবহার একেবারে সঠিক এবং প্রচলিত ছিল।
বেন লি

6

আপনি যদি এই অ্যালগরিদমগুলি বিশ্লেষণ করতে চান তবে আপনাকে // ডুস্টফ সংজ্ঞায়িত করতে হবে, কারণ এটি সত্যই ফলাফলটিকে পরিবর্তন করতে পারে। ধরা যাক ডাস্টফের জন্য ক্রমাগত ও (1) সংখ্যক ক্রিয়াকলাপ প্রয়োজন।

এই নতুন স্বরলিপি সহ কয়েকটি উদাহরণ এখানে দেওয়া হয়েছে:

আপনার প্রথম উদাহরণের জন্য, লিনিয়ার ট্র্যাভারসাল: এটি সঠিক!

উপর):

for (int i = 0; i < myArray.length; i++) {
    myArray[i] += 1;
}

এটি লিনিয়ার (ও (এন)) কেন? আমরা ইনপুট (অ্যারে) এ অতিরিক্ত উপাদান যুক্ত করার সাথে সাথে ঘটতে থাকা অপারেশনের পরিমাণ আমরা যোগ করার উপাদানগুলির সংখ্যার সাথে আনুপাতিকভাবে বাড়িয়ে তোলে।

সুতরাং যদি স্মৃতিতে কোথাও কোনও পূর্ণসংখ্যা বৃদ্ধি করতে এটি অপারেশন করে, আমরা f (x) = 5x = 5 অতিরিক্ত ক্রিয়াকলাপের সাহায্যে লুপটি কাজ করতে পারি। 20 অতিরিক্ত উপাদানগুলির জন্য, আমরা 20 টি অতিরিক্ত ক্রিয়াকলাপ করি। একটি অ্যারের একক পাস লিনিয়ার হতে থাকে। বালতি বাছাইয়ের মতো অ্যালগরিদমগুলিও রয়েছে যা অ্যারের একক পাসে বাছাই করতে ডেটা কাঠামো কাজে লাগাতে সক্ষম।

আপনার দ্বিতীয় উদাহরণটিও সঠিক হবে এবং এর মতো দেখাচ্ছে:

O (n ^ 2):

for (int i = 0; i < myArray.length; i++) {
    for (int j = 0; j < myArray.length; j++) {
        myArray[i][j] += 1;
    }
}

এই ক্ষেত্রে, প্রথম অ্যারেতে প্রতিটি অতিরিক্ত উপাদানগুলির জন্য, i, আমাদের সকল জে প্রসেস করতে হবে। আমি 1 যোগ করা আসলে জে যোগ (জে দৈর্ঘ্য)। সুতরাং, আপনি সঠিক! এই প্যাটার্নটি হ'ল (এন ^ 2), বা আমাদের উদাহরণে এটি আসলে ও (আই * জে) (বা n ^ 2 যদি i == জে, যা প্রায়শই ম্যাট্রিক্স অপারেশন বা বর্গক্ষেত্রের কাঠামোর ক্ষেত্রে ঘটে।

আপনার তৃতীয় উদাহরণ হ'ল ডুস্টফের উপর নির্ভর করে জিনিসগুলি পরিবর্তিত হয়; যদি কোডটি লিখিতভাবে হয় এবং স্টাফগুলি ধ্রুবক হয় তবে এটি আসলে কেবল ও (এন) হয় কারণ আমাদের আকারের অ্যারের 2 পাস রয়েছে, এবং 2n হ্রাস এন হবে to লুপগুলি একে অপরের বাইরে থাকা মূল ফ্যাক্টর নয় যা 2 code n কোড তৈরি করতে পারে; এখানে একটি ফাংশনের উদাহরণ যা 2 ^ n:

var fibonacci = function (n) {
    if (n == 1 || n == 2) {
        return 1;
    }

    else {
        return (fibonacci(n-2) + fibonacci(n-1));
    }
}

এই ফাংশনটি 2 ^ n, কারণ ফাংশনে প্রতিটি কল ফাংশনে TWO অতিরিক্ত কল উত্পন্ন করে (ফাইবোনাচি)। প্রতিবার আমরা যখন ফাংশনটি কল করি তখন আমাদের কাজের পরিমাণ দ্বিগুণ করতে হয়! এটি হাইড্রার মাথা কেটে ফেলার মতো এবং প্রতিটি সময় দু'টি নতুন ফোটার মতো দ্রুত তাড়াতাড়ি বেড়ে যায়!

আপনার চূড়ান্ত উদাহরণের জন্য, আপনি যদি মার্জ-সাজানোর মতো এনলগন সাজ্ট ব্যবহার করছেন তবে আপনি সঠিক যে এই কোডটি ও (এনএলজিএন) হবে। যাইহোক, আপনি নির্দিষ্ট পরিস্থিতিতে দ্রুত প্রকারের বিকাশের জন্য ডেটার কাঠামোটি কাজে লাগাতে পারেন (যেমন 1-100 এর মতো একটি জ্ঞাত, সীমিত পরিসরের মানগুলির চেয়ে বেশি) সুতরাং যদি O (nlgn) বাছাই O (nlgn) সময়ের চেয়ে কম সময় নেয় এমন কোনও ক্রিয়াকলাপের পাশে থাকে তবে মোট সময়ের জটিলতা হবে O (nlgn)।

জাভাস্ক্রিপ্টে (কমপক্ষে ফায়ারফক্সে) অ্যারে.প্রোটোটাইপ.সোর্ট () এ ডিফল্ট সাজানোটি অবশ্যই মার্জসার্ট, সুতরাং আপনি আপনার চূড়ান্ত দৃশ্যের জন্য ও (এনএলজিএন) এ খুঁজছেন।


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

1

আপনার দ্বিতীয় উদাহরণ (0 থেকে এন থেকে বাইরের লুপ , 0 থেকে বি থেকে অভ্যন্তরীণ লুপ ) ও ( এনবি ) হবে, ও ( এন 2 ) নয়। নিয়ম তোমাকে কিছু কম্পিউটিং যে হয় এন সময়, এবং আপনি কিছু কম্পিউটিং হয় ঐ প্রত্যেকের জন্য অন্য বার, এইভাবে এই ফাংশন বৃদ্ধি একমাত্র বৃদ্ধির উপর নির্ভর করে এন *

আপনার তৃতীয় উদাহরণটি কেবল ও ( এন ) - আপনি সমস্ত ধ্রুবকগুলি মুছে ফেলতে পারেন কারণ সেগুলি এন দিয়ে বৃদ্ধি পায় না এবং বৃদ্ধি হ'ল বিগ-ও স্বরলিপিটি।

আপনার শেষ উদাহরণ হিসাবে, হ্যাঁ, আপনার বিগ-ও স্বরলিপি অবশ্যই সাজানোর পদ্ধতি থেকে আসবে যা যদি এটি তুলনা-ভিত্তিক হয় (যেমন সাধারণত এটি হয়) তবে এটি সবচেয়ে দক্ষ আকারে, হে ( এন * লগন ) ।


0

মনে রাখবেন এটি রান-টাইমের আনুমানিক উপস্থাপনা। "নিয়মের অফ থাম্ব" আনুমানিক কারণ এটি অনর্থক তবে এটি মূল্যায়নের উদ্দেশ্যে প্রথমে একটি ভাল প্রথম অর্ডার দেয়।

প্রকৃত রান-টাইম নির্ভর করবে কতটা হিপ-স্পেস, প্রসেসর কত দ্রুত, নির্দেশ সেট, উপসর্গ বা পোস্ট-ফিক্স ইনক্রিমেন্ট অপারেটর ইত্যাদির উপর নির্ভর করবে ইয়াদ। যথাযথ রান-টাইম বিশ্লেষণ গ্রহণযোগ্যতা নির্ধারণের অনুমতি দেবে তবে প্রাথমিক বিষয়গুলি সম্পর্কে জ্ঞান থাকা আপনাকে শুরু থেকেই প্রোগ্রাম করার অনুমতি দেয়।

আমি সম্মত হই না যে পাঠ্যপুস্তক থেকে ব্যবহারিক প্রয়োগের ক্ষেত্রে কীভাবে বিগ-ওকে যুক্তিযুক্ত তা বোঝার জন্য আপনি সঠিক পথে রয়েছেন। এটি অতিক্রম করা কঠিন বাধা হতে পারে।

বড় ডেটা সেট এবং বৃহত প্রোগ্রামগুলিতে অ্যাসিপটোটিক গ্রোথ-রেট গুরুত্বপূর্ণ হয়ে ওঠে তাই সাধারণ উদাহরণগুলির জন্য আপনি যেটা দেখান যে এটি যথাযথ বাক্য গঠন এবং যুক্তির পক্ষে অতটা গুরুত্বপূর্ণ নয়।


-1

বড় ওহ, সংজ্ঞা অনুসারে অর্থ: একটি ফাংশনের জন্য চ (টি) সেখানে একটি ফাংশন সি * জি (টি) থাকে যেখানে সি একটি নির্বিচার ধ্রুবক যেমন চ (টি) <= সি * জি (টি) টি> এন এর জন্য যেখানে এন একটি স্বেচ্ছাসেবক ধ্রুবক, তারপরে চ (টি) ও (জি (টি)) এর মধ্যে বিদ্যমান এটি একটি গাণিতিক স্বরলিপি যা কম্পিউটার বিজ্ঞানে অ্যালগোরিদম বিশ্লেষণ করতে ব্যবহৃত হয়। যদি আপনার বিভ্রান্ত হয় তবে আমি বন্ধের সম্পর্কের দিকে নজর দেওয়ার পরামর্শ দিচ্ছি, আপনি এই উপায়টি আরও বিশদভাবে দেখতে পারবেন যে কীভাবে এই অ্যালগোরিদমগুলি এই বড়-ওহ মানগুলি পায়।

এই সংজ্ঞার কিছু পরিণতি: ও (এন) আসলে ও (2 এন) এর সাথে একমত।

এছাড়াও বিভিন্ন ধরণের বাছাই অ্যালগরিদম রয়েছে। তুলনা বাছাইয়ের জন্য সর্বনিম্ন বিগ-ওহ মান হ'ল ও (এনলগন) তবে আরও বড়-ও-এর সাথে প্রচুর পরিমাণে রয়েছে। উদাহরণস্বরূপ নির্বাচনের সাজানোর ক্ষেত্রে ও (এন ^ 2) রয়েছে। কিছু অ তুলনা বাছাইয়ের ক্ষেত্রে আরও ভাল-ওহ মান থাকতে পারে। একটি বালতি বাছাই, উদাহরণস্বরূপ ও (এন) রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.