অ্যালগরিদমিক জটিলতার জন্য একটি পরীক্ষা করা উচিত? যদি তাই হয়, কিভাবে?


14

ধরা যাক আমি সাজানো তালিকা / অ্যারে অনুসন্ধান করার মতো সাধারণ কিছু বাস্তবায়ন করছি। ফাংশন (সি # তে) এর মতো দেখতে পাবেন:

static int FindIndex(int[] sortedList, int i);

কার্যকারিতার দিক দিয়ে আমি এটি প্রয়োগ এবং পরীক্ষা করতে পারতাম, তবে স্পষ্ট কারণেই আমি সাধারণত একটি রৈখিক অনুসন্ধান বা ইচ্ছাকৃত বোকামির চেয়ে বাইনারি অনুসন্ধান পছন্দ করি।

সুতরাং আমার প্রশ্নটি হ'ল: আমাদের কি এমন পরীক্ষাগুলি লেখার চেষ্টা করা উচিত যা অ্যালগরিদমিক জটিলতার ক্ষেত্রে পারফরম্যান্সের গ্যারান্টি দেয় এবং যদি তাই হয় তবে কীভাবে?

আমি এই প্রশ্নের "আপনার উচিত" অংশের উভয় পক্ষেই তর্ক করা শুরু করেছি, তবে লোকেরা আমাকে জিজ্ঞাসা করার জন্য আমার যুক্তি ছাড়াই কী বলেছে তা দেখতে চাই।

"কীভাবে" এর পরিপ্রেক্ষিতে এটি খুব আকর্ষণীয় হয়ে যায় :) আপনি তুলনা অপারেটরকে পরামিতি করতে এবং এমন একটি পরীক্ষা দেখতে পেয়েছেন যার তুলনা অপারেটর তুলনা বা এরকম কিছু গণনা করে। তবে কেবল আপনার অর্থ এই নয় যে আপনার উচিত ...

অন্য কেউ এটি (সম্ভবত) বিবেচনা করেছেন? ধন্যবাদ।


@ স্টেনহুল্থিন - আমি এই সিদ্ধারটি এখানে করব এবং এটি পরীক্ষা করে দেখব। আমি কখনও ছিল না।
স্যারপেন্টর

বিটিডব্লিউ, সুন্দর প্রশ্ন +1
রাফায়েল কলুচি

উত্তর:


13

অ্যালগরিদমিক জটিলতা একটি তাত্ত্বিক গঠন এবং যেমন পেন্সিল এবং কাগজ দিয়ে এটি সেরা "পরীক্ষিত"। এটি যান্ত্রিকভাবে কার্যকরভাবে পরীক্ষা করা যায় না।

নিখুঁত কর্মক্ষমতা যান্ত্রিকভাবে পরীক্ষা করা যেতে পারে এবং দরকারী ইউনিট পরীক্ষা করতে পারে। যদি পারফরম্যান্সের বিষয়টি গুরুত্বপূর্ণ হয় তবে আপনি একটি প্রান্তিক নির্দিষ্ট করতে পারেন: "এই কোয়েরিতে 10 6 সংখ্যায় চলতে 50ms এর বেশি হওয়া উচিত নয় এবং 10 7 সংখ্যায় 60ms এর বেশি হওয়া উচিত নয় ।" যেটির জন্য আপনি ইউনিট পরীক্ষা তৈরি করতে পারেন

আপনার অ্যালগোরিদম লিনিয়ার বা লোগারিথমিক কিনা তা শেষ ব্যবহারকারী বিবেচনা করে না; তাদের ইউআই এখনও অ্যাপ্লিকেশনটিতে এক বছরের মূল্যবান ডেটা পেয়ে গেলেও তাত্ক্ষণিকভাবে প্রতিক্রিয়া দেখায় কিনা তা তাদের যত্নশীল।


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

একটি লাইব্রেরি কিছু গ্যারান্টি সরবরাহ করে বলেই তার একক পরীক্ষার যোগ্য হতে হবে না।
এসভিউ

@ টোবিয়াস ব্রিক: কোনও কিছুর পরীক্ষা করা এবং কোনও সংজ্ঞা দেওয়া দুটি আলাদা জিনিস।
ডেড এমজি

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

3

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

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


0

প্রধান জিনিসটি এটি বড় ডেটা দিয়ে চেষ্টা করে দেখুন এবং এটি খুব বেশি সময় নেয় কিনা তা দেখুন।

আমার পারফরম্যান্স টিউনিং অভিজ্ঞতায়, যেমন এই উদাহরণে , কিছু অ্যালগরিদম (উদাহরণস্বরূপ) ও (এন ^ 2) হয় তবে যা ঘটে তা যতক্ষণ সময় নেয় না তার যতক্ষণ সময় নেয় না রাডারটি কখনই আসে না।

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

যদি আপনি এটি পরীক্ষার মধ্যে ঘটতে পারেন তবে এটি খুব ভাল জিনিস, কারণ সমস্যাটি খুঁজে পাওয়া চূড়ান্ত সহজ, ঠিক যেমন এটি একটি আসল অসীম লুপ।


0

আমি মনে করি না আপনি যা করতে চান তা ইউনিট টেস্টিং।

আফাইক, ইউনিট টেস্টিং কেবল কোডটি যা করা উচিত তা নিশ্চিত করে তা নিশ্চিত করা এবং এটি কার্য সম্পাদনের দিকে মনোনিবেশ করে না।

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

কর্মক্ষমতা পরিমাপের জন্য অন্যান্য ধরণের সরঞ্জাম এবং নিদর্শন রয়েছে। এর মধ্যে একটি যেটি আমি এখন মনে করতে পারি তা হ'ল গ্রহণযোগ্যতা পরীক্ষা অ-কার্যকরী প্রয়োজনীয়তার উপর দৃষ্টি নিবদ্ধ করে।

পারফরম্যান্স টেস্টিংয়ের মতো আরও কয়েকজন রয়েছে (যা স্ট্রেস টেস্টিং, লোড টেস্টিং ইত্যাদি ব্যবহার করে)।

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

সুতরাং সংক্ষিপ্ত উত্তর হ'ল না, ইউনিট কোনও কোড পরীক্ষা করার সময় আপনার এটির বিষয়ে চিন্তা করা উচিত নয়।


0

তুলনাকারীতে পাস করা এবং এটি যে সময়ের নাম্বার বলা হয়েছে তার ট্র্যাক রাখা সহজ উদ্দেশ্যগুলির জন্য কাজ করবে যেমন একটি স্থির ইনপুট (বলে new int[] { 1,2,3, ... , 1024 }) অনুসন্ধান করার সময় তুলনা করার সংখ্যাটি 10 এর নিচে থাকে তা পরীক্ষা করা। এটি কমপক্ষে অ্যালগরিদমটি কীভাবে আচরণ করবে বলে মনে করা হচ্ছে সে সম্পর্কে আপনার উদ্দেশ্যগুলি পরিষ্কার করুন।

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

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