বাইনারি গাছের আবর্তন


16

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

ঘুর্ণন

এই চ্যালেঞ্জের মধ্যে আমরা কেবলমাত্র একক ডান-ঘূর্ণন দিকে লক্ষ্য করব, এই জাতীয় ঘূর্ণন (বাম-রোটেশনটি প্রতিসম হবে) এর মতো দেখতে:

    5            3
   / \          / \
  3   6   =>   1   5
 / \              / \
1   4            4   6

যদি কোনও পাতা 1, 4বা 6বাম বা ডান উপ-গাছ থাকে তবে একটি ঘূর্ণন এগুলি কেবল সেখানে রাখবে। যদি এটি বৃহত্তর গাছের একটি সাবট্রি হয় তবে আমরা নোডে কেবল "এটি কেটে ফেলতাম" এবং সেই নোডের 5সাথে ঘোরানো গাছটি (এখন নোড 3) "পুনরায় সংযুক্ত" করব ।

চ্যালেঞ্জ

উপরের বর্ণনা অনুসারে একটি বাইনারি অনুসন্ধান গাছ 1 এবং সেই নোডের উপরে গাছটিকে ডানদিকে ঘোরান একটি কী দেওয়া হয়েছে। উপরের উদাহরণে প্রদত্ত কীটি হবে 5

বিধি এবং I / O

  • আপনার পছন্দের কী এবং পরীক্ষার কেসগুলির মধ্যে দ্বিপক্ষীয়তা না থাকলে আপনি যে কোনও ধরণের কী ব্যবহার করতে পারেন
  • আপনি দ্বৈত গাছের জন্য কোনও উপস্থাপনা বেছে নিতে পারেন যতক্ষণ না কোনও অস্পষ্টতা নেই (উদাহরণস্বরূপ [3,[]]অস্পষ্ট হয় অন্যথায় নির্দিষ্ট না করা পর্যন্ত) এবং এটি আপনার পছন্দের ভাষার পক্ষে স্বাভাবিক
  • যেহেতু ইনপুটটি সর্বদা একটি বাইনারি অনুসন্ধান গাছ থাকবে সেখানে কোনও সদৃশ কী নেই
  • আপনি ধরে নিতে পারেন গাছটিতে কীটি রয়েছে
  • আপনি ধরে নিতে পারেন যে কীটিযুক্ত নোডের একটি বাম সন্তান রয়েছে has
  • আপনি প্রদত্ত কী এর অধীনে একটি সঠিক সাবট্রি অনুমান করতে পারবেন না
  • আপনি ধরে নিতে পারবেন না যে গাছটি ঘোরার আগে ভারসাম্যহীন
  • আপনি ধরে নিতে পারবেন না যে গাছটি ঘোরার পরে ভারসাম্যপূর্ণ
  • আপনি যে কোনও ডিফল্ট আই / ও পদ্ধতি ব্যবহার করতে পারেন
  • আপনার জমাটি গাছটি ফিরিয়ে ফেলা বা সমাধান সমাধানের সম্পূর্ণ প্রোগ্রাম হতে পারে

পরীক্ষার মামলা

এই উদাহরণগুলি নীচে একটি গাছকে উপস্থাপন করে

  • যদি এটি একটি পাতা: []
  • যদি এটি xচাবিযুক্ত একটি গাছ এবং উভয় সাবট্রির পাতা হয়:[x]
  • যদি এটি কী xএবং সাবট্রি সহ একটি গাছ থাকে left right:[x,left,right]

প্রথম উদাহরণটি রোটেশন বিভাগে প্রদত্ত একটি । যদি কোনও কারণে আপনার এগুলির একটি গ্রাফিকাল উপস্থাপনা প্রয়োজন হয় তবে এখানে 2 আপনি যান।

5 [5,[3,[1],[4]],[6]]  ->  [3,[1],[5,[4],[6]]]
5 [5,[3,[1],[4]],[]]  ->  [3,[1],[5,[4],[]]]
5 [5,[3,[],[4]],[6]]  ->  [3,[],[5,[4],[6]]]
5 [5,[3,[1],[]],[]]  ->  [3,[1],[5]]
4 [8,[4,[2,[1],[3]],[6,[5],[7]]],[12,[10,[9],[11]],[14,[13],[15]]]]  ->  [8,[2,[1],[4,[3],[6,[5],[7]]]],[12,[10,[9],[11]],[14,[13],[15]]]]
8 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]]  ->  [10,[6,[4,[2,[],[3]],[5]],[8,[7],[9]]],[11]]
10 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]]  ->  [8,[6,[4,[2,[],[3]],[5]],[7]],[10,[9],[11]]]
9 [6,[3,[2],[5]],[9,[8],[12,[11],[15,[14],[]]]]]  ->  [6,[3,[2],[5]],[8,[],[9,[],[12,[11],[15,[14],[]]]]]]
7 [7,[5,[3,[1],[4]],[6]],[8]]  ->  [5,[3,[1],[4]],[7,[6],[8]]]
15 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]  ->  [17,[9,[5,[2,[0],[4]],[8]],[13,[11,[10],[12]],[15,[14],[16]]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
21 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]  ->  [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[19,[18],[21,[20],[24,[22],[25]]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]

1: মানে যে কোনও নোডের জন্য বাম সাবট্রির সমস্ত কীগুলি কীটির চেয়ে ছোট হবে এবং ডান সাবট্রির সমস্ত কী এর চেয়ে বড় হবে

2: লিঙ্ক পচা রোধ করতে, আমি তাদের মন্তব্য হিসাবে এম্বেড করেছি

উত্তর:


8

হাস্কেল , 93 92 84 83 82 বাইট

data B=B[B]Int|L
k!B[l@(B[x,y]a),r]n|k<n=B[k!l,r]n|k>n=B[l,k!r]n|1>0=B[x,B[y,r]k]a

@ বিএমও, @ আলেফালফ এবং @ লাইকনিকে প্রতিটি বাইটের জন্য এবং @ নিমিকে আট বাইটের জন্য ধন্যবাদ!

এটি অনলাইন চেষ্টা করুন!


ব্যবহার data B=B[B]Intআরও কিছু বাইট সংরক্ষণ করতে পারে।
লাইকনি

@ লাইকোনি কেবলমাত্র একটি বাইট আমার মনে হয় তবে আমি তা নিয়ে যাব
অ্যাঙ্গস

আপনিই প্রথম দুটি মামলা মার্জ, 2 বাইট বাঁচাতে পারে k<n=B[k!l,r]nএবং k>n=B[l,k!r]n: এক অনুবাদ করে, এবং k/=n=B[k!l,k!r]n, এবং তারপর যোগ k!x=xপ্যাটার্ন ম্যাচিং সম্পূর্ণ করা।
রাদেক

5

Vim , 25 বাইট

বাফারে ইনপুট নেয় - স্থান পৃথকীকরণ কী এবং গাছ। গাছটি নিম্নরূপে প্রতিনিধিত্ব করা হবে বলে আশা করা হচ্ছে:

  • গাছের পাতা: []
  • কী k, বাম শিশু <left>এবং ডান সন্তানের সাথে নোড <right>:[ k <left><right>]

কীটির চারপাশের স্পেসগুলি kগুরুত্বপূর্ণ নয়, যেমন সমাধানটি সালিশী গাছের জন্য কাজ করে।

"adw/ <C-r>a⏎3dw%l"apr[%xl%i]

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

"adw                           " delete the key and trailing space, keep in register a
    / <C-r>a⏎                  " move cursor to the key surrounded with spaces
             3dw               " remove key and [ (move left node to top)
                %l             " move cursor to the right subtree
                  "ap          " insert key there
                     r[        " insert a [ (appending subtree to key)
                       %       " move to the end of new left subtree
                        x      " remove ] (fix parentheses)
                         l%    " move to the end of new right subtree
                           i]  " insert ] (fix parentheses)

পূর্বরূপ

লিন এই স্ক্রিপ্টটি দিয়ে তৈরি প্রথম পরীক্ষার কেসের একটি পূর্বরূপ এখানে :

                       ভিম পূর্বরূপ


3

ওল্ফ্রাম ভাষা (ম্যাথমেটিকা) , 30 বাইট

#2/.a_~b_~c_~#~d_:>b[a,c~#~d]&

এটি অনলাইন চেষ্টা করুন!

নীচে উপস্থাপিত একটি গাছ:

  • যদি এটি একটি পাতাগুলি থাকে: $(আপনি কোনও মান দ্বারা এটি প্রতিস্থাপন করতে পারেন যা কোনও চাবি নয়)
  • যদি এটি কী xএবং সাবট্রি সহ একটি গাছ থাকে left right:x[left,right]

উদাহরণস্বরূপ, প্রথম পরীক্ষার ক্ষেত্রে গাছটি প্রতিনিধিত্ব করে 5[3[1[$,$],4[$,$]],6[$,$]]

ব্যাখ্যা:

#2                                the second input
  /.                              replace
    a_~b_~c_~#~d_                 #[b[a,c],d], where # is the first input
                 :>               by
                   b[a,c~#~d]     b[a,#[c,d]]
                             &    define a function

3

কমন লিস্প, 146 বাইট

(defun r(k a)(cond((not a)a)((=(car a)k)`(,(caadr a),(cadadr a)(,(car a),(car(cddadr a)),(caddr a))))(t`(,(car a),(r k(cadr a)),(r k(caddr a))))))

এটি অনলাইনে চেষ্টা করুন বা সমস্ত টেস্টকেস যাচাই করুন!

একটি গাছ নিম্নরূপে প্রতিনিধিত্ব করা হয়:

  • একটি খালি গাছ হিসাবে প্রদর্শিত হয় nil(বা সমানভাবে ফাঁকা তালিকার হিসাবে সাধারণ লিস্পে ())
  • একটি খালি খালি গাছ তিনটি উপাদানের একটি তালিকা হিসাবে প্রতিনিধিত্ব করা হয় (node left-subtree right-subtree) (সুতরাং একটি পাত Lহিসাবে প্রদর্শিত হয় (L nil nil))।

2

জাভাস্ক্রিপ্ট (নোড.জেএস) , 70 বাইট

n=>f=a=>n-a[0]?(a[i=n<a[0]?1:2]=f(a[i]),a):(i=a[1],a[1]=i[2],i[2]=a,i)

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। সমস্ত নোডের অবশ্যই বাম এবং ডান এন্ট্রি থাকতে হবে তবে তারা []সেই দিকে কোনও সাবট্রি ইঙ্গিত করতে পারে । একটি সমাহার যে টেস্ট স্যুট ব্যবহার l(N)নির্দেশ করে Nপাতার নেই এবং l(N,L)যে ইঙ্গিত Nএকটি বাম subtree আছে Lকিন্তু উভয় ইনপুট এবং আউটপুট কোন ডান subtree।



1

জেলি , 24 বাইট

ñ
Ḣ,1ịṪƊṭ@ṪṭḢð{Ḣ;ç€ɗ¹¡i?

এটি অনলাইন চেষ্টা করুন!

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

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