অ্যালগরিদম: আমি ও (এন) এবং ও (এনলগ (এন)) এর সাথে কীভাবে যোগ করব?


22

আমার কাছে অনুসরণ করা অ্যালগরিদম রয়েছে যা সদৃশগুলি সন্ধান করে এবং সেগুলি সরিয়ে দেয়:

public static int numDuplicatesB(int[] arr) {
    Sort.mergesort(arr);
    int numDups = 0;
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] == arr[i - 1]) {
            numDups++;
} }
    return numDups;
}

আমি এর মধ্যে সবচেয়ে খারাপ সময়ের সময় জটিলতাটি অনুসন্ধান করার চেষ্টা করছি। আমি জানি যে একত্রীকরণটি হ'ল nlog(n)এবং আমার লুপের জন্য আমি সম্পূর্ণ ডেটা সেটটিতে পুনরাবৃত্তি করছি যাতে এটি গণনা করা যায় n। যদিও এই সংখ্যাগুলির সাথে কী করব আমি নিশ্চিত নই। আমি কি কেবল তাদের একসাথে যোগ করব? আমি যদি তা করতে থাকি তবে আমি কীভাবে এটি করব?


1
পার্শ্ব নোট: মেমরির প্রয়োজনীয়তার উপর নির্ভর করে ও (এন) এ করতে আপনি একটি হ্যাশ টেবিল ব্যবহার করতে পারেন।
কর্সিকা

উত্তর:


67
O(n) + O(n log(n)) = O(n log(n))

বিগ হে জটিলতার জন্য, আপনি যে সমস্ত বিষয়ে যত্নশীল তা হ'ল প্রভাবশালী শব্দ। n log(n)আধিপত্য বজায় রাখে nতাই এটি আপনার একমাত্র পদ।


4
এ সম্পর্কে ভাবার আরেকটি উপায় হ'ল আপনার ও (এন) প্রসেসিংটি সত্যিই ও (এন লগ এন) ছিল এমনভাবে কল্পনা করা, যেমন আপনি দুটি স্বতন্ত্র প্রকার করেছেন। তারপরে আপনার কাছে 2 * O (n লগ এন) থাকবে। তবে ধ্রুবকগুলি অল্পই বন্ধ হয়ে যায়, সুতরাং আপনি O (n লগ এন) এ ফিরে আসছেন।
জোনাথন ইউনিস

4
@ জোনাথন যখন এটি অনুশীলনে কাজ করে, এটি খুব সত্য যে ও (এন) ও (এন লগ (এন)) এর সমান নয় , তাই আমি এটি নিয়মিতভাবে ব্যবহার করার পরামর্শ দেব না।
আজা

17
@ এমরাকুল আসলে আমার মনে হয় যুক্তিটি তাত্ত্বিকভাবে কার্যকর পাশাপাশি বাস্তবও বটে। ও (এন) ও (এন লগ (এন)) এর সঠিক উপসেট। সুতরাং যদি চ (এন) ও (এন) এর অন্তর্ভুক্ত হয় তবে এটি ও (এন লগ (এন)) এর অন্তর্গত।
এমরি

17
এটি লক্ষ করা উচিত যে আমরা যখন বলি তখন আমরা যা বলি f(n) is O(g(n))তা হ'ল ফাংশন f is a member of the set of functions that grows at the rate of at most g(n) over the long term। এর অর্থ সমস্ত সদস্যের O(n)সদস্যও O(n*log(n))+এক্সপ্রেশন মত O(f(n)) + O(g(n))আসলে সেট ইউনিয়ন (যার আপনি কি সত্যিই গোঁড়া করছি, আপনি কি সত্যিই ব্যবহার করা উচিত ∪) পড়ুন।
মিথ্যা রায়ান

3
মূলত, এটা ইউনিয়ন সেট @LieRyan হয় না, কিন্তু সেট সমষ্টি: A + B = { a + b | a in A, b in B }। এটি ঘটে যায় যে ফর্মগুলির সেটগুলির জন্য এটি O(g(n))সেট ইউনিয়ন হিসাবে সমান, কারণ সেটগুলির মধ্যে একটি সর্বদা অন্যটির উপসেট হয় এবং তারা উভয়ই অঙ্কের (যেমন A + A = A) অবিস্মরণীয়। (উফফ, নাট মূলত একই রকম লিখেছিলেন)।
পাওলো ইবারম্যান

56

আসুন এটির মাধ্যমে আমাদের পথটির কারণ এবং সংজ্ঞাটি মনে রাখি O। আমি যেটি ব্যবহার করতে যাচ্ছি তা হ'ল অসীমের সীমাবদ্ধতার জন্য।

আপনি উল্লেখ করে ঠিক বলেছেন যে আপনি দু'টি অপারেশন একইরকম অ্যাসেম্পোটিক সীমানার সাথে করছেন O(n)এবং O(nlog(n))সেগুলি একক বাউন্ডে সংযুক্ত করা দুটি ফাংশন যুক্ত করার মতো সহজ নয়। আপনি জানেন যে আপনার ফাংশনটিতে কমপক্ষে O(n)সময় এবং কমপক্ষে সময়ও লাগে O(nlog(n))। সুতরাং সত্যিই আপনার ফাংশনটির জন্য জটিলতা শ্রেণিটি ইউনিয়ন O(n)এবং O(nlog(n))তবে O(nlog(n))এটি O(n)সত্যই এর একটি সুপারস্টার O(nlog(n))


12
+1 এর উত্তর হওয়া উচিত। এটি কমপ্যাসি পদগুলি ব্যবহার করে উত্তরটিকে আরও স্পষ্টভাবে বর্ণনা করে।

5

আপনি যদি এটি দীর্ঘকাল স্থির করতে যাচ্ছেন তবে এটি দেখতে মোটামুটি দেখতে পাবেন:

ধরুন মোট সময়টি: একটি + বিএন লগ (এন), যেখানে ক এবং খ স্থির হয় (নিম্ন অর্ডার শর্তাদি উপেক্ষা করে)।

এন যেমন অনন্তে চলে যায় (একটি + বিএন লগ (এন)) / এন লগ (এন) -> এ / লগ (এন) + বি -> বি

সুতরাং মোট সময় হল ও (বিএন লগ (এন)) = ও (এন লগ (এন))।


2

ও () এর সংজ্ঞা দিয়ে শুরু করুন:

ও (এন লগ এন) এর অর্থ "সি এন লগ এন এর চেয়ে কম, যদি এন বড় হয়"।

ও (এন) এর অর্থ "ডি এন এর চেয়ে কম, যদি এন বড় হয়"।

যদি আপনি উভয় যোগ করেন তবে ফলাফলটি সি এন লগ এন + ডি এন <সি এন লগ এন + ডি এন লগ এন <(সি + ডি) এন লগ এন = ও (এন লগ এন) এর চেয়ে কম is

সাধারণভাবে, বড় বড় এন এর জন্য যদি f (n)> C g (n) এবং কিছু সি> 0 হয়, তবে O (f (n)) + O (g (n)) = O (f (n))। এবং ও () এর সংজ্ঞা ব্যবহার করে কয়েকটি কেস করার পরে আপনি জানবেন যে আপনি কী করতে পারবেন এবং কী করতে পারবেন না।


1

বড় হে স্বরলিপি একটি সেট হিসাবে সংজ্ঞায়িত করা হয়:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং এখানে চিত্র বর্ণনা লিখুন সমস্ত ফাংশন রয়েছে যা কিছু স্বেচ্ছাসেবী বড় বিন্দু থেকে শুরু করেএখানে চিত্র বর্ণনা লিখুন - সর্বদা জি থেকে ছোট।

এখন, যখন আপনার কোনও ফাংশন রয়েছে এখানে চিত্র বর্ণনা লিখুন এবং তারপরে জি এর থেকে ধীর গতিতে বাড়ানো অন্য কোনওটি কার্যকর করে এটি অবশ্যই 2 জি এর চেয়ে ধীর গতিতে বাড়ছে। সুতরাং g এর চেয়ে ধীর গতিতে কিছু কার্যকর করা জটিলতার শ্রেণিতে পরিবর্তন আনবে না।

আরও আনুষ্ঠানিকভাবে:

f, h \ in th mathcal {O} (g) \ রাইটেরো (f + h) \ ইন th ম্যাথ্যাকাল {ও} (ছ)

আপনি এটি সহজেই প্রমাণ করতে পারেন।

টি এল; ডিআর

এটা এখনও এন লগ (এন)

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