কীভাবে অ্যালগরিদমগুলি বর্ণনা করবেন, সেগুলি প্রমাণ এবং বিশ্লেষণ করুন?


20

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

TAOCP ইংরেজি পদক্ষেপ এবং সঙ্গে মিশিয়ে ব্যবহার এতে যান অ্যালগরিদম বর্ণনা করতে, এবং ব্যবহার চার্ট প্রবাহিত অ্যালগরিদম আরো নির্দ্ধিধায় ছবি। এটি নিম্ন-স্তরের বলে মনে হচ্ছে তবে আমি দেখতে পাচ্ছি যে এর কিছু সুবিধা রয়েছে, বিশেষত ফ্লো চার্ট সহ, যা আমি অনেক উপেক্ষা করেছি। গণনাটি সেই তীরটিকে অনুসরণ করে এমন সময়কার বর্তমান অবস্থার বিষয়ে একটি দৃser়তার সাথে আমরা প্রত্যেকটি তীরকে লেবেল করতে পারি এবং অ্যালগরিদমের জন্য একটি প্ররোচিত প্রমাণ তৈরি করতে পারি। লেখক বলেছেন:

এটি লেখকের যুক্তি যা আমরা সত্যই বুঝতে পারি যে কেন একটি অ্যালগরিদম বৈধ হয় কেবল যখন আমরা এই পর্যায়ে পৌঁছে যাই যে আমাদের মনগুলি স্পষ্টভাবে সমস্ত দৃ as়পদ পূরণ করেছে, যেমন চিত্র 4-তে করা হয়েছিল।

আমি এই জাতীয় জিনিস অভিজ্ঞতা না। আরেকটি সুবিধা হ'ল, আমরা প্রতিটি পদক্ষেপ সম্পাদিত হওয়ার সময় গণনা করতে পারি। কার্চফের প্রথম আইনটি দিয়ে পরীক্ষা করা সহজ। আমি চলমান সময়টি বিশ্লেষণ করে দেখিনি, তাই যখন আমি চলমান সময়টি অনুমান করছিলাম তখন কিছু বাদ দেওয়া যেতে পারে।±1

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

এবং আমি জানতে চাই কী কী স্টাইলের বিবরণ মূলত গবেষণা কাজে ব্যবহৃত হয় এবং কীভাবে এই সমস্যাগুলি চিকিত্সা করা যায়।


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

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

1
@Raphael আমার অভ্যাস মানে যে গবেষণা কাজের অভ্যাস , না প্রোগ্রামিং
ইয়েফফাহ

@Frank, আপনি কি বোঝাতে চাচ্ছেন ভ্যারিয়েন্স ? আমার পারফরম্যান্স পরীক্ষাগুলি আমাকে সময় পরিবর্তনের সুযোগ দেয়।
এডিএ-কিএ মার্ট-ওরা-y

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

উত্তর:


18

সম্ভাব্য পন্থাগুলির একটি বিস্তৃত রয়েছে। কোনটি সবচেয়ে উপযুক্ত তার উপর নির্ভর করে

  • কি আপনাকে দেখাতে চেষ্টা করছেন,
  • আপনি কতটা বিশদ চান বা প্রয়োজন

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

আমি আপনাকে সুপরিচিত অ্যালগরিদম মার্জেসোর্টের জন্য তিনটি উদাহরণ দেব যা আশা করি এটি চিত্রিত করে।

উচ্চস্তর

অ্যালগরিদম Mergesort একটি তালিকা নিয়েছে, এটি দুটি (প্রায়) সমান দীর্ঘ অংশে বিভক্ত হয়, সেই আংশিক তালিকায় পুনরাবৃত্তি করে এবং (সাজানো) ফলাফলগুলিকে একত্রিত করে যাতে শেষের ফলাফলটি সাজানো হয়। সিঙ্গলটন বা খালি তালিকায় এটি ইনপুট দেয়।

এই অ্যালগরিদম স্পষ্টতই একটি সঠিক বাছাই করা অ্যালগরিদম। তালিকাটি বিভক্ত করা এবং এটিকে মার্জ করা প্রতিটি সময়েই প্রয়োগ করা যেতে পারে , যা আমাদের সবচেয়ে খারাপ ক্ষেত্রে রানটাইম টি ( এন ) = 2 টি ( এন ) এর পুনরাবৃত্তি দেয়Θ(এন)। মাস্টার উপপাদ্য দ্বারা এটিটি(এন)Θ(এনলগএন) এমূল্যায়ন করে।টি(এন)=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 । আনয়ন হাইপোথিসিস দ্বারা, এবং (কম হ্রাস না করে) প্রথম শ্রমের সংস্করণ অনুসারে বাছাই করুন। পুনরাবৃত্তির কল পরে এল দ্বিতীয়ার্ধ । অতএব, প্রতিটি পুনরাবৃত্তিতে লুপটি নির্বাচন করে ক্ষুদ্রতম উপাদান এখনও তদন্ত করেনি এবং এটিকে যুক্ত করে ; এইভাবে একটি অ ক্রমবর্ধমান সাজানো তালিকা থেকে সমস্ত উপাদান রয়েছেএনএন>1এলএন+ +1leftrightএলwhileresultresultleftএবং right। বিপরীত একটি অ decreasingly সাজানো সংস্করণ আর কাঙ্খিত - - ফলাফল, যা ফিরিয়ে দেওয়া হয়।এল

রানটাইম হিসাবে, আসুন আমরা উপাদানগুলির তুলনা এবং তালিকার ক্রিয়াকলাপগুলি গণনা করি (যা রানটাইমকে অ্যাসিম্পোটোটিকভাবে প্রাধান্য দেয়)। দৈর্ঘ্যের কম দুটিয়েরও কম কারণগুলির তালিকা রয়েছে। দৈর্ঘ্য তালিকাগুলির জন্য , আমাদের পুনরাবৃত্ত কলগুলির জন্য ইনপুটগুলি প্রস্তুত করার কারণে সেই ক্রিয়াকলাপগুলি ঘটেছে, পুনরাবৃত্তিকারীরা নিজেরাই কলস এবং লুপ এবং একটি কল করে । উভয় পুনরাবৃত্তির পরামিতি প্রতিটি সর্বাধিক n তালিকা ক্রিয়াকলাপের সাথে গণনা করা যেতে পারে । লুপ ঠিক মৃত্যুদন্ড কার্যকর করা হয় এন সর্বাধিক একটি উপাদান তুলনা সময়ে এবং প্রতি পুনরাবৃত্তির কারণ ও ঠিক দুই তালিকা অপারেশন। চূড়ান্ত 2 এন ব্যবহার করতে প্রয়োগ করা যেতে পারেএন>1whilereverseএনwhileএনreverse2এনতালিকা অপারেশন - প্রতিটি উপাদান ইনপুট থেকে সরানো হয় এবং আউটপুট তালিকায় রাখে। সুতরাং, অপারেশন গণনা নিম্নলিখিত পুনরাবৃত্তি পূরণ করে:

T(0)=T(1)=0T(n)T(n2)+T(n2)+7এন

যেহেতু স্পষ্টভাবে অ-হ্রাস পাচ্ছে তাই অ্যাসিপোটোটিক বৃদ্ধির জন্য এন = 2 কে বিবেচনা করা যথেষ্ট । এই ক্ষেত্রে , পুনরাবৃত্তিটি সরল করেটিএন=2

T(0)=T(1)=0T(n)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=f1=0fn=fn2+fn2+en

যেখানে আংশিক ফলাফলগুলি মার্জ করার জন্য প্রয়োজনীয় তুলনার সংখ্যা ² মেঝে এবং সিলগুলি পরিত্রাণ পেতে, আমরা n সমান কিনা সেটির ক্ষেত্রে কেস পার্থক্যটি সম্পাদন করি :enn

{f2m=2fm+e2mf2m+1=fm+fm+1+e2m+1

নেস্টেড ফরোয়ার্ড / এবং এন এর পিছনে পার্থক্যগুলি ব্যবহার করে আমরা এটি পাই getfnen

k=1n1(nk)Δfk=fnnf1

যোগফল পেরনের সূত্রের ডান হাতের সাথে মেলে । আমরা সংজ্ঞায়িত Dirichlet উৎপাদিত সিরিজ এর যেমনΔfk

W(s)=k1Δfkks=112sk1Δekks=: (s)

যা পেরনের সূত্রের সাথে একসাথে আমাদের নিয়ে যায়

fn=nf1+n2πi3i3+i(s)ns(12s)s(s+1)ds

এর মূল্যায়ন নির্ভর করে কোন ক্ষেত্রে বিশ্লেষণ করা হয়েছে। তা ছাড়া, আমরা - কিছু কৌতুকপূর্ণ পরে - পেতে অবশিষ্টাংশের উপপাদ্য প্রয়োগ করতে পারি(s)

fnnlog2(n)+nA(log2(n))+1

যেখানে হল পর্যায়ক্রমিক ফাংশন যেখানে [ - 1 , - 0.9 ] এর মান রয়েছে ।A[1,0.9]


  1. মেলিন রূপান্তর ও অ্যাসিপটিক্স: ফ্লাজোলেট এবং গোলিন দ্বারা একীভূত পুনরাবৃত্তি (1992)
  2. en=n2
    en=n1
    en=nn2n2+1n2n2+1

My question of running-time-analysis is that, how to determine α and β exactly T(n)=T(n/2)+T(n/2)+αn+β, which is close to practice (e.g, it's availabe to compare merge-sort and qsort).
Yai0Phah

@Frank: The short answer is You can't; the constants depend on implementation details—including the machine architecture, language, and compiler—that are immaterial to the underlying algorithm.
JeffE

@JeffE I have to claim that, the α and β should only be exact enough to do some comparison. More briefly, a mathematical model which can do a lot of works, without machine languages, to determine the constants.
Yai0Phah

@JeffE for example, the MIX/MMIX in taocp is, but it's too hard to translate an algorithm to such a machine language.
Yai0Phah

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

3

Dijkstra এর "প্রোগ্রামিং এর একটি শৃঙ্খলা" সব বিশ্লেষণ এবং প্রতিপাদন আলগোরিদিম ও provability জন্য নকশা সম্পর্কে। এই বইয়ের প্রবন্ধে, ডিজকস্ট্রা ব্যাখ্যা করেছেন যে কীভাবে খুব সাধারণভাবে নির্মিত একটি মিনি-ভাষা যথাযথভাবে বিশ্লেষণের জন্য ডিজাইন করা হয়েছে যা বহু অ্যালগরিদমকে আনুষ্ঠানিকভাবে ব্যাখ্যা করতে পারে:

এই জাতীয় কোনও বই শুরু করার সাথে সাথে একজনকে তাত্ক্ষণিকভাবে এই প্রশ্নের মুখোমুখি হতে হয়: "আমি কোন প্রোগ্রামিংয়ের ভাষা ব্যবহার করব?", এবং এটি নয়উপস্থাপনের নিছক প্রশ্ন! একটি সর্বাধিক গুরুত্বপূর্ণ, তবে একটি অতি मायाশীল, যে কোনও সরঞ্জামের দিকটি হ'ল এটির ব্যবহারের জন্য নিজেকে প্রশিক্ষণ দেওয়ার অভ্যাসগুলির উপর প্রভাব। যদি সরঞ্জামটি একটি প্রোগ্রামিং ভাষা হয় তবে এই প্রভাবটি হ'ল - আমরা এটি পছন্দ করি বা না - আমাদের চিন্তাভাবনার উপর একটি প্রভাব। আমার জ্ঞানের সর্বাধিক প্রভাবটির বিশ্লেষণ করে, আমি এই সিদ্ধান্তে পৌঁছেছি যে বিদ্যমান প্রোগ্রামিং ভাষা বা সেগুলির একটি উপসর্গের কোনওটিই আমার উদ্দেশ্য অনুসারে নয়; অন্যদিকে আমি নিজেকে নতুন প্রোগ্রামিং ভাষার নকশার জন্য এতটা প্রস্তুত জানতাম যে আমি পরের পাঁচ বছরের জন্য এটি না করার প্রতিশ্রুতি নিয়েছিলাম এবং আমার একটি স্পষ্ট অনুভূতি হয়েছিল যে সেই সময়টি এখনও কাটেনি! (তার আগে, আরও অনেক কিছুর মধ্যে এই মনোগ্রাফটি লিখতে হয়েছিল।

পরে তিনি ব্যাখ্যা করেন যে তিনি তার মিনি-ভাষা পেতে কতটা ছোট পরিচালনা করেছিলেন।

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

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