বাইনারি গাছ গণনা করুন


20

বাইনারি গাছ

বাইনারি ট্রি একটি গাছ যা তিন ধরণের নোডযুক্ত:

  • টার্মিনাল নোড, যার কোনও সন্তান নেই
  • unary নোড, যার প্রতিটি একটি করে সন্তান রয়েছে
  • বাইনারি নোড, যার দুটি করে বাচ্চা থাকে

আমরা বিএনএফ (ব্যাকাস us নওর ফর্ম) এ প্রদত্ত নিম্নলিখিত ব্যাকরণের সাথে তাদের প্রতিনিধিত্ব করতে পারি :

<e> ::= 
      <terminal>   
    | <unary>
    | <binary>

<terminal> ::= 
    "0"

<unary> ::= 
    "(1" <e> ")"

<binary> ::= 
    "(2" <e> " " <e> ")"

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

মোটজকিন নম্বর

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

N          Motzkin number M(N)
1          1
2          1
3          2 
4          4 
5          9 
6         21 
7         51 
8        127 
    ...

যেমন M(5)9, এবং 5 টি নোড সহ নয়টি স্বতন্ত্র বাইনারি গাছ রয়েছে are

1      (1 (1 (1 (1 0))))  
2      (1 (1 (2 0 0)))  
3      (1 (2 0 (1 0)))  
4      (1 (2 (1 0) 0))  
5      (2 0 (1 (1 0)))  
6      (2 0 (2 0 0))  
7      (2 (1 0) (1 0))  
8      (2 (1 (1 0)) 0)  
9      (2 (2 0 0) 0)  

কার্য

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

nপাঠযোগ্যতার জন্য প্রথম বন্ধনী সহ 1 থেকে 5 পর্যন্ত উদাহরণ Ex

0

(1 0)

(1 (1 0))
(2 0 0)

(1 (1 (1 0)))
(1 (2 0 0))
(2 0 (1 0))
(2 (1 0) 0)

(1 (1 (1 (1 0))))
(1 (1 (2 0 0)))
(1 (2 0 (1 0)))
(1 (2 (1 0) 0))
(2 0 (1 (1 0)))
(2 0 (2 0 0))
(2 (1 0) (1 0))
(2 (1 (1 0)) 0)
(2 (2 0 0) 0)

ইনপুট

ইনপুটটি একটি ইতিবাচক পূর্ণসংখ্যা হবে।

আউটপুট

আউটপুটটি এমন অনেকগুলি নোডের সাথে স্বতন্ত্র বাইনারি গাছগুলির একটি স্বতন্ত্র উপস্থাপনা হওয়া উচিত। উপরের বিএনএফ ব্যাকরণ দ্বারা প্রদত্ত সঠিক স্ট্রিংটি ব্যবহার করা বাধ্যতামূলক নয়: ব্যবহৃত সিনট্যাক্সগুলি গাছের একটি দ্ব্যর্থহীন প্রতিনিধিত্ব করে sufficient যেমন আপনি ব্যবহার করতে পারে []পরিবর্তে (), বন্ধনী একটি অতিরিক্ত স্তর [[]]পরিবর্তে [], বাইরের প্রথম বন্ধনী, বর্তমান বা অনুপস্থিত অতিরিক্ত কমা বা কোন কমা, অতিরিক্ত স্পেস, প্রথম বন্ধনী বা কোন প্রথম বন্ধনী, ইত্যাদি

এই সমস্ত সমতুল্য:

(1 (2 (1 0) 0))  
[1 [2 [1 0] 0]]  
1 2 1 0 0  
12100  
(1 [2 (1 0) 0])  
.:.--  
*%*55  
(- (+ (- 1) 1))
-+-11

@ Xnor দ্বারা একটি মন্তব্যে প্রণীত একটি প্রকরণ। যেহেতু কোনও ফর্ম্যাটে এটি অনুবাদ করার একটি উপায় রয়েছে যা এটি বোঝা যায় এটি গ্রহণযোগ্য।

[[[]][]]  is (2 (1 0) 0)

এই সহজ কিছু রূপান্তর বুঝতে করতে []করতে ()তাই মত

[([])()]

এখন আপনি যদি শুরু

[]

তারপরে একটি বাইনারি সন্নিবেশ করুন যা আপনার কাছে দুটি অভিব্যক্তি দরকার

 [()()] which is 2

এবং তারপরে প্রথম () এর জন্য একটি আনারি সন্নিবেশ করান যার জন্য আপনার কাছে পাওয়া একটি এক্সপ্রেশন প্রয়োজন

 [([])()] which is 21

তবে যেহেতু []বা ()কোনও অভ্যন্তরীণ বন্ধনীর সাথে 0 টি প্রতিনিধিত্ব করতে পারে যা আপনাকে এর মতো ব্যাখ্যা করতে পারে এমন আর কোনও এক্সপ্রেশন নেই

 2100

নোট করুন যে উত্তরগুলি তাত্ত্বিকভাবে অসীম মেমরির সাথে কাজ করতে পারে তবে বাস্তবায়ন-নির্ভর সসীম ইনপুটটির জন্য স্পষ্টতই স্মৃতিশক্তি শেষ হয়ে যাবে।

আউটপুট এর বিভিন্নতা

BNF             xnor       Christian   Ben
b(t, b(t, t))   [{}{{}{}}] (0(00))     (1, -1, 1, -1)                         
b(t, u(u(t)))   [{}{(())}] (0((0)))    (1, -1, 0, 0)           
b(u(t), u(t))   [{()}{()}] ((0)(0))    (1, 0, -1, 0)                     
b(b(t, t), t)   [{{}{}}{}] ((00)0)     (1, 1, -1, -1)              
b(u(u(t)), t)   [{(())}{}] (((0))0)    (1, 0, 0, -1)                          
u(b(t, u(t)))   [({}{()})] ((0(0)))    (0, 1, -1, 0)                          
u(b(u(t), t))   [({()}{})] (((0)0))    (0, 1, 0, -1)                        
u(u(b(t, t)))   [(({}{}))] (((00)))    (0, 0, 1, -1)                          
u(u(u(u(t))))   [(((())))] ((((0))))   (0, 0, 0, 0)  

সদৃশ গাছগুলির জন্য চেক করার একটি সম্ভাব্য জায়গা

সদৃশটি পরীক্ষা করার জন্য একটি জায়গা এম (5) এর সাথে রয়েছে।
এই গাছটি এম (4) টি গাছ থেকে এম (5) এর জন্য দু'বার তৈরি হয়েছিল

(2 (1 0) (1 0))  

প্রথমটিতে একটি অখণ্ড শাখা যুক্ত করে

(2 (1 0) 0)

এবং দ্বিতীয়টিতে একটি আনরি শাখা যুক্ত করে

(2 0 (1 0))

বিএনএফ বোঝা

বিএনএফ সহজ বিধি দ্বারা গঠিত:

<symbol> ::= expression

যেখানে বাম দিকে ঘেরা একটি প্রতীক নাম <>
ডানদিকে প্রতীকটি নির্মাণের জন্য অভিব্যক্তি। কিছু বিধি নির্মাণে অন্যান্য বিধি ব্যবহার করে, যেমন

<e> ::= <terminal>

e হতে পারে একটি terminal

এবং কিছু নিয়মের অক্ষর রয়েছে যা চিহ্ন তৈরিতে ব্যবহৃত হয়, যেমন

<terminal> ::= "0"

terminal শুধু শূন্য চরিত্র।

কিছু নিয়মের এগুলি নির্মাণের একাধিক উপায় রয়েছে, যেমন

<e> ::= 
      <terminal>   
    | <unary>
    | <binary>

একটি eএকটি <terminal>বা একটি <unary>বা একটি হতে পারে <binary>

এবং কিছু বিধি অংশের ক্রম, যেমন

<unary> ::= "(1" <e> ")"

একটি unaryঅক্ষর (1কি নির্মাণ করা যেতে পারে দ্বারা অনুসরণ eদ্বারা অনুসরণ )

আপনি সর্বদা শুরু করার নিয়ম দিয়ে শুরু করেন, এটি এর জন্য <e>

কয়েকটি সহজ উদাহরণ:

সরল ক্রমটি ঠিক 0। সুতরাং আমরা শুরু করার নিয়মটি দিয়ে শুরু করি <e>এবং দেখুন যে তিনটি পছন্দ রয়েছে:

  <terminal>   
| <unary>
| <binary>

সুতরাং প্রথম এক নিতে <terminal>। এখন একটি টার্মিনালের কোনও পছন্দ নেই এবং তা 0। তাই প্রতিস্থাপন <terminal>সঙ্গে 0<e>নিয়ম এবং আপনার কাজ সম্পন্ন করা হয়।

তার পরেরটি হ'ল (1 0)। যা আছে তার সাথে শুরু করুন <e>এবং ব্যবহার করুন<unary>

"(1" <e> ")"

এখন এটির একটি দরকার <e>তাই আমরা ফিরে যাব <e>এবং তিনজনের মধ্যে একটিকে বেছে নেব, এবার নির্বাচন করা, <terminal>যা দেয় 0। প্রতিস্থাপন করা হচ্ছে 0মধ্যে (1 <e> )দেয় (1 0), এবং এই প্রতিস্থাপিত হয় মধ্যে <unary>তাই <e>হয় (1 0)


সুতরাং, একটি বাইনারি গাছ? "একটি বাইনারি ট্রি একটি গাছের ডেটা কাঠামো যাতে প্রতিটি নোডে সর্বাধিক দুটি শিশু থাকে"
fəˈnɛtɪk

3
আপনার বর্ণনাটি বাইনারি গাছের। বাইনারি গাছের 2 টি বাচ্চা হওয়ার দরকার নেই। এটির অর্থ কেবল তাদের সর্বোচ্চ 2 বাচ্চা রয়েছে have আমার ধারণা, অ্যানারি-বাইনারি কেবল একটি আরও নির্দিষ্ট শব্দ যা সত্যিকার অর্থে আলাদা কিছু বোঝায় না।
fəˈnɛtɪk

আমাদের মধ্যে যারা কম্পিউটার বিজ্ঞানী নন তাদের জন্য "বিএনএফ" কী তা স্পষ্ট করার বিষয়টি বিবেচনা করুন
লুইস মেন্ডো

1
@ গুয়কোডার আমার বক্তব্যটি হ'ল, যদি কেউ "বিএনএফ" দেখেন এবং এর অর্থ কী না জানেন তবে তাদের কীভাবে ফেলে দেওয়া এবং পড়া বন্ধ করা যেতে পারে। সম্ভবত সংক্ষিপ্ত আকারের পরিবর্তে নামটি ব্যবহার করা এবং উইকিপিডিয়ায় একটি লিঙ্ক যুক্ত করা যথেষ্ট হবে
লুইস মেন্ডো

4
@ mbomb007 নাম পরিবর্তন হয়েছে। তার জন্য আমার পিয়ার-প্রেসার অ্যাওয়ার্ড পাওয়া উচিত। :)
গাই কোডার

উত্তর:


12

হাস্কেল, 68 বাইট

t 0=[""]
t 1=["0"]
t n=['(':x++y++")"|k<-[1..n-1],x<-t k,y<-t$n-k-1]

টার্মিনাল নোডগুলি রেফারেন্স 0দ্বারা (e)অ্যানারি এবং বাইনারি নোড দ্বারা প্রতিনিধিত্ব করা হয় । (ee), তাই দুই তিন নোড গাছের মত দেওয়া হয় (00)এবং ((0))

উদাহরণ:

*Main> t 5
["(0(00))","(0((0)))","((0)(0))","((00)0)","(((0))0)","((0(0)))","(((0)0))","(((00)))","((((0))))"]
*Main> length $ t 8
127
*Main> length $ t 15
113634 

5

সিজেএম (37 বাইট)

0aa{_2m*2\f+1Y$f+++:e__&}qi:A*{,A=},p

অনলাইন ডেমো । মনে রাখবেন যে এটি খুব দক্ষ নয় এবং আপনি সম্ভবত 5অনলাইনে ইনপুট গণনার চেষ্টা করতে চান না ।

অনুসরণ বিচ্ছিন্ন।


5

পাইথ ( 24 21 19 বাইট)

এটি আমার পাইথন 3 সমাধানের উপর ভিত্তি করে ।

f!|sTf<sY0._T^}1_1t

পাইথটি ব্যবহার করা আমার প্রথমবার তাই সম্ভবত এটি এখনও গল্ফযোগ্য।

উদাহরণ , ইনপুট যখন আউটপুট 4:

[[1, 0, -1], [1, -1, 0], [0, 1, -1], [0, 0, 0]]

1 বাইনারি নোডকে উপস্থাপন করে, 0 টি একটি অ্যানারি নোডকে উপস্থাপন করে এবং -1 একটি টার্মিনাল নোডকে উপস্থাপন করে। প্রতিটি গাছের শেষে একটি অন্তর্নিহিত টার্মিনাল নোড রয়েছে।

ব্যাখ্যা :

f!|sTf<sY0._T^}1_1t
f                    filter
             ^    t  length n-1 lists of elements
              }1_1   from [1, 0, -1]
 !|                  for when both
   sT                sum of list is 0, and
     f    ._T        for each prefix of list,
      <sY0           sum of prefix is non-negative.

আগ্রহের বিষয়: পাইথ উত্স কোড
গাই কোডার

4

ব্রেনফাক, 107 বাইট

,>++>-[-[<-[<-[>>[[>+<-]<]>+>[[<+>>>>>+<<<<-]>]>>++>,++++>]>[<+>-[+>>]>[<->[.<<<
<<]+[->+]+>>>]]]]<[[,<]<]<]

বিন্যাসকৃত:

,>++>-
[
  -
  [
    <-
    [
      <-
      [
        >>
        [[>+<-]<]
        >+>
        [[<+> >>>>+<<<<-]>]
        >>++>,++++>
      ]
      >
      [
        <+>-
        [
          +>>
        ]
        >
        [
          <->[.<<<<<]
          +[->+]
          +>>>
        ]
      ]
    ]
  ]
  <
  [
    [,<]
    <
  ]
  <
]

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

ইনপুটটিকে বাইট হিসাবে নেওয়া হয় এবং গাছটি 12100এটি হিসাবে উপস্থাপিত হয় \x01\x02\x03\x02: ফিরে রূপান্তর, অনুবাদ tr/\x01\x02\x03/012/, স্ট্রিংটিকে বিপরীত করা এবং একটি ফাইনাল যুক্ত করা 0। গাছগুলি দ্বারা পৃথক করা হয় \xfe। (আউটপুট যেমন প্রথম পরিবর্তন করে পড়ার জন্য সহজ করা যেতে পারে -মধ্যে -36এবং .মধ্যে +47.-47, যেখানে -36উপায়ে 36 একটি স্ট্রিং -অক্ষর, ইত্যাদি)

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

টেপটি 5-নোড কোষে বিভক্ত,

i d x 0 0

iসূচকটি কোথায় (বাম থেকে ডানে নীচে নেমেছে), dআংশিক যোগফল এবং xএটি উপাদান।

নিয়ন্ত্রণ প্রবাহের স্কেচ:

take n and push initial node
while stack is non-empty:
    if rightmost node can be decremented:
        decrement rightmost node
        if there are less than n nodes:
            push new node
        else if valid tree:
            print
    else:
        backtrack (pop)

মনে রাখবেন যে কখনও কখনও কোনও মান প্রকৃত (ধারণাগত) মানের চেয়ে এক বা দুটি বৃহত্তর হিসাবে সংরক্ষণ করা হয় বা আরম্ভ করা হয় এবং প্রয়োজনীয় হিসাবে সামঞ্জস্য করা হয়।


3

পাইথন 3 ( 138 134 128 121 119 বাইট)

from itertools import*
lambda n:[any(sum(t[:k])<0for k in range(n))|sum(t)or print(t)for t in product(*[[-1,0,1]]*~-n)]

উদাহরণস্বরূপ আউটপুট n=5:

(0, 0, 0, 0)
(0, 0, 1, -1)
(0, 1, -1, 0)
(0, 1, 0, -1)
(1, -1, 0, 0)
(1, -1, 1, -1)
(1, 0, -1, 0)
(1, 0, 0, -1)
(1, 1, -1, -1)

1 বাইনারি নোডকে উপস্থাপন করে, 0 টি একটি অ্যানারি নোডকে উপস্থাপন করে এবং -1 একটি টার্মিনাল নোডকে উপস্থাপন করে। প্রতিটি গাছের শেষে একটি অন্তর্নিহিত টার্মিনাল নোড রয়েছে।

প্রোগ্রামটি খুব কাছাকাছি সময় নিতে শুরু করে n=17


3

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30-57), 79 বাইট

f=(m,l=0)=>m?[for(n of[1,0,-1])if(l>n&l<=m+n)for(a of f(m-1,l-n))[...a,n]]:[[]]

যেখানে -1একটি টার্মিনাল, 0একটি অ্যানারি নোড এবং 1একটি বাইনারি নোড উপস্থাপন করে। m=14আমার পিসিতে ধীরে ধীরে শুরু হয়। পুনরাবৃত্তভাবে গাছের শেষ থেকে ফিরে কাজ করে।

  • নন-অ্যাকাউন্টেড নোডগুলির সংখ্যাটি lএই প্রান্তে সীমাবদ্ধ রয়েছে যে শেষে কেবল 1 টি নোড থাকতে পারে।
  • পরবর্তী নোডের nধরণটি যথেষ্ট পরিমাণ অ্যাকাউন্টবিহীন-নোডের সন্তান হওয়ার জন্য প্রয়োজনীয়তার দ্বারা সীমাবদ্ধ।

2

প্রোলোগ, 149 144 138 137 131 107 বাইট

e(L,L)-->[0].

e([_|A],L)--> 
    [1],
    e(A,L).

e([_,_|A],L)--> 
    [2],
    e(A,B), 
    e(B,L).

e(M,E):-                   
    length([_|L],M),        
    e(L,[],E,[]).           

?- e(5,S).
S = [1, 1, 1, 1, 0] ;
S = [1, 1, 2, 0, 0] ;
S = [1, 2, 0, 1, 0] ;
S = [1, 2, 1, 0, 0] ;
S = [2, 0, 1, 1, 0] ;
S = [2, 0, 2, 0, 0] ;
S = [2, 1, 0, 1, 0] ;
S = [2, 1, 1, 0, 0] ;
S = [2, 2, 0, 0, 0].

এবং সমাধান গণনা

e_count(N,Count) :-
    length([_|Ls], N),
    findall(., phrase(e(Ls,[]),E), Sols),
    length(Sols, Count).

?- e_count(N,Count).
N = Count, Count = 1 ;
N = 2, Count = 1 ;
N = 3, Count = 2 ;
N = Count, Count = 4 ;
N = 5, Count = 9 ;
N = 6, Count = 21 ;
N = 7, Count = 51 ;
N = 8, Count = 127 ;
N = 9, Count = 323 ;
N = 10, Count = 835 ;
N = 11, Count = 2188 ;
N = 12, Count = 5798 ;
N = 13, Count = 15511 ;
N = 14, Count = 41835 ;
N = 15, Count = 113634 

1

পাইথন, 71 বাইট

f=lambda n:{(a+b,)for k in range(n)for a in f(k)for b in f(n+~k)}or[()]

এটি গাছগুলিকে যেমন নেস্টেড টুপলস হিসাবে উপস্থাপন করে ((((),), ()),)যা ((())())কমা, স্পেস এবং বহিরাগতকে সরিয়ে দিয়ে রূপান্তরিত হতে পারে ()

পূর্ববর্তী 76 76-বাইট সংস্করণ:

f=lambda n:{'('+a+b+')'for k in range(n)for a in f(k)for b in f(n+~k)}or['']

1

সিজেম, 38 বাইট

পিটার টেলরের সিজেম উত্তর দেয় এমন একটি ভিন্ন পদ্ধতির ব্যবহার করে।

3rim*{:(1\+[{1$+}*])\:(_:z#|!},

আউটপুট কিছু হবে 1110120020102100। প্রতিটি গাছ হ'ল nসংখ্যার একটি গ্রুপ (যেখানে nইনপুট নম্বরটি থাকে)।

মৌলিক ধারণা যে আমরা ডিজিটের প্রতিটি সম্ভাব্য স্ট্রিং উৎপন্ন হয় 0, 1এবং 2, এবং তারপর শুধুমাত্র লোক যে সুগঠিত গাছ ফিল্টার করুন।

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