কোনও গাছকে পুনরাবৃত্তি, স্ট্যাক বা সারি এবং কেবল কয়েক মুঠো পয়েন্টার ছাড়াই আটকানো যেতে পারে?


15

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

সুতরাং, এটি সম্ভব, না অসম্ভব? কেন অথবা কেন নয়?

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

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


3
আপনার সীমাবদ্ধতা নির্দিষ্ট করতে হবে। আমাকে কি গাছটি বদলাতে দেওয়া হচ্ছে? গাছকে কীভাবে উপস্থাপন করা হয়? (উদাহরণস্বরূপ, প্রতিটি নোডের কি তার পিতামাতার কাছে প্যারেন্ট পয়েন্টার রয়েছে?) উত্তর নির্দিষ্ট সীমাবদ্ধতার উপর নির্ভর করবে; এই সীমাবদ্ধতাগুলি নির্দিষ্ট না করেই, এটি কোনও ভাল পোজড সমস্যা নয়।
DW

2
আমি অনুমান করি যে প্রফেসররা সত্যই প্রকাশ করতে চেয়েছিলেন কনট্রিন্টটি ছিল " অতিরিক্ত স্থান সহ"। তবে আপনার সমাধান কী ছিল, যাইহোক? হে(1)
রাফেল

উত্তর:


17

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

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

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

ভাল অংশ: কোনও অতিরিক্ত ডেটা কাঠামো নেই। খারাপ অংশ: সামান্য প্রতারণা, স্ট্যাকটি চতুর উপায়ে গাছের অভ্যন্তরে । খুব চালাক.

লুকানো স্ট্যাকের একটি প্রমাণ পি। মতেতি এবং আর মঙ্গিরমালানীতে দেখানো হয়েছে: মরিসের গাছ ট্র্যাভারসাল অ্যালগরিদম পুনর্বিবেচিত ডিওআই: 10.1016 / 0167-6423 (88) 90063-9

জেএম মরিস: বাইনারি গাছগুলি সহজ এবং সস্তায় ট্র্যাভার করে। আইপিএল 9 (1979) 197-200 ডিওআই: 10.1016 / 0020-0190 (79) 90068-1

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

জি। লিন্ডস্ট্রোম: স্ট্যাক বা ট্যাগ বিট ছাড়াই তালিকা কাঠামো স্ক্যান করছে। আইপিএল 2 (1973) 47-51। ডিওআই: 10.1016 / 0020-0190 (73) 90012-4

সম্ভবত সবচেয়ে সোজা উপায় রবসনের একটি পদ্ধতি । এখানে ক্লাসিক অ্যালগরিদমের জন্য প্রয়োজনীয় স্ট্যাকটি পাতা দিয়ে থ্রেড করা হয়েছে ed

জেএম রবসন: সহায়ক স্ট্যাক আইপিএল 1 (1973) 149-152 ছাড়াই বাইনারি গাছগুলি অনুসরণ করার জন্য একটি উন্নত অ্যালগরিদম। 10,1016 / 0020-0190 (73) 90018-5

আইপিএল = তথ্য প্রসেসিং লেটার


আমি এই সমাধানটিও পছন্দ করি, যদিও এটি আমার কম্পিউটার বিজ্ঞানের ক্লাসের প্রথম বর্ষের সময় নিয়ে আসত না। হ্যাঁ, সম্ভবত আমার প্রফেসরের বিধি মোতাবেক প্রতারণা করছি।
এনএল -

2
আপনি কৌশলগুলি জন্য লিঙ্ক / রেফারেন্স দিতে পারেন?
রাফেল

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

6

বনাম


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

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

@ রাফেল হ্যাঁ, এবং এটি মূল অধ্যাপকের প্রয়োজনীয়তা পূরণ করে, সুতরাং এটি আমার কাছে একটি গ্রহণযোগ্য উত্তর।
এনএল - মনিকা

0

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

Pseudocode:
root = pointer root 
depth = integer 0
finished = bool false
//If we n-ary tree also track how many children have been found 
//on the node with the most children for the purposes of this psuedocode 
//we'll assume a binary tree and insert a magic number of 2 so that we 
//can use bitwise operators instead of integer division 
while(!finished)
    ++depth
    treePosition = pointer root
    finished = true;
    for i := 0..2**depth
        for j := 0..depth
            if (i & j) //bitwise operator explained below
                // if right child doesn't exist break the loop
                treePosition = treePosition.rightChild
            else
                // if left child doesn't exist break the loop
                treePosition = treePosition.leftChild
        if j has any children
            finished = false
            do anything else you want when visiting the node

প্রথম কয়েকটি স্তরের জন্য এটি দেখতে এটির মতো দেখাবে, যেমন আপনি দেখতে পাচ্ছেন, সিউডোকোডের বিটওয়াইস অপারেটর কেবল একটি বাইনারি গাছের বাম বা ডানদিকে ঘুরিয়ে ফেলার সিদ্ধান্ত নেয়:

2**1       0               1
2**2   00      01      10      11
2**3 000 001 010 011 100 101 110 111

এন-অ্যারির জন্য, আপনি 0 এবং ম্যাকচিল্ড্রেনের মধ্যে কোন পাথটি নির্ধারণ করতে i% (ম্যাকচিল্ডেন ** জে) / জে নেবেন।

এনআরিতে প্রতিটি নোডে আপনার শিশুদের সংখ্যা সর্বোচ্চ চিলড্রেনের চেয়ে বেশি কিনা তা পরীক্ষা করে দেখতে হবে এবং যথাযথভাবে আপডেট করতে হবে।


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

হে(1)হে(এলজিএন)হে(1)হে(এন)হে(1)depth প্রস্থের চেয়ে বেশিint ?
ডাব্লু

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

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

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