নেস্টেড লুপগুলিকে খারাপ অভ্যাস হিসাবে বিবেচনা করা হয় কেন?


33

আমার প্রভাষক আজ উল্লেখ করেছিলেন যে জাভাতে "লেবেল" লুপ দেওয়া সম্ভব ছিল যাতে নেস্টেড লুপগুলি নিয়ে কাজ করার সময় আপনি তাদের উল্লেখ করতে পারেন। সুতরাং আমি বৈশিষ্ট্যটির সন্ধান করলাম কারণ এটি সম্পর্কে আমি জানতাম না এবং অনেক জায়গাতেই যেখানে এই বৈশিষ্ট্যটি ব্যাখ্যা করা হয়েছিল এটি একটি সতর্কতা অনুসরণ করেছিল, নেস্টেড লুপগুলি নিরুৎসাহিত করেছিল।

আমি আসলে বুঝতে পারছি না কেন? এটি কোডের পঠনযোগ্যতাকে প্রভাবিত করে বলেই কি? নাকি এটি আরও কিছু "প্রযুক্তিগত"?


4
যদি আমি আমার সিএস 3 কোর্সটি সঠিকভাবে মনে রাখি কারণ এটি প্রায়শই সূচকীয় সময়ের দিকে পরিচালিত করে যার অর্থ যদি আপনি একটি বড় ডেটা সেট পান তবে আপনার অ্যাপ্লিকেশনটি অকেজো হয়ে যাবে।
ট্র্যাভিস পেসেটো

21
সিএস প্রভাষকদের সম্পর্কে আপনার একটি জিনিস শিখতে হবে তা হ'ল তারা যা বলছেন তা বাস্তব বিশ্বে 100% প্রযোজ্য নয়। আমি লুপগুলি কয়েক গভীরের চেয়ে বেশি নীস্টে নিরুৎসাহিত করব, তবে যদি আপনার সমস্যা সমাধানের জন্য আপনাকে মি x এন উপাদানগুলি প্রসেস করতে হয় তবে আপনি সেইগুলি অনেকগুলি পুনরাবৃত্তি করতে যাচ্ছেন।
ব্লারফ্লায়

8
@ ট্র্যাভিসপেসেটো আসলে এটি এখনও বহুপদী জটিলতা - হে (এন ^ কে), কে নেস্টেড সংখ্যার হিসাবে, ঘনিষ্ঠ ও (কে ^ এন) নয়, যেখানে কে একটি ধ্রুবক।
m3th0dman

1
@ m3th0dman আমাকে সংশোধন করার জন্য ধন্যবাদ। আমার শিক্ষক এই বিষয়ে সেরা ছিল না। তিনি ও (এন ^ 2) এবং ও (কে ^ এন) কে একই ব্যবহার করেছিলেন।
ট্র্যাভিস পেসেটটো

2
নেস্টেড লুপগুলি সাইক্লোমেটিক জটিলতা বৃদ্ধি করে ( এখানে দেখুন ), যা কিছু লোকের মতে কোনও প্রোগ্রামের রক্ষণাবেক্ষণযোগ্যতা হ্রাস করে।
মার্কো

উত্তর:


62

নেস্টেড লুপগুলি যতক্ষণ না তারা সঠিক অ্যালগরিদম বর্ণনা করে ঠিক থাকে।

নেস্টেড লুপগুলির কার্যক্ষমতা বিবেচনা রয়েছে (@ ট্র্যাভিস-পেসেটোর উত্তর দেখুন) তবে কখনও কখনও এটি ঠিক সঠিক অ্যালগরিদম হয়, যেমন যখন আপনাকে ম্যাট্রিক্সের প্রতিটি মান অ্যাক্সেস করার প্রয়োজন হয়।

জাভাতে লেবেলিং লুপগুলি অল্প সময়ের মধ্যে বেশ কয়েকটি নেস্টেড লুপগুলি ভেঙে ফেলতে দেয় যখন এটি করার অন্যান্য উপায়গুলি অসুবিধে হয়। যেমন কিছু গেমের কোডের এই অংশটি থাকতে পারে:

Player chosen_one = null;
...
outer: // this is a label
for (Player player : party.getPlayers()) {
  for (Cell cell : player.getVisibleMapCells()) {
    for (Item artefact : cell.getItemsOnTheFloor())
      if (artefact == HOLY_GRAIL) {
        chosen_one = player;
        break outer; // everyone stop looking, we found it
      }
  }
}

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


2
সাইড নোট গ্রাফিক্স যেমন একটি অ্যালগরিদম ব্যবহার করে যা ম্যাট্রিক্সের প্রতিটি টুকরো অ্যাক্সেস করতে পারে। তবে, সময় সাশ্রয়ী পদ্ধতিতে এটি পরিচালনা করার জন্য জিপিইউ বিশেষায়িত is
ট্র্যাভিস পেসেটটো

হ্যাঁ, জিপিইউ ব্যাপকভাবে সমান্তরাল উপায়ে এটি করে; প্রশ্নটি ফাঁসির একক থ্রেড সম্পর্কে ছিল, আমি মনে করি।
9000

2
লেবেলগুলি সন্দেহ হওয়ার প্রবণতার একটি কারণ হ'ল প্রায়শই বিকল্প রয়েছে। এই ক্ষেত্রে আপনি পরিবর্তে ফিরে আসতে পারে।
jgmjgm

22

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

উদাহরণস্বরূপ, যদি আপনার তালিকার A তালিকায় 100 টি আইটেম এবং 100 টি তালিকায় বি রয়েছে, এবং আপনি জানেন যে তালিকার A এর প্রতিটি আইটেমের সাথে তালিকার বি তালিকার একটি আইটেম এটির সাথে মেলে, ("ম্যাচ" এর সংজ্ঞাটি ইচ্ছাকৃতভাবে অস্পষ্ট রেখে দেওয়া হয়েছে এখানে) এবং আপনি জোড়ার একটি তালিকা উত্পাদন করতে চান, এটি করার সহজ উপায়টি এটির মতো:

for each item X in list A:
  for each item Y in list B:
    if X matches Y then
      add (X, Y) to results
      break

প্রতিটি তালিকায় 100 টি আইটেম রয়েছে, এটি গড়ে 100 * 100/2 (5,000) matchesক্রিয়াকলাপ গ্রহণ করবে। আরও আইটেম সহ, বা যদি 1: 1 পারস্পরিক সম্পর্কের নিশ্চয়তা না পাওয়া যায় তবে তা আরও ব্যয়বহুল হয়ে যায়।

অন্যদিকে, অপারেশন করার মতো আরও দ্রুত উপায় রয়েছে:

sort list A
sort list B (according to the same sort order)
I = 0
J = 0
repeat
  X = A[I]
  Y = B[J]
  if X matches Y then
    add (X, Y) to results
    increment I
    increment J
  else if X < Y then
    increment I
  else increment J
until either index reaches the end of its list

আপনি যদি এইভাবে এটি করেন তবে matchesভিত্তিতে পরিচালিত সংখ্যার পরিবর্তে length(A) * length(B)এটি এখন ভিত্তিক length(A) + length(B), যার অর্থ আপনার কোডটি আরও দ্রুত চলবে।


10
বাছাইয়ের ব্যবস্থাটি O(n log n)যদি কুইকসোর্ট ব্যবহার করা হয় তবে দ্বিগুণ, সময় বাছাইয়ের সেটআপটি একটি অপ্রয়োজনীয় পরিমাণ সময় নেয় ।
রবার্ট হার্ভে

@ রবার্টহারভে: অবশ্যই তবে এটি O(n^2)এন এর ক্ষুদ্র মানগুলির চেয়ে এখনও অনেক কম
ম্যাসন হুইলারের

10
অ্যালগরিদমের দ্বিতীয় সংস্করণটি সাধারণত ভুল। প্রথমত, ধরে নেওয়া হয় যে এক্স এবং ওয়াই <অপারেটরের মাধ্যমে তুলনীয় , যা সাধারণত matchesঅপারেটর থেকে উত্পন্ন করা যায় না । দ্বিতীয়ত, এক্স এবং ওয়াই উভয়ই সংখ্যাসূচক হলেও ২ য় অ্যালগরিদম এখনও ভুল ফলাফল দিতে পারে, উদাহরণস্বরূপ যখন X matches Yহয় X + Y == 100
পাশা

9
@ ব্যবহারকারী 958624: স্পষ্টতই এটি একটি সাধারণ অ্যালগরিদমের খুব উচ্চ-স্তরের ওভারভিউ। "ম্যাচগুলি" অপারেটরের মতো, "<" এমন কোনও উপায়ে সংজ্ঞা দিতে হবে যা উপাত্তের সাথে তুলনা করার প্রসঙ্গে সঠিক। এটি যদি সঠিকভাবে করা হয় তবে ফলাফলগুলি সঠিক হবে।
ম্যাসন হুইলার

পিএইচপি সর্বশেষের মতো এমন কিছু করেছিল যা আমি মনে করি তার অ্যারের সাথে অনন্য এবং / অথবা এর বিপরীতে। লোকেরা পরিবর্তে কেবল পিএইচপি এর অ্যারে ব্যবহার করবে যা হ্যাশ ভিত্তিক এবং এটি আরও দ্রুত হবে।
jgmjgm

11

বাসা বাঁধে এড়ানোর এক কারণ হ'ল বাসা বাঁধা কাঠামো কাঠামোগত করা খুব খারাপ ধারণা, তারা লুপ কিনা তা নির্বিশেষে।

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

নেস্টেড লুপগুলি তুলনামূলকভাবে দ্রুত বুঝতে অসুবিধা পেতে পারে, যদিও কিছু লুপের বাসা ঠিক আছে - সরবরাহ করে, অন্যরা উল্লেখ করেছেন, এর অর্থ এই নয় যে আপনি অত্যন্ত (এবং অপ্রয়োজনীয়) ধীর অ্যালগরিদম ব্যবহার করে পারফরম্যান্স ইস্যু তৈরি করছেন।

আসলে, অযৌক্তিকভাবে ধীর পারফরম্যান্সের সীমা পেতে আপনার নেস্টেড লুপের দরকার নেই। উদাহরণস্বরূপ, একটি একক লুপ বিবেচনা করুন যা প্রতিটি পুনরাবৃত্তির মধ্যে একটি সারি থেকে একটি আইটেম নেয়, তারপরে সম্ভবত বেশ কয়েকটি পিছনে রাখে - যেমন কোনও গোলকধাঁধার প্রস্থ-প্রথম অনুসন্ধান search পারফরম্যান্সটি লুপের নেস্টিংয়ের গভীরতার দ্বারা স্থির হয় না (যা কেবলমাত্র 1) তবে অবশেষে অবসন্ন হওয়ার আগে এই সারিতে যে আইটেমগুলি রাখা হয় তার সংখ্যা দ্বারা ( যদি এটি কখনও নিঃশেষ হয়ে যায়) - কতটা বড় পৌঁছনীয় অংশ গোলকধাঁধা হয়।


1
আপনি খুব সহজেই কেবল নেস্টেড লুপটি সমতল করতে পারেন এবং এটি একই সময় নেয়। 0 থেকে প্রস্থের জন্য নিন; উচ্চতা 0 থেকে; পরিবর্তে আপনি উচ্চতা 0 থেকে প্রস্থের উচ্চতার জন্য রেখে দিতে পারেন।
jgmjgm

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

আমি এটি করার মতো একটি ভাল জিনিস হিসাবে পরামর্শ দিচ্ছি না তবে দুটি লুপকে একটিতে পরিণত করা ঠিক কত আশ্চর্যজনক বিষয় হতে পারে তবে সময়ের জটিলতায় এখনও তার প্রভাব পড়েনি।
jgmjgm

7

অনেক নেস্টেড লুপের ক্ষেত্রে আপনি বহুপদী সময় শেষ করেন। উদাহরণস্বরূপ এই সিউডো কোডটি দেওয়া হয়েছে:

set i equal to 1
while i is not equal to 100
  increment i
  set j equal to 1
  while j is not equal to i
    increment j
  end
 end

এটি O (n ^ 2) সময় হিসাবে বিবেচিত হবে যা গ্রাফের মতো হবে: এখানে চিত্র বর্ণনা লিখুন

যেখানে y- অক্ষ আপনার প্রোগ্রামটি শেষ হতে সময় নেয় এবং x- অক্ষ হ'ল ডেটার পরিমাণ।

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


10
আপনি আপনার গ্রাফটি পুনরায় নির্ধারণ করতে ইচ্ছুক হতে পারেন: এটি তাত্ক্ষণিকভাবে বক্ররেখার নয়, পুনরাবৃত্তিও ও (এন log 2) থেকে স্টাফ ও (এন লগ এন) তৈরি করে না
র‌্যাচেট ফ্রিক

5
পুনরাবৃত্তির জন্য আমার দুটি শব্দ "স্ট্যাক" এবং "ওভারফ্লো" রয়েছে
ম্যাটিউজ

10
আপনার বক্তব্য যে পুনরাবৃত্তি একটি O (n ^ 2) অপারেশন হ্রাস করতে পারে একটি O (n লগ এন) এর মূলত ভুল। পুনরাবৃত্তভাবে বনাম পুনরাবৃত্তভাবে একই অ্যালগরিদম প্রয়োগ করা হয়েছে একই বিগ-ও সময়ের জটিলতা থাকা উচিত। তদুপরি, পুনরাবৃত্তি প্রায়শই ধীর হতে পারে (ভাষা প্রয়োগের উপর নির্ভর করে), যেহেতু প্রতিটি পুনরাবৃত্ত কলটিতে একটি নতুন স্ট্যাক ফ্রেম তৈরি করা প্রয়োজন, যখন পুনরাবৃত্তির জন্য কেবল একটি শাখা / তুলনা প্রয়োজন। ফাংশন কলগুলি সাধারণত সস্তা, তবে সেগুলি নিখরচায় নয়।
ডিকারুনি

2
@ ট্র্যাভিসপেসেটো পুনরাবৃত্তি বা চক্রীয় অবজেক্টের রেফারেন্সের কারণে সি # অ্যাপ্লিকেশন বিকাশের সময় আমি গত 6 মাসে 3 টি স্ট্যাক ওভারফ্লো দেখেছি। এটি সম্পর্কে মজার বিষয় যা এটি ক্রাশ হবে এবং আপনি কী জানেন যে জানেন না। যখন আপনি নেস্টেড লুপগুলি দেখেন আপনি জানেন যে কোনও খারাপ কিছু ঘটতে পারে এবং কোনও কিছুর জন্য ভুল সূচক সম্পর্কে ব্যতিক্রম সহজেই দৃশ্যমান।
ম্যাটিউজ

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

0

ছোট যাত্রীবাহী গাড়ির পরিবর্তে তিরিশ টন ট্রাক চালানো খারাপ অভ্যাস practice আপনি যখন 20 বা 30 টন স্টাফট পরিবহনের দরকার তখন ব্যতীত।

আপনি যখন নেস্টেড লুপ ব্যবহার করেন, এটি খারাপ অভ্যাস নয়। এটি হয় একেবারে বোকা, অথবা এটি ঠিক যা প্রয়োজন তা হয়। তুমি ঠিক কর.

তবে, কেউ লুপিং লুপ সম্পর্কে অভিযোগ করেছে । এর উত্তর: আপনার যদি প্রশ্ন জিজ্ঞাসা করতে হয় তবে লেবেল ব্যবহার করবেন না। আপনি যদি নিজেকে সিদ্ধান্ত নিতে যথেষ্ট জানেন তবে আপনি নিজেই সিদ্ধান্ত নিন।


যদি আপনি নিজেকে স্থির করতে যথেষ্ট জানেন তবে লেবেলযুক্ত লুপগুলি ব্যবহার না করা আপনি যথেষ্ট জানেন। :-)
user949300

না। যখন আপনাকে যথেষ্ট শেখানো হয় তখন আপনাকে লেবেলযুক্ত ব্যবহার না করা শেখানো হয়েছিল। যখন আপনি যথেষ্ট জানেন আপনি ডগমাকে ছাড়িয়ে গিয়ে সঠিক কাজ করেন।
gnasher729

1
লেবেলের সমস্যাটি হ'ল এটি খুব কমই প্রয়োজন হয় এবং প্রচুর লোক প্রবাহ নিয়ন্ত্রণ ভুলগুলির পক্ষে কাজ করতে খুব তাড়াতাড়ি এটি ব্যবহার করে। প্রবাহ নিয়ন্ত্রণ ভুল হয়ে গেলে লোকেরা কীভাবে সমস্ত স্থান থেকে বেরিয়ে যায় তার মতো বাছাই করুন। ক্রিয়াকলাপগুলি এটিকে অনেকাংশে অপ্রয়োজনীয় করে তোলে।
jgmjgm

-1

নেস্টেড লুপগুলি সম্পর্কে সহজাতভাবে ভুল বা অগত্যা এমনকি খারাপ কিছুই নেই। তাদের অবশ্য কিছু বিবেচনা এবং সমস্যা রয়েছে।

আপনার নিবন্ধগুলিতে নেতৃত্ব দেওয়া হয়েছিল সম্ভবত বংশবৃদ্ধির নামে বা একটি মনস্তাত্ত্বিক প্রক্রিয়ার কারণে যা পুড়ে গেছে বলে পরিচিত, বিশেষতাকে বাদ দিয়ে।

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

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

এখানে অনেক উত্তর যেমন লুপের জন্য নেস্টেড নির্দেশ করে তা হল আপনার প্রোগ্রামের পারফরম্যান্স বৈশিষ্ট্যের ইঙ্গিত যা প্রতিটি বাসা বাঁধে তাত্পর্যপূর্ণভাবে খারাপ হতে পারে। এটি হ'ল ও (এন), ও (এন ^ 2), ও (এন ^ 3) এবং এর উপর ও (এন ^ গভীরতা) রয়েছে যেখানে গভীরতা প্রতিনিধিত্ব করে আপনি কতগুলি লুপগুলি নেস্ট করেছেন। আপনার বাসা বাড়ার সাথে সাথে প্রয়োজনীয় সময়টি দ্রুত বাড়তে থাকে grows সমস্যাটি হ'ল এটি হ'ল এটিও নিশ্চিত নয় যে আপনার সময় বা স্থান জটিলতা হ'ল (প্রায়শই একটি * বি * সি কিন্তু সমস্ত বাসা লুপগুলি সমস্ত সময় চালাতে পারে না) বা এটিও নিশ্চিত নয় যে আপনি পারফরম্যান্স সমস্যা থাকলেও তা যদি হয়।

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

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

এটি এমন একটি সমস্যা যা historতিহাসিকভাবে আরও তাত্পর্যপূর্ণ হবে যেখানে পর্দা ছোট এবং কম রেজোলিউশনের ছিল। এই ক্ষেত্রে এমনকি কয়েক স্তরের বাসাও সত্যিকার অর্থে অনেক জায়গা নিতে পারে। এটি আজ একটি কম উদ্বেগ যেখানে থ্রেশহোল্ডটি বেশি যদিও এটি পর্যাপ্ত বাসা বাঁধলে এখনও সমস্যা উপস্থাপন করতে পারে।

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

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

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

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

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

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

আপনার প্রশ্নের উত্তরটি হ'ল এটি উভয়ই, তবে উদ্বেগ দুটিই সম্পূর্ণ নয়। এগুলি হয় সম্পূর্ণ সাপেক্ষিক বা কেবল প্রসঙ্গগত উদ্দেশ্য। দুর্ভাগ্যক্রমে কখনও কখনও সম্পূর্ণ বিষয়গত বা বরং মতামত নজির গ্রহণ করে এবং প্রাধান্য পায়।

থাম্বের নিয়ম হিসাবে, যদি এটি নেস্টেড লুপের প্রয়োজন হয় বা এটি পরবর্তী সুস্পষ্ট পদক্ষেপের মতো মনে হয়, তবে ইচ্ছাকৃতভাবে এবং এটি সহজভাবে না করা ভাল। তবে কোনও সন্দেহ যদি দীর্ঘায়িত হয় তবে পরে তা পর্যালোচনা করা উচিত।

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

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


ধারালো <-> খাঁটি ছুরি উদাহরণ দুর্দান্ত নয়, যেহেতু ভোঁতা ছুরিগুলি সাধারণত কাটার জন্য আরও বিপজ্জনক। আর হে (ঢ) -> হে (ঢ ^ 2) -> হে (ঢ ^ 3) হয় না সূচকীয় মধ্যে n, এটা জ্যামিতিক বা বহুপদী
কালেথ

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

@jgmjgm: n ^ গভীরতা বহুপদী, গভীরতা ^ n ক্ষতিকারক। এটি আসলে ব্যাখ্যার বিষয় নয়।
রোল শ্রোভেন

x ^ y এর সাথে y ^ x আলাদা? আপনি যে ভুলটি করেছেন তা হ'ল আপনি কখনই উত্তরটি পড়েন না। আপনি সূচকীয়দের জন্য গ্রেপ করেছেন এবং তারপরে এমন সমীকরণের জন্য গ্রেপ করেছেন যা তাদের নিজস্ব হিসাবে তাত্পর্যযুক্ত নয়। আপনি যদি পড়েন তবে আমি দেখতে পেয়েছি যে এটি নীড়ের প্রতিটি স্তরের জন্য তাত্পর্যপূর্ণভাবে বৃদ্ধি পায় এবং যদি আপনি এটি পরীক্ষা করে নেন তবে (a = 0; a <n; a ++); (বি = 0; বি <এন) এর জন্য সময় ; p ++,); জন্য (গ = 0; গ <এন; C ++); লুপগুলি যোগ করার বা অপসারণ করার পরে আপনি দেখতে পাবেন যে এটি প্রকৃতপক্ষে ঘনিষ্ঠ। আপনি একটি লুপ n ^ 1 এ পারফর্ম করতে পাবেন, দুজন n ^ 2 এ সঞ্চালন করবেন এবং তিনটি n ^ 3 এ সঞ্চালন করবেন। আপনি নেস্টেড বুঝতে ব্যর্থ: ডি। জেমোয়েট্রিক সাবটেনশনিয়াল।
jgmjgm

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