অ্যারে ছাড়াই স্মৃতিচারণ


14

কর্পেন এট আল এর আলগোরিদিমগুলির ভূমিকাতে , বিভাগ 15.3 গতিশীল প্রোগ্রামিংয়ের উপাদানগুলি মেমোয়েজেশনটিকে নিম্নলিখিত হিসাবে ব্যাখ্যা করে:

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

এবং এটি পাদটীকা হিসাবে যুক্ত করেছে:

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

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


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


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

উত্তর:


5

সম্ভবত আরও ভাল উদাহরণ রয়েছে, তবে এখানে আমার মাথার উপরের অংশটি একটি:

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


3

আমি 2 টি উদাহরণ দিতে চাই।

0-1 ন্যাপস্যাক সমস্যা

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

এই ক্ষেত্রে, কোনও মেমোরির অর্থনীতির স্বার্থে, কেউ 2D অ্যারের পরিবর্তে স্মৃতিচারণের জন্য অভিধানটি বেছে নিতে পারেন।

আর্লি পার্সিং অ্যালগরিদম

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

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

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

সুতরাং, অভিধানের ডেটা কাঠামোর ভিত্তিতে পার্সিং চার্টটি প্রয়োগ করা আরও সুবিধাজনক।

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


0

প্রতিযোগিতামূলক প্রোগ্রামিং থেকে আমার অভিজ্ঞতায় হ্যাশ টেবিল (পাইথনের dictবা অনুরূপ) ব্যবহার করা প্রায়শই অ্যারের ব্যবহারের চেয়ে বেশি সুবিধাজনক কারণ কোনও হ্যাশযোগ্য ডেটা টাইপ কী হিসাবে ব্যবহার করা যেতে পারে যেমন স্ট্রিংস, সেটস ( frozensetপাইথনে) অথবা টিপলস (string, int)ইত্যাদি etc. যদি কোনও অ্যারে ব্যবহার করা হয় তবে আপনাকে অবশ্যই সমস্ত কীগুলি পূর্ণসংখ্যায় অনুবাদ করতে হবে (০ থেকে শুরু), যা অতিরিক্ত কাজ নেয় এবং আপনার উত্স নোট হিসাবে, যদি আপনি আগে থেকে কীগুলির স্থান না জানেন তবে সম্ভব নাও হতে পারে। সুতরাং অভিধানগুলি অ্যারের চেয়ে বেশি সাধারণ।

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

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