ভাগ করুন এবং বিজয়ী অ্যালগরিদম - কেন দুটি অংশের বেশি অংশে বিভক্ত হবে না?


33

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

আমি অনুমান করি যে অনেকগুলিতে ডেটা বিভক্ত করার কাজটি অনেকগুলি উপ সেট এটির পক্ষে মূল্যহীন করে তোলে না তবে দু'টি উপ সেটগুলিতে একজনের থামানো উচিত তা দেখার জন্য আমি অন্তর্নিহিতের অভাব বোধ করছি।

আমি 3-উপায় কুইকোর্টের অনেকগুলি রেফারেন্সও দেখেছি। এটি কখন দ্রুত? অনুশীলনে কী ব্যবহৃত হয়?


কুইকোর্টের অনুরূপ একটি অ্যালগোরিদম তৈরি করার চেষ্টা করুন যা একটি অ্যারেরকে তিন ভাগে বিভক্ত করে।
gnasher729

উত্তর:


49

এটি আমার কাছে বোধগম্য নয় যে এটি যদি দুটি ডেটা পুরো ডেটা সেটটি নিয়ে কাজ করার অর্ধেকেরও কম কাজ করে তবে কোনও সমস্যার সমাধান করা দ্রুত হয়।

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

তবে কেন ডেটা সেটটি তিন ভাগে বিভক্ত করবেন না? চার? এন?

মূলত এটি দুটি অংশের বেশি বিভক্ত হওয়া এবং দুটিরও বেশি ফলাফল পুনরায় সমন্বিত করার ফলে আরও জটিল বাস্তবায়ন হয় তবে অ্যালগরিদমের মৌলিক (বিগ ও) বৈশিষ্ট্য পরিবর্তন হয় না - পার্থক্যটি একটি ধ্রুবক উপাদান, এবং মন্দা হতে পারে যদি 2 টিরও বেশি সাবসেটের বিভাগ এবং পুনঃসংযোগ অতিরিক্ত ওভারহেড তৈরি করে।

উদাহরণস্বরূপ, আপনি যদি একটি 3-উপায় সংহত সাজানোর কাজ করেন তবে পুনঃসংযোগের পর্যায়ে আপনাকে এখন প্রতিটি উপাদানের জন্য 3 টির মধ্যে সর্বাধিক সন্ধান করতে হবে, যার জন্য 1 এর পরিবর্তে 2 টি তুলনা প্রয়োজন, সুতরাং আপনি সামগ্রিক তুলনায় দ্বিগুণ করুন । বিনিময়ে, আপনি ln (2) / ln (3) == 0.63 এর একটি ফ্যাক্টর দ্বারা পুনরাবৃত্তির গভীরতা হ্রাস করেন, সুতরাং আপনার কাছে 37% কম অদলবদল রয়েছে, তবে 2 * 0.63 == 26% আরও তুলনা (এবং মেমরি অ্যাক্সেস) রয়েছে। এটি ভাল বা খারাপ তা নির্ভর করে যা আপনার হার্ডওয়্যারে বেশি ব্যয়বহুল।

আমি 3-উপায় কুইকোর্টের অনেকগুলি রেফারেন্সও দেখেছি। এটি কখন দ্রুত?

স্পষ্টতই কুইকোর্টের দ্বৈত পিভট রূপটি একই সংখ্যার তুলনায় প্রমাণিত হতে পারে তবে গড়ে 20% কম অদলবদল হয়, তাই এটি নেট লাভ।

অনুশীলনে কী ব্যবহৃত হয়?

আজকাল খুব সহজেই কেউ তাদের নিজস্ব বাছাই করা অ্যালগরিদমগুলি প্রোগ্রাম করে; তারা একটি লাইব্রেরির দ্বারা সরবরাহিত একটি ব্যবহার করে। উদাহরণস্বরূপ, জাভা 7 এপিআই প্রকৃতপক্ষে দ্বৈত-পিভট কুইকোর্ট ব্যবহার করে।

যে সমস্ত লোকেরা কিছু কারণে তাদের নিজস্ব বাছাই করা অ্যালগরিদমকে প্রোগ্রাম করেন তারা সাধারণ 2-উপায় বৈকল্পিকের সাথে লেগে থাকবেন কারণ ত্রুটিগুলির কম সম্ভাবনা বেশিরভাগ সময় 20% ভাল পারফরম্যান্স বীট করে। মনে রাখবেন: এখন পর্যন্ত সবচেয়ে গুরুত্বপূর্ণ পারফরম্যান্সের উন্নতি হ'ল কোডটি "কাজ না করে" থেকে "কাজ" করার দিকে চলে যায়।


1
ছোট নোট: জাভা 7 কেবলমাত্র আদিমগুলি বাছাই করার সময় ডুয়েল-পিভট কুইকোর্ট ব্যবহার করে । অবজেক্টগুলি বাছাই করতে এটি টিমসোর্ট ব্যবহার করে।
বাকুরিউ

1
"এই দিনগুলিতে খুব সহজেই কেউ তাদের নিজস্ব বাছাই করা অ্যালগরিদমগুলি প্রোগ্রাম করে" এবং (আরও গুরুত্বপূর্ণভাবে) "মনে রাখবেন: কোডটি" কাজ না করে "" কাজ "করার দিকে চলে যাওয়ার পরে সবচেয়ে গুরুত্বপূর্ণ পারফরম্যান্সের উন্নতি হয়" " যাইহোক, আমি জানতে চাই যে ওভারহেড এখনও তুচ্ছ যদি উদাহরণস্বরূপ, একটি ডেটা সেট করা অনেকগুলি, অনেক অংশে বিভক্ত করে। : এটা এত ঘটনাচক্রে, যাতে অন্য লোকেরা আছে bealto.com/gpu-sorting_intro.html stackoverflow.com/questions/1415679/... devgurus.amd.com/thread/157159
AndrewJacksonZA

আমি কিছুটা ধীর। এটির তুলনায় 2 * 0.69 কেন বেশি লাগে তা কেউ ব্যাখ্যা করতে পারেন? 0.69 কোথা থেকে এসেছে তা নিশ্চিত নয়।
jeebface

@ জিজফেস উফ, এটি একটি টাইপো ছিল (এখনই স্থির)। এটি 0.63 (পুনরাবৃত্তির গভীরতার হ্রাস), তারপরে আরও 26% ফলাফল কার্যকর হয়।
মাইকেল বর্গওয়ার্ট

30

তাত্পর্যপূর্ণভাবে বলতে গেলে, এতে কিছু যায় আসে না। উদাহরণস্বরূপ, বাইনারি অনুসন্ধান আনুমানিক লগ 2  এন তুলনা করে এবং ত্রৈমাসিক অনুসন্ধান আনুমানিক লগ 3  এন তুলনা করে। আপনি যদি নিজের লগারিদমগুলি জানেন তবে আপনি জানেন যে লগ একটি  এক্স = লগ বি  এক্স / লগ বি  এ, সুতরাং বাইনারি অনুসন্ধান কেবল প্রায় 1 / লগ 3 করে টের্নারি অনুসন্ধানের তুলনায় 2 ar 1.5 গুন অনেক তুলনা। বড় ওহ স্বরলিপিতে লোগারিদমের ভিত্তি কেউ কখনই নির্দিষ্ট করে না বলেও এই কারণটি দেখা যায়: ভিত্তিটি প্রকৃত কী তা বিবেচনা করেই কোনও প্রদত্ত বেসে লোগারিদম থেকে দূরে থাকা এটি একটি ধ্রুবক ফ্যাক্টর। সুতরাং সমস্যাটিকে আরও সাবকেটে বিভক্ত করা সময়ের জটিলতার উন্নতি করে না এবং ব্যবহারিকভাবে আরও জটিল যুক্তি ছাড়িয়ে যাওয়ার পক্ষে যথেষ্ট নয়। প্রকৃতপক্ষে, এই জটিলতা ব্যবহারিক কার্যকারিতা নেতিবাচকভাবে প্রভাবিত করতে পারে, ক্যাশে চাপ বাড়িয়ে বা মাইক্রো-অপ্টিমাইজেশনকে কম অক্ষম করে তোলে।

অন্যদিকে, কিছু গাছ-ইশ ডেটা কাঠামো একটি উচ্চ শাখা ফ্যাক্টর ব্যবহার করে (3 এর চেয়ে অনেক বেশি বড়, প্রায়শই 32 বা ততোধিক), যদিও সাধারণত অন্যান্য কারণে। এটি মেমোরি শ্রেণিবদ্ধের ব্যবহারের উন্নতি করে: র‌্যামে সঞ্চিত ডেটা স্ট্রাকচারগুলি ক্যাশে আরও ভাল ব্যবহার করে, ডিস্কে সঞ্চিত ডেটা স্ট্রাকচারগুলিতে এইচডিডি-> র‌্যামের কম পড়া দরকার।


হ্যাঁ বাইনারি গাছের কাঠামোর চেয়ে বেশি নির্দিষ্ট নির্দিষ্ট প্রয়োগের জন্য অষ্টমীর সন্ধান করুন।
ডায়াক্সিক্স 3:58 এ

@ ডিএক্সিক্স বিটিরি সম্ভবত আরও সাধারণ।
জুলাই

4

এখানে অনুসন্ধান / সাজানোর অ্যালগরিদম রয়েছে যা দুটি দ্বারা নয়, বরং এন দ্বারা বিভক্ত ide

একটি সাধারণ উদাহরণ হ্যাশ কোডিং দ্বারা অনুসন্ধান, যা O (1) সময় নেয়।

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

মৌলিক বিষয়টি হ'ল, যখন কোনও প্রোগ্রাম কিছু তথ্য পরীক্ষা করে এবং তারপরে নিম্নলিখিত কয়েকটি রাজ্যে প্রবেশ করে, নিম্নলিখিত কতগুলি রাজ্য রয়েছে এবং তার সম্ভাবনা কতটা সমান?

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

যখন কোনও কম্পিউটার একটি সংখ্যা নিয়ে থাকে এবং এটিকে একটি সূচকে একটি অ্যারে রূপান্তরিত করে, তখন এটি অ্যারের উপাদানগুলির সংখ্যার বেস 2 লগ করতে "শিখতে" থাকে এবং এটি স্থির সময়ে তা করে। উদাহরণস্বরূপ, যদি 1024 এন্ট্রিগুলির একটি জাম্প টেবিল থাকে তবে কমবেশি কম বেশি সম্ভাবনা থাকে, তবে সেই টেবিলটি পেরে 10 বিটগুলি "শেখায়"। হ্যাশ কোডিংয়ের পিছনে এটিই মূল কৌশল trick এর একটি বাছাইয়ের উদাহরণটি আপনি কীভাবে কার্ডের ডেকে বাছাই করতে পারেন। 52 কার্ড, প্রতিটি কার্ডের জন্য একটি। প্রতিটি কার্ডকে তার বাক্সে ফেলে দিন এবং তারপরে এগুলি সমস্ত স্কুপ করুন। কোনও মহকুমার প্রয়োজন নেই।


1

যেহেতু এটি সাধারণ বিভাজন এবং বিজয় সম্পর্কে প্রশ্ন, কেবল বাছাই নয়, আমি আশ্চর্য হয়েছি যে কেউ মাস্টার উপপাদ্যকে সামনে আনেনি

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

Karatsuba গুণ জন্য অ্যালগরিদম হে একটি চলমান সময় (3 এন ^ log_2 3) যা সাধারণ গুণ অ্যালগরিদম জন্য (ঢ ^ 2) হে beats (ঢ হয় ডিজিটের সংখ্যা অর্জন একটি 3-উপায় ডিভাইড এবং জয় করো ব্যবহার নম্বর)।


মাস্টার উপপাদ্যে, আপনি যে উপ-সমস্যার সৃষ্টি করছেন তা কেবলমাত্র ফ্যাক্টর নয়। করাতসুবা এবং এর কাজিনু স্ট্রেসনে, উন্নতি আসলে কিছু সাব-সমস্যার সমাধানের সাথে স্মার্টলি মার্জ করে আসে, সুতরাং আপনি সাব-সমস্যায় পুনরাবৃত্ত কলগুলির সংখ্যা হ্রাস করুন। সংক্ষেপে, bমাস্টার উপপাদ্যটি উপরে aযেতে আপনার আরও বিভাগে উন্নতি করার জন্য ধীরগতিতে যেতে হবে।
অবহিত

-4

বাইনারি প্রকৃতির কারণে একটি কম্পিউটার 2 তে জিনিসগুলি বিভক্ত করতে খুব দক্ষ এবং 3 তে খুব বেশি নয় আপনি প্রথমে 2 তে ভাগ করে 3 তে একটি বিভাগ পেয়েছেন এবং তারপরে একটি অংশটি আবার 2 তে ভাগ করে নিন So আপনার 3 বিভাগ পেতে 2 দ্বারা, আপনি পাশাপাশি 2 এ ভাগ করতে পারেন।

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