বাইনারি অনুসন্ধান জটিলতা গণনা কিভাবে


144

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


1
: এই আপনি সাহায্য করতে পারে stackoverflow.com/a/13093274/550393
2cupsOfTech

উত্তর:


385

এটি দেখার আরও গাণিতিক উপায়, যদিও এটি সত্যই জটিল নয়। আইএমও অনানুষ্ঠানিক হিসাবে আরও স্পষ্ট:

প্রশ্নটি হল, আপনার 1 না হওয়া পর্যন্ত আপনি N কে 2 দ্বারা কতবার ভাগ করতে পারবেন? এটি মূলত বলে আসছে, আপনি এটি না পাওয়া পর্যন্ত একটি বাইনারি অনুসন্ধান করুন (অর্ধ উপাদান)। একটি সূত্রে এটি হবে:

1 = এন / 2 এক্স

2 x দিয়ে গুণ করুন :

2 x = এন

এখন লগ 2 :

লগ 2 (2 এক্স ) = লগ 2 এন
এক্স * লগ 2 (2) = লগ 2 এন
এক্স * 1 = লগ 2 এন

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


আমি কেবল এটি টি (এন) = (2 ^ 2) * কে গণনা করেছি। কিভাবে এটি ফর্ম লগ করতে?
শান খান

1
: একই ধারণা গ্রাফিক্যালি ব্যাখ্যা stackoverflow.com/a/13093274/550393
2cupsOfTech

আমি যে অংশটি মিস করছি তা হ'ল, আপনার কাছে 7 টি এন্ট্রি সহ বিএসটি থাকলে এর সূত্রটি কী? log2 (7)? আমি প্রতিটি সম্ভাব্য ফলাফল সহ একটি নিষ্ঠুর বল গণনা করেছি, এবং এমন একটি উত্তর এসেছি যা লগ 2 (7) এর সমান নয়, তাই আমি কী ভুল করছি?
পেরি মনসচাউ

1
বাইনারি গাছের ব্যাখ্যার চেয়ে এত সহজ।
NoName

1
খুব সুন্দর উত্তর
ভিএইচএস

22

বাইনারি অনুসন্ধানের জন্য, টি (এন) = টি (এন / 2) + ও (1) // পুনরাবৃত্তির সম্পর্ক

পুনরাবৃত্ত সম্পর্কের রান টাইম জটিলতা গণনার জন্য মাস্টার্স উপপাদ প্রয়োগ করুন: টি (এন) = এটি (এন / বি) + চ (এন)

এখানে, a = 1, b = 2 => লগ (একটি বেস খ) = 1

এছাড়াও, এখানে চ (এন) = n ^ সি লগ ^ কে (এন) // কে = 0 এবং সি = লগ (একটি বেস খ)

সুতরাং, টি (এন) = ও (এন ^ সি লগ ^ (কে + 1) এন) = ও (লগ (এন))

সূত্র: http://en.wikedia.org/wiki/Master_theorem


1
কেন লগ (একটি বেস খ) 1 হয় যখন a = 1 এবং b = 2, এটি 0 না হওয়া উচিত?
গৌরাঙ্গ ভাইস

16

টি (ঢ) = টি (ঢ / 2) + 1

টি (এন / 2) = টি (এন / 4) + 1 + 1

উপরের (N / 2) এর মান রাখুন তাই T (n) = T (n / 4) + 1 + 1। । । । টি (ঢ / 2 ^ ট) + 1 + 1 + 1 + 1 টি .....

= টি (2 ^ কে / 2 ^ কে) + 1 + 1 .... + 1 কে পর্যন্ত

= টি (1) + K

যেমনটি আমরা ২ ^ কে = এন নিয়েছি

কে = লগ এন

সুতরাং সময় জটিলতা হ'ল (লগ এন)


10

এটি অর্ধেক অনুসন্ধানের সময় দেয় না, এটি লগ করে না (এন)। এটি লোগারিথমিকভাবে হ্রাস করে। এক মুহুর্তের জন্য এই সম্পর্কে চিন্তা করুন। যদি কোনও টেবিলে আপনার 128 টি প্রবেশপথ থাকে এবং আপনার মানটির জন্য রৈখিকভাবে অনুসন্ধান করতে হয়, আপনার মানটি পেতে সম্ভবত গড়ে প্রায় 64 টি এন্ট্রি লাগবে। এটি এন / 2 বা লিনিয়ার সময়। বাইনারি অনুসন্ধানের সাহায্যে, আপনি প্রতিটি পুনরাবৃত্তির সম্ভাব্য এন্ট্রিগুলিকে 1/2 মুছে ফেলেন, যেমন আপনার মান সন্ধান করতে সর্বাধিক মাত্র 7 টি তুলনা করতে পারে (128 এর লগ বেস 2 এর 7 বা 2 পাওয়ারটি 128.) এটি হ'ল বাইনারি অনুসন্ধানের শক্তি।


নেক্রোপোস্টের জন্য দুঃখিত তবে 128 সমানভাবে ভরাট গাছ নয়। আমি এটিকে ঘিরে আমার মাথা পেতে একটি মৌলিক উদাহরণ ব্যবহার করেছি এবং আমি দেখতে পেয়েছি যে 7 টি এন্ট্রি সমানভাবে 3 টি স্তর দিয়ে একটি গাছ পূরণ করে। আমি গণনা করেছি যে জটিলতাটি 17/7 হওয়া উচিত (তুলনার সমষ্টিগুলির গড়ের গড়) যা 2.43। তবে লগ 2 (7) হ'ল 2.81। তাহলে আমি এখানে কী মিস করছি?
পেরি মনসচাউ

দুটি উত্তর - প্রথমটি এখানে: একবার আপনি 100 টি এন্ট্রিতে প্রবেশ করলে লগ 2 () লিনিয়ারের চেয়ে অনেক বেশি ভাল। আমি মনে করি আপনি এটি দেখতে পাচ্ছেন, তবে পরের দিকে।
মাইকেল ডরগান

1
দ্বিতীয় উত্তর: আমি নিশ্চিত না যে আপনার কী ধরণের গাছ রয়েছে যেখানে everything টির মধ্যে সমস্ত কিছু পূর্ণ রয়েছে। আমি 8 টি প্রবেশের একটি নিখুঁত গাছ সম্পর্কে যখন চিন্তা করি তখন আমি 8 টি পাতাগুলি সহ 3 স্তরের গভীর গাছ দেখি। এই গাছে, আপনি যে সংখ্যাটি অনুসন্ধান করেন তা নির্বিশেষে, মূল থেকে পাতায় যাওয়ার জন্য মোট 3 টি তুলনা লাগে takes Ent টি এন্ট্রির জন্য, কোনও পাথের মধ্যে একটি তুলনামূলকভাবে কম লাগে তাই ২০/7 (৩ টি তুলনার n টি নোড, ২ টি তুলনার 1 নোড) যা ~ 2.85। লগ 2 (7) ~ 2.81। .04 পার্থক্যটি ব্যাখ্যা করার মতো আমার কাছে গণিতের পটভূমি নেই, তবে আমি অনুমান করি যে এটি ভগ্নাংশ বিট উপলভ্য বা অন্য কোনও যাদু না
রেখেই করতে পারে

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

5

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

বিবৃতি প্রমাণ করতে সক্ষম হবার জন্য এটি কেবল প্রথাগত গাণিতিক লিংগো, ইত্যাদি It এর খুব সোজা ব্যাখ্যা রয়েছে। যখন এন খুব বড় হয়, লগ এন ফাংশনটি ফাংশনটি সম্পাদন করতে সময় লাগে না- "ইনপুট সেট", এন এর আকার তালিকার দৈর্ঘ্য মাত্র।

সহজ কথায়, বাইনারি অনুসন্ধান ও (লগ এন) -এর কারণ হ'ল এটি প্রতিটি পুনরাবৃত্তির ইনপুট সেটটিকে অর্ধেক করে দেয়। বিপরীত পরিস্থিতিতে এটি সম্পর্কে চিন্তা করা আরও সহজ। এক্স পুনরাবৃত্তিতে, বাইনারি অনুসন্ধান অ্যালগরিদম সর্বাধিক পরীক্ষা করতে পারে কত দীর্ঘ তালিকা? উত্তরটি 2 ^ x। এর থেকে আমরা দেখতে পাচ্ছি যে বিপরীতটি হ'ল দৈনিক বাইনারি অনুসন্ধান অ্যালগরিদমের দৈর্ঘ্য n এর তালিকার জন্য লগ 2 এন পুনরাবৃত্তি প্রয়োজন।

যদি এটি ও (লগ এন) হয় না ও ও (লগ 2 এন) হয় তবে এটি কেবল আবার রাখা হয়েছে - বড় হে নোটেশন ধ্রুবক ব্যবহার করে গণনা করা হয় না।


4

এখানে উইকিপিডিয়া প্রবেশ রয়েছে is

যদি আপনি সাধারণ পুনরাবৃত্তি পদ্ধতির দিকে লক্ষ্য করেন। আপনার প্রয়োজনীয় উপাদান না পাওয়া পর্যন্ত আপনি অনুসন্ধান করার জন্য অর্ধেক উপাদান সরিয়ে ফেলছেন।

আমরা কীভাবে সূত্রটি নিয়ে আসছি তার ব্যাখ্যা এখানে।

প্রাথমিকভাবে বলুন আপনার কাছে N সংখ্যাগুলির সংখ্যা রয়েছে এবং তারপরে আপনি যা করেন তা প্রথম প্রচেষ্টা হিসাবে ⌊N / 2⌋। যেখানে এন হ'ল নিম্ন সীমা এবং উপরের গণ্ডির সমষ্টি। এন এর প্রথম বারের মানটি (এল + এইচ) সমান হবে, যেখানে এল প্রথম সূচক (0) এবং আপনি যে তালিকার সন্ধান করছেন তার তালিকার শেষ সূচক হ'ল। আপনি যদি ভাগ্যবান হন তবে আপনি যে উপাদানটি অনুসন্ধান করার চেষ্টা করছেন সেটি মাঝখানে থাকবে [যেমন। আপনি তালিকায় 18 টি অনুসন্ধান করছেন {16, 17, 18, 19, 20} তারপরে আপনি গণনা করুন ⌊ (0 + 4) / 2⌋ = 2 যেখানে 0 নিম্ন সীমাবদ্ধ (এল - অ্যারের প্রথম উপাদানটির সূচক) এবং 4 হ'ল উচ্চতর বাউন্ড (H - অ্যারের শেষ উপাদানটির সূচক)। উপরের ক্ষেত্রে এল = 0 এবং এইচ = 4 এখন 2 টি হল 18 টি উপাদানটির সূচক যা আপনি সন্ধান করছেন। বিঙ্গো! তুমি কি দেখেছো এটাকে.

যদি কেসটি অন্যরকম {15,16,17,18,19} ছিল তবে আপনি এখনও 18 টি অনুসন্ধান করে যাচ্ছেন তবে আপনি ভাগ্যবান হবেন না এবং আপনি প্রথম এন / 2 করছেন (যা ⌊ (0 + 4) / 2⌋ = 2 এবং তারপরে সূচক 2 এ 17 টি উপাদানটি বুঝতে পারছেন যে সংখ্যাটি আপনি খুঁজছেন তা নয় Now এখন আপনি জানেন যে পুনরাবৃত্ত পদ্ধতিতে অনুসন্ধানের জন্য আপনার পরবর্তী প্রয়াসে আপনাকে কমপক্ষে অর্ধেক অ্যারের সন্ধান করতে হবে না Your অনুসন্ধানের প্রচেষ্টা অর্ধেক হয়ে গেছে। সুতরাং মূলত, আপনি আগের যে উপাদানগুলির অনুসন্ধান করেছিলেন তার অর্ধেক তালিকাগুলি অনুসন্ধান করবেন না, প্রতিবার আপনি যখন আগের উপাদানটিতে অনুসন্ধান করতে সক্ষম নন এমন উপাদানটি সন্ধান করার চেষ্টা করবেন।

তাই সবচেয়ে খারাপ অবস্থা হবে

[এন] / ২ + [(এন / ২)] / ২ + [((এন / ২) / ২)] / ২ .....
অর্থাৎ:
এন / ২ 1 + এন / 2 2 + এন / 2 3 + ..... + এন / 2 এক্স … ..

অবধি ... আপনি অনুসন্ধান শেষ করেছেন, আপনি যে উপাদানটিতে সন্ধান করার চেষ্টা করছেন তা তালিকার শেষের দিকে।

এটি সবচেয়ে খারাপ অবস্থাটি দেখায় যখন আপনি N / 2 x পৌঁছে যান যেখানে x এরকম 2 x = N থাকে

অন্যান্য ক্ষেত্রে N / 2 x যেখানে x এরকম 2 x <N এক্স এর ন্যূনতম মান 1 হতে পারে, এটি সর্বোত্তম ক্ষেত্রে।

এখন থেকে গাণিতিকভাবে সবচেয়ে খারাপ ক্ষেত্রে যখন
2 x = N
=> লগ 2 (2 এক্স ) = লগ 2 (এন)
=> এক্স * লগ 2 (2) = লগ 2 (এন)
=> এক্স * 1 = লগ 2 (এন)
=> আরও আনুষ্ঠানিকভাবে অলগ 2 (এন) + 1⌋


1
কীভাবে আপনি আরও আনুষ্ঠানিক সংস্করণ পাবেন?
ক্লে

একটি মেঝে ফাংশন ব্যবহৃত হয়। বিশদটি উত্তরটিতে প্রদত্ত উইকি লিঙ্কের ( এন.ইউ.ইউকিপিডিয়া.org / উইকি / বাইনারি_সার্ক_ালগোরিদিম ) পারফরম্যান্স বিভাগে রয়েছে ।
রাজকন


2

ধরা যাক বাইনারি অনুসন্ধানে পুনরাবৃত্তি k পুনরাবৃত্তির পরে সমাপ্ত হয়। প্রতিটি পুনরাবৃত্তিতে অ্যারেটি অর্ধেক দ্বারা ভাগ করা হয়। সুতরাং যাক যে কোনও পুনরাবৃত্তিতে অ্যারের দৈর্ঘ্য হ'ল এন Iteration 1 এ,

Length of array = n

Iteration 2 এ,

Length of array = n⁄2

Iteration 3 এ,

Length of array = (n⁄2)⁄2 = n⁄22

সুতরাং, Iteration কে পরে,

Length of array = n⁄2k

এছাড়াও, আমরা জানি যে পরে ট বিভাগের পর অ্যারের দৈর্ঘ্য 1 হয়ে অতএব

Length of array = n⁄2k = 1
=> n = 2k

উভয় পক্ষের লগ ফাংশন প্রয়োগ করা:

=> log2 (n) = log2 (2k)
=> log2 (n) = k log2 (2)
As (loga (a) = 1)

অতএব,

As (loga (a) = 1)
k = log2 (n)

সুতরাং বাইনারি অনুসন্ধানের সময় জটিলতা

log2 (n)

1

একটি বাইনারি অনুসন্ধান সমস্যার অর্ধেক বার বার ভাগ করে কাজ করে, এরকম কিছু (বিবরণ বাদ দেওয়া):

[4,1,3,8,5] এর মধ্যে 3 খুঁজছেন উদাহরণ

  1. আপনার আইটেমের তালিকা অর্ডার করুন [1,3,4,5,8]
  2. মাঝের আইটেমটি দেখুন (4),
    • যদি আপনি যা খুঁজছেন তা যদি হয় তবে থামুন
    • যদি এটি আরও বেশি হয় তবে প্রথমার্ধটি দেখুন
    • যদি এটি কম হয় তবে দ্বিতীয়ার্ধটি দেখুন
  3. নতুন তালিকার সাথে দ্বিতীয় ধাপটি পুনরাবৃত্তি করুন [1, 3], 3 সন্ধান করুন এবং থামুন

এটা একটা হয় দ্বি যখন আপনি 2 সমস্যা বিভক্ত -nary অনুসন্ধান।

অনুসন্ধানের জন্য সঠিক মান সন্ধানের জন্য কেবল লগ 2 (এন) পদক্ষেপ প্রয়োজন।

আপনি যদি অ্যালগরিদমিক জটিলতা সম্পর্কে জানতে চান তবে আমি আলগোরিদিমগুলির পরিচিতির প্রস্তাব দেব ।


1

যেহেতু আমরা প্রতিবার অর্ধেকের মধ্যে একটি তালিকা কেটে ফেলেছি সুতরাং আমরা কেবল দুটি পদকে বিভাজন করতে গিয়ে 1 টি পেতে কতগুলি পদক্ষেপে তা জানতে হবে। প্রদত্ত নিরূপণে x সময় অনুসারে একটি তালিকাকে বিভক্ত করে যতক্ষণ না আমরা একটি উপাদান পেয়েছি (সবচেয়ে খারাপ ক্ষেত্রে)।

1 = এন / 2 এক্স

2x = এন

লগ 2 নিচ্ছে

লগ 2 (2 এক্স) = লগ 2 (এন)

x * লগ 2 (2) = লগ 2 (এন)

x = লগ 2 (এন)


1

টি (এন) = টি (এন / 2) + 1

টি (এন) = টি (এন / 2) + 1 = (টি (এন / 4) + 1) + 1

...

টি (এন) = টি (এন / এন) + (1 + 1 + 1 + ... + 1) = 1 + লগএন (বেস 2 লগ) = 1 + লগএন

সুতরাং বাইনারি অনুসন্ধানের সময় জটিলতা হ'ল ও (লগএন)


0
ok see this
for(i=0;i<n;n=n/2)
{
i++;
}
1. Suppose at i=k the loop terminate. i.e. the loop execute k times.

2. at each iteration n is divided by half.

2.a n=n/2                   .... AT I=1
2.b n=(n/2)/2=n/(2^2)
2.c n=((n/2)/2)/2=n/(2^3)....... aT I=3
2.d n=(((n/2)/2)/2)/2=n/(2^4)

So at i=k , n=1 which is obtain by dividing n  2^k times
n=2^k
1=n/2^k 
k=log(N)  //base 2

0

একটি উদাহরণ দিয়ে আমাকে আপনার সবার জন্য সহজ করে তুলি।

সরলতার উদ্দেশ্যে, ধরে নেওয়া যাক সাজানো ক্রমে একটি অ্যারেতে 32 টি উপাদান রয়েছে যার মধ্যে আমরা বাইনারি অনুসন্ধান ব্যবহার করে একটি উপাদান অনুসন্ধান করছি।

1 2 3 4 5 6 ... 32

ধরা যাক আমরা 32 টি সন্ধান করছি the

17 18 19 20 .... 32

দ্বিতীয় পুনরাবৃত্তির পরে, আমরা বাকি থাকবে

25 26 27 28 .... 32

তৃতীয় পুনরাবৃত্তির পরে, আমরা বাকি থাকবে

29 30 31 32

চতুর্থ পুনরাবৃত্তির পরে, আমরা রেখে যাব

31 32

পঞ্চম পুনরাবৃত্ত্বে, আমরা মানটি 32 খুঁজে পাব।

সুতরাং, আমরা যদি এটি গাণিতিক সমীকরণে রূপান্তর করি তবে আমরা পাব

(32 এক্স (1/2 5 )) = 1

=> এন এক্স (2 -কে ) = 1

=> (2 কে ) = এন

=> কে লগ 2 2 = লগ 2 এন

=> কে = লগ 2 এন

সুতরাং প্রমাণ।


0

পঠনযোগ্য লটেক্স সহ মাস্টার উপপাদ্যটি ব্যবহার করে সমাধানটি এখানে দেওয়া হল।

বাইনারি অনুসন্ধানের জন্য পুনরাবৃত্ত সম্পর্কের প্রতিটি পুনরাবৃত্তির জন্য, আমরা রানটাইম টি (এন / 2) দিয়ে সমস্যাটিকে একটি সাব-সমস্যায় রূপান্তর করি। অতএব:

টি (এন) = টি (এন / 2) +1

মাস্টার উপপাদ্য প্রতিস্থাপন, আমরা পেতে:

টি (এন) = এটি (এন / বি) + এফ (এন)

এখন, কারণ logba0 এবং f (n) 1, আমরা মাস্টার উপপাদকের দ্বিতীয় কেসটি ব্যবহার করতে পারি কারণ:

f (n) = O (1) = O (n0) = O (nlogba)

এই যে মানে:

টি (এন) = ও (নলবালগন) = ও (এন0 লগন) = ও (লগইন)

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