সাবসেট সামার অর্ডারিংস


22

nধনাত্মক সংখ্যার একটি সেট 2^nসাবসেট রয়েছে। যদি এই সাবসেটগুলির কোনওটির সমষ্টি না হয় তবে আমরা একটি সেটকে "সুন্দর" বলব। {2, 4, 5, 8}এটি একটি দুর্দান্ত সেট। যেহেতু সাবসেটগুলির কোনওটির সমষ্টি নেই, আমরা সাবসেটগুলি যোগফল অনুসারে বাছাই করতে পারি:

[{}, {2}, {4}, {5}, {2, 4}, {2, 5}, {8}, {4, 5}, {2, 8}, {2, 4, 5}, {4, 8}, {5, 8}, {2, 4, 8}, {2, 5, 8}, {4, 5, 8}, {2, 4, 5, 8}]

আমরা ক্রমবর্ধমান ক্রমে [2, 4, 5, 8]চিহ্নগুলির সাথে সংখ্যাগুলি লেবেল করলে [a, b, c, d]আমরা নিম্নলিখিত বিমূর্ত ক্রমটি পাই:

[{}, {a}, {b}, {c}, {a, b}, {a, c}, {d}, {b, c}, {a, d}, {a, b, c}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}]

ইতিবাচক সংখ্যার আরেকটি দুর্দান্ত সেট একই বিমূর্ত ক্রম বা অন্য একটি হতে পারে। উদাহরণস্বরূপ, [3, 4, 8, 10]ভিন্ন বিমূর্ত অর্ডার সহ একটি দুর্দান্ত সেট:

[{}, {a}, {b}, {a, b}, {c}, {d}, {a, c}, {b, c}, {a, d}, {b, d}, {a, b, c}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}]

এই চ্যালেঞ্জে আপনাকে অবশ্যই nইতিবাচক সংখ্যাগুলির দুর্দান্ত সেটগুলির পৃথক বিমূর্ত ক্রমগুলির সংখ্যা গণনা করতে হবে । এই সিকোয়েন্সটি হ'ল OEIS A009997 , এবং জানা মানগুলি শুরু n=1হচ্ছে:

1, 1, 2, 14, 516, 124187, 214580603

উদাহরণস্বরূপ, উদাহরণস্বরূপ, n=3নিম্নলিখিত দুটি সম্ভাব্য বিমূর্ত ক্রম:

[{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}]
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {b, c}, {a, b, c}]

কারণ n=4, নিম্নলিখিত 14 টি বিমূর্ত অর্ডারিং রয়েছে, সেই সাথে সেই অর্ডারের সাথে একটি দুর্দান্ত সেটও রয়েছে:

[{}, {a}, {b}, {a, b}, {c}, {a, c}, {b, c}, {a, b, c}, {d}, {a, d}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 4, 2, 1]                                       
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {b, c}, {d}, {a, b, c}, {a, d}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 6, 3, 2]                                      
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {d}, {b, c}, {a, d}, {a, b, c}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 7, 4, 2]                                      
[{}, {a}, {b}, {a, b}, {c}, {a, c}, {d}, {a, d}, {b, c}, {a, b, c}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 6, 4, 1]                                       
[{}, {a}, {b}, {a, b}, {c}, {d}, {a, c}, {b, c}, {a, d}, {b, d}, {a, b, c}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 8, 4, 3]                                      
[{}, {a}, {b}, {a, b}, {c}, {d}, {a, c}, {a, d}, {b, c}, {b, d}, {a, b, c}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 7, 4, 2]                                       
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}, {d}, {a, d}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 4, 3, 2]                                      
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {d}, {a, b, c}, {a, d}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 4, 3, 2]                                       
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {d}, {b, c}, {a, d}, {a, b, c}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 5, 4, 2]                                       
[{}, {a}, {b}, {c}, {a, b}, {a, c}, {d}, {a, d}, {b, c}, {a, b, c}, {b, d}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 7, 6, 2]                                      
[{}, {a}, {b}, {c}, {a, b}, {d}, {a, c}, {b, c}, {a, d}, {b, d}, {a, b, c}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 6, 4, 3]                                       
[{}, {a}, {b}, {c}, {a, b}, {d}, {a, c}, {a, d}, {b, c}, {b, d}, {a, b, c}, {c, d}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [10, 8, 6, 3]                                      
[{}, {a}, {b}, {c}, {d}, {a, b}, {a, c}, {b, c}, {a, d}, {b, d}, {c, d}, {a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [8, 6, 5, 4]                                       
[{}, {a}, {b}, {c}, {d}, {a, b}, {a, c}, {a, d}, {b, c}, {b, d}, {c, d}, {a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}, {a, b, c, d}], [7, 6, 5, 3]

নিম্নলিখিতটি কোনও বৈধ বিমূর্ত অর্ডার নয়:

{}, {a}, {b}, {c}, {d}, {a,b}, {e}, {a,c}, {b,c}, {a,d}, {a,e}, {b,d}, {b,e}, {c,d}, {a,b,c}, {a,b,d}, {c,e}, {d,e}, {a,b,e}, {a,c,d}, {a,c,e}, {b,c,d}, {b,c,e}, {a,d,e}, {b,d,e}, {a,b,c,d}, {c,d,e}, {a,b,c,e}, {a,b,d,e}, {a,c,d,e}, {b,c,d,e}, {a,b,c,d,e}

এই আদেশটি বোঝায় যে:

d < a + b
b + c < a + d
a + e < b + d
a + b + d < c + e

এই অসমতার সংমিশ্রণ দেয়:

2a + 2b + c + 2d + e < 2a + 2b + c + 2d + e

যা একটি বৈপরীত্য। আপনার কোড অবশ্যই এই ক্রম গণনা করা উচিত। এই জাতীয় প্রতিবেদনগুলি প্রথমে উপস্থিত হয় n=5এই কাগজ থেকে উদাহরণ , পৃষ্ঠায় 2.5 উদাহরণ।

এই ক্রম যে সত্ত্বেও অবৈধ A < Bযে বোঝা A U C < B U C, কোন Cথেকে টুকরো করা Aএবং B


আপনার কোড বা প্রোগ্রামটি অবশ্যই যথেষ্ট দ্রুত হওয়া উচিত যা আপনি এটি n=4জমা দেওয়ার আগে এটি শেষের দিকে চালাতে পারেন ।

দাখিলগুলি যথারীতি প্রোগ্রাম, ফাংশন ইত্যাদি হতে পারে।

স্ট্যান্ডার্ড লুফোলগুলি বরাবরের মতো নিষিদ্ধ। এটি কোড গল্ফ, তাই বাইট জেতে সংক্ষিপ্ত উত্তর। মন্তব্যগুলিতে পরিষ্কার প্রশ্ন জিজ্ঞাসা করুন।


ইসসাক অনেক দিন দেখছে না!
orlp

যখন দুটি উপগঠন হয়, সেখানে এমন কোনও দৃশ্য রয়েছে যেখানে বা than ব্যতীত অন্য কোনও তথ্য থেকে অনুমান করা যায় , গণনায় নয় প্রাথমিক ? পি প্রশ্ন পি প্রশ্ন পি পি , কুই প্রশ্ন ( পি কুই ) একটি ...P,QPQPQpP,qQ(pq)abc
orp

উত্তর: হ্যাঁ আঁট যথেষ্ট, উদাহরণস্বরূপ নয়: । { একটি , } , { , }pP,qQ(pq){a,c},{b,c}
orlp

@orlp ফিরে আসাই ভাল! আমি মনে করি আমি
প্রত্যাশিত

আপনি কি n = 4 এর জন্য 14 টি সম্ভাব্য অর্ডারগুলি যুক্ত করতে পারেন?
পিটার টেলর

উত্তর:


11

পাইথন 3 + SciPy, 396 390 385 351 336 355 বাইট

from scipy.optimize import*
n=int(input())
r=range(n)
def f(u):
 s=linprog(r,u,[-n]*len(u),options={'tol':.1});c=s.success;y=sorted(range(c<<n),key=lambda a:s.x.round()@[a>>i&1for i in r])
 for a,b in zip(y,y[1:]):
  v=[(a>>i&1)-(b>>i&1)for i in r]
  if~-(v in u):c+=f(u+[[-z for z in v]]);u+=v,
 return+c
print(f([[(i==j-1)-(i==j)for i in r]for j in r]))

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

এটি এখন n = 5 জন্য প্রায় 5 সেকেন্ডে চলে। if~-(v in u):-18 বাইট কিন্তু বিপুল কর্মক্ষমতা শাস্তি জন্য সরানো হতে পারে।

আপনি যদি সমস্ত বিমূর্ত ক্রমগুলি কেবল এটি গণনা করার পরিবর্তে পাওয়া যায় সেগুলি মুদ্রণ করতে চান if c:print(s.x.round(),y)তবে forলুপের আগে যুক্ত করুন । (সাবসেটগুলি বাইনারি পূর্ণসংখ্যার দ্বারা প্রতিনিধিত্ব করা হয় যেখানে প্রতিটি বিট একটি উপাদানের উপস্থিতি বা অনুপস্থিতির সাথে মিলে যায়: { a , c , d } ↔ 1101₂ = 13.)

কিভাবে এটা কাজ করে

fপুনরাবৃত্তিমূলক বিমূর্ত ক্রম গণনাগুলি প্রদত্ত সীমাবদ্ধতার একটি তালিকা সন্তুষ্ট করে। আমরা na , a + nb , b + nc , c + nd সীমাবদ্ধতাগুলি দিয়ে শুরু করি । রৈখিক প্রোগ্রামিং ব্যবহার করে আমরা সীমাবদ্ধতার একটি সমাধান খুঁজে পাই (বা যদি না থাকে তবে 0 ফিরে আসে) এই ক্ষেত্রে আমরা একটি = 4, বি = 8, সি = 12, ডি = 16 পাই get আমরা সংখ্যার সমাধানটি বৃত্তাকার করি round , তারপরে তার সমস্ত সাবসেটকে তাদের যোগফল অনুসারে বাছাই করে একটি রেফারেন্স অর্ডার গণনা করুন:

{ }, { বি }, { সি }, { , বি }, { ডি }, { , সি }, { , ডি }, { বি , সি }, { বি , ডি }, { , বি , সি }, { সি , ডি }, { , বি , ডি }, { , সি , ডি }, { বি , সি , ডি },একটি , , , }

রাউন্ডিং n / 2 এর বেশি দ্বারা কোনও প্রতিবন্ধকতা লঙ্ঘন করতে পারে না , এজন্য আমরা এন এর একটি মার্জিন যুক্ত করেছি ।

পাইথন যেহেতু sortedস্থিতিশীল, তাই সাবটেটগুলির মধ্যে যে কোনও সম্পর্ক একই রকমের বিপরীত-লিক্সোগ্রাফিক ক্রমে বিভক্ত হয় যার মধ্যে আমরা সেগুলি উত্পন্ন করেছিলাম। সুতরাং আমরা imagine a , b , c , d rep এর সাথে} a { 2 ^ n + 2 ^ 0, বি · 2 ^ n + 2 ^ 1, সি · 2 ^ n + 2 ^ 2, ডি · 2 la এর পরিবর্তে কল্পনা করতে পারি কোনও সম্পর্ক ছাড়াই একই ক্রম পেতে n + 2 ^ 3}।

পরিকল্পনাটি হ'ল রেফারেন্স অর্ডারের সাথে প্রথমে একমত না হওয়ার ভিত্তিতে কেস বিশ্লেষণ করে অন্যান্য সমস্ত বিমূর্ত অর্ডারগুলিকে শ্রেণিবদ্ধ করা হবে :

উভয় ক্ষেত্রেই { একটি }> { },
অথবা { একটি } <{ }> { },
অথবা { একটি } <{ } <{ }> { একটি , },
অথবা { একটি } <{ } < { সি } <{ , বি }> { ডি },
⋮ ⋮

প্রতিটি ক্ষেত্রে, আমরা এন এর মার্জিন fসহ এই নতুন সীমাবদ্ধতাগুলি যুক্ত করি এবং পুনরায় যুক্ত হওয়া নতুন সীমাবদ্ধতার সাথে কল করি ।

নোট

কিছুক্ষণের জন্য আমি অনুমান করেছিলাম (তবে ধরে নি নি) যে সীমাবদ্ধতার উপর 1 টি মার্জিন সহ লিনিয়ার প্রোগ্রাম সমাধানগুলি সর্বদা পূর্ণসংখ্যার হবে। এটি মিথ্যা বলে প্রমাণিত হয়েছে: এন = with সহ একটি পাল্টা নমুনা {2.5, 30, 62.5, 73.5, 82, 87.5, 99.5}}

পাইথন, 606 বাইট (দ্রুত, কোনও বাহ্যিক গ্রন্থাগার নেই)

n=int(input())
r=range(n)
e=enumerate
def l(u,x):
 for i,v in e(u):
  for j,a in e(v):
   if a<0:break
  else:return[0]*len(x)
  if sum(b*x[k]for k,b in e(v))>0:
   x=l([[b*w[j]-a*w[k]for k,b in e(v)if k!=j]for w in u[:i]],x[:j]+x[j+1:]);x.insert(j,0)
   for k,b in e(v):
    if k!=j:x[j]+=b*x[k];x[k]*=-a
 return x
def f(u,x):
 x=l(u,x);c=any(x);y=sorted(range(c<<n),key=lambda a:sum(x[i]*(a>>i&1)for i in r))
 for a,b in zip(y,y[1:]):
  v=[(a>>i&1)-(b>>i&1)for i in r]+[1]
  if~-(v in u):c+=f(u+[[-z for z in v[:-1]]+[1]],x);u+=v,
 return+c
print(f([[(i==j-1)-(i==j)for i in r]+[1]for j in r],[1]*(n+1)))

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

এই রান এন এক সেকেন্ডের ত্রৈমাসিকে = 5, এবং এন = 6 230 মধ্যে সেকেন্ড (PyPy 75 সেকেন্ড)।

এটি ভাসমান পয়েন্ট গোলাকার সমস্যাগুলি এড়াতে সমজাতীয় স্থানাঙ্কে পূর্ণসংখ্যার গণিত ব্যবহার করে একটি হ্যান্ড-কোডড লিনিয়ার প্রোগ্রামিং সলভার অন্তর্ভুক্ত করে।



@ মিঃ এক্সকোডার অবশ্যই, ধন্যবাদ!
অ্যান্ডারস ক্যাসরগ

@ লিন ধন্যবাদ! আমি কিছুটা আপস করলাম কারণ আমি এটিকে খুব বেশি কমিয়ে দিতে চাই না n এটি ইতিমধ্যে এন = 5 এর জন্য প্রায় 3 মিনিট সময় নেয়
অ্যান্ডারস কাসেরগ

1
@ অ্যালোনআমিট দেখে মনে হচ্ছে এটি এন = 6 এর জন্য প্রায় 55 মিনিট সময় নিয়েছে; আমার কাছে বিজ্ঞানের চেয়ে GLPK ব্যবহার করে একটি সংস্করণ রয়েছে যা 70 সেকেন্ডে n = 6 করে। আরও গুরুত্বপূর্ণভাবে, সাইকপাই সংস্করণটি ভুল উত্তর পেয়েছে (এবং সঠিকভাবে জিএলপিকে)… তাই আহ, এটাই ... আকর্ষণীয় ... আমি আশ্চর্য হই যে এটি সাইকপাই # 6690 ?
অ্যান্ডারস ক্যাসরগ

1
@ অ্যালোনআমিট # 6690 এটি নয় তবে আমি যুক্ত করেছিলাম options={'tol':.1}, যা মনে হয় সমস্যার যত্ন নিচ্ছে।
অ্যান্ডারস কাসের্গ

0

রুবি, 308 বাইট, আরও দ্রুত

কেস 4 কে 150 ডলারে চালায়। কোনও বিশেষায়িত গ্রন্থাগার ব্যবহৃত হয় না।

->n{t=2**(n-1)
n==0 ?[[0]]:P[n-1].map{|a|b=a.map{|i|i+t}
[*0..t].repeated_combination(t).select{|m|m[0]>=a.index(n-1)}.map{|m|c,d=a.dup,b.dup;m.reverse.map{|i|c.insert(i,d.pop)};c}}.flatten(1).select{|p|p.combination(2).all?{|(x,y)|x&~y==0||y&~x!=0&&n.times.all?{|i|x!=y<<i+1}&&p.index(x&~y)<p.index(y&~x)}}}

উদাহরণস্বরূপ, এটি একটি ছোট মামলার পুনরাবৃত্তভাবে ছেদ করতে পারে

[{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}]

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

সম্মতি জন্য যা অংশ পরীক্ষা করে সেগুলি আগের মতো, তবে পরীক্ষার সংমিশ্রণগুলি খুব কম নয়।

সম্প্রসারিত এবং মন্তব্য করা সংস্করণ:

->n{
    t=2**(n-1)
    if n==0
        [[0]]
    else
        # for each one of the previous nice orderings
        P[n-1].map { |a|
            # create the missing sets, keep order
            b = a.map{|i|i+t}
            # intersperse the two sets
            [*0..t].repeated_combination(t) # select t insertion points
                .select do |m|
                    # ensure the new singleton is after the old ones
                    m[0] >= a.index(n-1)
                end
                .map do |m|
                    # do the interspersion
                    c,d=a.dup,b.dup
                    m.reverse.map{|i|c.insert(i, d.pop)}
                    c
                end
        }.flatten(1).select{ |p|
            # check if the final ordering is still nice
            p.combination(2).all? { |(x,y)|
                (x&~y==0) || 
                (y&~x!=0) && 
                n.times.all?{|i|x!=y<<i+1} && 
                (p.index(x&~y)<p.index(y&~x))
            }
        }
    end
}

রুবি, 151 বাইট, বেশ ধীর

(তিনটি উপাদানের ক্ষেত্রে << 1 সেকেন্ড লাগে, চারটির ক্ষেত্রে এখনও চলছে)

->n{[*1...2**n-1].permutation.select{|p|p.combination(2).all?{|(x,y)|x&~y==0||y&~x!=0&&n.times.all?{|i|x!=y<<i+1}&&p.index(x&~y)<p.index(y&~x)}}.count}

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

ফরম্যাট:

-> n {
  [*1...2**n-1]. # prepare permutations of non-empty and non-full sets
    permutation.
    select { |p|
      p.combination(2). # check all ordered pairs
        all? { |(x, y)|
          # first is subset of second 
          x &~ y == 0 ||
          # second is not subset of first
          y &~ x != 0 &&
          # first is not a right shift of second
          # (this normalizes the ordering on atoms)
          n.times.all? { |i| x != y << i+1 } &&
          # after taking out common elements, ordering agrees 
          p.index(x &~ y) < p.index(y &~ x)
        }
    }.
    count
}

আমি আমার মেশিনে এটি 3 এর উপরে পরীক্ষা করতে পারি না তবে এটি (139 বাইট) আপনার সমাধানের সাথে কার্যকরভাবে অভিন্ন হওয়া উচিত। পরিবর্তনগুলি: ...x-1=> ..x-2, .select{...}.count=> .count{...}, |(x,y)|=> |x,y|, x&~y==0||y&~x!=0=> x&~y<1||y&~x>0যেহেতু a&~bআমার ভুল না হলে নেতিবাচক হতে পারে না
Asone Tuhid

1
n=5আমি সবেমাত্র জুড়েছি এমন কাউন্টারটেক্সেল দেখুন । যদি আমার ভুল না হয় তবে আপনার কোডটি এটি গ্রহণ করবে।
isaacg

2
টিআইও লিঙ্কটি দেখিয়েছে এটি কাউন্টারেরেক্সেমলে সঠিকভাবে কাজ করে না: এটি অনলাইনে চেষ্টা করে দেখুন!
isaacg

1
আপনার নতুন সংস্করণটি একটি পুনরাবৃত্ত ফাংশন বলে মনে হচ্ছে P, তাই এটি অনামী হতে পারে না। এছাড়াও, আমি মনে করি আমার পোস্ট করা কাউন্টারিক্স নমুনার কারণে এটি এখনও ব্যর্থ।
isaacg

1
দ্রুত সমাধানের জন্য: ২৮০ বাইট অনলাইনে এটি ব্যবহার করে দেখুন! । নোট করুন যে আপনাকে অবশ্যই পুনরাবৃত্ত ফাংশনের নাম অন্তর্ভুক্ত করতে হবে ( P=)। এছাড়াও, আমি মনে করি আপনাকে একটি নম্বর ফিরিয়ে দিতে হবে যাতে আপনার .sizeকোনও জায়গায় অন্তর্ভুক্ত থাকতে পারে ।
অসোন তুহিদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.