একটি অ্যালগরিদমের সময় জটিলতার কথা বলার সময় "কনস্ট্যান্ট অ্যামোরিটাইজড টাইম" বলতে কী বোঝায়?
একটি অ্যালগরিদমের সময় জটিলতার কথা বলার সময় "কনস্ট্যান্ট অ্যামোরিটাইজড টাইম" বলতে কী বোঝায়?
উত্তর:
ইমোরাইজড সময়টি সহজ শর্তে ব্যাখ্যা করা হয়েছে:
আপনি যদি কোনও অভিযান লক্ষ লক্ষ বার বলে থাকেন তবে আপনি সত্যিই সবচেয়ে খারাপ পরিস্থিতি বা সেই অপারেশনের সেরা ক্ষেত্রে সম্পর্কে চিন্তা করবেন না - আপনি যখন লক্ষ লক্ষ বার অপারেশনটি পুনরায় পুনর্বার করেন তখন মোট কতটা সময় নেওয়া হয় ।
সুতরাং কিছুক্ষণের মধ্যে একবার অপারেশনটি খুব ধীর হয় কিনা তাতে কিছু যায় আসে না, যতক্ষণ না "একবারে একবার" আস্তে আস্তে দূরে সরে যাওয়ার পক্ষে বিরল। মূলত amorised সময় মানে "আপনি অনেক অপারেশন করেন তবে অপারেশন প্রতি সময় নেওয়া গড় সময়"। রীতিমতো সময় স্থির থাকতে হবে না; আপনি লিনিয়ার এবং লোগারিথমিক অ্যামোরিটাইজড সময় বা অন্য কিছু পেতে পারেন।
আসুন ম্যাটসের গতিশীল অ্যারের উদাহরণটি নেওয়া যাক, আপনি বারবার নতুন আইটেম যুক্ত করেন। সাধারণত কোনও আইটেম যুক্ত করতে ধ্রুব সময় লাগে (যা O(1)
)। কিন্তু প্রতিবার অ্যারে পূর্ণ হয়ে গেলে আপনি দ্বিগুণ স্থান বরাদ্দ করেন, নতুন ডেটাতে আপনার ডেটা অনুলিপি করে, এবং পুরাতন স্থানকে মুক্ত করেন। বরাদ্দ এবং নিরবচ্ছিন্ন সময়ে চালানো নিরূপণ ধরে O(n)
নিলে , এই বৃদ্ধি প্রক্রিয়াটি সময় নেয় যেখানে এন অ্যারের বর্তমান আকার হয়।
সুতরাং প্রতিবার যখন আপনি বড় করবেন, আপনি সর্বশেষ বিস্তারের দ্বিগুণ সময় নিবেন। তবে আপনি এটি করার আগে দু'বার অপেক্ষা করেছেন! প্রতিটি বর্ধনের ব্যয় এইভাবে সন্নিবেশগুলির মধ্যে "ছড়িয়ে" যেতে পারে। এর অর্থ দীর্ঘমেয়াদে, অ্যারে এম আইটেম যুক্ত করার জন্য মোট সময় নেওয়া হয় O(m)
, এবং সুতরাং মোড়িত সময় (যেমন প্রতি সন্নিবেশের সময়) হয় O(1)
।
এর অর্থ এটি যে সময়ের সাথে সাথে সবচেয়ে খারাপ পরিস্থিতি ও (1) বা ধ্রুবক সময়ের সাথে ডিফল্ট হয়ে যায়। একটি সাধারণ উদাহরণ গতিশীল অ্যারে। যদি আমরা ইতিমধ্যে একটি নতুন প্রবেশের জন্য মেমরি বরাদ্দ করে রেখেছি তবে এটি ও (1) হবে। যদি আমরা এটি বরাদ্দ না করি আমরা বরাদ্দ দিয়ে তা করব, বলুন, বর্তমান পরিমাণের দ্বিগুণ twice এই নির্দিষ্ট সন্নিবেশ O (1) হবে না , বরং অন্য কিছু।
গুরুত্বপূর্ণটি হ'ল অ্যালগরিদম গ্যারান্টি দেয় যে ক্রমগুলির ক্রমানুসারে ব্যয়বহুল ক্রিয়াকলাপগুলি সূচিত হবে এবং এর ফলে পুরো অপারেশন ও (1) সরবরাহ করবে।
বা আরও কঠোর শর্তে,
একটি ধ্রুবক সি রয়েছে, যেমন প্রতিটি অপারেশনের ক্রমের জন্য (ব্যয়বহুল ক্রিয়াকলাপের সাথে একটিও সমাপ্ত হয়) দৈর্ঘ্যের এল, সময়টি সি * এল এর চেয়ে বেশি হয় না (ধন্যবাদ রাফা ডগির্ড )
এটি সম্পর্কে চিন্তাভাবনার স্বজ্ঞাত উপায় বিকাশের জন্য, গতিশীল অ্যারেতে উপাদান সন্নিবেশ বিবেচনা করুন (উদাহরণস্বরূপ std::vector
C ++)। আসুন একটি গ্রাফ প্লট করুন, যা অ্যারেতে N উপাদানগুলি সন্নিবেশ করানোর জন্য প্রয়োজনীয় সংখ্যক ক্রিয়াকলাপের (Y) নির্ভরতা দেখায়:
অ্যারে প্রসারিত করতে কালো গ্রাফের উল্লম্ব অংশগুলি মেমরির পুনঃনির্ধারণের সাথে সামঞ্জস্য করে। এখানে আমরা দেখতে পারি যে এই নির্ভরতা মোটামুটি একটি লাইন হিসাবে উপস্থাপন করা যেতে পারে। এবং এই লাইন সমীকরণটি Y=C*N + b
( আমাদের ক্ষেত্রে C
ধ্রুবক, b
= 0)। অতএব আমরা বলতে পারি যে C*N
অ্যারেতে N উপাদান যুক্ত করতে আমাদের গড়ে অপারেশন ব্যয় করতে হবে, বা C*1
একটি উপাদান যুক্ত করতে ক্রিয়াকলাপগুলি (নিয়মিত ধীরে ধীরে ধীরে ধীরে সময় কাটাতে হবে )।
আমি 3 বার পুনরাবৃত্তি পড়ার পরে, নীচে উইকিপিডিয়া ব্যাখ্যাটি দরকারী বলে মনে করি:
সূত্র: https://en.wikedia.org/wiki/Amorised_analysis#Dynamic_Array
"গতিশীল অ্যারে
ডায়নামিক অ্যারের জন্য পুশ অপারেশনের ইমোরোটাইজড বিশ্লেষণ
একটি গতিশীল অ্যারে বিবেচনা করুন যা আকারে বৃদ্ধি পায় কারণ এতে আরও উপাদান যুক্ত হয় যেমন জাভাতে অ্যারেলিস্ট। যদি আমরা 4 মাপের গতিশীল অ্যারে দিয়ে শুরু করি তবে এটিতে চারটি উপাদানকে ধাক্কা দিতে ধ্রুবক সময় লাগবে। তবুও অ্যারেটিতে পঞ্চম উপাদানটি চাপিয়ে দিতে আরও বেশি সময় লাগবে কারণ অ্যারেটি বর্তমান আকারের দ্বিগুণ নতুন অ্যারে তৈরি করতে হবে (8), পুরানো উপাদানগুলিকে নতুন অ্যারেতে অনুলিপি করতে হবে এবং তারপরে নতুন উপাদান যুক্ত করতে হবে। পরবর্তী তিনটি পুশ ক্রিয়াকলাপ একইভাবে ধ্রুবক সময় নেবে এবং তারপরে পরবর্তী সংযোজনে অ্যারের আকারের আরও ধীর দ্বিগুণ হওয়া প্রয়োজন।
সাধারণভাবে যদি আমরা আকার n এর অ্যারেতে ধাক্কা খেয়ে একটি নির্বিচার সংখ্যা বিবেচনা করি, আমরা লক্ষ্য করব যে পুশ অপারেশনগুলি শেষেরটি ব্যতীত ধ্রুব সময় নেয় যা আকার (দ্বিগুণ) অপারেশন করতে O (n) সময় নেয়। যেহেতু সেখানে এন অপারেশন মোট ছিল আমরা এটির গড় সময় নিতে পারি এবং গতিশীল অ্যারেতে উপাদানগুলিকে ধাক্কা দেওয়ার জন্য লাগে: O (n / n) = O (1), ধ্রুবক সময় ""
একটি সাধারণ গল্প হিসাবে আমার বোঝার জন্য:
ধরুন আপনার অনেক টাকা আছে। এবং, আপনি তাদের একটি ঘরে রেখে দিতে চান। এবং, আপনার এখন হাত বা পায়ে দীর্ঘ প্রয়োজন আপনার প্রয়োজন now এবং, আপনাকে সমস্ত একটি ঘরে পূরণ করতে হবে, তাই এটিকে লক করা সহজ।
সুতরাং, আপনি ঘরের শেষ / কোণে ডানদিকে যান এবং তাদের স্ট্যাক করা শুরু করেন। আপনি তাদের স্ট্যাক করার সাথে সাথে আস্তে আস্তে ঘরটি স্থানের বাইরে চলে যাবে। যাইহোক, আপনি পূরণ হিসাবে এটি স্ট্যাক করা সহজ ছিল। টাকা পেল, টাকা রাখো। সহজ। এটি ও (1)। আমাদের আগের কোনও অর্থ সরানোর দরকার নেই।
একবার রুম স্থান শেষ হয়ে যায়। আমাদের আরও একটি ঘর দরকার, এটি আরও বড়। এখানে একটি সমস্যা রয়েছে, যেহেতু আমাদের কেবল 1 টি কক্ষ থাকতে পারে তাই আমাদের কেবল 1 টি লক থাকতে পারে, তাই আমাদের সেই ঘরে থাকা সমস্ত অর্থ নতুন বড় ঘরে সরানো দরকার। সুতরাং, সমস্ত ঘর, ছোট ঘর থেকে, বড় ঘরে সরান। এটি আবার তাদের সমস্ত স্ট্যাক করুন। সুতরাং, আমাদের পূর্ববর্তী সমস্ত অর্থ সরিয়ে নেওয়া দরকার। সুতরাং, এটি ও (এন)। (ধরে নিলাম এন পূর্ববর্তী অর্থের মোট গণনা)
অন্য কথায়, এটি এন পর্যন্ত সহজ ছিল, কেবল 1 টি অপারেশন, তবে যখন আমাদের বড় কক্ষে যেতে হবে তখন আমরা এন অপারেশন করেছি। সুতরাং, অন্য কথায়, যদি আমরা গড় বের করি তবে এটি শুরুতে 1 টি সন্নিবেশ করা হয় এবং অন্য ঘরে যাওয়ার সময় আরও 1 টি সরানো। মোট 2 টি অপারেশন, একটি সন্নিবেশ, একটি পদক্ষেপ।
ধরে নেওয়া এন ছোট ঘরেও 1 মিলিয়ন এর মতো বড়, এন (1 মিলিয়ন) এর তুলনায় 2 ক্রিয়াকলাপগুলি আসলে তুলনীয় সংখ্যা নয়, সুতরাং এটি ধ্রুবক বা ও (1) হিসাবে বিবেচিত হয়।
ধরে নেওয়া হচ্ছে যখন আমরা উপরের সমস্তটি অন্য একটি বড় ঘরে করি এবং আবার সরানো দরকার। এটি এখনও একইরকম। বলুন, এন 2 (বলুন, 1 বিলিয়ন) বড় ঘরে অর্থের গণনার নতুন পরিমাণ
সুতরাং, আমাদের কাছে এন 2 আছে (এর মধ্যে পূর্বের এনও রয়েছে যেহেতু আমরা ছোট থেকে বড় ঘরে সমস্ত স্থানান্তর করি)
আমাদের এখনও মাত্র 2 টি অপারেশন দরকার, একটি বড় ঘরে isোকানো হয়, তারপরে আরও বড় ঘরে সরানোর জন্য আরেকটি মুভ অপারেশন।
সুতরাং, এমনকি এন 2 (1 বিলিয়ন) এর জন্যও এটি প্রতিটিটির জন্য 2 টি অপারেশন। যা আর কিছুই নয়। সুতরাং, এটি ধ্রুবক বা ও (1)
সুতরাং, এন যেমন N থেকে N2 বা অন্য 2 তে বৃদ্ধি পায়, তাতে তেমন কিছু আসে যায় না। এটি এখনও ধ্রুবক, বা হে (1) প্রতিটি এন এর জন্য প্রয়োজনীয় অপারেশন।
এখন ধরে নিন, আপনার এন হিসাবে 1 টি খুব ছোট, অর্থের সংখ্যা খুব কম, এবং আপনার খুব ছোট একটি ঘর রয়েছে, যা কেবলমাত্র 1 টি গণনা মানিয়ে যাবে।
ঘরে টাকা পূরণের সাথে সাথেই ঘরটি পূর্ণ হয়ে যায়।
আপনি যখন বড় ঘরে যান, ধরে নিন এটি কেবল এতে আরও একটি অর্থের জন্য উপযুক্ত হতে পারে, মোট 2 টি গণনার অর্থ। তার মানে, আগের স্থানান্তরিত অর্থ এবং আরও 1 টি। এবং আবার এটি পূরণ করা হয়।
এইভাবে, এন ধীরে ধীরে বৃদ্ধি পাচ্ছে, এবং এটি আর ধ্রুবক হে (1) নয়, যেহেতু আমরা আগের ঘর থেকে সমস্ত অর্থ সরিয়ে নিচ্ছি, তবে কেবল আরও 1 টি মানিয়ে নিতে পারি।
100 বার পরে, নতুন ঘরটি আগের থেকে 100 টি গণনা এবং এটি আরও 1 টি মানিয়ে নিতে পারে it এটি ও (এন), যেহেতু ও (এন + 1) ও (এন), অর্থাৎ, 100 বা 101 এর ডিগ্রি একই, উভয়ই শত শত, এর আগের গল্পটির বিপরীতে, মিলিয়ন এবং বিলিয়ন ।
সুতরাং, এটি আমাদের অর্থের জন্য ঘর (বা ভেরিয়েবল) বরাদ্দ করার অকার্যকর উপায়।
সুতরাং, একটি ভাল উপায় 2 এর ক্ষমতা সহ আরও ঘর বরাদ্দ করা হচ্ছে।
প্রথম কক্ষের আকার = 1 পয়সা গণনা 2
য় ঘরের আকার = 4 টাকার গণনার
তৃতীয় ঘরের আকার = ফিট 8 অর্থের গণনা
4 র্থ ঘরের আকার = 16 ফিট অর্থের গণনা
5 তম ঘরের আকার = 32 টাকার গণনা
6th ষ্ঠ ঘরের আকার = ফিট টাকা 64 গণনা
7th রুম আকার = তড়কা টাকা 128 গণনা
8th রুম আকার = তড়কা টাকা 256 গণনা
9 ম রুম আকার = তড়কা টাকা 512 গণনা
10th রুম আকার = তড়কা টাকা 1024 গণনা
11 তম রুম আকার = তড়কা টাকা 2,048 গণনা
। ..
16 তম ঘরের আকার = 65,536 টাকার গণনা ফিট
...
32 তম ঘরের আকার = 4,294,967,296 টাকার গণনা
...
th৪ তম কক্ষের আকার = 18,446,744,073,709,551,616 টাকার গণনা
কেন এই ভাল? কারণ এটি শুরুর দিকে ধীরে ধীরে বৃদ্ধি পেতে দেখায় এবং পরে দ্রুত, এটি আমাদের র্যামের মেমরির পরিমাণের সাথে তুলনা করে।
এটি সহায়ক, কারণ প্রথম ক্ষেত্রে এটি ভাল হলেও, অর্থের জন্য মোট কাজ করার পরিমাণ নির্ধারিত (2) এবং ঘরের আকারের (এন) সাথে তুলনীয় নয়, প্রাথমিক পর্যায়ে আমরা যে রুমটি নিয়েছিলাম সেটি খুব বেশি হতে পারে might বড় (1 মিলিয়ন) যা আমরা প্রথম ক্ষেত্রে যদি এত পরিমাণ অর্থ সঞ্চয় করতে পারি তবে তার উপর নির্ভর করে আমরা সম্পূর্ণরূপে ব্যবহার করতে পারি না।
যাইহোক, শেষ ক্ষেত্রে, 2 এর শক্তি, এটি আমাদের র্যামের সীমাতে বৃদ্ধি পায়। এবং তাই, 2 এর শক্তিতে বৃদ্ধি, উভয় আর্মোটাইজড বিশ্লেষণ স্থির থাকে এবং এটি আমাদের কাছে সীমাবদ্ধ র্যামের পক্ষে বন্ধুত্বপূর্ণ।
উপরোক্ত ব্যাখ্যাগুলি একত্রিত বিশ্লেষণের ক্ষেত্রে প্রযোজ্য, একাধিক ক্রিয়াকলাপের "গড়" নেওয়ার ধারণা। আমি নিশ্চিত নই যে তারা কীভাবে ব্যাঙ্কার-পদ্ধতিতে বা পদার্থবিজ্ঞানীদের পদ্ধতিতে প্রয়োগিত বিশ্লেষণের প্রয়োগ করে।
এখন। আমি সঠিক উত্তর সম্পর্কে ঠিক নিশ্চিত নই। তবে এটি উভয় পদার্থবিদ + ব্যাঙ্কারের পদ্ধতির নীতিগত শর্তের সাথে করতে হবে:
(ক্রিয়াকলাপের অমিতকরণ-ব্যয়ের যোগফল)> = (অপারেশনের আসল-ব্যয়ের যোগফল)।
আমি যে প্রধান সমস্যার মুখোমুখি হচ্ছি তা হ'ল ক্রিয়াকলাপের অ্যাম্পোরাইটিস-অ্যাসেম্পোটিক ব্যয়গুলি সাধারণ-অ্যাসিপটোটিক-ব্যয়ের চেয়ে পৃথক, আমি কীভাবে amorised- ব্যয়ের তাত্পর্যকে মূল্যায়ন করতে পারি তা নিশ্চিত নই।
কেউ যখন আমার একটি এমোরিটাইজড-ব্যয় দেয় তখন আমি জানি যে এটি সাধারণ-অ্যাসিপোটিক ব্যয়ের মতো নয় তবে তত্ক্ষণাতীত-ব্যয় থেকে আমি কী সিদ্ধান্ত নেব?
যেহেতু আমাদের কিছু অপারেশনকে অতিরিক্ত চার্জ দেওয়া হচ্ছে যখন অন্য অপারেশনগুলি সঞ্চারিত হচ্ছে, তাই একটি অনুমানও হতে পারে যে পৃথক ক্রিয়াকলাপের এমোরিটাইজড-ব্যয়ের উদ্ধৃতি অর্থহীন হবে।
উদাহরণস্বরূপ: একটি ফাইবোনাকির স্তূপের জন্য, কেবলমাত্র হ্রাস-কী (O) (1) হওয়ার আনুষাঙ্গিক ব্যয়ের উদ্ধৃতি অর্থহীন কারণ যেহেতু "স্তূপের সম্ভাব্যতা বৃদ্ধিতে পূর্ববর্তী ক্রিয়াকলাপগুলি দ্বারা করা কাজ" ব্যয় হ্রাস পাবে।
অথবা
আমাদের আরও একটি হাইপোথিসিস থাকতে পারে যা নিম্নরূপিত-ব্যয় সম্পর্কে কারণগুলি:
আমি জানি যে ব্যয়বহুল অপারেশনটি মাল্টিপল কম-কাস্ট অপারেশনগুলির আগে চলেছে।
বিশ্লেষণের খাতিরে, আমি কিছু স্বল্প ব্যয়মূলক ক্রিয়াকলাপকে অত্যধিক চার্জ করতে যাচ্ছি, তবে এটিই তাদের আশ্বাস-কাস্টম পরিবর্তন করে না।
এই স্বল্প ব্যয়বহুল ক্রিয়াকলাপগুলির সাথে, আমি এটি প্রমাণ করতে পারি যে এক্সপেনসিভ অপারেশনের একটি ছোট এ্যাসিপটোটিক কাস্ট রয়েছে।
এইভাবে আমি এন ক্রিয়াকলাপের ব্যয়ের ASYMPTOTIC-BOUND উন্নত / হ্রাস করেছি।
সুতরাং amorised- ব্যয় বিশ্লেষণ + amorised- খরচ-সীমা এখন কেবল ব্যয়বহুল ক্রিয়াকলাপের জন্য প্রযোজ্য। সস্তা ক্রিয়াকলাপগুলিতে তাদের সাধারণ-অ্যাসিপোটোটিক-ব্যয়ের মতো একই অ্যাসিপটোটিক-এমোরিটাইজড ব্যয় থাকে।
"ফাংশন কলগুলির মোট সংখ্যা" "" এই সমস্ত কলগুলির জন্য নেওয়া মোট সময় "এর মধ্যে ভাগ করে কোনও ফাংশনের পারফরম্যান্সকে গড় করা যায়। এমনকি আপনার করা প্রতিটি কলের জন্য যে ক্রিয়াকলাপগুলি আরও বেশি এবং বেশি সময় নেয় সেগুলিও এইভাবে গড়ে নেওয়া যেতে পারে।
সুতরাং, কোনও ক্রিয়াকলাপের সারমর্মটি Constant Amortized Time
হল যে এই "গড় সময়" এমন একটি সিলিংয়ে পৌঁছে যা কলগুলির সংখ্যা বাড়তে থাকে বলে অতিক্রম করে না। যে কোনও নির্দিষ্ট কল পারফরম্যান্সে পরিবর্তিত হতে পারে, তবে দীর্ঘকাল ধরে এই গড় সময়টি আরও বড় এবং আরও বাড়তে থাকবে না।
এটি এমন কোনও কিছুর জন্য প্রয়োজনীয় যোগ্যতা Constant Amortized Time
।