আমি সিএলআরএস দ্বারা "অ্যালগরিদমের পরিচিতি" পড়ছি। দ্বিতীয় অধ্যায়ে, লেখকরা "লুপ আক্রমণকারীদের" উল্লেখ করেছেন। লুপ আক্রমণকারী কী?
আমি সিএলআরএস দ্বারা "অ্যালগরিদমের পরিচিতি" পড়ছি। দ্বিতীয় অধ্যায়ে, লেখকরা "লুপ আক্রমণকারীদের" উল্লেখ করেছেন। লুপ আক্রমণকারী কী?
উত্তর:
সরল কথায়, একটি লুপ আক্রমণকারী হ'ল কিছু প্রাকটিক (শর্ত) যা লুপটির প্রতিটি পুনরাবৃত্তির জন্য ধারণ করে। উদাহরণস্বরূপ, আসুন একটি সাধারণ for
লুপটি দেখুন যা দেখে মনে হচ্ছে:
int j = 9;
for(int i=0; i<10; i++)
j--;
এই উদাহরণে এটি সত্য (প্রতিটি পুনরাবৃত্তির জন্য) যা সত্য i + j == 9
। একটি দুর্বল আক্রমণকারী এটি সত্য
i >= 0 && i <= 10
।
আমি এই খুব সহজ সংজ্ঞা পছন্দ: ( উত্স )
একটি লুপ আক্রমণকারী হ'ল একটি শর্ত [প্রোগ্রাম ভেরিয়েবলগুলির মধ্যে] যা লুপের প্রতিটি পুনরাবৃত্তির আগে এবং অবিলম্বে তাত্ক্ষণিকভাবে সত্য। (দ্রষ্টব্য যে এটি পুনরাবৃত্তির মাধ্যমে এর সত্য বা মিথ্যা অংশের অংশ সম্পর্কে কিছুই বলে না))
নিজেই, একটি লুপ আক্রমণকারী খুব বেশি কিছু করে না। যাইহোক, একটি উপযুক্ত আক্রমণকারী দেওয়া, এটি একটি অ্যালগরিদমের সঠিকতা প্রমাণে সহায়তা করতে ব্যবহার করা যেতে পারে। সিএলআরএস-এর সাধারণ উদাহরণটি সম্ভবত বাছাইয়ের সাথে করতে হবে। উদাহরণস্বরূপ, আপনার লুপ আক্রমণকারীটিকে কিছু এমন হতে দিন, লুপের শুরুতে i
, এই অ্যারের প্রথম এন্ট্রিগুলি সাজানো হয়। আপনি যদি প্রমাণ করতে পারেন যে এটি প্রকৃতপক্ষে একটি লুপ ইনগ্রায়েন্ট (যেমন এটি প্রতিটি লুপ পুনরাবৃত্তির আগে এবং তার পরে ধারণ করে), আপনি এটি বাছাই করা অ্যালগরিদমের যথার্থতা প্রমাণ করতে ব্যবহার করতে পারেন: লুপের সমাপ্তিতে, লুপের আক্রমণকারী এখনও তৃপ্ত , এবং কাউন্টারটি i
অ্যারের দৈর্ঘ্য। সুতরাং, প্রথম i
এন্ট্রি বাছাই করা মানে পুরো অ্যারে বাছাই করা হয়।
এমনকি আরও সাধারণ উদাহরণ: লুপগুলি ইনগ্রেন্টস, সঠিকতা এবং প্রোগ্রাম ডেরাইভেশন ।
আমি লুপের আক্রমণকারীটিকে যেভাবে বুঝি তা হ'ল প্রোগ্রামগুলি সম্পর্কিত যুক্তিযুক্ত, আনুষ্ঠানিক সরঞ্জাম tool আমরা একটি একক বিবৃতি দিই যা আমরা সত্য প্রমাণের দিকে মনোনিবেশ করি এবং আমরা এটিকে লুপ ইনগ্রায়েন্ট বলি। এটি আমাদের যুক্তি সংগঠিত করে। যদিও আমরা কিছু অ্যালগরিদমের সঠিকতা সম্পর্কে অনানুষ্ঠানিকভাবে তর্ক করতে পারি, একটি লুপ আক্রমণকারী আমাদের ব্যবহার করে খুব মনোযোগ সহকারে চিন্তা করতে এবং আমাদের যুক্তিটি বায়ুচলাচল নিশ্চিত করে।
লুপ এবং আক্রমণকারীদের সাথে লেনদেন করার সময় একটি জিনিস এখনই টের পাওয়া যায় না। তারা লুপ আক্রমণকারী এবং লুপ শর্তাধীন (লুপের সমাপ্তি নিয়ন্ত্রণ করে এমন শর্ত) এর মধ্যে বিভ্রান্ত হয়।
লোকেদের নির্দেশ হিসাবে, লুপের আক্রমণকারীটি অবশ্যই সত্য
(যদিও এটি লুপের শরীরে অস্থায়ীভাবে মিথ্যা হতে পারে)। অন্যদিকে লুপটি শর্তসাপেক্ষে লুপটি সমাপ্ত হওয়ার পরে অবশ্যই মিথ্যা হওয়া উচিত , অন্যথায় লুপটি কখনই শেষ হবে না।
সুতরাং লুপ আক্রমণকারী এবং লুপ শর্তযুক্ত আলাদা শর্ত হতে হবে ।
জটিল লুপের আক্রমণকারীটির একটি ভাল উদাহরণ বাইনারি অনুসন্ধানের জন্য।
bsearch(type A[], type a) {
start = 1, end = length(A)
while ( start <= end ) {
mid = floor(start + end / 2)
if ( A[mid] == a ) return mid
if ( A[mid] > a ) end = mid - 1
if ( A[mid] < a ) start = mid + 1
}
return -1
}
সুতরাং লুপ শর্তসাপেক্ষে বেশ সোজা এগিয়ে মনে হয় - যখন শুরু হয়> লুপটি সমাপ্ত হয়। তবে লুপটি সঠিক কেন? লুপ আক্রমণকারীটি কী যা এটি সঠিকতা প্রমাণ করে?
আক্রমণকারী হ'ল যৌক্তিক বিবৃতি:
if ( A[mid] == a ) then ( start <= mid <= end )
এই বিবৃতিটি একটি যৌক্তিক টোটোলজি - আমরা যে নির্দিষ্ট লুপ / অ্যালগরিদমকে প্রমাণ করার চেষ্টা করছি তার প্রসঙ্গে এটি সর্বদা সত্য । এবং এটি শেষ হওয়ার পরে লুপটির সঠিকতা সম্পর্কে দরকারী তথ্য সরবরাহ করে।
যদি আমরা ফিরে আসি কারণ আমরা অ্যারেতে উপাদানটি পেয়েছি তবে বিবৃতিটি স্পষ্টভাবে সত্য, যেহেতু যদি A[mid] == a
তখন a
অ্যারেতে থাকে এবং mid
অবশ্যই শুরু এবং শেষের মধ্যে হয়। যদি লুপ বন্ধ কারণ start > end
তারপর কোন সংখ্যা হতে পারে যেমন যে start <= mid
এবং mid <= end
এবং এর ফলে আমরা জানি যে বিবৃতি A[mid] == a
মিথ্যা হতে হবে। তবে, ফলস্বরূপ সামগ্রিক যৌক্তিক বিবৃতিটি নাল অর্থে এখনও সত্য। (যুক্তিতে যুক্তিটি যদি (মিথ্যা) থাকে তবে (কিছু) সর্বদা সত্য)
এখন লুপটি বন্ধ হয়ে যাওয়ার সাথে সাথে লুপটি শর্তসাপেক্ষে মিথ্যা হওয়ার বিষয়ে কী বলেছিলাম? দেখে মনে হচ্ছে যখন উপাদানটি অ্যারেতে পাওয়া যায় তখন লুপটি বন্ধ হয়ে গেলে লুপ শর্তযুক্ত হয় !? এটি আসলে নয়, কারণ while ( A[mid] != a && start <= end )
প্রকৃত লুপ শর্তসাপেক্ষ সত্যই তবে প্রথম অংশটি বোঝানো হওয়ায় আমরা প্রকৃত পরীক্ষাটি ছোট করে রেখেছি। লুপটি কীভাবে শেষ হয় তা নির্বিশেষে লুপের পরে এই শর্তসাপেক্ষ স্পষ্টভাবে মিথ্যা।
a
উপস্থিত কোনও গ্যারান্টি নেই A
। অনানুষ্ঠানিকভাবে এটি হবে, "যদি কী a
অ্যারেতে উপস্থিত থাকে তবে অবশ্যই এটি অবশ্যই অন্তর্ভুক্ত start
এবং end
অন্তর্ভুক্ত হবে"। তারপরে এটি অনুসরণ করে যে A[start..end]
খালি থাকলে, এটি a
এ
পূর্ববর্তী উত্তরগুলি খুব ভাল উপায়ে লুপের আক্রমণকারীকে সংজ্ঞায়িত করেছে।
নীচে সিএলআরএস এর লেখকরা কীভাবে সন্নিবেশ বাছাইয়ের সঠিকতা প্রমাণ করতে লুপ ইনগ্রায়েন্ট ব্যবহার করেছেন ?
সন্নিবেশ বাছাই অ্যালগরিদম (বই হিসাবে দেওয়া হয়েছে):
INSERTION-SORT(A)
for j ← 2 to length[A]
do key ← A[j]
// Insert A[j] into the sorted sequence A[1..j-1].
i ← j - 1
while i > 0 and A[i] > key
do A[i + 1] ← A[i]
i ← i - 1
A[i + 1] ← key
এই ক্ষেত্রে লুপ ইনগ্রায়েন্ট: সাব-অ্যারে [1 থেকে জে -1] সর্বদা বাছাই করা হয়।
এখন এটি পরীক্ষা করে দেখা যাক যে অ্যালগরিদমটি সঠিক।
সূচনা : প্রথম পুনরাবৃত্তির আগে j = 2। সুতরাং সাব-অ্যারে [1: 1] টি অ্যারে পরীক্ষা করা হবে। এটির যেমন একটি মাত্র উপাদান থাকে তাই এটি বাছাই করা হয়। এভাবে আক্রমণকারী সন্তুষ্ট হয়।
রক্ষণাবেক্ষণ : প্রতিটি পুনরাবৃত্তির পরে আক্রমণকারীটি পরীক্ষা করে এটি সহজে যাচাই করা যেতে পারে। এক্ষেত্রে এটি সন্তুষ্ট।
সমাপ্তি : এটি সেই পদক্ষেপ যেখানে আমরা অ্যালগরিদমের যথার্থতা প্রমাণ করব।
যখন লুপটি সমাপ্ত হয় তখন j = n + 1 এর মান। আবার লুপ আক্রমণকারী সন্তুষ্ট। এর অর্থ হল সাব-অ্যারে [1 থেকে n] বাছাই করা উচিত।
এটিই আমরা আমাদের অ্যালগরিদমটি করতে চাই। সুতরাং আমাদের অ্যালগরিদম সঠিক।
সমস্ত উত্তরের উত্তরের পাশাপাশি, আমি জেফ এডমন্ডসের দ্বারা কীভাবে আলগোরিদিম সম্পর্কে চিন্তাভাবনা করতে পারি তার একটি দুর্দান্ত উদাহরণ অনুমান করি যে ধারণাটি খুব ভালভাবে ফুটিয়ে তুলতে পারে:
উদাহরণ ১.২.১ "ফাইন্ড-ম্যাক্স টু-ফিঙ্গার অ্যালগরিদম"
1) বিশেষ উল্লেখ: একটি ইনপুট উদাহরণ এলিমেন্টের এল (1..n) নিয়ে গঠিত consists আউটপুটটিতে এমন একটি সূচক থাকে যা এল (i) এর সর্বাধিক মান থাকে। যদি এই একই মান সহ একাধিক এন্ট্রি থাকে, তবে তাদের মধ্যে যে কোনও একটি ফেরত দেওয়া হবে।
2) বেসিক পদক্ষেপ: আপনি দুটি আঙুলের পদ্ধতিতে সিদ্ধান্ত নিন। আপনার ডান আঙুলটি তালিকার নীচে চলেছে।
3) অগ্রগতির পরিমাপ: অগ্রগতির পরিমাপটি আপনার ডান আঙুলের তালিকার কতটা ওপরে রয়েছে is
4) লুপ আক্রমণকারী: লুপের আক্রমণকারীটি জানিয়েছে যে আপনার বাম আঙুলটি আপনার ডান আঙুলের দ্বারা এখন পর্যন্ত মুখোমুখি হওয়া বৃহত্তম এন্ট্রিগুলির মধ্যে একটিকে নির্দেশ করে।
৫) প্রধান পদক্ষেপ: প্রতিটি পুনরাবৃত্তি, আপনি আপনার ডান আঙুলটি তালিকার একটি প্রবেশিকায় নীচে সরান। যদি আপনার ডান আঙুলটি এখন কোনও এন্ট্রির দিকে ইঙ্গিত করে যা বড় হয় তবে বাম আঙুলের প্রবেশটি, তারপরে আপনার বাম আঙুলটি আপনার ডান আঙুলের সাথে রাখতে সরান।
6) অগ্রগতি করুন: আপনি অগ্রগতি করছেন কারণ আপনার ডান আঙুলটি একটি প্রবেশ করায়।
7) লুপ আক্রমণকারী বজায় রাখুন: আপনি জানেন যে লুপের আক্রমণকারীটি নিম্নরূপে বজায় রাখা হয়েছে। প্রতিটি পদক্ষেপের জন্য, নতুন বাম আঙুলের উপাদানটি সর্বোচ্চ (পুরানো বাম আঙুলের উপাদান, নতুন উপাদান)। লুপ আক্রমণকারী দ্বারা, এটি সর্বোচ্চ (সর্বাধিক সংক্ষিপ্ত তালিকা), নতুন উপাদান)। গাণিতিকভাবে - ম্যাটিক্যালি, এটি সর্বোচ্চ (দীর্ঘ তালিকা) list
8) লুপ আক্রমণকারী স্থাপন: স্থাপন আপনি প্রথম দিকে উভয় আঙ্গুলকে প্রথম উপাদানটিতে নির্দেশ করে লুপের আক্রমণকারীটি স্থাপন করেন।
9) প্রস্থান শর্ত: আপনার ডান আঙুলটি তালিকাটি অনুসরণ করা শেষ হলে আপনি সম্পন্ন হন।
10) সমাপ্তি: শেষ পর্যন্ত, আমরা জানি যে সমস্যাটি নিম্নরূপে সমাধান করা হয়েছে। প্রস্থান প্রস্থান অনুসারে, আপনার ডান আঙুলটি সমস্ত প্রবেশের মুখোমুখি হয়েছে। লুপ আক্রমণকারী দ্বারা, আপনার বাম আঙুলটি এর সর্বাধিক পয়েন্ট করে। এই এন্ট্রি ফিরে।
11) সমাপ্তি এবং চলমান সময়: প্রয়োজনীয় সময়টি তালিকার দৈর্ঘ্যের কিছু ধ্রুবক বার।
12) বিশেষ কেস: যখন একই মান সহ একাধিক এন্ট্রি থাকে বা এন = 0 বা এন = 1 হয় তখন কী হয় তা পরীক্ষা করে দেখুন।
13) কোডিং এবং বাস্তবায়নের বিশদ: ...
14) আনুষ্ঠানিক প্রমাণ: অ্যালগরিদমের যথার্থতা উপরের পদক্ষেপগুলি থেকে অনুসরণ করে।
এটি লক্ষ করা উচিত যে একটি লুপ ইনভারেন্টেন্ট পুনরাবৃত্ত আলগোরিদিমগুলির নকশায় সহায়তা করতে পারে যখন একটি দৃser়তা বিবেচিত হয় যা ভেরিয়েবলগুলির মধ্যে গুরুত্বপূর্ণ সম্পর্ককে প্রকাশ করে যা প্রতিটি পুনরুক্তির শুরুতে সত্য হওয়া আবশ্যক এবং যখন লুপটি সমাপ্ত হয়। এটি যদি ধরে রাখে, গণনা কার্যকারিতার পথে on যদি মিথ্যা হয়, তবে অ্যালগরিদম ব্যর্থ হয়েছে।
এই ক্ষেত্রে আক্রমণকারী মানে এমন একটি শর্ত যা প্রতিটি লুপ পুনরাবৃত্তির একটি নির্দিষ্ট সময়ে সত্য হওয়া উচিত।
চুক্তি প্রোগ্রামিংয়ে, কোনও আক্রমণকারী হ'ল একটি শর্ত যা অবশ্যই কোনও পাবলিক পদ্ধতির বলা হওয়ার আগে এবং পরে সত্য হওয়া উচিত (চুক্তি অনুসারে)।
লুপ ইনভেরেন্ট সম্পত্তি হ'ল একটি শর্ত যা লুপের কার্যকরকরণের প্রতিটি ধাপকে ধরে রাখে (যেমন লুপগুলির জন্য, যখন লুপগুলি ইত্যাদি) holds
এটি একটি লুপ ইনভেরিয়েন্ট প্রুফের জন্য প্রয়োজনীয়, যেখানে কেউ এটি দেখাতে সক্ষম হয় যে যদি একটি আলগোরিদম সঠিকভাবে কার্যকর করে তবে যদি তার কার্য সম্পাদনের প্রতিটি পদক্ষেপে এই লুপের অদম্য সম্পত্তি থাকে।
অ্যালগরিদমটি সঠিক হওয়ার জন্য, লুপ ইনভায়রেন্ট অবশ্যই ধরে রাখতে হবে:
সূচনা (সূচনা)
রক্ষণাবেক্ষণ (প্রতিটি পদক্ষেপের পরে)
সমাপ্তি (এটি শেষ হয়ে গেলে)
এটি একগুচ্ছ জিনিসগুলি মূল্যায়নের জন্য ব্যবহৃত হয়, তবে এর সর্বোত্তম উদাহরণ হ'ল গ্রাফ ট্র্যাভারসাল সম্পর্কিত লোভিত অ্যালগরিদম। একটি লোভী অ্যালগরিদম একটি সর্বোত্তম সমাধান (গ্রাফ জুড়ে একটি পথ) আনার জন্য, এটি অবশ্যই সর্বনিম্ন ওজনের পথে সমস্ত নোডের সাথে সংযোগ স্থাপন করতে হবে।
সুতরাং, লুপ আক্রমণকারী সম্পত্তি হ'ল পথটির কমপক্ষে ওজন রয়েছে। শুরুতে আমরা কোনও প্রান্ত যোগ করি নি, সুতরাং এই সম্পত্তিটি সত্য (এটি মিথ্যা নয়, এক্ষেত্রে )। এ প্রতিটি পদক্ষেপ , আমরা সর্বনিম্ন ওজন প্রান্ত (লোভী পদক্ষেপ) অনুসরণ, তাই আবার আমরা সর্বনিম্ন ওজন পথ গ্রহণ করছেন। এ শেষ , আমরা আমাদের সম্পত্তি সত্য সর্বনিম্ন ভরযুক্ত পথ খুঁজে পেয়েছি।
যদি একটি অ্যালগরিদম এটি না করে তবে আমরা প্রমাণ করতে পারি যে এটি অনুকূল নয়।
লুপগুলি দিয়ে কী ঘটছে তা ট্র্যাক করা শক্ত। যে লুপগুলি লক্ষ্য লক্ষ্য অর্জন না করেই শেষ বা অবসান হয় না কম্পিউটার প্রোগ্রামিংয়ে এটি একটি সাধারণ সমস্যা। লুপ আক্রমণকারীদের সহায়তা করে। একটি লুপ আক্রমণকারী হ'ল আপনার প্রোগ্রামের ভেরিয়েবলের মধ্যে সম্পর্ক সম্পর্কে একটি আনুষ্ঠানিক বিবৃতি যা লুপটি চালানোর ঠিক আগে চালিত হয় (আক্রমণকারী প্রতিষ্ঠা করে) এবং লুপের নীচে আবার সত্য হয়, প্রতিটি সময় লুপের মাধ্যমে (আক্রমণকারীকে বজায় রাখা) )। আপনার কোডে লুপ ইনভায়রেন্টগুলির ব্যবহারের সাধারণ প্যাটার্নটি এখানে:
... // লুপ পরিবর্তিত এখানে অবশ্যই সঠিক হতে হবে
যখন (টেস্ট শর্ত) {
// লুপ উপরের
...
// লুপ নীচে
// লুপ পরিবর্তিত এখানে অবশ্যই সঠিক হতে হবে
}
// সমাপন + + লুপ পরিবর্তিত = লক্ষ্য
...
লুপটির শীর্ষ এবং নীচের মাঝে অগ্রভাগটি সম্ভবত লুপের লক্ষ্যে পৌঁছানোর দিকে তৈরি করা হচ্ছে। এটি আক্রমণকারীকে বিরক্ত করতে পারে (মিথ্যা করতে পারে)। লুপ আক্রমণকারীদের পয়েন্ট হ'ল প্রতিশ্রুতি যে প্রতিবার লুপ বডিটি পুনরাবৃত্তি করার আগে আক্রমণকারী পুনরুদ্ধার করা হবে। এর দুটি সুবিধা রয়েছে:
কাজ জটিল, তথ্য নির্ভর উপায়ে পরবর্তী পাসের দিকে এগিয়ে যায় না। একে অপরকে স্বতন্ত্রভাবে লুপ দিয়ে প্রতিটি পাস করে, আক্রমণকারীরা পাসগুলিকে এক সাথে কাজ করার জন্য পরিবেশন করে serving আপনার লুপটি কাজ করে এমন যুক্তিটি হ্রাস পেয়েছে যে লুপের মধ্যবর্তী প্রতিটি পাসের সাথে লুপ ইনগ্রেন্টটি পুনরুদ্ধার করা হয়েছে। এটি লুপটির জটিল সামগ্রিক আচরণকে ছোট ছোট ছোট পদক্ষেপে বিভক্ত করে, যার প্রতিটি পৃথকভাবে বিবেচনা করা যেতে পারে। লুপের পরীক্ষার শর্তটি আক্রমণকারীটির অংশ নয়। এটি লুপটি শেষ করে দেয়। আপনি আলাদাভাবে দুটি জিনিস বিবেচনা করুন: কেন লুপটি কখনই শেষ করা উচিত এবং লুপটি শেষ হয়ে গেলে কেন তার লক্ষ্য অর্জন করে। লুপটি সমাপ্ত হবে যদি প্রতিবার লুপের মাধ্যমে আপনি সমাপ্তির শর্তটি সন্তুষ্ট করার কাছাকাছি চলে যান। এটি নিশ্চিত করা প্রায়শই সহজ: যেমন eg একটি নির্দিষ্ট উপরের সীমা না পৌঁছানো অবধি কাউন্টের ভেরিয়েবল পদক্ষেপ। কখনও কখনও সমাপ্তির পিছনে যুক্তি আরও কঠিন।
লুপ আক্রমণকারী তৈরি করা উচিত যাতে যখন সমাপ্তির শর্তটি হয় এবং আক্রমণকারীটি সত্য হয়, তবে লক্ষ্যটি পৌঁছে যায়:
আক্রমণকারী + সমাপ্তি => লক্ষ্য
এটি এমন সহজলভ্য এবং সম্পর্কিত যেগুলি সমাপ্তি ব্যতীত সমস্ত লক্ষ্য অর্জন অর্জন করে inv লুপ আক্রমণকারীদের প্রকাশ করার জন্য গাণিতিক চিহ্নগুলি ব্যবহার করা ভাল তবে এটি যখন জটিল পরিস্থিতিগুলির দিকে নিয়ে যায় আমরা স্পষ্ট গদ্য এবং সাধারণ জ্ঞানের উপর নির্ভর করি।
দুঃখিত, আমি মন্তব্য অনুমতি নেই।
@ টমাস পেট্রিসেক যেমন আপনি উল্লেখ করেছেন
দুর্বল আক্রমণকারী যা সত্য তা হ'ল i> = 0 && i <10 (কারণ এটি ধারাবাহিকতা শর্ত!) "
এটি কেমন লুপ আক্রমণকারী?
আমি আশা করি আমি ভুল নই, যতদূর আমি বুঝতে পেরেছি [1] লুপের আক্রমণকারীটি লুপ (ইনিশিয়ালাইজেশন) এর শুরুতে সত্য হবে, প্রতিটি পুনরুক্তির (রক্ষণাবেক্ষণ) এর আগে এবং পরে এটি সত্য হবে এবং পরে এটিও সত্য হবে লুপের সমাপ্তি (সমাপ্তি) । তবে সর্বশেষ পুনরাবৃত্তির পরে আমি দশে পরিণত হয়েছি i সুতরাং, শর্তটি i> = 0 && i <10 হয়ে যায় এবং লুপটি বন্ধ করে দেয়। এটি লুপ ইনগ্রেন্টের তৃতীয় সম্পত্তি (সমাপ্তি) লঙ্ঘন করে।
[1] http://www.win.tue.nl/~kbuchin/teaching/JBP030/notebooks/loop-invariants.html
লুপ আক্রমণকারী একটি গাণিতিক সূত্র যেমন (x=y+1)
। এই উদাহরণে, x
এবং y
একটি লুপ দুটি ভেরিয়েবল প্রতিনিধিত্ব করুন। কোডটি কার্যকর করার সময় এই পরিবর্তনশীলগুলির পরিবর্তিত আচরণ বিবেচনা করে, সমস্ত সম্ভাব্য x
এবং y
মানগুলির পরীক্ষা করা এবং তারা কোনও ত্রুটি উত্পন্ন করে কিনা তা দেখতে প্রায় অসম্ভব । বলুন x
একটি পূর্ণসংখ্যা হয়। পূর্ণসংখ্যা মেমরিতে 32 বিট স্থান ধরে রাখতে পারে। যদি সংখ্যাটি অতিক্রম করে, বাফার ওভারফ্লো ঘটে। সুতরাং আমাদের নিশ্চিত হওয়া দরকার যে কোডটি কার্যকর করার সময় এটি কখনই সেই জায়গার বেশি হয় না। তার জন্য, আমাদের একটি সাধারণ সূত্র বুঝতে হবে যা ভেরিয়েবলের মধ্যে সম্পর্ক প্রদর্শন করে। সর্বোপরি, আমরা কেবল প্রোগ্রামটির আচরণটি বোঝার চেষ্টা করি।
একটি লুপ আক্রমণকারী একটি দৃser়তা যা লুপের প্রয়োগের আগে এবং পরে সত্য।
লিনিয়ার সন্ধানে (বইয়ে দেওয়া অনুশীলন অনুসারে), প্রদত্ত অ্যারেতে আমাদের V এর সন্ধান করতে হবে।
0 <= k <দৈর্ঘ্য থেকে অ্যারের স্ক্যান করা এবং প্রতিটি উপাদানকে তুলনা করার মতো এটি সহজ। যদি ভি খুঁজে পাওয়া যায় বা স্ক্যানিং যদি অ্যারের দৈর্ঘ্যে পৌঁছায় তবে লুপটি বন্ধ করুন।
উপরের সমস্যায় আমার বোঝা অনুসারে-
লুপ ইনভেরেন্টস (ইনিশিয়ালাইজেশন): কে - 1 পুনরাবৃত্তিতে ভি পাওয়া যায় না। খুব প্রথম পুনরাবৃত্তি, এটি -1 হবে সুতরাং আমরা বলতে পারি ভি -1 পজিশনে পাওয়া যায়নি -1
রক্ষণাবেক্ষণ: পরবর্তী পুনরাবৃত্তিতে, কে -1 এ পাওয়া যায়নি V সত্য
সমাপ্তি: কে পজিশনে ভি ভি পাওয়া গেলে বা কে অ্যারের দৈর্ঘ্যে পৌঁছায়, লুপটি সমাপ্ত করুন।