বাইনারি অনুসন্ধান ত্রৈমাসিক অনুসন্ধানের চেয়ে দ্রুত কেন?


49

একটি অ্যারের খুঁজছেন বাইনারি অনুসন্ধান ব্যবহার উপাদান লাগে, সবচেয়ে খারাপ ক্ষেত্রে লগ ইন করুন 2 এন পুনরাবৃত্তিও, কারণ প্রতিটি পদে পদে আমরা আমাদের সার্চ স্পেস অর্ধেক ছাঁটা। পারলে, এর পরিবর্তে, আমরা 'তিন সার্চ' ব্যবহার, আমরা প্রতিটি পুনরাবৃত্তির এ দূরে কাটা চাই আমাদের সার্চ স্পেস দুই তৃতীয়াংশ, তাই সবচেয়ে খারাপ ক্ষেত্রে নিতে হবে লগ 3 এন < লগ ইন করুন 2 এন পুনরাবৃত্তিও ...Nlog2Nlog3N<log2N

দেখে মনে হচ্ছে ত্রৈমাসিক অনুসন্ধান দ্রুত, সুতরাং আমরা বাইনারি অনুসন্ধান কেন ব্যবহার করব?


3
কোয়ার্টারারি অনুসন্ধান সম্পর্কে কেউ একই যুক্তি ব্যবহার করতে পারে না? অথবা এমনকি দশমিক অনুসন্ধান ... বা ২ এর চেয়ে বড় কিছু
ডি'আ্যালার'কপ

4
দয়া করে বি + ট্রি সম্পর্কে পড়ুন
অরুনমোজি

5
লিনিয়ার অনুসন্ধানগুলি প্রায়শই আধুনিক হার্ডওয়্যারগুলিতে ছোট থেকে মাঝারি আকারের সমস্যাগুলিতে বাইনারি অনুসন্ধানের চেয়ে দ্রুত হয়, কারণ এটি ক্যাশে-সুসংহত এবং প্রায় সমস্ত শাখা সঠিকভাবে পূর্বাভাস দেওয়া হয়।
ছদ্মনাম

2
এছাড়াও 2 * লগ_3 (এন) = লগ_3 (এন ^ 2) যদি এটি আপনার স্বজ্ঞাততার সাথে কথা বলে।
পাভেলপ

6
এটি স্বজ্ঞাত পদে রাখা যাক। যদি কোনও 3-ভিত্তিক অনুসন্ধানটি দ্রুত হয় কারণ এটি প্রতিটি পুনরাবৃত্তিতে অনুসন্ধানের স্থানকে আরও কমিয়ে দেয়, তবে মিলিয়ন-ভিত্তিক অনুসন্ধানটি কী দ্রুত ব্যবহার হচ্ছে না? তবে আপনি সহজেই দেখতে পারেন যে লক্ষ্যটি রয়েছে এমন 1-মিলিয়নতম স্লাইস নির্ধারণ করতে আপনাকে প্রতিটি পুনরাবৃত্তির ভিতরে গড়ে গড়ে 500,000 চেক করতে হবে। স্পষ্টতই, প্রতিটি পুনরাবৃত্তির অর্ধেকের মধ্যে অনুসন্ধানের স্থানটি কাটা এবং আরও কিছু না, আপনাকে নির্ভরযোগ্যভাবে একক পদক্ষেপে সর্বাধিক তথ্য দেয় ।
এরিক

উত্তর:


76

log2(n)+O(1)
2log3(n)+O(1)
2log3(n)+O(1)=2log(2)log(3)log2(n)+O(1)
2log(2)log(3)>1

n

nf(k)=(k1)log(2)log(k)k


1
এবং এলএইচএস লিনিয়ার এবং আরএইচএস লোগারিথমিক তাই এটি কোনও চতুর্থাংশ বা এর চেয়ে বেশি কিছু করার পক্ষে সাহায্য করবে না .... চমৎকার ব্যাখ্যা .... ধন্যবাদ
দ্য মিডিন স্কয়ার

3
কেবলমাত্র সম্পূর্ণতার জন্য: নোট করুন যে উপাদান তুলনার সংখ্যার মতো একটি বিমূর্ত পরিমাপ প্রকৃত রানটাইমকে প্রভাবিত করতে পারে বা না পারে। বিশেষত, আপনাকে বিবেচনা করতে হবে যে আপনি কতগুলি ক্যাশে মিস করেছেন সম্ভবত কোনও অনুসন্ধানের মাধ্যমে দীর্ঘ অ্যারেতে যাওয়ার সম্ভাবনা রয়েছে। (এখানে, তারা কাকতালীয়ভাবে কারণ ওপি জিজ্ঞেস "কেন এটা দ্রুততর?" আমি শুধু এই লক্ষ করছি, এবং উত্তর যে একটি বিমূর্ত পরিমাপ সঙ্গে কিছু আলগোরিদিম জন্য বিভ্রান্তিকর হতে পারে।।)
রাফায়েল

10
একটি ত্রৈমাসিক অনুসন্ধানে, 1/3 বারের জন্য আপনাকে কেবল 1 তুলনা প্রয়োজন (কম তুলনা করুন: নীচের তৃতীয়তে যদি আপনার দ্বিতীয় তুলনা প্রয়োজন না)। এটি 25% (এই বিশ্বে যেখানে আমরা কেবল তুলনামূলক গণনার প্রতি যত্নশীল) এর পরিবর্তে মাত্র 5% ধীর গতির করে তোলে। এটিকে এন-অ্যারে কীভাবে সাধারণ করা যায় তা আমি নিশ্চিত নই, যদিও আমি সন্দেহ করি এটি বাইনারির চেয়ে দ্রুত কখনই না পায়।
অ্যারন ডুফর

2
@ অ্যারোনডুফর: যেহেতু প্রথমে মাঝের আইটেমটির সাথে তুলনা করে এবং তারপরে অন্যান্য তুলনাগুলির ফলাফল উপেক্ষা করে একটি চতুর্ভুজ অনুসন্ধান করতে পারত, তবে চতুর্ভুজ অনুসন্ধানের একমাত্র উপায় দ্রুততর হতে পারে যদি তিনটি তুলনা দুটি তুলনার চেয়ে সমান্তরালে আরও সস্তা করা যায় ধারাবাহিকভাবে সম্পাদন করা যেতে পারে।
ক্যাট

1
@ অ্যারোনডুফর তবে আপনি অনুসন্ধানের জন্য উপাদানগুলির উপর নিবিড়তা বোধ করছেন এবং কেন এটি ঠিক আছে তা আমার কাছে পরিষ্কার নয়। সবচেয়ে খারাপ ক্ষেত্রে উভয় তুলনা প্রতিটি পদক্ষেপে সম্পাদন করা যেতে পারে।
সাশো নিকোলভ

26

DCTLib ঠিক আছে, তবে এক সেকেন্ডের জন্য গণিতটি ভুলে যান।

আপনার যুক্তি অনুসারে, n -ary দ্রুত হওয়া উচিত। তবে আপনি যদি এটির বিষয়ে চিন্তা করেন তবে n -ary হ'ল নিয়মিত পুনরাবৃত্তি অনুসন্ধানের সমান (কেবল তালিকার মাধ্যমে 1 দ্বারা 1 দ্বারা পুনরায় বিবর্তিত ক্রমে)। প্রথমে আপনি তালিকার সর্বশেষ (বা শেষের পাশে) আইটেমটি নির্বাচন করুন এবং সেই মানটিকে আপনার তুলনা মানের সাথে তুলনা করুন। তারপরে আপনি সেই তালিকাটি আপনার তালিকা থেকে সরিয়ে ফেলুন এবং তারপরে নতুন তালিকার সর্বশেষ আইটেমটি চয়ন করুন, যা অ্যারেতে সর্বশেষ মানের পরের অংশ। প্রতিবার, আপনি নিজের মানটি না পাওয়া পর্যন্ত আপনি একসাথে 1 টি মান মুছে ফেলবেন।

পরিবর্তে, আপনার এটির মতো চিন্তা করা উচিত - আমি প্রতিটি পুনরাবৃত্তিকে তালিকা থেকে সর্বাধিক মানগুলি কীভাবে সরিয়ে দেব? বাইনারি অনুসন্ধানে, আপনি সর্বদা অর্ধেক তালিকাটি মুছে ফেলেন। একটি ত্রৈমাসিক অনুসন্ধানে, সম্ভাবনার (৩৩.৩৩% সম্ভাবনা রয়েছে, আসলে) আপনি তালিকার ২/৩ সরিয়ে ফেলতে পারেন, তবে এর চেয়েও বড় সুযোগ (.6 66..66%) রয়েছে যা আপনি কেবলমাত্র তালিকার ১/৩ টি অপসারণ করবেন। ও (এন) গণনা করার জন্য, আপনাকে সবচেয়ে খারাপ পরিস্থিতিটি দেখতে হবে, যা 1/3, 1/2 এর চেয়ে কম। আপনি আরও কাছাকাছি এবং এন এর কাছাকাছি যেতে, এটি আরও খারাপ হয়।

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

(পি_ ব্লোয়ার) এক্স (অংশটি আমরা কম হলে মুছে ফেলতে পারি) + (পি_হিগার) এক্স (অংশটি আমরা উচ্চতর হলে মুছে ফেলতে পারি) = ই

বাইনারি অনুসন্ধানের জন্য, এটি .5x.5 + .5x.5 = .5 (আমরা সর্বদা অর্ধেক তালিকাটি সরিয়ে রাখি)। ত্রৈমাসিক অনুসন্ধানের জন্য, এই মানটি .666x.333 + .333x.666 = 0.44, বা প্রতিটি পদক্ষেপে, আমরা সম্ভবত বাইনারি অনুসন্ধানের তুলনায় এটি কেবলমাত্র 44% তালিকা সরিয়ে ফেলব, এটি বাইনারি অনুসন্ধানের চেয়ে কম দক্ষ করে তোলে। এই মানটি 1/2 (তালিকার অর্ধেক) শীর্ষে পৌঁছে যায় এবং আপনি এন (বিপরীত পুনরাবৃত্তি) এবং 0 (নিয়মিত পুনরাবৃত্তি) এর কাছাকাছি পৌঁছায়।

ঠিক আছে, তাই আমি মিথ্যা বললাম..এখানে একটি সামান্য গণিত জড়িত, তবে আমি আশা করি এটি সাহায্য করে!


1
এটি একটি দুর্দান্ত উত্তর।
The_Sympathizer

ইয়া সীমানা বিশ্লেষণ শক্ত গণিত বুঝতে সাহায্য করে! এন-অ্যারি ক্রমিক অনুসন্ধানে লিনিয়ার অনুসন্ধান ও (এন) এর একই ব্যয় রয়েছে।
শুভা

-2

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


2
অবশ্যই আপনি যদি পুনরাবৃত্তির জন্য কেবল একটি তুলনা করে এটি করতে পারতেন তবে ত্রৈমাসিক অনুসন্ধান দ্রুত হবে। তবে, স্ট্রিং বা ইন্টিজারগুলি নির্বিশেষে আপনি পারবেন না।
ফ্রাঙ্কডাব্লু

তুলনাগুলি অপ্রয়োজনীয় হবে না এবং সমস্যাটি সংকলকটির সাথে কিছুই করার নেই। অনুসন্ধানের জায়গাকে তিন ভাগে ভাগ করতে আপনার 2 টি তুলনা দরকার। একটি বাইনারি অনুসন্ধানে, আপনাকে কেবলমাত্র মাঝারি উপাদানটির সাথে তুলনা করতে হবে এবং তারপরে আপনি জানতে পারবেন ফলাফলটি কোন অর্ধেক অনুসন্ধান স্থানের মধ্যে পড়েছে ter ত্রৈমাসিক অনুসন্ধানের সাথে, আপনাকে সেই পথটির 1/3 অংশের সাথে তুলনা করতে হবে তালিকা এবং একটি 2/3 তালিকা মাধ্যমে উপায়। আপনি কোন ধরণের ডেটা তুলনা করছেন বা কোন ভাষাটি ব্যবহার করছেন তা অপ্রাসঙ্গিক। মঞ্জুর, আইটেমটি 1 য় 3 য় হয়, আপনি 1 তুলনা পরে থামতে পারে।
রিয়ারাব

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

1
এটিকে ঘৃণা করুন - ত্রৈমাসিক অনুসন্ধানের ভুল সংজ্ঞা।
জোশুয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.