আমাকে নির্দেশের অ্যাসাইক্লিক গ্রাফটি কী তা সহজ শর্তে কেউ ব্যাখ্যা করতে পারেন?


109

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


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

1
যে ব্যক্তি গিট ব্যবহার করে সে আসলে না জেনে ডিএজি ব্যবহার করে, ericsink.com/vcbe/html/direected_acyclic_ographics.html
কিউল্যাং

উত্তর:


86

অন্যান্য বিন্দুগুলিকে নির্দেশ করে রেখাগুলির সাথে বিন্দুগুলি


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

27
... এক দিকে
মার্ক রবসন

3
সম্ভাব্য শর্তগুলির চেয়ে কম ক্ষেত্রে সহজাত জটিল ধারণা প্রকাশ করতে ব্যর্থ হওয়ার এটি একটি উত্তম উদাহরণ। এজন্য ইউক্লিডের পঞ্চম পোস্টুলেট এখনও বিদ্যমান।
Xaqron

4
আপনাকে "যেখানে রেখাগুলি চক্র গঠন করে না" অন্তর্ভুক্ত করতে হবে, অন্যথায় আপনি কেবল একটি নির্দেশিত গ্রাফ বর্ণনা করছেন, নির্দেশিত অ্যাসাইক্লিক গ্রাফ নয়।
ফারাপ

"লুপযুক্ত বিন্দুগুলি অন্য বিন্দুগুলিকে নির্দেশ করে, কোনও লুপ ছাড়াই" একটি উন্নতি হবে।
জন DeRegnaucourt

172

গ্রাফ = কাঠামোটি নোডগুলি সমন্বিত করে, যা একে অপরের সাথে প্রান্তের সাথে সংযুক্ত থাকে

নির্দেশিত = নোডের (প্রান্তগুলির) মধ্যে সংযোগগুলির একটি দিক রয়েছে: এ -> বি বি -> এ এর ​​মতো নয়

এসাইক্লিক = "নন-সার্কুলার" = প্রান্তগুলি অনুসরণ করে নোড থেকে নোডে চলে যাওয়া, আপনি দ্বিতীয় বারের মতো একই নোডের মুখোমুখি হবেন না।

পরিচালিত অ্যাসাইক্লিক গ্রাফের একটি ভাল উদাহরণ একটি গাছ। দ্রষ্টব্য, তবে, নির্দেশিত সমস্ত অ্যাসাইক্লিক গ্রাফ গাছ নয়।


আমি বুঝতেছি নোডগুলি কী। আপনি যখন "প্রান্ত" বলছেন, আপনি কি নোড এ থেকে নোড বি-তে নির্দেশিত একটি তীর বলতে চান?
appshare.co

আরও ভাল ব্যাখ্যা। সুতরাং এই প্রোগ্রামিং সঙ্গে কি করতে হবে? এটি কি ফাংশনাল প্রোগ্রামিংয়ের সাথে সম্পর্কিত?
appshare.co

2
এটি সাধারণত একটি তীর দ্বারা প্রতিনিধিত্ব করা হয়, তবে এটি সত্যই সত্য যে এ এবং বি এর মধ্যে একটি সম্পর্ক রয়েছে আপনার প্রোগ্রামে এই দুটি নোডের প্রতিনিধিত্বকারী সূচকগুলিতে সংলগ্ন ম্যাট্রিক্সের ক্ষেত্রে এটি সত্যিকারের মান হতে পারে।
tvanfosson

42
সমস্ত নির্দেশিত গাছ হ'ল ডিএজি, তবে সমস্ত ডিএজি গাছ নয় trees ন্যাগ সি এর একাধিক পিতা-মাতা থাকায় ড্যাগ এ-> বি, এ-> সি, বি-> সি গাছ হিসাবে প্রতিনিধিত্ব করতে পারে না।
জেসন এস

2
প্রান্তগুলির দিকনির্দেশতা কেবলমাত্র ডিএজিগুলি গাছ থেকে আলাদা করার বৈশিষ্ট্য নয়। কোনও ডিএজে গাছের থেকে আলাদা | ভি | -1 প্রান্ত থাকতে পারে। উদাহরণস্বরূপ, এ-> বি, এ-> সি, বি-> ডি, সি-> ডি একটি ডিএজি তবে স্পষ্টতই কোনও গাছ নয় কারণ এতে একই সংখ্যক প্রান্ত এবং নোড রয়েছে।
বেনাম মুস

49

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

প্রাক-আবশ্যক গ্রাফ - ইঞ্জিনিয়ারিং কোর্সের সময় প্রতিটি শিক্ষার্থী এমন বিষয় বাছাইয়ের মুখোমুখি হয় যা প্রাক-প্রয়োজনীয়তার মতো প্রয়োজনীয়তা অনুসরণ করে। এখন এটি স্পষ্ট হয়ে গেছে যে আপনি অ্যালগরিদম [এ] এর পূর্ব প্রয়োজনীয় কোর্স ছাড়াই আর্টিফিশিয়াল ইন্টেলিজেন্স [বি] তে কোনও ক্লাস নিতে পারবেন না। সুতরাং বি A এর উপর নির্ভর করে বা আরও ভাল শর্তে A এর বি এর দিকে একটি প্রান্ত রয়েছে তাই নোড বিতে পৌঁছানোর জন্য আপনাকে নোড এ যেতে হবে এটি খুব শীঘ্রই পরিষ্কার হয়ে যাবে যে এর পূর্বের প্রয়োজনীয়তা সহ সমস্ত বিষয় একটি গ্রাফে যুক্ত করার পরে। , এটি একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ হিসাবে পরিণত হবে।

যদি কোনও চক্র থাকে তবে আপনি কখনই কোনও কোর্স শেষ করতে পারবেন না: পি

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

আমার অধ্যাপক এই সাদৃশ্যটি দিয়েছেন এবং এটি আমাকে জটিল জটিল ধারণা ব্যবহারের চেয়ে ড্যাজি বুঝতে সর্বোত্তমভাবে সহায়তা করেছে!

আর একটি রিয়েল টাইম উদাহরণ -> সংস্করণ সিস্টেমে ড্যাগের কীভাবে ব্যবহার করা যেতে পারে তার রিয়েল টাইম উদাহরণ


4
এটি সর্বাধিক উচ্চমানের উত্তর হওয়া উচিত। সাধারণ উপমা এবং পাঠ্য বইয়ের সংজ্ঞাটি ব্যবহার করে না ওপি সহজেই বুঝতে সক্ষম নয়।
কিমাথি

25

প্রোগ্রামিংয়ে নির্দেশিত অ্যাসাইক্লিক গ্রাফের উদাহরণগুলির মধ্যে কম-বেশি যে কোনও কিছু সংযোগ এবং কার্যকারিতা প্রতিনিধিত্ব করে include

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

  • গণনাগুলি সঠিক ক্রমে মূল্যায়ন করা হয়েছে তা নিশ্চিত করুন ( টপোলজিকাল সাজান) )
  • সমান্তরালভাবে যদি গণনা করা যায় তবে প্রতিটি সংখ্যায় কার্যকর প্রয়োগের সময় বেশি থাকে তবে আপনি পুরো সেটটির সর্বাধিক প্রয়োগের সময় গণনা করতে পারেন

অন্যান্য অনেক কিছুর মধ্যে।

অ্যাপ্লিকেশন প্রোগ্রামিংয়ের ক্ষেত্রের বাইরে, কোনও প্রোগ্রামের উপাদানগুলির যথাযথ বিল্ড অর্ডার নিশ্চিত করতে যে কোনও শালীন অটোমেটেড বিল্ড টুল (মেক, পিঁপড়া, স্ক্যানস ইত্যাদি) ডিএজি ব্যবহার করবে।


কার্যকারিতা উল্লেখ করার জন্য +1। এটি অনেকাংশে উঠে আসে যখন আপনাকে এমন একটি জটিল সিস্টেমের প্রতিনিধিত্ব করতে হয় যেখানে এক প্রক্রিয়ার আউটপুট হয় এক বা একাধিক অন্যান্য প্রক্রিয়ার ইনপুট।
অ্যালেক্স ফেনম্যান

14

বেশ কয়েকটি উত্তরে গ্রাফের ব্যবহারের উদাহরণ দেওয়া হয়েছে (যেমন নেটওয়ার্ক মডেলিং) এবং আপনি "প্রোগ্রামিংয়ের সাথে এর কী আছে?" জিজ্ঞাসা করেছেন।

এই সাব-প্রশ্নের উত্তরটি হ'ল এটির প্রোগ্রামিংয়ের সাথে খুব বেশি কিছু করার নেই। সমস্যা সমাধানের সাথে এটি করতে হবে।

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


প্রোগ্রামিংয়ে প্রয়োগ করা যায়। হ্যাঁ, আমি এটি পছন্দ করি, গ্রাফগুলি কম্পিউটারের প্রকৃত বিশ্বে স্বতন্ত্র থাকায়!

13

পরিচালিত অ্যাসাইক্লিক গ্রাফগুলিতে (ডিএজি) নিম্নলিখিত বৈশিষ্ট্য রয়েছে যা এগুলি অন্যান্য গ্রাফ থেকে পৃথক করে:

  1. তাদের প্রান্ত দিকনির্দেশ প্রদর্শন করে।
  2. তাদের চক্র নেই।

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


1
অ্যান্ড্রিয়েভ, অচলাবস্থার উদাহরণের জন্য +1। এটি আসলে মাইএসকিউএল এর ইনোডিবি ইঞ্জিন দ্বারা ব্যবহৃত হয় এবং তারা এটিকে "ওয়েট-ফর-গ্রাফ" বলে, যেমন "এই সারিতে সেই সারিটির লকটি মুক্তি পেতে অপেক্ষা করতে হবে"
রোল্যান্ড বোম্যান

হ্যাঁ, নামটি সহ আপনি মারা গেছেন - গ্রাফের জন্য অপেক্ষা করুন। কিছু যে মিস। সাড়া আপডেট। :)
অর্ণকৃষ্ণ

তারা কীভাবে জানবে যে একটি নির্ভরতা রয়েছে? দুটি নোডের একটি সাধারণ পূর্বপুরুষ আছে কিনা তা পরীক্ষা করে দেখুন?

এই লিঙ্কটি - cis.temple.edu/~ingargio/cis307/readings/deadlock.html আরও প্রযুক্তিগত বিবরণ রয়েছে।
অর্ণকৃষ্ণ

11

আমি ধরে নিয়েছি আপনি ইতিমধ্যে বেসিক গ্রাফ পরিভাষা জানেন; অন্যথায় আপনার গ্রাফ তত্ত্ব সম্পর্কিত নিবন্ধ থেকে শুরু করা উচিত ।

নির্দেশ সত্য যে প্রান্ত (সংযোগ) দিকনির্দেশ আছে বোঝায়। চিত্রটিতে, এই দিকগুলি তীরগুলি দ্বারা দেখানো হয়েছে। বিপরীতটি একটি পুনর্নির্দেশিত গ্রাফ, যার প্রান্তটি দিকনির্দেশ নির্দিষ্ট করে না।

Acyclic অর্থ আপনি যদি কোনও যথেচ্ছ নোড এক্স থেকে শুরু করে সমস্ত সম্ভাব্য প্রান্ত দিয়ে চলে যান তবে ইতিমধ্যে ব্যবহৃত প্রান্তে ফিরে না গিয়ে আপনি এক্সে ফিরে যেতে পারবেন না।

বেশ কয়েকটি অ্যাপ্লিকেশন:

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

5

একটি ডিএজি হ'ল একটি গ্রাফ যেখানে সমস্ত কিছু একই দিকে প্রবাহিত হয় এবং কোনও নোড নিজেই আবার উল্লেখ করতে পারে না।

পৈতৃক গাছ সম্পর্কে চিন্তা করুন; তারা আসলে ডিএজিএস।

সব ডিএজি আছে

  • নোড (ডেটা সংরক্ষণের স্থান)
  • নির্দেশিত প্রান্তগুলি (একই দিকের পয়েন্ট)
  • একটি পৈতৃক নোড (পিতা-মাতা ছাড়া একটি নোড)
  • পাতাগুলি (নোডগুলির কোনও সন্তান নেই)

ডিএজিগুলি গাছ থেকে আলাদা। গাছের মতো কাঠামোতে প্রতি দুটি নোডের মধ্যে একটি অনন্য পথ থাকতে হবে। ডিএজিগুলিতে কোনও নোডের দুটি প্যারেন্ট নোড থাকতে পারে।

ডিএজিগুলি সম্পর্কে একটি ভাল নিবন্ধ এখানে । আমি আশা করি এটি সাহায্য করবে.


4

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


2

উত্স কোড বা এমনকি তিনটি ঠিকানা (টিএসি) কোড দৃষ্টিকোণ থেকে আপনি এই পৃষ্ঠায় সমস্যাটি খুব সহজেই কল্পনা করতে পারবেন ...

http://cgm.cs.mcgill.ca/~hagha/topic30/topic30.html#Exptree

আপনি যদি এক্সপ্রেশন ট্রি বিভাগে যান, এবং তারপরে কিছুটা নীচে এটি গাছের "টপোলজিকাল বাছাই", এবং কীভাবে এক্সপ্রেশনকে মূল্যায়ন করবেন তার অ্যালগরিদম দেখায়।

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

প্রাচীন প্রাচীন ইজিপস্টিয়ান (অর্থাত্ ইংরেজিতে) ডিএজি গণনা করার প্রাথমিক অ্যালগরিদম হ'ল:

1) আপনার ডিএজি অবজেক্টটি তেমন করুন

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

একবার আপনি কোনও ভেরিয়েবল এক্সকে অর্পণ করার পরে, ঘটনাক্রমে অ্যাসাইনমেন্টের পয়েন্টে লাইভ থাকা সমস্ত ড্যাগ উপ-এক্সপ্রেশন নোডগুলি লাইভ হয় না, কারণ নতুন অ্যাসাইনমেন্টটি পুরানো মানটি ব্যবহার করে সাব এক্সপ্রেশনগুলির অর্থ অবৈধ করে দেয়।

class Dag {
  TList LiveList;
  DagNode Root;
}

// In your DagNode you need a way to refer to the original things that
// the DAG is computed from. In this case I just assume an integer index
// into the list of variables and also an integer index for the opertor for
// Nodes that refer to operators. Obviously you can create sub-classes for
// different kinds of Dag Nodes.
class DagNode {
  int Variable;
  int Operator;// You can also use a class
  DagNode Left;
  DagNode Right;
  DagNodeList Parents;
}

সুতরাং আপনি যা করছেন তা আপনার নিজের কোডে আপনার গাছের মধ্য দিয়ে চলছেন যেমন উদাহরণস্বরূপ উত্স কোডে প্রকাশের গাছ। উদাহরণস্বরূপ বিদ্যমান নোডগুলি এক্সনোডে কল করুন।

সুতরাং প্রতিটি এক্সনোডের জন্য আপনাকে এটি কীভাবে ডিএজে যুক্ত করতে হবে তা সিদ্ধান্ত নেওয়া দরকার এবং এটি ইতিমধ্যে ডাগে থাকার সম্ভাবনা রয়েছে।

এটি খুব সাধারণ সিউডো কোড। সংকলনের উদ্দেশ্যে নয়।

DagNode XNode::GetDagNode(Dag dag) {
  if (XNode.IsAssignment) {
    // The assignment is a special case. A common sub expression is not
    // formed by the assignment since it creates a new value.

    // Evaluate the right hand side like normal
    XNode.RightXNode.GetDagNode();  


    // And now take the variable being assigned to out of the current live list
    dag.RemoveDagNodeForVariable(XNode.VariableBeingAssigned);

    // Also remove all DAG sub expressions using the variable - since the new value
    // makes them redundant
    dag.RemoveDagExpressionsUsingVariable(XNode.VariableBeingAssigned);

    // Then make a new variable in the live list in the dag, so that references to
    // the variable later on will see the new dag node instead.
    dag.AddDagNodeForVariable(XNode.VariableBeingAssigned);

  }
  else if (XNode.IsVariable) {
    // A variable node has no child nodes, so you can just proces it directly
    DagNode n = dag.GetDagNodeForVariable(XNode.Variable));
    if (n) XNode.DagNode = n;
    else {
      XNode.DagNode = dag.CreateDagNodeForVariable(XNode.Variable);
    }
    return XNode.DagNode;
  }
  else if (XNode.IsOperator) {
    DagNode leftDagNode = XNode.LeftXNode.GetDagNode(dag);
    DagNode rightDagNode = XNode.RightXNode.GetDagNode(dag);


    // Here you can observe how supplying the operator id and both operands that it
    // looks in the Dags live list to check if this expression is already there. If
    // it is then it returns it and that is how a common sub-expression is formed.
    // This is called an internal node.
    XNode.DagNode = 
      dag.GetOrCreateDagNodeForOperator(XNode.Operator,leftDagNode,RightDagNode) );

    return XNode.DagNode;
  }
}

সুতরাং এটি দেখার এক উপায়। গাছের একটি মৌলিক পদচারণা এবং ড্যাগ নোডগুলি যাবার সাথে যুক্ত করা এবং উল্লেখ করা। উদাহরণস্বরূপ গাছের মূলটি ডাগনোড যা দেয় তা ডাগের মূল।

স্পষ্টতই উদাহরণ পদ্ধতিটি ছোট ছোট ভাগে বিভক্ত হয়ে ভার্চুয়াল ফাংশন সহ উপ-শ্রেণি হিসাবে তৈরি করা যেতে পারে।

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

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

// Most basic DAG topological ordering example.
void DagNode::OrderDAG(int* counter) {
  if (this->AlreadyCounted) return;

  // Count from left to right
  for x = 0 to this->Children.Count-1
    this->Children[x].OrderDag(counter)

  // And finally number the DAG Node here after all
  // the children have been numbered
  this->DAGOrder = *counter;

  // Increment the counter so the caller gets a higher number
  *counter = *counter + 1;

  // Mark as processed so will count again
  this->AlreadyCounted = TRUE;
}

1

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


1

নামটি আপনাকে তার সংজ্ঞাটি সম্পর্কে যা জানা দরকার সেগুলির বেশিরভাগটি আপনাকে বলে: এটি এমন একটি গ্রাফ যেখানে প্রতি প্রান্তটি কেবল এক দিকে প্রবাহিত হয় এবং একবার আপনি একটি প্রান্তটি ক্রল করে ফেললে আপনার পথটি আপনাকে কেবল যে বাকী প্রান্তে ফেলেছিল তা কখনই আপনাকে ফিরিয়ে আনবে না।

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

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

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


-5

আপনি যখন প্রতিনিধিত্ব করতে চান তখন একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ কার্যকর হয় ... একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ! ক্যানোনিকাল উদাহরণটি একটি পারিবারিক গাছ বা বংশবৃত্ত।


আহ, এটাও বোঝা যায়। কিন্তু এখনও, এটি প্রোগ্রামিংয়ের সাথে কী করেছে?
appshare.co

1
প্রোগ্রামিংয়ের সাথে কোনও ডেটা স্ট্রাকচারের কী সম্পর্ক রয়েছে?
জোনাথন ফেইনবার্গ

ঠিক আছে আমি বুঝতে পারছি. এটি ঠিক যে আপনি নিজের উত্তরে "ডেটা স্ট্রাকচার" উল্লেখ করেন নি
appshare.co

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