কোন অ্যালগরিদমকে ও (লগ এন) জটিলতার কারণ হতে পারে?


106

বিগ-ও সম্পর্কে আমার জ্ঞান সীমাবদ্ধ এবং লগ শর্তাবলী সমীকরণে প্রদর্শিত হলে এটি আমাকে আরও দূরে ফেলে দেয়।

কেউ হয়তো আমাকে O(log n)অ্যালগরিদম কী বলে সহজ ভাষায় ব্যাখ্যা করতে পারেন ? লোগারিদম কোথা থেকে আসে?

আমি যখন এই মধ্যবর্তী মহড়ার প্রশ্নটি সমাধান করার চেষ্টা করছিলাম তখন এটি বিশেষত প্রকাশিত হয়েছিল:

এক্স (1..n) এবং ওয়াই (1..n) এ দুটি পূর্ণসংখ্যার তালিকা থাকতে পারে, প্রতিটি ননডক্রাইজিং ক্রমে সাজানো হয়। সমস্ত 2n সম্মিলিত উপাদানগুলির মধ্যম (বা নবতম ক্ষুদ্রতম পূর্ণসংখ্যার) সন্ধান করার জন্য একটি ও (লগ এন) -কালীন অ্যালগরিদম দিন। প্রাক্তন, এক্স = (4, 5, 7, 8, 9) এবং ওয়াই = (3, 5, 8, 9, 10), তারপরে 7 হ'ল সম্মিলিত তালিকার মধ্যবর্তী (3, 4, 5, 5, 7) , 8, 8, 9, 9, 10)। [ইঙ্গিত: বাইনারি অনুসন্ধানের ধারণাগুলি ব্যবহার করুন]


29
O(log n)হিসাবে দেখা যেতে পারে: আপনি যদি সমস্যার আকার দ্বিগুণ করেন তবে nআপনার অ্যালগরিদমের জন্য কেবল আরও ধাপের ধ্রুব সংখ্যা প্রয়োজন।
phimuemue

3
এই ওয়েবসাইটটি আমাকে বিগ ও স্বরলিপিটির উদ্বোধন করতে সহায়তা করেছে: পুনরাবৃত্তি-
ব্র্যাড

1
আমি ভাবছি কেন উপরের উদাহরণটির মধ্যম 7, কেননা এটি 8 টিও হতে পারে। উদাহরণস্বরূপ তাই ভাল না?
stryba

13
ও (লগ (এন)) অ্যালগরিদমগুলি সম্পর্কে ভাবার একটি ভাল উপায় হ'ল প্রতিটি পদক্ষেপে তারা সমস্যার আকারটি অর্ধেক কমান। বাইনারি অনুসন্ধানের উদাহরণটি ধরুন - প্রতিটি পদক্ষেপে আপনি আপনার অনুসন্ধানের পরিসীমাটির মাঝখানে মানটি পরীক্ষা করে, পরিসীমাটিকে অর্ধেক করে বিভক্ত করেন; এর পরে আপনি আপনার অনুসন্ধান পরিসর থেকে একটি অর্ধেক মুছে ফেলবেন এবং অন্য অর্ধেকটি পরবর্তী পদক্ষেপের জন্য আপনার অনুসন্ধানের সীমাতে পরিণত হবে। এবং সুতরাং প্রতিটি পদক্ষেপে আপনার অনুসন্ধানের পরিধি আকারে অর্ধেক হয়ে যায়, এইভাবে অ্যালগরিদমের ও (লগ (এন)) জটিলতা। (হ্রাস ঠিক অর্ধেক হতে হবে না, এটি একটি তৃতীয় দ্বারা হতে পারে, 25% দ্বারা, যে কোনও ধ্রুবক শতাংশ; অর্ধেকটি সর্বাধিক সাধারণ)
ক্রিজিসটফ কোজিয়েলসিজেক

ধন্যবাদ ছেলেরা, পূর্ববর্তী সমস্যা নিয়ে কাজ করা এবং শীঘ্রই এটি পেয়ে যাবেন, উত্তরগুলির জন্য খুব প্রশংসা করুন! এটি অধ্যয়নের জন্য পরে ফিরে আসবে
111135352

উত্তর:


290

আমার একমত হতে হবে যে প্রথমবার আপনি কোনও ও (লগ এন) অ্যালগরিদম দেখলে এটি বেশ অদ্ভুত ... পৃথিবীতে সেই লোগারিদম কোথা থেকে এসেছে? যাইহোক, দেখা যাচ্ছে যে বিগ-ও স্বরলিপিতে আপনি লগ টার্ম পেতে পারেন এমন বিভিন্ন উপায় রয়েছে। এখানে কয়েকটি দেওয়া হল:

বারবার একটি ধ্রুবক দ্বারা বিভাজন

যে কোনও সংখ্যা নিন; বলুন, ১.. একটি সংখ্যা কম বা তার সমান পাওয়ার আগে আপনি কতবার n কে দুই দ্বারা ভাগ করতে পারবেন? 16 এর জন্য, আমাদের এটি আছে

16 / 2 = 8
 8 / 2 = 4
 4 / 2 = 2
 2 / 2 = 1

লক্ষ করুন যে এটি শেষ করতে চারটি পদক্ষেপ গ্রহণ শেষ ends মজার বিষয় হল, আমাদের সেই লগটি 2 16 = 4. হুমম ... 128 এর কি?

128 / 2 = 64
 64 / 2 = 32
 32 / 2 = 16
 16 / 2 = 8
  8 / 2 = 4
  4 / 2 = 2
  2 / 2 = 1

এটি সাতটি পদক্ষেপ নিয়েছে এবং লগ 2 128 = 7. এটি কি কাকতালীয় ঘটনা? নাঃ! এর জন্য একটি ভাল কারণ আছে। মনে করুন যে আমরা একটি সংখ্যা 2 দ্বারা 2 বার বার করব। তারপরে আমরা n / 2 নম্বর পেয়েছি i । যদি আমরা এই মানটি সর্বাধিক 1 এর মানের জন্য সমাধান করতে চাই তবে আমরা পাই

এন / 2 আমি ≤ 1

n ≤ 2 i

লগ 2 এন ≤ i

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

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

তাহলে এটি কোথায় আসে? একটি ক্লাসিক উদাহরণ বাইনারি অনুসন্ধান , একটি মানের জন্য বাছাই করা অ্যারে অনুসন্ধানের জন্য একটি দ্রুত অ্যালগরিদম। অ্যালগরিদম এইভাবে কাজ করে:

  • অ্যারেটি যদি খালি থাকে তবে ফিরে আসুন যে উপাদানটি অ্যারেতে উপস্থিত নেই।
  • অন্যথায়:
    • অ্যারের মাঝারি উপাদানটি দেখুন।
    • এটি আমরা যে উপাদানটির সন্ধান করছি তার সমান হলে সাফল্য ফিরে আসুন।
    • এটি যদি আমরা যে উপাদানটির সন্ধান করছি তার চেয়ে বেশি হলে:
      • অ্যারের দ্বিতীয়ার্ধটি ফেলে দিন।
      • পুনরাবৃত্তি
    • এটি যদি আমরা যে উপাদানটির সন্ধান করছি তার চেয়ে কম হলে:
      • অ্যারের প্রথমার্ধটি ফেলে দিন।
      • পুনরাবৃত্তি

উদাহরণস্বরূপ, অ্যারেতে 5 অনুসন্ধান করা

1   3   5   7   9   11   13

আমরা প্রথমে মাঝারি উপাদানটি দেখতে চাই:

1   3   5   7   9   11   13
            ^

যেহেতু 7> 5, এবং অ্যারে বাছাই করা হয়েছে তাই আমরা একটি সত্যের জন্য জানি যে 5 সংখ্যাটি অ্যারের পিছনের অর্ধে থাকতে পারে না, তাই আমরা কেবল এটি বাতিল করতে পারি। এই পাতার

1   3   5

সুতরাং এখন আমরা এখানে মাঝারি উপাদান তাকান:

1   3   5
    ^

3 <5 থেকে, আমরা জানি যে অ্যারের প্রথমার্ধে 5 উপস্থিত হতে পারে না, তাই আমরা প্রথমার্ধের অ্যারে ছেড়ে দিতে পারি

        5

আবার আমরা এই অ্যারের মাঝখানে তাকান:

        5
        ^

যেহেতু এটি আমরা ঠিক খুঁজছি এমন নম্বর, তাই আমরা জানাতে পারি যে 5 আসলে অ্যারেতে রয়েছে।

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

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

প্রক্রিয়াকরণ এক সময় এক অঙ্কের মান

বেস -10 নম্বর এন এ কতগুলি সংখ্যা রয়েছে? ঠিক আছে, যদি সংখ্যায় কে ডিজিট থাকে, তবে আমাদের কাছে সবচেয়ে বড় সংখ্যাটি 10 কে এর একাধিক । বৃহত্তম কে-অঙ্কের সংখ্যাটি 999 ... 9, কে গুন, এবং এটি 10 কে + 1 - 1 সমান is ফলস্বরূপ, আমরা যদি জানি যে এর মধ্যে n এর সংখ্যা রয়েছে, তবে আমরা জানি যে n এর মান হয় সর্বাধিক 10 কে + 1 - 1. আমরা এন এর ক্ষেত্রে কে এর জন্য সমাধান করতে চাইলে আমরা পাই

n ≤ 10 কে + 1 - 1

n + 1 ≤ 10 কে + 1

লগ 10 (এন + 1) ≤ কে + 1

(লগ 10 (এন + 1)) - 1 ≤ কে

যা থেকে আমরা পেয়েছি যে কে প্রায় এন এর বেস -10 লোগারিদম। অন্য কথায়, n এর সংখ্যার সংখ্যা হ'ল ও (লগ এন)।

উদাহরণস্বরূপ, আসুন দুটি বড় সংখ্যক যুক্ত করার জটিলতা সম্পর্কে চিন্তা করি যা কোনও মেশিন শব্দের সাথে ফিট করার জন্য খুব বড়। মনে করুন যে আমাদের 10 নম্বর বেসে প্রতিনিধিত্ব করা আছে, এবং আমরা সংখ্যাগুলি এম এবং এন কল করব। এগুলি যুক্ত করার একটি উপায় হ'ল গ্রেড-স্কুল পদ্ধতির মাধ্যমে - একবারে এক অঙ্কের বাইরে সংখ্যা লিখুন, তারপরে ডান থেকে বাম দিকে কাজ করুন। উদাহরণস্বরূপ, 1337 এবং 2065 যুক্ত করার জন্য, আমরা সংখ্যাগুলি লিখে লিখে শুরু করব

    1  3  3  7
+   2  0  6  5
==============

আমরা শেষ সংখ্যাটি যুক্ত করি এবং 1:

          1
    1  3  3  7
+   2  0  6  5
==============
             2

তারপরে আমরা দ্বিতীয় থেকে শেষের ("পেনাল্টিমেট") অঙ্কটি যুক্ত করব এবং 1টি বহন করব:

       1  1
    1  3  3  7
+   2  0  6  5
==============
          0  2

এরপরে, আমরা তৃতীয় থেকে শেষ ("অ্যান্টিপেনলিটমেট") অঙ্কটি যুক্ত করব:

       1  1
    1  3  3  7
+   2  0  6  5
==============
       4  0  2

অবশেষে, আমরা চতুর্থ থেকে শেষের ("প্রাক-পূর্বপরিচয়" ... আমি ইংরাজিকে ভালবাসি) সংখ্যা যুক্ত করি:

       1  1
    1  3  3  7
+   2  0  6  5
==============
    3  4  0  2

এখন, আমরা কত কাজ করেছি? আমরা প্রতি ডিজিটে মোট ও (1) কাজ করি (এটি ধ্রুব পরিমাণ কাজের কাজ), এবং সেখানে ও (সর্বোচ্চ {লগ এন, লগ এম}) মোট অঙ্ক রয়েছে যাতে প্রক্রিয়া করা প্রয়োজন। এটি মোট ও (সর্বোচ্চ {লগ এন, লগ এম}) জটিলতা দেয় কারণ আমাদের দুটি সংখ্যায় প্রতিটি অঙ্ক দেখতে হবে।

অনেক অ্যালগরিদম কোনও বেসে একবারে এক ডিজিট কাজ করা থেকে সেগুলিতে একটি ও (লগ এন) শব্দ পান। একটি সর্বোত্তম উদাহরণ হ'ল রেডিক্স সাজান , যা একসাথে এক অঙ্কের সংখ্যাকে সাজায় । র‌্যাডিক্স সাজানোর অনেক স্বাদ রয়েছে, তবে এগুলি সাধারণত ও (এন লগ ইউ) সময়ে চালিত হয়, যেখানে ইউ সবচেয়ে বড় সম্ভাব্য পূর্ণসংখ্য যা সাজানো হচ্ছে orted এর কারণ হ'ল ধরণের প্রতিটি পাসে ও (এন) সময় লাগে এবং সর্বাধিক সংখ্যক ও (লগ ইউ) সংখ্যার বাছাইয়ের জন্য মোট ও (লগ ইউ) পুনরাবৃত্তি প্রয়োজন। অনেক উন্নত অ্যালগরিদম, যেমন গ্যাবোর সবচেয়ে সংক্ষিপ্ত-পাথ অ্যালগরিদম বা ফোর্ড-ফুলকারসন সর্বাধিক-প্রবাহ অ্যালগরিদমের স্কেলিং সংস্করণে তাদের জটিলতায় লগ শব্দ রয়েছে কারণ তারা একবারে এক ডিজিট কাজ করে।


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

আশাকরি এটা সাহায্য করবে!


8

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

আমরা বলি যে একটি সমস্যা "বিগ-ওহ (এন এর কিছু ফাংশন)" যদি হয় এবং কেবল যদি :

সমস্ত এন> কিছু স্বেচ্ছাসেবী N_0 এর জন্য কিছু ধ্রুবক সি থাকে, যেমন অ্যালগরিদমের রানটাইম ধ্রুবক সি বারের চেয়ে কম থাকে (এন এর কিছু ফাংশন)

অন্য কথায়, ছোট সমস্যাগুলির বিষয়ে ভাববেন না যেখানে সমস্যা স্থাপনের "ধ্রুবক ওভারহেড" গুরুত্বপূর্ণ সমস্যাগুলি নিয়ে ভাবেন। এবং বড় সমস্যাগুলির বিষয়ে চিন্তা করার সময়, বিগ-ওহ অফ (এন এর কিছু ফাংশন) এর অর্থ রান-টাইম এখনও সেই ধরণের কিছু ধ্রুবক সময়ের চেয়ে সর্বদা কম থাকে। সর্বদা.

সংক্ষেপে, সেই ফাংশনটি একটি ধ্রুবক ফ্যাক্টর অবধি একটি উপরের বাউন্ড।

সুতরাং, "বিগ-ওহ অফ লগ (এন)" এর অর্থ একইরূপে যা আমি উপরে বলেছি "" এন এর কিছু ফাংশন "ব্যতীত" লগ (এন) "দিয়ে প্রতিস্থাপন করা হবে।

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

আপনি সেই নির্বিচারে ধ্রুবকটিকে সি = 10 হিসাবে বেছে নিতে পারেন এবং আপনার তালিকায় যদি এন = 32 উপাদান থাকে তবে আপনি ভাল: 10 * লগ (32) = 50, যা 32 এর রানটাইমের চেয়ে বেশি But তবে এন = 64 , 10 * লগ ()৪) = ,০, যা the৪ এর রানটাইমের তুলনায় কম। অন্য কথায়, কোনও N_0 নেই।

আমরা যদি বাইনারি অনুসন্ধান করি তবে আমরা মাঝারি উপাদানটিকে বেছে নিয়ে একটি তুলনা করি। তারপরে আমরা অর্ধেক সংখ্যা ছুঁড়ে ফেলি এবং এটি আবার এবং আবারও করব এবং আরও কিছু। যদি আপনার এন = 32 হয় তবে আপনি এটি প্রায় 5 বার করতে পারেন যা লগ (32)। যদি আপনার এন = 64 হয় তবে আপনি এটি প্রায় 6 বার করতে পারেন ইত্যাদি Now এখন আপনি সেই নির্বিচারে ধ্রুবক সি বেছে নিতে পারেন যাতে এন এর বৃহত মানগুলির জন্য প্রয়োজনীয়তা সর্বদা পূরণ হয় in

এই সমস্ত ব্যাকগ্রাউন্ডের সাথে, ও (লগ (এন)) এর অর্থ সাধারণত এটি হ'ল আপনার কাছে একটি সহজ কাজ করার কিছু উপায় রয়েছে যা আপনার সমস্যার আকার অর্ধেক কেটে দেয়। ঠিক যেমন উপরের দিকে বাইনারি অনুসন্ধান করা হচ্ছে। আপনি যখন সমস্যাটি অর্ধেকে কেটে ফেলেন, আপনি এটি আবার অর্ধেকে কেটে ফেলতে পারেন এবং আবারও এবং আবারও। তবে, সমালোচনামূলকভাবে, আপনি যা করতে পারবেন না তা হ'ল লগ (এন) এর চেয়ে বেশি সময় নেবে some সুতরাং উদাহরণস্বরূপ, আপনি আপনার দুটি তালিকাগুলি একটি বড় তালিকায় স্থানান্তর করতে পারবেন না, যদি না আপনি ও (লগ (এন)) সময়েও এটি করার কোনও উপায় খুঁজে না পান।

(দ্রষ্টব্য: প্রায় সর্বদা, লগ (এন) এর অর্থ লগ-বেস-টু, যা আমি উপরে ধারনা করি))


4

নিম্নলিখিত সমাধানে, পুনরাবৃত্ত কল সহ সমস্ত লাইন X এবং Y এর সাব-অ্যারে প্রদত্ত আকারের অর্ধেক অংশে করা হয় Other অন্যান্য লাইনগুলি একটি ধ্রুবক সময়ে সম্পন্ন হয়। পুনরাবৃত্ত ফাংশন টি (2 এন) = টি (2 এন / 2) + সি = টি (এন) + সি = ও (এলজি (2 এন)) = ও (এলজিএন)।

আপনি মিডিয়ান (এক্স, 1, এন, ওয়াই, 1, এন) দিয়ে শুরু করুন।

MEDIAN(X, p, r, Y, i, k) 
if X[r]<Y[i]
    return X[r]
if Y[k]<X[p]
    return Y[k]
q=floor((p+r)/2)
j=floor((i+k)/2)
if r-p+1 is even
    if X[q+1]>Y[j] and Y[j+1]>X[q]
        if X[q]>Y[j]
            return X[q]
        else
            return Y[j]
    if X[q+1]<Y[j-1]
        return MEDIAN(X, q+1, r, Y, i, j)
    else
        return MEDIAN(X, p, q, Y, j+1, k)
else
    if X[q]>Y[j] and Y[j+1]>X[q-1]
        return Y[j]
    if Y[j]>X[q] and X[q+1]>Y[j-1]
        return X[q]
    if X[q+1]<Y[j-1]
        return MEDIAN(X, q, r, Y, i, j)
    else
        return MEDIAN(X, p, q, Y, j, k)

3

অ্যালগরিদম জটিলতা বিশ্লেষণে লোগ শব্দটি প্রায়শই পপ আপ হয়। এখানে কিছু ব্যাখ্যা রয়েছে:

1. আপনি কীভাবে একটি সংখ্যা উপস্থাপন করবেন?

এক্স = 245436 নম্বরটি ধরুন “" 245436 "এর এই স্বরলিপিটিতে এতে অন্তর্নিহিত তথ্য রয়েছে। তথ্যটি সুস্পষ্ট করা:

এক্স = 2 * 10 ^ 5 + 4 * 10 ^ 4 + 5 * 10 ^ 3 + 4 * 10 ^ 2 + 3 * 10 ^ 1 + 6 * 10 ^ 0

যা সংখ্যার দশমিক প্রসারিত। সুতরাং, আমাদের এই সংখ্যার উপস্থাপনের জন্য প্রয়োজনীয় ন্যূনতম পরিমাণটি 6 ডিজিট। এটি কোনও কাকতালীয় ঘটনা নয়, যেহেতু 10 less d এর চেয়ে কম সংখ্যাকে ডি সংখ্যায় উপস্থাপন করা যেতে পারে ।

সুতরাং এক্স উপস্থাপনের জন্য কতগুলি সংখ্যার প্রয়োজন? এক্স প্লাস 1 এ 10 এর বৃহত্তম ব্যয়কারীর সমান।

==> 10 ^ d> এক্স
==> লগ (10 ^ ডি)> লগ (এক্স)
==> ডি * লগ (10)> লগ (এক্স)
==> ডি> লগ (এক্স) // এবং লগ প্রদর্শিত হবে আবার ...
==> ডি = ফ্লোর (লগ (এক্স)) + 1

এছাড়াও মনে রাখবেন যে এই ব্যাপ্তির সংখ্যাটি বোঝানোর জন্য এটি সবচেয়ে সংক্ষিপ্ত উপায়। যে কোনও হ্রাস তথ্য হ্রাস ডেকে আনবে, কারণ একটি অনুপস্থিত অঙ্কটি অন্য 10 টি সংখ্যায় ম্যাপ করা যেতে পারে। উদাহরণস্বরূপ: 12 * 120, 121, 122,…, 129 এ ম্যাপ করা যায়।

2. আপনি কীভাবে কোনও সংখ্যার জন্য অনুসন্ধান করবেন (0, এন - 1)?

এন = 10 ^ ডি গ্রহণ, আমরা আমাদের সবচেয়ে গুরুত্বপূর্ণ পর্যবেক্ষণ ব্যবহার:

0 থেকে N - 1 = লগ (এন) সংখ্যাগুলির মধ্যে একটি সীমাতে অনন্যভাবে একটি মান সনাক্ত করতে তথ্যের সর্বনিম্ন পরিমাণ।

এটি সূচিত করে যে, যখন 0 থেকে N - 1 অবধি পূর্ণসংখ্যার লাইনে একটি সংখ্যা অনুসন্ধান করতে বলা হয় তখন আমাদের এটির জন্য কমপক্ষে লগ (এন) চেষ্টা করা দরকার। কেন? যে কোনও অনুসন্ধান অ্যালগরিদমের সংখ্যার সন্ধানের জন্য একের পর এক সংখ্যা বেছে নেওয়া দরকার।

নূন্যতম সংখ্যার জন্য এটি চয়ন করতে হবে তা হল লগ (এন)। অতএব, আকারের N এর একটি স্থানে কোনও সংখ্যার সন্ধান করতে নেওয়া অপারেশনগুলির সর্বনিম্ন সংখ্যা হ'ল লগ (এন)।

আপনি কি বাইনারি অনুসন্ধান, টের্নারি অনুসন্ধান বা ডেকা অনুসন্ধানের ক্রম জটিলতার অনুমান করতে পারেন?
এটি ও (লগ (এন))!

৩. আপনি সংখ্যার সেটকে কীভাবে সাজান?

একটি অ্যারে বিতে সংখ্যার একটি সেট সাজানোর জন্য জিজ্ঞাসা করা হলে, এটির মতো দেখাচ্ছে ->

উপাদানসমূহ পারমুট করুন

মূল অ্যারেতে প্রতিটি উপাদান সাজানো অ্যারেতে এটি সম্পর্কিত সূচকে ম্যাপ করা উচিত। সুতরাং, প্রথম উপাদানটির জন্য আমাদের n অবস্থান রয়েছে। 0 থেকে n - 1 পর্যন্ত এই ব্যাপ্তিতে যথাযথভাবে সম্পর্কিত সূচকটি খুঁজে পেতে আমাদের লগ (এন) ক্রিয়াকলাপ প্রয়োজন।

পরের উপাদানটির জন্য লগ (এন -1) ক্রিয়াকলাপ, পরবর্তী লগ (এন -2) এবং আরও প্রয়োজন। মোটটি আসে:

==> লগ (এন) + লগ (এন - 1) + লগ (এন - 2) +… + লগ (1)

লগ (এ) + লগ (খ) = লগ (একটি * খ),

==> লগ ব্যবহার করে (ঢ!)

এটি এনলগ (এন) - এন এর সাথে প্রায় অনুমান করা যায়। ও (এন * লগ (এন))
কোনটি !

সুতরাং আমরা উপসংহারে পৌঁছেছি যে কোনও বাছাই করা অ্যালগরিদম ও (এন * লগ (এন)) এর চেয়ে ভাল করতে পারে না। এবং এই জটিলতাযুক্ত কিছু অ্যালগরিদম হলেন জনপ্রিয় মার্জ বাছাই এবং হিপ সাজান!

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

চিয়ার্স!


2

আমরা সময়কে জটিলতা ও (লগ এন) বলি, যখন সমাধানটি n এর উপর পুনরাবৃত্তির উপর ভিত্তি করে, যেখানে প্রতিটি পুনরাবৃত্তিতে করা কাজটি পূর্ববর্তী পুনরাবৃত্তির একটি ভগ্নাংশ, কারণ অ্যালগোরিদম সমাধানের দিকে কাজ করে।


1

এখনও মন্তব্য করতে পারি না ... নেক্রো এটা! আভি কোহেনের উত্তরটি ভুল, চেষ্টা করুন:

X = 1 3 4 5 8
Y = 2 5 6 7 9

শর্তগুলির কোনওটিই সত্য নয়, সুতরাং মিডিয়ান (এক্স, পি, কিউ, ওয়াই, জে, কে) উভয় পাঁচটি কেটে দেবে। এগুলি ননডেক্রেসিং ক্রম, সমস্ত মান পৃথক নয়।

স্বতন্ত্র মান সহ সম-দৈর্ঘ্যের উদাহরণটিও চেষ্টা করে দেখুন:

X = 1 3 4 7
Y = 2 5 6 8

এখন মিডিয়ান (এক্স, পি, কিউ, ওয়াই, জে + ১, কে) চারটি কেটে দেবে।

পরিবর্তে আমি এই অ্যালগরিদম অফার করছি, এটি মিডিয়ানের সাথে কল করুন (1, এন, 1, এন):

MEDIAN(startx, endx, starty, endy){
  if (startx == endx)
    return min(X[startx], y[starty])
  odd = (startx + endx) % 2     //0 if even, 1 if odd
  m = (startx+endx - odd)/2
  n = (starty+endy - odd)/2
  x = X[m]
  y = Y[n]
  if x == y
    //then there are n-2{+1} total elements smaller than or equal to both x and y
    //so this value is the nth smallest
    //we have found the median.
    return x
  if (x < y)
    //if we remove some numbers smaller then the median,
    //and remove the same amount of numbers bigger than the median,
    //the median will not change
    //we know the elements before x are smaller than the median,
    //and the elements after y are bigger than the median,
    //so we discard these and continue the search:
    return MEDIAN(m, endx, starty, n + 1 - odd)
  else  (x > y)
    return MEDIAN(startx, m + 1 - odd, n, endy)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.