সি ++ এসটিএল কেন কোনও "গাছ" ধারক সরবরাহ করে না?


373

কেন সি ++ এসটিএল কোনও "ট্রি" পাত্রে সরবরাহ করে না এবং এর পরিবর্তে ব্যবহার করার জন্য সেরা জিনিসটি কী?

পারফরম্যান্স বর্ধন হিসাবে গাছকে ব্যবহার না করে আমি গাছ হিসাবে বস্তুর একটি শ্রেণিবিন্যাস সংরক্ষণ করতে চাই ...


7
শ্রেণিবিন্যাসের উপস্থাপনা সঞ্চয় করার জন্য আমার একটি গাছ লাগবে।
রডি

20
আমি সেই লোকটির সাথে রয়েছি যিনি "সঠিক" উত্তরগুলি ভোট দিয়েছেন, যা মনে হয়; "গাছগুলি অকেজো"। অস্পষ্ট গাছের ব্যবহার যদি গুরুত্বপূর্ণ হয়।
জো সোল-ব্রিংগার

আমি মনে করি কারণ এটি তুচ্ছ - কেউ এখনও এটি স্ট্যান্ডার্ড লাইব্রেরিতে প্রয়োগ করেনি। এটা প্রমিত গ্রন্থাগার ছিল না মত std::unordered_mapএবং std::unordered_setসম্প্রতি পর্যন্ত। এবং তার আগে স্ট্যান্ডার্ড লাইব্রেরিতে কোনও এসটিএল ধারক ছিল না।
ডক

1
আমার চিন্তাভাবনা (যদিও প্রাসঙ্গিক স্ট্যান্ডার্ডটি কখনও পড়েনি, সুতরাং এটি একটি মন্তব্য নয় এটি উত্তর নয়) হ'ল এসটিএল নির্দিষ্ট ডেটা স্ট্রাকচারের বিষয়ে চিন্তা করে না, এটি জটিলতার বিষয়ে নির্দিষ্টকরণগুলি এবং কী অপারেশনগুলি সমর্থন করে সে সম্পর্কে যত্নশীল। সুতরাং ব্যবহৃত অন্তর্নিহিত কাঠামো বাস্তবায়ন এবং / অথবা লক্ষ্য স্থাপত্যগুলির মধ্যে পরিবর্তিত হতে পারে, তবে নির্দিষ্টকরণগুলিকে সন্তুষ্ট করে। আমি বেশ নিশ্চিত std::mapএবং std::setসেখানকার প্রতিটি বাস্তবায়নে একটি গাছ ব্যবহার করব, তবে কিছু বৃক্ষবিহীন কাঠামোও যদি নির্দিষ্টকরণগুলি পূরণ করে তবে তাদের দরকার নেই।
মার্ক কে কোয়ান

উত্তর:


182

দুটি গাছ আপনি গাছ ব্যবহার করতে চাইতে পারেন:

আপনি গাছের মতো কাঠামো ব্যবহার করে সমস্যাটি আয়ন করতে চান: এর
জন্য আমাদের গ্রাফ লাইব্রেরি বাড়ানো হয়েছে

অথবা আপনি এমন একটি ধারক চান যাতে গাছের মতো অ্যাক্সেসের বৈশিষ্ট্য রয়েছে যার জন্য আমাদের এটি রয়েছে

মূলত এই দুটি পাত্রে বৈশিষ্ট্যগুলি হ'ল গাছ ব্যবহার করে ব্যবহারিকভাবে প্রয়োগ করতে হবে (যদিও এটি আসলে কোনও প্রয়োজন নয়)।

এই প্রশ্নটিও দেখুন: সি ট্রি বাস্তবায়ন


64
গাছ ব্যবহার করার অনেকগুলি অনেক কারণ রয়েছে, যদিও এগুলি সর্বাধিক সাধারণ। সবথেকে সাধারণ!
জো সোল-ব্রিংগার

3
একটি গাছ চাওয়ার তৃতীয় বড় কারণটি দ্রুত সন্নিবেশ / অপসারণ সহ সর্বদা বাছাই করা তালিকার জন্য, তবে এর জন্য রয়েছে স্ট্যান্ড: মাল্টিসিট।
ভয়েডস্টার

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

14
আমি এই উত্তরটির সাথে একমত নই, 2008 এবং এখন উভয় ক্ষেত্রেই। স্ট্যান্ডার্ড লাইব্রেরিতে "উত্সাহ" নেই, এবং উত্সাহের কোনও কিছুর প্রাপ্যতা স্ট্যান্ডার্ডের মধ্যে না নেওয়ার কারণ হওয়া উচিত (এবং এটি হয়নি)। অধিকন্তু, বিজিএল সাধারণ এবং এগুলি থেকে নিখরচায় বিশেষজ্ঞ গাছের শ্রেণীর মেধায় যথেষ্ট পরিমাণে জড়িত। এছাড়াও, সত্য যে মানচিত্র :: মানচিত্র এবং স্টাডি :: সেট একটি গাছের প্রয়োজন, আইএমও, stl::red_black_treeইত্যাদি ইত্যাদির জন্য অন্য যুক্তি , অবশেষে, std::mapএবং std::setগাছগুলি ভারসাম্যপূর্ণ, std::treeসম্ভবত নাও হতে পারে।
einpoklum

1
@ আইনপোকলুম: "উত্সাহের কোনও কিছুর প্রাপ্যতা এটিকে স্ট্যান্ডার্ড হিসাবে গ্রহণ না করার কারণ হওয়া উচিত নয়" - উত্সাহ দেওয়ার এক উদ্দেশ্য হিসাবে দেওয়া হয় যে স্ট্যান্ডার্ডে অন্তর্ভুক্ত হওয়ার আগে দরকারী লাইব্রেরিগুলির প্রমাণদানের ক্ষেত্র হিসাবে কাজ করা, আমি কেবল "একেবারে!" বলুন।
মার্টিন বোনার

94

সম্ভবত একই কারণে যে কোনও বৃদ্ধির পাত্র নেই। এই ধরণের ধারক কার্যকর করার অনেকগুলি উপায় রয়েছে এবং যারা এটি ব্যবহার করবেন তাদের সন্তুষ্ট করার জন্য কোনও ভাল উপায় নেই।

কিছু বিষয় বিবেচনা করুন:

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

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

এখানে আরও কিছু জেনেরিক ট্রি বাস্তবায়ন রয়েছে:


5
"... সবাইকে সন্তুষ্ট করার জন্য কোনও ভাল উপায় নেই ..." যেহেতু stl :: মানচিত্র, stl :: মাল্টিম্যাপ এবং stl :: সেটটি stl এর rb_tree এর উপর ভিত্তি করে রয়েছে, সেগুলি কেবলমাত্র বেসিক প্রকারের মতোই সন্তুষ্ট হওয়া উচিত ।
ক্যাটসকুল

44
একটি নোডের শিশুদের পুনরুদ্ধার করার কোনও উপায় নেই তা বিবেচনা করে std::map, আমি সেই গাছের পাত্রে কল করব না। সেগুলি হ'ল সংঘবদ্ধ পাত্রে যা সাধারণত গাছ হিসাবে প্রয়োগ করা হয়। বড় পার্থক্য.
মাকিং হাঁস

2
আমি মুইং হাঁসের সাথে একমত, আপনি কিভাবে একটি স্ট্যান্ড :: ম্যাপে প্রস্থের প্রথম প্রবর্তনটি প্রয়োগ করবেন? এটি মারাত্মক ব্যয়বহুল হতে চলেছে
মার্কো এ

1
আমি ক্যাস্পার পিটার্স ট্রি ট্রি ব্যবহার করতে শুরু করেছি, তবে জিপিএলভি 3 বা অন্য কোনও জিপিএল সংস্করণের জন্য লাইসেন্স পর্যালোচনা করার পরে এটি আমাদের বাণিজ্যিক সফ্টওয়্যারকে দূষিত করবে। আপনার যদি বাণিজ্যিক উদ্দেশ্যে কোনও কাঠামোর প্রয়োজন হয় তবে @hplbsh এর মন্তব্যে প্রদত্ত ট্র্রিটি দেখার পরামর্শ দেব would
জেক ৮৮

3
গাছে বিভিন্ন ধরণের নির্দিষ্ট প্রয়োজনীয়তা বিভিন্ন ধরণের গাছ রাখার যুক্তি, কোনওটিই না পাওয়ার জন্য।
আন্ড্রে

50

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


12
আমি মনে করি না যে সে ধারক প্রয়োগের কথা বলছে, সে নিজেই একটি গাছের পাত্রের কথা বলছে।
মাকিং হাঁস

3
@ মুভিংডাক আমি মনে করি উইলহেমটেল মানে যা হ'ল সি ++ স্ট্যান্ডার্ড লাইব্রেরি তাদের অন্তর্নিহিত ডেটা কাঠামোর ভিত্তিতে পাত্রে সংজ্ঞা দেয় না; এটি কেবল পাত্রে তাদের ইন্টারফেস এবং পর্যবেক্ষণযোগ্য বৈশিষ্ট্য যেমন অ্যাসিপোটোটিক পারফরম্যান্স দ্বারা সংজ্ঞায়িত করে। আপনি যখন এটি সম্পর্কে চিন্তা করেন, কোনও গাছ আসলেই কোনও ধারক নয় (যেমন আমরা তাদের জানি)। তাদের কাছে সরাসরি আগাও নেই end()এবং begin()যার সাহায্যে আপনি সমস্ত উপাদান ইত্যাদির মাধ্যমে পুনরাবৃত্তি করতে পারেন
জর্দান মেলো

7
@ জর্দানমেলো: সমস্ত বিষয় নিয়ে বাজে কথা। এটি এমন একটি জিনিস যা বস্তুগুলি ধারণ করে। এটি একটি সূচনা () এবং শেষ () এবং দ্বি নির্দেশামূলক পুনরাবৃত্তি সঙ্গে পুনরাবৃত্তি করতে এটি নকশা করা খুব তুচ্ছ। প্রতিটি ধারক বিভিন্ন বৈশিষ্ট্য আছে। যদি কারও অতিরিক্ত গাছের বৈশিষ্ট্য থাকতে পারে তবে এটি কার্যকর হবে। বেশ সহজ হওয়া উচিত।
মাকিং হাঁস

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

@JordanMelo: যে দৃষ্টিকোণ থেকে, সারিগুলি, স্ট্যাকগুলি বা অগ্রাধিকার সারিগুলি মত অ্যাডাপ্টার STL অন্তর্গত (তারা নেই চাই begin()এবং end())। এবং মনে রাখবেন যে অগ্রাধিকারের সারিটি সাধারণত একটি গাদা, যা অন্তত তাত্ত্বিকভাবে একটি গাছ (যদিও বাস্তব বাস্তবায়ন হয়)। সুতরাং আপনি যদি কিছু পৃথক অন্তর্নিহিত ডেটা কাঠামো ব্যবহার করে অ্যাডাপ্টার হিসাবে একটি গাছ প্রয়োগ করেন তবে এটি এসটিএলে অন্তর্ভুক্ত হওয়ার যোগ্য হবে।
andreee

48

"আমি গাছ হিসাবে বস্তুর শ্রেণিবিন্যাস সঞ্চয় করতে চাই"

সি ++ 11 এসেছে এবং চলে গেছে এবং তারা এখনও সরবরাহ করার প্রয়োজন দেখেনি std::tree, যদিও ধারণাটি এসেছে ( এখানে দেখুন )। তারা এটি যুক্ত না করার কারণ হতে পারে বিদ্যমান পাত্রে শীর্ষে নিজের তৈরি করা তুচ্ছভাবে সহজ is উদাহরণ স্বরূপ...

template< typename T >
struct tree_node
   {
   T t;
   std::vector<tree_node> children;
   };

একটি সাধারণ ট্র্যাভারসাল পুনরাবৃত্তি ব্যবহার করবে ...

template< typename T >
void tree_node<T>::walk_depth_first() const
   {
   cout<<t;
   for ( auto & n: children ) n.walk_depth_first();
   }

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


2
যদি প্রকল্পটি গাছের_নোডের বাচ্চাদের বাছাই করার অনুমতি দিতে পারে তবে std :: vector <> এর জায়গায় একটি std :: set <> ব্যবহার করুন এবং তারপরে গাছের_নোড অবজেক্টে অপারেটর <() যুক্ত করা ব্যাপক উন্নতি করবে 'টি' -র মতো অবজেক্টের 'অনুসন্ধান' সম্পাদনা।
জে জর্জনসন

4
দেখা যাচ্ছে যে তারা অলস ছিল এবং প্রকৃতপক্ষে আপনার প্রথম উদাহরণটি অনির্ধারিত আচরণ করে।
ব্যবহারকারী541686

2
@ মেহরদাদ: অবশেষে আমি এখানে আপনার মন্তব্যের পিছনে বিশদ জিজ্ঞাসা করার সিদ্ধান্ত নিয়েছি ।
নোটার

many of the algorithms simply don't make any sense for a hierarchy। ব্যাখ্যার বিষয়। স্ট্যাকওভারফ্লো ব্যবহারকারীদের একটি কাঠামো কল্পনা করুন এবং প্রতি বছর আপনি চান যে উচ্চ খ্যাতি পয়েন্ট রয়েছে তাদের নিম্ন সুনামের পয়েন্টযুক্ত ব্যক্তিদের বস করতে পারেন। সুতরাং বিএফএস পুনরুক্তি এবং উপযুক্ত তুলনা প্রদান, প্রতি বছর আপনি খালি চালানো std::sort(tree.begin(), tree.end())
ডক

একই টোকেন করে, আপনি সহজেই প্রতিস্থাপন (আনস্ট্রাকচারড কী-মান রেকর্ড মডেল, উদাহরণস্বরূপ তাদেরকে JSON মত) একটি মিশুক গাছ নির্মান করতে পারে vectorসঙ্গে mapউপরোক্ত উদাহরণে। JSON- এর মতো কাঠামোর সম্পূর্ণ সমর্থন করার জন্য, আপনি variantনোডগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারেন ।
নোটার

43

আপনি যদি কোনও আরবি-ট্রি বাস্তবায়ন সন্ধান করছেন তবে stl_tree.h আপনার পক্ষেও উপযুক্ত হতে পারে।


14
আশ্চর্যের বিষয় হল এটিই কেবলমাত্র প্রতিক্রিয়া যা আসলে আসল প্রশ্নের উত্তর দেয়।
ক্যাটস্কুল

12
তিনি "হাইয়ার্কি" চান তা বিবেচনা করে, "ভারসাম্যপূর্ণ" কোনও কিছুই ভুল উত্তর বলে ধরে নেওয়া নিরাপদ বলে মনে হয়।
মাকিং হাঁস

11
"এটি একটি অভ্যন্তরীণ শিরোলেখ ফাইল যা অন্যান্য লাইব্রেরির শিরোনামগুলি অন্তর্ভুক্ত করে। আপনি এটি সরাসরি ব্যবহার করার চেষ্টা করবেন না" "
ড্যান

3
@ ড্যান: এটি অনুলিপি করা সরাসরি এটি ব্যবহার করে গঠিত হয় না।
einpoklum

12

স্ট্যান্ড :: মানচিত্রটি একটি লাল কালো গাছের উপর ভিত্তি করে তৈরি । আপনি নিজের ধরণের গাছ প্রয়োগ করতে আপনাকে অন্যান্য পাত্রেও ব্যবহার করতে পারেন।


13
এটি সাধারণত লাল-কালো গাছ ব্যবহার করে (এটি করার প্রয়োজন হয় না)।
মার্টিন ইয়র্ক 19

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

// রেড-ব্ল্যাক ট্রি ক্লাস, এসটিএল // এসোসিয়েটিভ পাত্রে (সেট, মাল্টিসেট, মানচিত্র এবং মাল্টিম্যাপ) প্রয়োগে ব্যবহারের জন্য ডিজাইন করা। আমার stl_tree.h ফাইল থেকে এটি ধরেছে।
জেজে

@ জেজে কমপক্ষে স্টুডিও ২০১০-এ, এটি একটি অভ্যন্তরীণ ordered red-black tree of {key, mapped} values, unique keysক্লাস ব্যবহার করে , এতে সংজ্ঞায়িত করা হয়েছে <xtree>। এই মুহূর্তে আরও আধুনিক সংস্করণে অ্যাক্সেস পাবেন না।
জাস্টিন সময় - মনিকা

8

একরকম, স্ট্যান্ড :: মানচিত্রটি একটি গাছ (এটি ভারসাম্য বাইনারি গাছের মতো একই কার্য সম্পাদনের বৈশিষ্ট্য থাকা প্রয়োজন) তবে এটি অন্যান্য গাছের কার্যকারিতা প্রকাশ করে না। প্রকৃত গাছের ডেটা কাঠামো না অন্তর্ভুক্ত করার সম্ভবত যুক্তি সম্ভবত স্টলটির সমস্ত কিছু অন্তর্ভুক্ত না করার বিষয় ছিল। আপনার নিজের অ্যালগোরিদম এবং ডেটা স্ট্রাকচার বাস্তবায়নের জন্য স্টাইলটিকে কাঠামো হিসাবে দেখা যেতে পারে।

সাধারণভাবে, যদি আপনি চান এমন একটি প্রাথমিক গ্রন্থাগার কার্যকারিতা রয়েছে, যেটি স্টলে নেই, তবে সমাধানটি বুস্টের দিকে তাকাতে হবে

তা না হলে, একটি এর গুচ্ছ এর লাইব্রেরি আউট সেখানে আপনার গাছের চাহিদার উপর নির্ভর করে।


6

সমস্ত এসটিএল ধারক বাহ্যিকভাবে একটি পুনরাবৃত্তি প্রক্রিয়া সহ "সিকোয়েন্স" হিসাবে উপস্থাপিত হয়। গাছগুলি এই প্রতিমা অনুসরণ করে না।


7
একটি ট্রি ডেটা স্ট্রাকচার পুনরুদ্ধারক, আন্ডারর্ডার বা পোস্টারর্ডার ট্র্যাভারসাল পুনরুক্তিগুলির মাধ্যমে সরবরাহ করতে পারে। আসলে এটিই স্ট্যান্ড :: ম্যাপটি করে।
অ্যান্ড্রু তোমাজোস

3
হ্যাঁ এবং না ... এটি "বৃক্ষ" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে। std::mapঅভ্যন্তরীণভাবে বিট্রি হিসাবে প্রয়োগ করা হয়েছে, তবে বাহ্যিকভাবে এটি পেয়ারের বাছাই করা সিকোয়েন্স হিসাবে উপস্থিত হয়। আপনি সর্বজনীনভাবে জিজ্ঞাসা করতে পারেন যে উপাদানটি আগে এবং কে পরে আছেন তা প্রদত্ত। একটি সাধারণ গাছ কাঠামো যার মধ্যে প্রতিটি উপাদান রয়েছে সেগুলি কোনও বাছাই বা দিক নির্দেশ করে না। আপনি পুনরাবৃত্তকারীকে সংজ্ঞায়িত করতে পারেন যা গাছের কাঠামোকে অনেক উপায়ে হাঁটে (সাল্লো | গভীর প্রথম | শেষ ...) তবে একবার আপনি এটিটি সম্পন্ন করার পরে একটি std::treeধারক অবশ্যই তাদের কোনও beginফাংশন থেকে ফিরে আসতে হবে । এবং এক বা অন্য ফিরে আসার সুস্পষ্ট কারণ নেই।
এমিলিও গারাভাগলিয়া

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

4
আপনার উত্তরের বোঝার বিষয়টি হ'ল কোনও স্টল এন-ট্রি ডেটা কাঠামো নেই কারণ এটির "ক্রম" ইন্টারফেস নেই। এটি কেবল ভুল is
অ্যান্ড্রু তোমাজস

3
@ এমিলো গারাভাগলিয়া: তার প্রমাণ হিসাবে std::unordered_set, যার সদস্যদের পুনরাবৃত্তি করার কোনও "অনন্য উপায়" নেই (আসলে পুনরাবৃত্তির ক্রমটি সিউডো-এলোমেলো এবং বাস্তবায়ন সংজ্ঞায়িত) তবে এটি এখনও একটি স্টেটের ধারক - এটি আপনার বক্তব্যকে অস্বীকার করে। ধারকটিতে প্রতিটি উপাদানের উপরে আইট্রেট করা এখনও কার্যকর অপারেশন, এমনকি যদি অর্ডার অপরিজ্ঞাত হয়।
অ্যান্ড্রু তোমাজস

4

কারণ এসটিএল কোনও "সবকিছু" গ্রন্থাগার নয়। এটিতে মূলত জিনিস তৈরির জন্য প্রয়োজনীয় ন্যূনতম কাঠামো রয়েছে।


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

2
আমি মনে করি না যে ওপি বাইনারি গাছের জন্য জিজ্ঞাসা করছে, তিনি একটি শ্রেণিবিন্যাস সঞ্চয় করার জন্য একটি গাছের জন্য জিজ্ঞাসা করছেন।
মিনিটে হাঁসকে মুগ করছে

কেবল এটিই নয়, এসটিএলে একটি গাছ "ধারক" যুক্ত করার অর্থ অনেকগুলি নতুন ধারণা যুক্ত হওয়ার অর্থ হবে, উদাহরণস্বরূপ একটি ট্রি ন্যাভিগেটর (সাধারণীকরণকারী)।
alfC

5
"জিনিস তৈরির ন্যূনতম কাঠামো" একটি অত্যন্ত বিষয়গত বক্তব্য। আপনি কাঁচা সি ++ ধারণা সহ জিনিসগুলি তৈরি করতে পারেন, তাই আমি অনুমান করি সত্য ন্যূনতম কোনওটি এসটিএল হবে না।
ডক


3

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

উদাহরণ স্বরূপ:

template <typename T>
struct TreeNode
{
  T* DATA ; // data of type T to be stored at this TreeNode

  vector< TreeNode<T>* > children ;

  // insertion logic for if an insert is asked of me.
  // may append to children, or may pass off to one of the child nodes
  void insert( T* newData ) ;

} ;

template <typename T>
struct Tree
{
  TreeNode<T>* root;

  // TREE LEVEL functions
  void clear() { delete root ; root=0; }

  void insert( T* data ) { if(root)root->insert(data); } 
} ;

7
এটি আপনার প্রচুর কাঁচা পয়েন্টারগুলির মালিকানা রয়েছে, যার অনেকেরই বিন্দু বিন্দু হওয়ার দরকার নেই।
মাকিং হাঁস

আপনাকে এই উত্তর প্রত্যাহারের পরামর্শ দিন। একটি ট্রিনোড ক্লাস একটি গাছ বাস্তবায়নের অংশ।
einpoklum

3

আমি মনে করি এসটিএল গাছ না থাকার বিভিন্ন কারণ রয়েছে। প্রাথমিকভাবে গাছগুলি পুনরাবৃত্ত তথ্য কাঠামোর একটি রূপ যা একটি ধারক (তালিকা, ভেক্টর, সেট) এর মতো খুব আলাদা সূক্ষ্ম কাঠামো থাকে যা সঠিক পছন্দগুলি জটিল করে তোলে। তারা এসটিএল ব্যবহার করে বেসিক ফর্ম তৈরি করা খুব সহজ।

একটি সীমাবদ্ধ শিকড় গাছকে একটি ধারক হিসাবে ভাবা যেতে পারে যার মান বা পেওলড রয়েছে, একটি শ্রেণির এ উদাহরণ এবং সম্ভবত শিকড় (উপ) গাছের খালি সংগ্রহ; সাবট্রিগুলির খালি সংগ্রহ সহ গাছগুলিকে পাতা হিসাবে ভাবা হয়।

template<class A>
struct unordered_tree : std::set<unordered_tree>, A
{};

template<class A>
struct b_tree : std::vector<b_tree>, A
{};

template<class A>
struct planar_tree : std::list<planar_tree>, A
{};

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

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

তবে গাছের পাশাপাশি ‘কো-ট্রি’ রয়েছে; সর্বোপরি গাছগুলির সম্পত্তি আছে যে আপনি যদি রুটটি মুছুন তবে আপনি সবকিছু মুছবেন।

গাছের পুনরাবৃত্তির জন্য বিবেচনা করুন, সম্ভবত তারা পুনরাবৃত্তির একটি সাধারণ স্ট্যাক হিসাবে, কোনও নোড এবং তার পিতামাতার কাছে উপলব্ধ হবে ... মূল পর্যন্ত।

template<class TREE>
struct node_iterator : std::stack<TREE::iterator>{
operator*() {return *back();}
...};

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

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

আমি যদি সন্তুষ্ট হব তবে এটি যদি ভাল ফর্মে হয় তবে এটি স্ট্যান্ডার্ডে যাওয়ার পথটি খুঁজে পায়।


0

উত্তরের উত্তরগুলি পড়ার সাধারণ নামগুলি হ'ল কেউ গাছের মধ্য দিয়ে পুনরাবৃত্তি করতে পারে না বা গাছ অন্য এসটিএল পাত্রে একইরকম ইন্টারফেস গ্রহণ করে না এবং এই জাতীয় গাছের কাঠামোর সাথে কেউ এসটিএল অ্যালগরিদম ব্যবহার করতে পারে না।

এই বিষয়টি মাথায় রেখে আমি নিজের গাছের ডেটা কাঠামো ডিজাইন করার চেষ্টা করেছি যা এসটিএল-এর মতো ইন্টারফেস সরবরাহ করবে এবং বিদ্যমান এসটিএল অ্যালগরিদমগুলিকে যতটা সম্ভব ব্যবহারযোগ্য হবে।

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

গাছটি অবশ্যই প্রদান করবে এমন অন্যান্য গুরুত্বপূর্ণ বৈশিষ্ট্য হ'ল ট্র্যাভার্সিং পুনরাবৃত্তিগুলি।

আমি এখানে যা করতে সক্ষম হয়েছি তা এখানে: https://github.com/igagis/utki/blob/master/src/utki/tree.hpp

এবং এখানে পরীক্ষাগুলি রয়েছে: https://github.com/igagis/utki/blob/master/tests/tree/tests.cpp


-9

সমস্ত এসটিএল পাত্রে পুনরাবৃত্তকারীগুলির সাথে ব্যবহার করা যেতে পারে। আপনার কাছে কোনও ট্রিটারের গাছ থাকতে পারে না কারণ আপনার '' এক ডান '' পথটি গাছের মধ্যে দিয়ে যায় না।


3
তবে আপনি বলতে পারেন বিএফএস বা ডিএফএস সঠিক উপায়। বা উভয় সমর্থন করুন। বা অন্য যে কোনও আপনি কল্পনা করতে পারেন। জুট এটি কী তা ব্যবহারকারীকে জানান।
tomas789

2
স্টাড :: ম্যাপে গাছের পুনরাবৃত্তি রয়েছে।
জয়

1
একটি গাছ তার নিজস্ব কাস্টম পুনরাবৃত্তকারী টাইপকে সংজ্ঞায়িত করতে পারে যা একটি "চরম" থেকে অন্যটিতে সমস্ত নোডকে অনুসরণ করে (যেমন পাথ 0 এবং 1 সহ কোনও বাইনারি গাছের জন্য, এটি একটি পুনরাবৃত্তির প্রস্তাব দিতে পারে যা "সমস্ত 0s" থেকে "সমস্ত" তে যায় 1s ", এবং একটি বিপরীত পুনরুক্তিকারীর যে বিপরীত আছে; 3 গভীরতা এবং শুরু নোড সঙ্গে একটি গাছ জন্য s, উদাহরণস্বরূপ, এটি উপর নোড পুনরুক্তি পারে যেমন s000, s00, s001, s0, s010, s01, s011, s, s100, s10, s101, s1, s110, s11, s111(" বামদিকের ডানদিকের ")" থেকে "; এটি গভীরতায় ট্র্যাভেরসাল প্যাটার্ন ব্যবহার করতে পারে ( s, s0, s1, s00, s01, s10, s11,
জাস্টিন সময় - পুনর্বহাল মনিকা

, ইত্যাদি) বা অন্য কোনও প্যাটার্ন, যতক্ষণ না এটি প্রতিটি নোডের উপরে এমনভাবে পুনরাবৃত্তি হয় যাতে প্রত্যেকে কেবলমাত্র একক সময় পাস হয়।
জাস্টিন সময় - মনিকা

1
@ ডক, খুব ভাল পয়েন্ট। আমি মনে করি std::unordered_setএকটি ক্রম "তৈরি" হয়েছিল কারণ আমরা কিছু স্বেচ্ছাচারী উপায় (হ্যাশ ফাংশন দ্বারা অভ্যন্তরীণভাবে দেওয়া) ব্যতীত অন্য উপাদানগুলির উপর পুনরাবৃত্তি করার একটি ভাল উপায় জানি না। আমি মনে করি এটি গাছের বিপরীত ক্ষেত্রে: পুনরাবৃত্তির unordered_setপরিমাণকে অল্প সংজ্ঞায়িত করা হয়, তাত্ত্বিকভাবে সম্ভবত "এলোমেলোভাবে" ব্যতীত কোনও পুনরাবৃত্তি সংজ্ঞায়নের "উপায় নেই"। গাছের ক্ষেত্রে অনেকগুলি "ভাল" (এলোমেলোভাবে) উপায় নেই। তবে, আবারও, আপনার পয়েন্টটি বৈধ।
ALFC
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.