অ্যালগরিদমের প্যাটার্ন যা প্রয়োজন হলে এটি কীভাবে সমাধানে যায় তার একটি ব্যাখ্যা দেয়


14

নিম্নলিখিত পরিস্থিতি আমার বেশ কয়েকবার ঘটেছে।

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

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

Initially, a=6 and b=4. The number of 2-factors, d, is initialized to 0.
a and b are both even, so we divide them by 2 and increment d by 1.
Now, a=3 and b=2.
a is odd but b is even, so we divide b by 2.
Now, a=3 and b=1.
a and b are both odd, so we replace a by (a-b)/2 = 1.
Now, a=1 and b=1.
a=b, so the GCD is a*2^d = 2.

আউটপুটটি এমনভাবে ফেরত দেওয়া উচিত যা এটি কনসোলে এবং ওয়েব-ভিত্তিক অ্যাপ্লিকেশনগুলিতে সহজেই প্রদর্শিত হতে পারে।

যখন প্রয়োজন হয় তখন ব্যাখ্যা দেওয়ার জন্য একটি ভাল ধরণ কী, যখন ব্যাখ্যা প্রয়োজন হয় না যখন অ্যালগরিদমের আসল-সময় পারফরম্যান্সকে আঘাত না করে?

উত্তর:


50

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

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


2
আপনি লগিংয়ের মতো আপনি চালু এবং বন্ধ এমন কিছু না হলেও এটির মতামত এবং স্ব ডকুমেন্টিং কোডটি কমপক্ষে একটি "অ্যালগরিদম যা নিজেকে ব্যাখ্যা করে" সম্পর্কে কোনও প্রশ্নে একটি সম্মানজনক উল্লেখ পাওয়া উচিত feels
candied_orange

9
@ ক্যান্ডিওড অরেঞ্জ প্রশ্নটি বিশেষত এর সাথে অন্তর্ভুক্ত প্রকৃত রান-টাইম মানগুলির সাথে একটি "ব্যাখ্যা" জিজ্ঞাসা করে। মন্তব্যগুলি সে ক্ষেত্রে খুব বেশি সাহায্য করবে না।
11:56 '

@ মেটাকুবড ওহ এসো আমি বলিনি যে এটি লগিংয়ের বিকল্প ছিল। প্রশ্নের শিরোনামটি দেখুন এবং এখানে দিয়ে আসা ট্র্যাফিকের কথা ভাবেন।
candied_orange

4
@ ক্যান্ডিওড ওরেঞ্জ: আমি মনে করি যে প্রশ্নের শিরোনামটি বিভ্রান্তিমূলক, আপনি ঠিক বলেছেন যে এটি সেভাবে ব্যাখ্যা করা যেতে পারে, তবে এটি ওপি যা চাইছে তা নয়। তবে আমি আমাকে এটি সংশোধন করতে দিয়েছি, আমি শিরোনাম সম্পাদনা করব।
ডক ব্রাউন

1
দ্রষ্টব্য যে ট্রেলোগের মতো কিছু বিশেষভাবে আউটপুট উত্পাদন করার জন্য ডিজাইন করা হয়েছে যা ফাংশন কলগুলির সম্পূর্ণ রেকর্ড উত্পাদন করে জটিল গণনাগুলি ব্যাখ্যা করে।
বোরিস স্পাইডার

7

একটি ভাল প্যাটার্ন হ'ল পর্যবেক্ষক। https://en.wikipedia.org/wiki/Observer_pattern

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

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

interface AlgoLogObserver {
   public void observe(String message);
}

class AlgorithmXyz {   
   AlgoLogObserver observer = null;
   void runCalculation() {   
       if (observer!=null) { oberserver.observe("Hello"); }
       ...
   }   
}

...
algo = new AlgorithmXyz();
algo.observer = new ConsoleLoggingObserver();  // yes, yes make a 
                                               // setter instead, or use Ruby :-)
algo.runCalculation();

এটি সামান্য ভার্বোস, তবে চেকটি ==nullযত তাড়াতাড়ি পাওয়া উচিত।

(দ্রষ্টব্য যে সাধারণ ক্ষেত্রে observerসম্ভবত Vector observersএকাধিক পর্যবেক্ষকের জন্য অনুমতি দেওয়ার পরিবর্তে এটি হতে পারে; এটি অবশ্যই সম্ভব এবং আরও বেশি ওভারহেডের দিকে পরিচালিত করবে না; আপনি এখনও যে অপটিমাইজেশনটি সেট করেছেন observers=nullতার পরিবর্তে আপনি সেট করতে পারেন খালি Vector।)

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


5

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

এর কয়েকটি সুবিধা রয়েছে:

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

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


2
অবশ্যই আছে, তৈরি করার ওভারহেড lambdas ...
সের্গিও Tulentsev

1
সার্জিও হালকা করে তোলে তবে আপনার যুক্তির মূর্খতা পুরোপুরি ব্যাখ্যা করে না। লগ স্ট্রিংগুলি নির্মাণের কার্যকারিতা ওভারহেড ল্যাম্বডাস নির্মাণের কার্যকারিতা ওভারহেডের চেয়ে কম মাত্রার ক্রম । আপনি এখানে খুব খারাপ
ট্রেড অফ করেছেন

2
@ টায়ারিয়াস: আপনার কাছে কি এটি নির্ভরযোগ্য একটি বেঞ্চমার্ক আছে ? (বেঞ্চমার্ক আপনি লিঙ্ক গভীরভাবে ত্রুটিপূর্ণ হয়, CF stackoverflow.com/questions/504103/... )
meriton

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

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

0

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

সুতরাং মূলত আমি প্রবেশের মানগুলি (প্রাথমিক অবস্থা), প্রতিটি শাখা নির্বাচিত (শর্তসাপেক্ষে) এবং নির্বাচিত শাখায় প্রবেশের সময় (অস্থায়ী রাষ্ট্র) লগ করব।


1
এই এমনকি প্রশ্ন সুরাহা করতে বলা সম্পর্কে আলগোরিদিম রিয়েল-টাইম কর্মক্ষমতা যখন ব্যাখ্যা আছে আঘাত না প্রচেষ্টা নয়, না প্রয়োজন
মশা

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