উপাদানগুলির পুনরাবৃত্তি ছাড়াই জোড়ের সেট থেকে সংমিশ্রণগুলি তৈরি করা হচ্ছে


28

আমার একজোড়া সেট আছে। প্রতিটি জুড়ি ফর্মের (x, y) এর মতো যে x, y ব্যাপ্তি থেকে পূর্ণসংখ্যার অন্তর্ভুক্ত [0,n)

সুতরাং, যদি এন 4 হয়, তবে আমার নীচের জোড়াগুলি রয়েছে:

(0,1) (0,2) (0,3)
(1,2) (1,3) 
(2,3) 

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

 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere]
 2. (0,2)(1,3) [Correct]
 3. (1,3)(0,2) [Same as 2]

আমার সাথে জোড়া পরে একবারে কি কেউ আমাকে সমস্ত সম্ভাব্য সংমিশ্রণ উত্পন্ন করার উপায় প্রস্তাব করতে পারে?


আপনার জোড়গুলি উপস্থাপন করতে সম্ভবত 2 ডি অ্যারে ব্যবহার করে। বৈধ সংমিশ্রণগুলি এন অ্যারে সেলগুলির নির্বাচনের সাথে সম্পর্কিত যা প্রতিটি সারি এবং কলামে ঠিক 1 টি নির্বাচিত ঘর ধারণ করে।
জো

4
আপনি কি বলছেন যে ইনপুটটি সমস্ত জুটির সেট ? যদি তাই হয়, তবে আপনার কেবল ইনপুটটি কেবল বলা উচিত । n
rgrig

2
সবসময় কি ? যদি তা না হয় তবে "পূর্ণসংখ্যার কোনওটিরই পুনরাবৃত্তি হয় না" এবং "প্রতিটি পূর্ণসংখ্যা অন্তত একবার চূড়ান্ত সংমিশ্রণে উপস্থিত হয়" বিবৃতিগুলি পরস্পরবিরোধী। n
Dmytro Korduban

1
@ আরগ্রিগের মতো একই সমস্যা: ইনপুটটি কি সমস্ত আনর্ডারড জোড়া হয় বা এটি সম্ভাব্য জোড়গুলির একটি নির্বিচারে সেট? যদি এটি সমস্ত জোড়া হয় তবে আপনি কেবল ইনপুটটি বলতে পারেন , তালিকা দেওয়ার দরকার নেই। n
কাভেঃ

1
আপনার জোড়ার প্রাথমিক সেট দ্বারা নির্ধারিত পয়েন্টগুলিতে গ্রাফের সমস্ত নিখুঁত মিলগুলি তৈরি করতে আগ্রহী । তবুও মনে হচ্ছে আপনি সেই গ্রাফটিকে সেই পয়েন্টগুলিতে সম্পূর্ণ গ্রাফ হিসাবে নিয়েছেন। যদি আপনি এটি উল্লেখ করেন তবে আপনার প্রশ্ন আরও স্পষ্ট হবে। আছে যেমন matchings। n(n1)!!:=1×3×5××(n1)
মার্ক ভ্যান লিউউইন

উত্তর:


14

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

  1. ইতিমধ্যে ইনপুট তালিকার আওতায় থাকা স্বল্পতম সংখ্যার গণনা করুন। প্রথম অনুরোধের জন্য, এটি অবশ্যই 0 হবে, কারণ কোনও জোড়া বেছে নেওয়া হয়নি।
  2. যদি সমস্ত সংখ্যা আচ্ছাদিত থাকে তবে আপনার একটি সঠিক সমন্বয় রয়েছে, এটিকে মুদ্রণ করুন এবং পূর্ববর্তী পদক্ষেপটি ফিরিয়ে দিন। অন্যথায়, অনাবৃত সবচেয়ে ছোট সংখ্যাটি আমরা লক্ষ্য করব।
  3. লক্ষ্য নম্বরটি কভার করার জন্য উপায়টি খুঁজছেন এমন জুড়িগুলি অনুসন্ধান করুন। যদি কিছুই না থাকে তবে কেবল পুনরাবৃত্তির আগের স্তরে ফিরে আসুন।
  4. যদি লক্ষ্য নম্বরটি কভার করার কোনও উপায় থাকে, তবে প্রথমটিটি বেছে নিন এবং পুনরায় পুনরুদ্ধার করে পুরো প্রক্রিয়াটি আবার কল করুন, এই জুটিটি বেছে নেওয়া জোড়ের তালিকায় যুক্ত করুন।
  5. এটি যখন ফিরে আসে, পূর্বের নির্বাচিত জোড়াকে ওভারল্যাপ না করে কোনও জোড় দিয়ে লক্ষ্য নম্বরটি কভার করার পরবর্তী উপায়টি সন্ধান করুন। যদি আপনি এটির সন্ধান পান তবে এটি বাছুন এবং পুনরাবৃত্তভাবে পরবর্তী পদ্ধতিতে কল করুন।
  6. লক্ষ্য সংখ্যাটি কভার করার আরও কোনও উপায় না পাওয়া পর্যন্ত 4 এবং 5 পদক্ষেপ চালিয়ে যান। জোড়গুলির পুরো তালিকাটি দিয়ে যান। যখন আরও সঠিক পছন্দ নেই, পুনরাবৃত্তির আগের স্তরে ফিরে আসুন।

এই অ্যালগরিদমটি ভিজ্যুয়ালাইজ করার উপায়টি এমন একটি গাছের সাথে রয়েছে যার পথগুলি অ ওভারল্যাপিং জোড়গুলির ক্রম sequ গাছের প্রথম স্তরে সমস্ত জোড় থাকে যা 0 থাকে above উপরের উদাহরণস্বরূপ, গাছটি

           মূল
             |
     ----------------
     | | |
   (0,1) (0,2) (0,3)
     | | |
   (2,3) (1,3) (1,2)

এই উদাহরণে গাছের মধ্য দিয়ে সমস্ত পাথ প্রকৃতপক্ষে সঠিক সংগ্রহ দেয়, তবে উদাহরণস্বরূপ আমরা যদি এই জুটিটি (১,২) রেখে দিয়ে থাকি তবে ডানদিকের রাস্তায় কেবল একটি নোড থাকবে এবং ৩ য় ধাপে অনুসন্ধান ব্যর্থ হবে correspond

নির্দিষ্ট ধরণের সমস্ত অবজেক্টকে গণনা করার অনুরূপ অনেক সমস্যার জন্য এই ধরণের অনুসন্ধান আলগোরিদিমগুলি বিকাশ করা যেতে পারে।


এটি প্রস্তাবিত হয়েছিল যে সম্ভবত ওপি বলতে বোঝায় যে সমস্ত জুটি ইনপুটটিতে রয়েছে, কেবল প্রশ্ন হিসাবে সেগুলির একটি সেট নয়। সেক্ষেত্রে অ্যালগরিদম আরও সহজ কারণ কোন জোড়ের অনুমতি রয়েছে তা যাচাই করার দরকার নেই। এমনকি সমস্ত জোড়া সেট তৈরি করাও প্রয়োজনীয় নয়; নিম্নলিখিত সিউডোকোড ওপি যা বলেছে তা করবে। এখানে ইনপুট সংখ্যা "তালিকা" একটি খালি তালিকা হিসাবে আরম্ভ আউট, এবং "আবৃত" দৈর্ঘ্যের একটি অ্যারের হয়, 0 সক্রিয়া এটা কিছুটা আরও দক্ষ করা সম্ভব হয়েছে কিন্তু যে আমার তাৎক্ষণিক লক্ষ্য নয়।এনnn

sub cover {
  i = 0;
  while ( (i < n) && (covered[i] == 1 )) {
   i++;
  }
  if ( i == n ) { print list; return;}
  covered[i] = 1;
  for ( j = 0; j < n; j++ ) {
    if ( covered[j] == 0 ) {
      covered[j] = 1;
      push list, [i,j];
      cover();
      pop list;
      covered[j] = 0;
    }
  }
  covered[i] = 0;
}

এটি কাজ করা উচিত, তবে এটি করা সম্ভবত এটি সবচেয়ে কার্যকর উপায় নয়।
জো

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

যদি তালিকাটি পয়েন্টার ব্যবহার করে তবে নুথের নাচের লিঙ্কগুলি একবার দেখার মতো। যখন আপনি ফিরে আসবেন পুনরাবৃত্তি কল এবং তালিকার পূর্বের অবস্থাটি পুনরুদ্ধার করতে হবে।
uli

10

আপনি এটি পুনরাবৃত্তি সমাধান করতে পারেন। ধরুন আপনার ব্যাপ্তির জন্য সমস্ত সমাধান । তারপরে আপনি থেকে সহজেই the সমাধানগুলি তৈরি করতে পারেন । আকারটি দিয়ে খুব দ্রুত বৃদ্ধি পায় , সুতরাং মেমরির সমস্ত সেট ধরে রাখার চেয়ে জেনারেটর লেখা ভাল, নীচে পাইথনের উদাহরণ দেখুন। [ 0 , এন ) এস এন + 2 এস এন এনSn[0,n)Sn+2Snn

def pairs(n):
    if (n%2==1 or n<2):
        print("no solution")
        return
    if (n==2):
        yield(  [[0,1]]  )
    else:
        Sn_2 = pairs(n-2) 
        for s in Sn_2:
            yield( s + [[n-2,n-1]] )
            for i in range(n/2-1):
                sn = list(s)
                sn.remove(s[i])
                yield( sn + [ [s[i][0], n-2] , [s[i][1], n-1] ] )
                yield( sn + [ [s[i][1], n-2] , [s[i][0], n-1] ] )

কল করে আপনি সমস্ত জোড়া তালিকাবদ্ধ করতে পারেন

for x in pairs(6):
   print(x)

6

আপডেট : আমার আগের উত্তরটি দ্বিপক্ষীয় গ্রাফগুলির সাথে মোকাবিলা করেছে, যা ওপি জিজ্ঞাসা করছে না। আমি আপাতত এটি সম্পর্কিত তথ্য হিসাবে রেখে দিচ্ছি। তবে আরও প্রাসঙ্গিক তথ্য অবিবাহিত গ্রাফের নিখুঁত ম্যাচের সাথে সম্পর্কিত।

এই বিষয়ে, প্রপ দ্বারা একটি দুর্দান্ত সমীক্ষা রয়েছে যা অগ্রগতির রূপরেখা (1999 সাল পর্যন্ত)। এই নিবন্ধে কিছু ধারণা এবং সম্পর্কিত লিঙ্কগুলি কার্যকর হতে পারে useful টিএল; ডিআর হ'ল - এটি খুব জটিল :)

--- পুরানো উত্তর শুরু

মনে রাখবেন যে আপনি যা করতে বলছেন তা হ'ল দ্বিপক্ষীয় গ্রাফের সমস্ত সম্ভাব্য নিখুঁত মিলগুলি গণনা করা। এটি করার জন্য অনেকগুলি পৃথক পৃথক অ্যালগরিদম রয়েছে এবং বিশেষত সাম্প্রতিকতম একটি হ'ল আইএসএএসি 2001 এর

মূল ধারণাটি হ'ল নেটওয়ার্ক ফ্লো ব্যবহার করে একটি নিখুঁত মিল খুঁজে পাওয়া এবং তারপরে বারবার বিকল্প চক্র ব্যবহার করে এটি সংশোধন করুন (আরও তথ্যের জন্য নেটওয়ার্ক প্রবাহের কোনও অ্যালগোরিদম পাঠ্যপুস্তক অধ্যায় দেখুন)।


দ্বিপক্ষীয় গ্রাফ প্রদত্ত লেবেলগুলির সাথে দুটি সেট নিয়ে গঠিত [0, n), এবং একটি প্রান্ত আছে (i, j) যদি এবং কেবল যদি (i! = J)
জো

আমি মনে করি না আপনি জোড়গুলির জন্য নোড লাগাতে হবে, আমরা এগুলি প্রান্ত হিসাবে গণ্য করতে পারি। অন্য কথায়, আমরা শীর্ষে একটি সম্পূর্ণ গ্রাফ আছে , এবং আমরা সমস্ত শীর্ষবিন্দু আচ্ছাদন উত্পাদন করতে চান। সুতরাং আমার কাছে মনে হচ্ছে সমস্যাটি স্থায়ী গণনা করছে । কে nnKn
কাভেঃ

2
স্থায়ী উত্তর গণনা। তবে ওপি তাদের গণনা করতে চায়
সুরেশ

গ্রাফ কাঠামোর কারণে এগুলির সমস্তই আইসমোরফিক কারণ তাই প্রয়োগের অনুমতি সম্পর্কে চিন্তা করা ভাল ধারণা হতে পারে (তবে সমস্যাটি হ'ল এটি নকল তৈরি করবে)।
কাভেঃ

4

আপনার চয়ন করা প্রতিটি জোড়া দুটি সারি মুছে ফেলা হয় যা থেকে আপনি আর চয়ন করতে পারবেন না। এই ধারণাটি পুনরাবৃত্ত আলগোরিদিম সেটআপ করতে ব্যবহার করা যেতে পারে (স্কালায়):

def combine(pairs : Seq[(Int,Int)]) : Seq[Seq[(Int, Int)]] = pairs match {
  case Seq() => Seq()
  case Seq(p) => Seq(Seq(p))
  case _ => {
    val combinations = pairs map { case (a,b) => {
      val others = combine(pairs filter { case (c,d) =>
        a != c && a != d && b != c && b != d
      })

      others map { s => ((a,b) +: s) }
    }}

    combinations.flatten map { _.sorted } distinct
  }
}

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


এটি কি প্রতিটি সংখ্যাকে অন্তর্ভুক্ত করে না এমন সংমিশ্রণগুলিও ফেরত দেবে না, তবে যা প্রসারিত হতে পারে না কারণ মূল ক্রমের কোনও জোড় নেই যা তাদের প্রসারিত করতে পারে? যদি তা হয় তবে এই সংমিশ্রণগুলি ফিল্টার করা দরকার।
কার্ল ম্যামার্ট

ওপি প্রস্তাব দিয়েছে যে আমরা যদি প্রতিটি নকল ছাড়াই পর্যাপ্ত পরিমাণে বড় সেট থাকে তবেই আমরা প্রতিটি নম্বর পাই। সেটিং ইন এবং সমস্ত (সাজানো হিসেবে) ইনপুট হিসাবে জোড়া, এই সত্য, এবং আপনি এই ব্যবহারটি নির্ধারণ, যার জন্য আমার আলগোরিদিম (অভিযুক্ত) সঠিক নয়। n2N
রাফেল

আমি স্কেলা পড়তে পারি না, তবে এই বিষয়টি নিয়েই আমি উদ্বিগ্ন। মনে করুন কেবল একটি জোড়, এবং । তারপরে কোনও আউটপুট থাকা উচিত নয়, কারণ পুরো সেটটি কভার করা যায় না। সেক্ষেত্রে এই অ্যালগরিদমটি কি এখনও কিছু ফেরত দেবে? এন = 4(0,1)n=4
কার্ল ম্যামার্ট

হ্যাঁ। তবে আমি যেমন বলেছি, আমার উত্তরটি ওপির প্রস্তাবিত দৃশ্যের সাথে সম্পর্কিত, অর্থাত্ স্বেচ্ছাচারী তথ্য নয়।
রাফেল

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

4

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

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

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

আমরা যদি অন্য দৈর্ঘ্যের ক্রম তৈরি করতে চাই তবে আমরা এই কৌশলটি প্রসারিত করতে পারি। কেবল মনে রাখবেন যে আমরা যখন কোনও পরবর্তী উপাদানটি বেছে নিয়েছি যার প্রথম সংখ্যাটি সর্বাপেক্ষা ক্ষুদ্রতম নয় তবে আমরা এক বা একাধিক সারি উপাদানগুলিকে বাছাই করা যথাযথ অংশে উপস্থিত হওয়া থেকে বিরত থাকি, তাই প্রারমুটেশনটির সর্বোচ্চ দৈর্ঘ্য সেই অনুযায়ী হ্রাস হয়।


3

আপনি যা জিজ্ঞাসা করছেন এটি এটি কিনা তা আমি নিশ্চিত নই তবে যেমনটি আমি বুঝতে পেরেছি, আপনারা সমস্ত of এর আনর্ডারড জোড়া এবং সমস্ত তালিকাটি গণনা করতে চান সেটটি কভার করুন যেখানে একটি সমান সংখ্যা। আমরা প্রান্ত-আচ্ছাদন হিসাবে , অবস্থিত সম্পূর্ণ গ্রাফ ।(n2)[n]={1,,n}[n]nKnn

তবুও প্রশ্নটি মনে হয় যে প্রতিটি সংখ্যা তালিকাতে একবারে উপস্থিত হয়। কোন ক্ষেত্রে, আমরা কেবল প্রচ্ছদগুলি দেখছি যা নিখুঁত মিল রয়েছে । গ্রাফের সাথে মিলের সংখ্যাটি তার সংলগ্ন ম্যাট্রিক্সের স্থায়ী সমান । সুতরাং আমাদের গণনা করা দরকার ।[n]Perm(Kn)

এটি পরিচিত যে স্থায়ী তবে এটি সাধারণ ক্ষেত্রে। জন্য এখানে তালিকা রয়েছে। #P-complete Knn!2n2

এগুলির সমস্ত উত্পন্ন করার সহজ উপায় হ'ল একটি নিখুঁত মিলের সমাধান করা এবং তারপরে এর একটি অনুক্রম প্রয়োগ করা তবে এটি অনেকগুলি নকল তৈরি করে।[n]

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