সম্ভাব্য পন্থাগুলির একটি বিস্তৃত রয়েছে। কোনটি সবচেয়ে উপযুক্ত তার উপর নির্ভর করে
- কি আপনাকে দেখাতে চেষ্টা করছেন,
- আপনি কতটা বিশদ চান বা প্রয়োজন
যদি অ্যালগোরিদম একটি বিস্তৃত পরিচিত যা আপনি সাবরুটাইন হিসাবে ব্যবহার করেন তবে আপনি প্রায়শই উচ্চতর স্তরে থাকেন। যদি তদন্তের অধীনে অ্যালগোরিদম মূল বিষয় হয় তবে আপনি সম্ভবত আরও বিশদ হতে চান। বিশ্লেষণের ক্ষেত্রেও একই কথা বলা যেতে পারে: আপনার যদি ওপরের রানটাইম বাউন্ডের প্রয়োজন হয় তবে আপনি যখন বিবৃতিটির সুনির্দিষ্ট গণনা চান তখন থেকে আলাদা হয়ে যান proceed
আমি আপনাকে সুপরিচিত অ্যালগরিদম মার্জেসোর্টের জন্য তিনটি উদাহরণ দেব যা আশা করি এটি চিত্রিত করে।
উচ্চস্তর
অ্যালগরিদম Mergesort একটি তালিকা নিয়েছে, এটি দুটি (প্রায়) সমান দীর্ঘ অংশে বিভক্ত হয়, সেই আংশিক তালিকায় পুনরাবৃত্তি করে এবং (সাজানো) ফলাফলগুলিকে একত্রিত করে যাতে শেষের ফলাফলটি সাজানো হয়। সিঙ্গলটন বা খালি তালিকায় এটি ইনপুট দেয়।
এই অ্যালগরিদম স্পষ্টতই একটি সঠিক বাছাই করা অ্যালগরিদম। তালিকাটি বিভক্ত করা এবং এটিকে মার্জ করা প্রতিটি সময়েই প্রয়োগ করা যেতে পারে , যা আমাদের সবচেয়ে খারাপ ক্ষেত্রে রানটাইম টি ( এন ) = 2 টি ( এন ) এর পুনরাবৃত্তি দেয়Θ ( এন )। মাস্টার উপপাদ্য দ্বারা এটিটি(এন)∈Θ(এনলগএন) এমূল্যায়ন করে।টি( n ) = 2 টি( এন)2) +Θ(এন)টি( এন ) ∈ Θ ( এন লগএন )
মধ্যম সারির
নিম্নলিখিত সিউডো কোড দ্বারা অ্যালগরিদম Mergesort দেওয়া হয়েছে:
procedure mergesort(l : List) {
if ( l.length < 2 ) {
return l
}
left = mergesort(l.take(l.length / 2)
right = mergesort(l.drop(l.length / 2)
result = []
while ( left.length > 0 || right.length > 0 ) {
if ( right.length == 0 || (left.length > 0 && left.head <= right.head) ) {
result = left.head :: result
left = left.tail
}
else {
result = right.head :: result
right = right.tail
}
}
return result.reverse
}
আমরা অন্তর্ভুক্তি দ্বারা সঠিকতা প্রমাণ। দৈর্ঘ্যের শূন্য বা একের তালিকার জন্য, অ্যালগরিদম তুচ্ছভাবে সঠিক। আনয়ন হাইপোথিসিস হিসেবে অনুমান mergesort
সর্বাধিক দৈর্ঘ্য তালিকা সঠিকভাবে সঞ্চালিত কিছু অবাধ জন্য, কিন্তু নির্দিষ্ট প্রাকৃতিক এন > 1 । এখন দিন এল দৈর্ঘ্য একটি তালিকা হতে এন + + 1 । আনয়ন হাইপোথিসিস দ্বারা, এবং (কম হ্রাস না করে) প্রথম শ্রমের সংস্করণ অনুসারে বাছাই করুন। পুনরাবৃত্তির কল পরে এল দ্বিতীয়ার্ধ । অতএব, প্রতিটি পুনরাবৃত্তিতে লুপটি নির্বাচন করে ক্ষুদ্রতম উপাদান এখনও তদন্ত করেনি এবং এটিকে যুক্ত করে ; এইভাবে একটি অ ক্রমবর্ধমান সাজানো তালিকা থেকে সমস্ত উপাদান রয়েছেএনn > 1এলn + 1left
right
এলwhile
result
result
left
এবং right
। বিপরীত একটি অ decreasingly সাজানো সংস্করণ আর কাঙ্খিত - - ফলাফল, যা ফিরিয়ে দেওয়া হয়।এল
রানটাইম হিসাবে, আসুন আমরা উপাদানগুলির তুলনা এবং তালিকার ক্রিয়াকলাপগুলি গণনা করি (যা রানটাইমকে অ্যাসিম্পোটোটিকভাবে প্রাধান্য দেয়)। দৈর্ঘ্যের কম দুটিয়েরও কম কারণগুলির তালিকা রয়েছে। দৈর্ঘ্য তালিকাগুলির জন্য , আমাদের পুনরাবৃত্ত কলগুলির জন্য ইনপুটগুলি প্রস্তুত করার কারণে সেই ক্রিয়াকলাপগুলি ঘটেছে, পুনরাবৃত্তিকারীরা নিজেরাই কলস এবং লুপ এবং একটি কল করে । উভয় পুনরাবৃত্তির পরামিতি প্রতিটি সর্বাধিক n তালিকা ক্রিয়াকলাপের সাথে গণনা করা যেতে পারে । লুপ ঠিক মৃত্যুদন্ড কার্যকর করা হয় এন সর্বাধিক একটি উপাদান তুলনা সময়ে এবং প্রতি পুনরাবৃত্তির কারণ ও ঠিক দুই তালিকা অপারেশন। চূড়ান্ত 2 এন ব্যবহার করতে প্রয়োগ করা যেতে পারেn > 1while
reverse
এনwhile
এনreverse
2 এনতালিকা অপারেশন - প্রতিটি উপাদান ইনপুট থেকে সরানো হয় এবং আউটপুট তালিকায় রাখে। সুতরাং, অপারেশন গণনা নিম্নলিখিত পুনরাবৃত্তি পূরণ করে:
টি(0)=T(1)T(n)=0≤T(⌈n2⌉)+T(⌊n2⌋)+7n
যেহেতু স্পষ্টভাবে অ-হ্রাস পাচ্ছে তাই অ্যাসিপোটোটিক বৃদ্ধির জন্য এন = 2 কে বিবেচনা করা যথেষ্ট । এই ক্ষেত্রে , পুনরাবৃত্তিটি সরল করেটিn = 2ট
T(0)=T(1)T(n)=0≤2T(n2)+7n
মাস্টার উপপাদ্য দ্বারা আমরা পাই যা রানটাইম পর্যন্ত প্রসারিত ।T∈Θ(nlogn)mergesort
আল্ট্রা নিম্ন স্তরের
ইসাবেল / এইচএল-তে Mergesort এর (সাধারণীকরণ) বাস্তবায়ন বিবেচনা করুন :
types dataset = "nat * string"
fun leq :: "dataset \<Rightarrow> dataset \<Rightarrow> bool" where
"leq (kx::nat, dx) (ky, dy) = (kx \<le> ky)"
fun merge :: "dataset list \<Rightarrow> dataset list \<Rightarrow> dataset list" where
"merge [] b = b" |
"merge a [] = a" |
"merge (a # as) (b # bs) = (if leq a b then a # merge as (b # bs) else b # merge (a # as) bs)"
function (sequential) msort :: "dataset list \<Rightarrow> dataset list" where
"msort [] = []" |
"msort [x] = [x]" |
"msort l = (let mid = length l div 2 in merge (msort (take mid l)) (msort (drop mid l)))"
by pat_completeness auto
termination
apply (relation "measure length")
by simp+
এর মধ্যে ইতিমধ্যে সু-সংজ্ঞা এবং সমাপ্তির প্রমাণ রয়েছে। এখানে একটি (প্রায়) সম্পূর্ণ নির্ভুলতার প্রমাণ সন্ধান করুন ।
"রানটাইম" এর জন্য, এটি তুলনার সংখ্যা, পূর্ববর্তী বিভাগের মতো একটি পুনরাবৃত্তি সেট আপ করা যায়। মাস্টার উপপাদ্যটি ব্যবহার করা এবং ধ্রুবকগুলি ভুলে যাওয়ার পরিবর্তে, আপনি এটির প্রায়শই পেতে বিশ্লেষণ করতে পারেন যা সত্য পরিমাণের সাথে সংশ্লেষগতভাবে সমান। আপনি সম্পূর্ণ বিশ্লেষণ [1] এ খুঁজে পেতে পারেন; এখানে মোটামুটি একটি রূপরেখা দেওয়া আছে (এটি প্রয়োজনীয়ভাবে ইসাবেল / এইচএল কোডটি ফিট করে না):
উপরে হিসাবে, তুলনা সংখ্যার জন্য পুনরাবৃত্তি
f0=f1fn=0=f⌈n2⌉+f⌊n2⌋+en
যেখানে আংশিক ফলাফলগুলি মার্জ করার জন্য প্রয়োজনীয় তুলনার সংখ্যা ² মেঝে এবং সিলগুলি পরিত্রাণ পেতে, আমরা n সমান কিনা সেটির ক্ষেত্রে কেস পার্থক্যটি সম্পাদন করি :enn
{f2mf2m+1=2fm+e2m=fm+fm+1+e2m+1
নেস্টেড ফরোয়ার্ড / এবং ই এন এর পিছনে পার্থক্যগুলি ব্যবহার করে আমরা এটি পাই getfnen
।∑k=1n−1(n−k)⋅Δ∇fk=fn−nf1
যোগফল পেরনের সূত্রের ডান হাতের সাথে মেলে । আমরা সংজ্ঞায়িত Dirichlet উৎপাদিত সিরিজ এর যেমনΔ∇fk
W(s)=∑k≥1Δ∇fkk−s=11−2−s⋅∑k≥1Δ∇ekks=: ⊟(s)
যা পেরনের সূত্রের সাথে একসাথে আমাদের নিয়ে যায়
।fn=nf1+n2πi∫3−i∞3+i∞⊟(s)ns(1−2−s)s(s+1)ds
এর মূল্যায়ন নির্ভর করে কোন ক্ষেত্রে বিশ্লেষণ করা হয়েছে। তা ছাড়া, আমরা - কিছু কৌতুকপূর্ণ পরে - পেতে অবশিষ্টাংশের উপপাদ্য প্রয়োগ করতে পারি⊟(s)
fn∼n⋅log2(n)+n⋅A(log2(n))+1
যেখানে হল পর্যায়ক্রমিক ফাংশন যেখানে [ - 1 , - 0.9 ] এর মান রয়েছে ।A[−1,−0.9]
- মেলিন রূপান্তর ও অ্যাসিপটিক্স: ফ্লাজোলেট এবং গোলিন দ্বারা একীভূত পুনরাবৃত্তি (1992)
- en=⌊n2⌋
en=n−1
en=n−⌊n2⌋⌈n2⌉+1−⌈n2⌉⌊n2⌋+1