পুনরাবৃত্ত ক্রিয়াকলাপগুলির জন্য জটিলতা নির্ধারণ (বিগ ও স্বরলিপি)


267

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

int recursiveFun1(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun1(n-1);
}

int recursiveFun2(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun2(n-5);
}

int recursiveFun3(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun3(n/5);
}

void recursiveFun4(int n, int m, int o)
{
    if (n <= 0)
    {
        printf("%d, %d\n",m, o);
    }
    else
    {
        recursiveFun4(n-1, m+1, o);
        recursiveFun4(n-1, m, o+1);
    }
}

int recursiveFun5(int n)
{
    for (i = 0; i < n; i += 2) {
        // do something
    }

    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun5(n-5);
}

4
আপনি যদি প্রতিবার বিশ্লেষণের মধ্য দিয়ে যেতে না চান তবে একটি কালো বাক্স কৌশল রয়েছে যা মাস্টার পদ্ধতি বলে। কিন্তু এই অনুমানের সাথে যে ইনপুটগুলির সমস্ত পুনরাবৃত্ত স্প্লিটগুলি প্রতিটি ক্ষেত্রে সমান আকারের হয়।
বিবেক কৃষ্ণ


উত্তর:


345

প্রতিটি ফাংশনের জন্য বিগ ও স্বরলিপিতে সময় জটিলতাটি সাংখ্যিক ক্রমে:

  1. প্রথম ফাংশন তাই সেটির বেস কেস উপনীত হওয়ার আগে যাও recursively এন বার বলা হচ্ছে O(n), প্রায়ই বলা রৈখিক
  2. দ্বিতীয় ফাংশনটি প্রতিবারের জন্য এন -5 বলা হয়, সুতরাং আমরা ফাংশনটি বলার আগে এন থেকে পাঁচটি কেটে রাখি, তবে এন -5ও হয় O(n)। (প্রকৃতপক্ষে n / 5 বারের অর্ডার বলা হয় And এবং, ও (এন / 5) = ও (এন))।
  3. এই ফাংশনটি হ'ল লগ (এন) বেস 5, প্রতিটি সময় ফাংশনটি কল করার আগে আমরা 5 দ্বারা বিভাজন করি যাতে এটির O(log(n))(বেস 5) বলা হয়, প্রায়শই লোগারিদমিক এবং বেশিরভাগ ক্ষেত্রে বিগ ও স্বরলিপি বলে এবং জটিলতা বিশ্লেষণ বেস 2 ব্যবহার করে।
  4. চতুর্থ, এটা এর O(2^n), বা সূচকীয় , যেহেতু প্রতিটি ফাংশন কল নিজেই দুইবার কল যদি না তা recursed হয়েছে এন বার।
  5. শেষ ফাংশন হিসাবে, লুপটির জন্য n / 2 লাগে যেহেতু আমরা 2 দ্বারা বৃদ্ধি পাচ্ছি, এবং পুনরাবৃত্তি এন -5 নেয় এবং যেহেতু লুপটির জন্য পুনরাবৃত্তি বলা হয় তাই সময় জটিলতা (এন -5) * (এন) / 2) = (2n-10) * n = 2n ^ 2- 10n, অ্যাসিপটোটিক আচরণ এবং সবচেয়ে খারাপ পরিস্থিতি বিবেচনার কারণে বা বড় ও এর পক্ষে যে ওপরের সীমানা চেষ্টা করছে, আমরা কেবলমাত্র বৃহত্তর পদটিতে আগ্রহী O(n^2)

    আপনার মধ্যমাংশের জন্য শুভকামনা;)


পঞ্চম সম্পর্কে আপনার অধিকার, এন লুপের জন্য হ্রাস পাবে তবে চতুর্থটির জন্য আমি মনে করি না যে এটি গাছের মতো তার জন্য n ^ 2 প্রতিবার আপনার পুনরাবৃত্তি দুবার ডেকেছে তাই এটি 2 plus n হওয়া উচিত যা আপনার ছিল এর আগে মন্তব্যে উত্তর দিন।
কোডার

2
@ এমজেজিওয়াটার লুপের চলমান সময়টি মি। যখন পুনরাবৃত্তিটি 1 বার চালায়, লুপটি কার্যকর করতে মি লাগে। যখন পুনরাবৃত্তি 2 বার চালানো হয়, লুপটি 2 বারও চালানো হয়, সুতরাং এটি 2 মি ... এবং আরও কিছু সময় নেয়। সুতরাং এটি '' 'নয়,' ''।
বিজেসি

3
@ কোডার 5 টির জন্য ব্যাখ্যাটি বিজোড় বলে মনে হচ্ছে। যদি লুপটির n/2পুনরাবৃত্তিতে 2 টির ফলাফল forবাড়ানো হয় তবে 5 টি হ্রাস করে কেন n/5পুনরাবৃত্তির কল আসবে না ? এটি এখনও ফলস্বরূপ হবে তবে এটি O(n^2)আরও স্বজ্ঞাত ব্যাখ্যা হিসাবে মনে হচ্ছে। যখন তারা একই কাজটি অপরিহার্য হয় তখন কেন বিয়োগ এবং বিভাগকে মেশান?
জ্যাক

1
@ কোডার তাই # 4 এর জন্য, যদি ফাংশন সংজ্ঞাটিতে 3 পুনরাবৃত্ত কল ছিল, তবে এটি ও (4 ^ n) এর একটি সময়ের জটিলতা ছিল? এবং 5 পুনরাবৃত্তি কলগুলির জন্য এটি ও (5 ^ n) হবে, সঠিক?
rmutalik

1
@ জ্যাক হ্যাঁ, আমিও একই ভাবছিলাম। এটা করা উচিত n/5নয় n-5। এবং শেষ পর্যন্ত, পুরোপুরি নীচে সিদ্ধ হবে O(N^2)
অনুজ

128

কেস জন্য যেখানে n <= 0, T(n) = O(1)। সুতরাং, সময় জটিলতা কখন নির্ভর করবে n >= 0

আমরা n >= 0নীচের অংশে কেসটি বিবেচনা করব ।

1।

T(n) = a + T(n - 1)

যেখানে একটি কিছু ধ্রুবক হয়।

আনয়ন দ্বারা:

T(n) = n * a + T(0) = n * a + b = O(n)

যেখানে ক, খ কিছু ধ্রুবক।

2।

T(n) = a + T(n - 5)

যেখানে একটি কিছু ধ্রুবক হয়

আনয়ন দ্বারা:

T(n) = ceil(n / 5) * a + T(k) = ceil(n / 5) * a + b = O(n)

যেখানে a, b কিছু ধ্রুবক এবং কে <= 0

3।

T(n) = a + T(n / 5)

যেখানে একটি কিছু ধ্রুবক হয়

আনয়ন দ্বারা:

T(n) = a * log5(n) + T(0) = a * log5(n) + b = O(log n)

যেখানে ক, খ কিছু ধ্রুবক

4।

T(n) = a + 2 * T(n - 1)

যেখানে একটি কিছু ধ্রুবক হয়

আনয়ন দ্বারা:

T(n) = a + 2a + 4a + ... + 2^(n-1) * a + T(0) * 2^n 
     = a * 2^n - a + b * 2^n
     = (a + b) * 2^n - a
     = O(2 ^ n)

যেখানে ক, খ কিছু ধ্রুবক।

5।

T(n) = n / 2 + T(n - 5)

যেখানে এন কিছু ধ্রুবক হয়

লেখা n = 5q + rযেখানে q এবং দ পূর্ণসংখ্যা এবং দ = 0, 1, 2, 3, 4 হয়

T(5q + r) = (5q + r) / 2 + T(5 * (q - 1) + r)

আমাদের রয়েছে q = (n - r) / 5এবং আর <5 এর পরে আমরা এটিকে একটি ধ্রুবক হিসাবে বিবেচনা করতে পারিq = O(n)

আনয়ন দ্বারা:

T(n) = T(5q + r)
     = (5q + r) / 2 + (5 * (q - 1) + r) / 2 + ... + r / 2 +  T(r)
     = 5 / 2 * (q + (q - 1) + ... + 1) +  1 / 2 * (q + 1) * r + T(r)
     = 5 / 4 * (q + 1) * q + 1 / 2 * (q + 1) * r + T(r)
     = 5 / 4 * q^2 + 5 / 4 * q + 1 / 2 * q * r + 1 / 2 * r + T(r)

যেহেতু r <4, আমরা কিছু ধ্রুবক যাতে এটি খুঁজে পেতে পারি b >= T(r)

T(n) = T(5q + r)
     = 5 / 2 * q^2 + (5 / 4 + 1 / 2 * r) * q + 1 / 2 * r + b
     = 5 / 2 * O(n ^ 2) + (5 / 4 + 1 / 2 * r) * O(n) + 1 / 2 * r + b
     = O(n ^ 2)

1
আমি সম্প্রতি একটি সাক্ষাত্কারের প্রশ্নটি ব্যর্থ করেছি (এবং সাক্ষাত্কারটি প্রসারিত করে) যা একটি পুনরাবৃত্ত ফাইবোনাকি ফাংশনের সময় এবং স্থান জটিলতার বিশ্লেষণের সাথে করতে হয়। এই উত্তরটি মহাকাব্যিক এবং এটি অনেক সাহায্য করেছে, আমি এটি ভালবাসি, আমি আশা করি আমি আপনাকে দুবার ভোট দিতে পারতাম। আমি জানি এটি পুরানো তবে আপনার কাছে কি স্থানের গণনার জন্য অনুরূপ কিছু রয়েছে - সম্ভবত একটি লিঙ্ক, কিছু?
দিমিতর দিমিত্রভ

4 নম্বরের জন্য, ফলাফল একই হলেও, অন্তর্ভুক্তিটি কি নিম্নলিখিত হওয়া উচিত নয়? টি (এন) = এ + 2 টি (এন -1) = এ + 2 এ + 4 টি (এন-1) = 3 এ + 4 এ + 8 টি (এন-1) = এ * (2 ^ এন - 1) + 2 ^ n * টি (0) = এ * (2 ^ n - 1) + বি * 2 ^ এন = (এ + বি) * 2 ^ এন - এ = ও (2 ^ n)
তুষারফিশ

27

পুনরাবৃত্তাকার অ্যালগরিদমের জটিলতা প্রায় অনুমানের জন্য আমি খুঁজে পাওয়ার সেরা উপায়গুলির মধ্যে একটি হ'ল পুনরাবৃত্তি গাছ আঁকানো। একবার আপনার পুনরাবৃত্ত গাছ হবে:

Complexity = length of tree from root node to leaf node * number of leaf nodes
  1. প্রথম ফাংশনটির দৈর্ঘ্য nএবং পাতার নোডের সংখ্যা 1থাকবে তাই জটিলতা হবেn*1 = n
  2. দ্বিতীয় n/5ফাংশনটিতে আবার পাতার নোডের দৈর্ঘ্য এবং সংখ্যা 1থাকবে তাই জটিলতা হবে n/5 * 1 = n/5। এটি প্রায় অনুমান করা উচিতn

  3. তৃতীয় ফাংশনের জন্য, যেহেতু nপ্রতিটি পুনরাবৃত্ত কলগুলিতে 5 দ্বারা বিভক্ত করা হচ্ছে, পুনরাবৃত্ত গাছের দৈর্ঘ্য হবে log(n)(base 5)এবং পাতার নোডের সংখ্যা আবার 1 হবে তাই জটিলতা হবেlog(n)(base 5) * 1 = log(n)(base 5)

  4. চতুর্থ ফাংশনের জন্য যেহেতু প্রতিটি নোডের দুটি শিশু নোড থাকবে, তাই পাতা নোডের সংখ্যা সমান হবে (2^n)এবং পুনরাবৃত্ত হওয়া গাছের দৈর্ঘ্য nএত জটিল হবে (2^n) * n। তবে যেহেতু nসামনে তুচ্ছ (2^n), তাই এটিকে উপেক্ষা করা যায় এবং জটিলতা কেবল বলা যায় (2^n)

  5. পঞ্চম ফাংশনের জন্য, জটিলতার পরিচয় করিয়ে দেওয়ার জন্য দুটি উপাদান রয়েছে। জটিলতা forপ্রতিটি ক্রিয়ায় লুপ দ্বারা প্রবর্তন ফাংশন এবং জটিলতার পুনরাবৃত্তি দ্বারা প্রবর্তিত । উপরের গণনাটি করা, ফাংশনের পুনরাবৃত্ত প্রকৃতির দ্বারা প্রবর্তিত ~ nজটিলতা এবং লুপের কারণে জটিলতা হবে n। মোট জটিলতা হবে n*n

দ্রষ্টব্য: জটিলতা গণনার এটি একটি দ্রুত এবং নোংরা উপায় (অফিসিয়াল কিছুই নয়!)। এই সম্পর্কে প্রতিক্রিয়া শুনতে চাই। ধন্যবাদ।


দুর্দান্ত উত্তর! চতুর্থ ফাংশন সম্পর্কে আমার একটি প্রশ্ন আছে। যদি এটির তিনটি পুনরাবৃত্ত কল হত তবে উত্তরটি (3 ^ n) হত। অথবা আপনি কি কেবল (2 ^ n) বলবেন?
বেন ফোর্স্রপ

@ শুভম: # 4 আমার কাছে ঠিক মনে হচ্ছে না। পাতার সংখ্যা যদি হয় 2^nতবে গাছের উচ্চতা অবশ্যই হবে n, তা নয় log n। উচ্চতা কেবলমাত্র log nযদি nগাছের মোট নোডের প্রতিনিধিত্ব করে। তবে তা হয় না।
জুলিয়ান এ।

@ বেনফোর্সপ: এটি 3 ^ n হবে কারণ প্রতিটি নোডে তিনটি শিশু নোড থাকবে। এ সম্পর্কে নিশ্চিত হওয়ার সর্বোত্তম উপায় হ'ল পুনরাবৃত্ত গাছটি ডামি মান সহ আঁকুন।
শুভম

# 2 হওয়া উচিত এন -5 এন / 5 নয়
ফিন্ট্যাসিস

7

আমরা এটি গাণিতিকভাবে প্রমাণ করতে পারি যা উপরের উত্তরগুলিতে আমি অনুপস্থিত ছিল।

এটি কোনও পদ্ধতিতে কীভাবে গণনা করা যায় তা বুঝতে নাটকীয়ভাবে আপনাকে সহায়তা করতে পারে। এটি কীভাবে করবেন তা সম্পূর্ণরূপে বুঝতে নীচে থেকে নীচে থেকে পড়ার পরামর্শ দিচ্ছি:

  1. T(n) = T(n-1) + 1এর অর্থ হল যে পদ্ধতিটি শেষ হতে সময়টি একই পদ্ধতির সমান হয় তবে এন -১ এর সাথে T(n-1)এবং আমরা এখন যুক্ত করি + 1কারণ সাধারণ অপারেশনগুলি সমাপ্ত হতে সময় ব্যতীত (ব্যতীত T(n-1))। এখন আমরা এটি যাচ্ছি T(n-1)হিসাবে অনুসরণ: T(n-1) = T(n-1-1) + 1। দেখে মনে হচ্ছে আমরা এখন এমন একটি ফাংশন গঠন করতে পারি যা আমাদের কিছু ধরণের পুনরাবৃত্তি দিতে পারে যাতে আমরা পুরোপুরি বুঝতে পারি। আমরা ডান দিকে স্থাপন করবে T(n-1) = ...পরিবর্তে T(n-1)পদ্ধতি ভিতরে T(n) = ...: যা আমাদের দিতে হবে T(n) = T(n-1-1) + 1 + 1, যা T(n) = T(n-2) + 2বা অন্য কথায় আমরা আমাদের অনুপস্থিত এটি প্রয়োজন k: T(n) = T(n-k) + k। পরবর্তী পদক্ষেপটি নেওয়া n-kএবং দাবি করা n-k = 1কারণ কারণ পুনরাবৃত্তি শেষে এটি ঠিক ও (1) কখন নেবেn<=0। এই সাধারণ সমীকরণ থেকে আমরা এখন এটি জানি k = n - 1। আসুন kআমাদের চূড়ান্ত পদ্ধতিতে রাখি: T(n) = T(n-k) + kযা আমাদের দেবে: T(n) = 1 + n - 1যা হ'ল nবা O(n)
  2. ১. এর সমান You আপনি এটি নিজের স্ব পরীক্ষা করতে পারেন এবং দেখতে পান যে O(n)
  3. T(n) = T(n/5) + 1আগের মত, এই পদ্ধতির সমাপ্তির সময় একই পদ্ধতির সাথে সমান হয় তবে n/5এটি কেন এটিতে আবদ্ধ T(n/5)। আসুন T(n/5)1 এর মতো সন্ধান করুন: T(n/5) = T(n/5/5) + 1যা হয় T(n/5) = T(n/5^2) + 1। আসুন জায়গা T(n/5)ভিতরে T(n)চূড়ান্ত গণনা জন্য: T(n) = T(n/5^k) + k। আবার আগের মতো, n/5^k = 1যা n = 5^k5 এর পাওয়ার হিসাবে ঠিক কী জিজ্ঞাসা করা আমাদের এন দেবে, উত্তরটি হল log5n = k(বেস 5 এর লগ)। আসুন আমাদের অনুসন্ধানগুলি T(n) = T(n/5^k) + kঅনুসরণ হিসাবে রাখি: T(n) = 1 + lognযাO(logn)
  4. T(n) = 2T(n-1) + 1আমাদের এখানে যা আছে তা মূলত আগের মতই তবে এবার আমরা পদ্ধতিটি পুনরাবৃত্তভাবে 2 বার প্রার্থনা করছি এইভাবে আমরা এটি 2 দিয়ে বহুগুণ করব Let's আসুন খুঁজে বের করি T(n-1) = 2T(n-1-1) + 1কোনটি T(n-1) = 2T(n-2) + 1। আগের মতো আমাদের পরবর্তী স্থান, আসুন আমাদের সন্ধান করুন: T(n) = 2(2T(n-2)) + 1 + 1যা T(n) = 2^2T(n-2) + 2এটি আমাদের দেয় T(n) = 2^kT(n-k) + k। আসুন যা kদাবি করে এটি সন্ধান করি । আসুন অনুসরণ হিসাবে রাখুন: যা মোটামুটিn-k = 1k = n - 1kT(n) = 2^(n-1) + n - 1O(2^n)
  5. T(n) = T(n-5) + n + 1এটি প্রায় 4 এর মতোই তবে এখন আমরা যুক্ত করছি nকারণ আমাদের একটি forলুপ রয়েছে। আসুন খুঁজে বের করা যাক T(n-5) = T(n-5-5) + n + 1যা T(n-5) = T(n - 2*5) + n + 1। আসুন এটি স্থাপন করুন: T(n) = T(n-2*5) + n + n + 1 + 1)যা T(n) = T(n-2*5) + 2n + 2)এবং এর জন্য: T(n) = T(n-k*5) + kn + k)আবার: n-5k = 1যা n = 5k + 1মোটামুটি n = k। এটি আমাদের দেবে: T(n) = T(0) + n^2 + nযা মোটামুটি O(n^2)

আমি এখনই বাকি উত্তরগুলি পড়ার পরামর্শ দিচ্ছি যা এখন আপনাকে একটি আরও ভাল দৃষ্টিকোণ দেবে। শুভকামনা those বড় ওদের জয়ী হওয়া :)


1

এখানে চাবিটি হ'ল কল ট্রিটিকে ভিজ্যুয়ালাইজ করা। একবার এটি করা হয়ে গেলে জটিলতাটি হ'ল:

nodes of the call tree * complexity of other code in the function

পরবর্তী শব্দটিকে আমরা একইসাথে পুনরাবৃত্তির ক্রিয়া হিসাবে গণনা করতে পারি।

পরিবর্তে, একটি সম্পূর্ণ গাছের মোট নোড হিসাবে গণনা করা হয়

                  C^L - 1
                  -------  , when C>1
               /   C - 1
              /
 # of nodes =
              \    
               \ 
                  L        , when C=1

যেখানে সি প্রতিটি নোডের বাচ্চাদের সংখ্যা এবং এল গাছের স্তরের সংখ্যা (মূল অন্তর্ভুক্ত)।

গাছটি কল্পনা করা সহজ। প্রথম কল (রুট নোড) থেকে শুরু করুন তারপর ফাংশনে পুনরাবৃত্ত কলগুলির সংখ্যার মতো অনেকগুলি শিশু আঁকুন। উপ-কলে পাস করা প্যারামিটারটি "নোডের মান" হিসাবে লিখতেও দরকারী।

সুতরাং, উপরের উদাহরণগুলিতে:

  1. এখানে কল ট্রিটি সি = 1, এল = এন + 1। বাকি ফাংশনের জটিলতা হ'ল ও (1)। সুতরাং মোট জটিলতা হ'ল এল * ও (1) = (এন + 1) * ও (1) = ও (এন)
n     level 1
n-1   level 2
n-2   level 3
n-3   level 4
... ~ n levels -> L = n
  1. এখানে কল ট্রি সি = 1, এল = এন / 5। বাকি ফাংশনের জটিলতা হ'ল ও (1)। সুতরাং মোট জটিলতা হ'ল এল * ও (1) = (এন / 5) * ও (1) = ও (এন)
n
n-5
n-10
n-15
... ~ n/5 levels -> L = n/5
  1. কল ট্রিটি এখানে সি = 1, এল = লগ (এন)। বাকি ফাংশনের জটিলতা হ'ল ও (1)। সুতরাং মোট জটিলতা হ'ল এল * ও (1) = লগ 5 (এন) * ও (1) = ও (লগ (এন))
n
n/5
n/5^2
n/5^3
... ~ log5(n) levels -> L = log5(n)
  1. কল ট্রিটি এখানে সি = 2, এল = এন। বাকি ফাংশনের জটিলতা হ'ল ও (1)। এবার আমরা কল ট্রিতে নোডের সংখ্যার জন্য পূর্ণ সূত্রটি ব্যবহার করি কারণ সি> ১. সুতরাং মোট জটিলতা হ'ল (সি ^ এল -1) / (সি -১) * ও (1) = (2 ^ n - 1 ) * ও (1) = ও (2 ^ n)
               n                   level 1
      n-1             n-1          level 2
  n-2     n-2     n-2     n-2      ...
n-3 n-3 n-3 n-3 n-3 n-3 n-3 n-3    ...     
              ...                ~ n levels -> L = n
  1. এখানে কল ট্রি সি = 1, এল = এন / 5। বাকি ফাংশনের জটিলতা হ'ল ও (এন)। সুতরাং মোট জটিলতা হ'ল এল * ও (1) = (এন / 5) * ও (এন) = ও (এন ^ 2)
n
n-5
n-10
n-15
... ~ n/5 levels -> L = n/5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.