অ্যালগরিদম ডিজাইনের অনুশীলনে অ্যালগরিদমের অসম্পূর্ণ জটিলতার প্রাসঙ্গিকতা বর্ণনা করা


40

অ্যালগরিদম এবং জটিলতায় আমরা অ্যালগরিদমের অ্যাসিম্পটিক জটিলতায় মনোনিবেশ করি, অর্থাৎ ইনপুটটির আকার অনন্তের দিকে যাওয়ার জন্য কোনও অ্যালগোরিদম যে পরিমাণ সংস্থান ব্যবহার করে তা।

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

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

কেন আমরা অ্যাসিপটোটিক জটিলতা ব্যবহার করি? অনুশীলনে অ্যালগরিদমের নকশার সাথে সম্পর্কিত এই অ্যাসেম্পোটিক বিশ্লেষণ কীভাবে হয়?


আরেকটি প্রাসঙ্গিক প্রশ্ন হ'ল: আমরা কেন ধ্রুবক বিষয়গুলিকে উপেক্ষা করি ?
রাফেল

উত্তর:


24

মজার প্রশ্ন হ'ল বিকল্প কী? আমি জানি কেবলমাত্র অন্য পদ্ধতিটি পরীক্ষা / বেঞ্চমার্কিং। আমরা অ্যালগরিদমগুলি প্রোগ্রাম করি, তাদের সীমাবদ্ধ ইনপুট সেটটিতে চালিত (এর প্রতিনিধি নমুনা) দিন এবং ফলাফলগুলি তুলনা করুন। এটি নিয়ে বেশ কয়েকটি সমস্যা রয়েছে।

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

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

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

কিছুটা অনুশীলন করার ফাঁক বন্ধ করতে আনুষ্ঠানিক, তাত্ত্বিক সরঞ্জাম রয়েছে। উদাহরণগুলি হ'ল

  • মেমরি শ্রেণিবদ্ধ (এবং অন্যান্য I / O) বিবেচনা করে,
  • গড় কেস বিশ্লেষণ (যেখানে উপযুক্ত),
  • স্বতন্ত্র বিবৃতি সংখ্যার বিশ্লেষণ (বিমূর্ত ব্যয় ব্যবস্থা পরিবর্তে) এবং
  • ধ্রুবক কারণ নির্ধারণ।

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

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

আমি অনুশীলনকারীদের জন্য বেঞ্চমার্কগুলি চালানোর আগে অ্যালগরিদমের স্থান ফিল্টার করার জন্য তত্ত্বটি ব্যবহার করার পরামর্শ দিচ্ছি:

if ( input size forever bounded? ) {
  benchmark available implementations, choose best
  schedule new benchmarks for when machine changes
}
else {
  benchmark implementations of all asymptotically good algorithms
  choose the best
  schedule new benchmarks for when machine changes or inputs grow significantly
}

  1. একবারে ক্যাশে মিস করার সংখ্যা বৃদ্ধি পেলে পরম ও আপেক্ষিক পারফরম্যান্সে পাগল পরিবর্তন হতে পারে, যা সাধারণত ইনপুটগুলি বৃদ্ধি পেলে ঘটে তবে যন্ত্রটি একই থাকে।
  2. হিসাবে, ক্ষেত্রের শীর্ষস্থানীয় গবেষকরা এটি করতে সক্ষম নন।
  3. এখানে সরঞ্জামটি সন্ধান করুনইঞ্জিনিয়ারিং জাভা's এর ডুয়াল পিভট কুইকোর্টের এসএ ওয়াইল্ড এট আল দ্বারা মাএলজিএএন ব্যবহার করে একটি উদাহরণ ব্যবহার প্রকাশিত হয়েছে । (২০১২) [ প্রিপ্রিন্ট ]
  4. এস ওয়াইল্ড অ্যান্ড এম। নেবেল (২০১২) দ্বারা জাভা's এর দ্বৈত পিভট কুইকোর্টের গড় কেস বিশ্লেষণ - [ প্রিন্ট ]

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

আপনি গভীর গভীর খনন করার পরে অ্যাসিম্পটোটিক বিশ্লেষণের সীমা স্পষ্ট হয়ে ওঠে; কুইকসোর্ট একটি বিশিষ্ট উদাহরণ
রাফেল

1
এফডাব্লুআইডাব্লু, আমি এখানে ল্যান্ডাউ স্বরলিপি সম্পর্কে আমার মতের একটি সাম্প্রতিক স্ন্যাপশট লিখেছি ।
রাফেল

11

আমি ধরে নিই যে এই প্রশ্নটি এমন কোর্সের পাঠদান থেকে উত্থাপিত হয়েছে যার মধ্যে অ্যাসিম্পটোটিক বিশ্লেষণ রয়েছে। প্রাথমিকভাবে শ্রেণিতে এই উপাদানটি কেন পড়ানো হয় সে সম্পর্কে বেশ কয়েকটি সম্ভাব্য উত্তর রয়েছে:

  • অ্যাসিম্পটোটিক বিশ্লেষণ একটি গাণিতিক বিমূর্ততা যা বিশ্লেষণে নিজেকে উত্সাহ দেয়। (যুক্তিযুক্ত) গণিতবিদ হিসাবে, আমরা অ্যালগরিদমগুলি বিশ্লেষণ করতে সক্ষম হতে চাই এবং তারা কেবল তাদের জটিলতার প্রতিরোধ করার উপায় অ্যাসেম্পোটিক বিশ্লেষণ ব্যবহার করে।

  • একটি অ্যালগরিদমের asympotic কর্মক্ষমতা মূল্যায়ন কিছু নীতিগুলি যা অনুশীলনে কার্যকর তা নির্দেশ করে: উদাহরণস্বরূপ, কোডটির যে অংশটি বেশিরভাগ সময় নেয় তার দিকে মনোনিবেশ করুন এবং কোডের এমন কোনও অংশ ছাড় করুন যা একটি অসম্পূর্ণভাবে উপেক্ষিত অংশ গ্রহণ করে ।

  • অ্যাসিম্পোটিক বিশ্লেষণের কয়েকটি কৌশল কার্যকর are আমি এখানে মূলত তথাকথিত "মাস্টার উপপাদ্য" কে উল্লেখ করছি, যা অনেক পরিস্থিতিতে বাস্তবতার একটি ভাল বর্ণনা is

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

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


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

1
আমি আপনার ভিত্তিতে বিভ্রান্ত আপনি লক্ষ্য করছেন যে এই গ্রুপটি গণিতবিদ এবং উচ্চাকাঙ্ক্ষী প্রোগ্রামার উভয়ই হ'ল এটি একটি অদ্ভুত সংমিশ্রণ এবং কম্পিউটার বিজ্ঞানীদের বৈশিষ্ট্যও নয়। (এছাড়াও, আমি আনুষ্ঠানিক ভাষাগুলিতে আপনার মতামতটি ভাগ করি না, তবে এটি অন্য একটি বিষয়))
রাফেল

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

3
@ ইউভালফিল্মাস আমি প্রায়শই ব্যাখ্যা করেছি যে আমি বিশ্বাস করি না যে সিএস = টিসিএস + প্রোগ্রামিং। আপনি যদি কোনও সিএস কোর্স পড়ান (কোনও বিশ্ববিদ্যালয়ে) এবং আপনার বেশিরভাগ শিক্ষার্থী প্রোগ্রামার হতে চান তবে কিছু কিছু নষ্ট হয়ে গেছে (ইমো)। আমি যুক্তি দিয়ে বলব যে যে কোনও কম্পিউটার বিজ্ঞানী অ্যালগরিদমিক্স, প্রথাগত ভাষা এবং এমনকি কিছু জটিলতা তত্ত্বের (এবং আরও অনেক কিছুই যেমন কম্পাইলার এবং সিপিইউ কীভাবে কাজ করেন) শক্ত শিক্ষা থেকে লাভ করতে পারেন।
রাফেল

2
@ উইল্ডকার্ড কম্পিউটার আর্কিটেকচার, কম্পিউটার গ্রাফিক্স, এআই, প্রোগ্রামিং ভাষা গবেষণা, ... - তালিকাটি অন্তহীন! টিসিএস আসলেই একটি কুলুঙ্গি, এবং প্রোগ্রামিং (বেশিরভাগ) সিএস গবেষকদের জন্য একটি সরঞ্জাম।
রাফেল

7

চলমান সময়ের অ্যাসিম্পটোটিক বিশ্লেষণ ব্যবহারের জন্য দুটি গুরুতর কারণ রয়েছে:

  • n

  • গাণিতিক ট্র্যাকটেবিলিটি অনুমতি দেয়। অপারেশন গণনার জন্য সঠিক অভিব্যক্তিগুলি খুঁজে পাওয়া সম্ভব এমন ক্ষেত্রে ব্যতিক্রমী। অ্যাসিম্পটিকগুলি অধ্যয়ন করার ফলে আরও সম্ভাবনা খোলে (যেমন জটিল কার্যগুলির অ্যাসিপটোটিক আনুমানিক কাজ সহজ)।

এবং আরও অনেকগুলি রয়েছে (যেমন যন্ত্রের স্বাধীনতা, অর্থবোধকতা, তুলনামূলকতা ...)।


n

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

6

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


3

কারণ অ্যাসিম্পটিকগুলি "সহজ" (যাইহোক, সীমাবদ্ধ ক্ষেত্রে সঠিক বিশ্লেষণ করার চেয়ে সহজ)।

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

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


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

3

এখানে অ্যাসিপোটোটিক বিশ্লেষণের মাধ্যমে আমি ধরে নিয়েছি যে আমরা ইনপুটটির আকার অনন্তের দিকে চলে যাওয়ার সাথে সাথে আলগোরিদমের আচরণ বোঝাই।

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

বাস্তব বিশ্বের যেকোন সরল মডেল সম্পর্কে একই প্রশ্ন জিজ্ঞাসা করা যেতে পারে। আমরা কেন বাস্তব বিশ্বের সরলিকৃত গাণিতিক মডেলগুলি ব্যবহার করি?

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

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

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

সংক্ষেপে অ্যাসিপটোটিক জটিলতা সাধারণ বুনিয়াদি কাজগুলির জন্য একটি অ্যালগোরিদমের আসল জটিলতার আনুমানিক গণনা করা তুলনামূলকভাবে সহজ (একটি অ্যালগোরিদম পাঠ্যপুস্তকের সমস্যা)। আমরা আরও জটিল প্রোগ্রামগুলি তৈরি করার সাথে সাথে পারফরম্যান্সের প্রয়োজনীয়তাগুলি পরিবর্তন হয় এবং আরও জটিল হয়ে যায় এবং অ্যাসিম্পোটিক বিশ্লেষণ ততটা কার্যকর নাও হতে পারে।


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

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

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

Θ(nlgn)Θ(n2)Θ(lgn)O(n)



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

@ রাফেল, ধন্যবাদ আমি শীঘ্রই অন্য একটি সম্পাদনা করার পরিকল্পনা করছি। :)
কাভেঃ

-2

O(n2)O(nlogn)O(n2) এটি কুইকোর্টের তুলনায় শেষ করতে।

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

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


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

@ ইরাকেল আপনি নিজের উত্তরে বেঞ্চমার্কিংয়ের বিষয়টি কভার করেছেন; এটি একটি ভাল উত্তর। তবে মনে রাখবেন যে অ্যানিমেশন / ভিজ্যুয়ালাইজেশন বেঞ্চমার্কিংয়ের সাথে নিবিড়ভাবে সম্পর্কিত হতে পারে। আসলে রানটাইমগুলি [অন্যান্য উত্তরগুলিতে আচ্ছাদিত] কী প্রভাবিত করে তার যথেষ্ট পরিমাণে ব্যাখ্যা রয়েছে তবে কিছুটা হলেও এর "গোলমাল" এবং অ্যাসিপটোটিক জটিলতা "আওয়াজকে আরামদায়ক / গড় গড়ায়"। এটি কীভাবে এটি করে তা দেখার জন্য আর একটি অনুশীলন শুরু করে।
vzn

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

nn

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