দক্ষতার সাথে সমস্ত ভেক্টর পার্টিশন তৈরি করুন


12

একটি ভেক্টর পার্টিশন একটি ভেক্টরকে বিভিন্ন ভেক্টরকে এমন একটি ধারাবাহিকভাবে বিভক্ত করছে যে তাদের যোগফলটি আসল। এখানে কয়েকটি বিভাজন রয়েছে:

[3, 1, 2] = [3, 1, 2]
[3, 1, 2] = [0, 0, 1] + [0, 0, 1] + [0, 1, 0] + [1, 0, 0] + [2, 0, 0]
[3, 1, 2] = [1, 1, 2] + [2, 0, 0]

এখানে ভেক্টর সংযোজন উপাদান অনুসারে সম্পন্ন করা হয়। একটি বৈধ পার্টিশনে নেতিবাচক পূর্ণ সংখ্যার কোনও ভেক্টর বা অল-শূন্য ভেক্টর থাকে না।

এখন চ্যালেঞ্জটি হ'ল এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা একটি লক্ষ্য ভেক্টর প্রদত্ত সমস্ত সম্ভাব্য ভেক্টর পার্টিশন তৈরি করে। এটি তুলনামূলকভাবে সহজ শোনায় ...

... তবে একটি মোচড় আছে। যদি ইনপুট ভেক্টরটির আকার L থাকে এবং এটি তৈরি করে সবচেয়ে বড় পার্টিশনটিতে M উপাদান থাকে তবে আপনি O (L * M) মেমরির চেয়ে বেশি ব্যবহার করতে পারবেন না।

আপনি ধরে নিতে পারেন যে কোনও পূর্ণসংখ্যক O (1) মেমরি ব্যবহার করে। এর অর্থ হ'ল পার্টিশনগুলি তৈরি করার সময় আপনাকে অবশ্যই আউটপুট করতে হবে। তার উপরে, আপনাকে অবশ্যই প্রতিটি বিভাজন ঠিক একবার আউটপুট করতে হবে। উদাহরণস্বরূপ, এগুলি একই পার্টিশন:

[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]

আপনি যদি উভয়ই আউটপুট দিতে থাকেন তবে আপনার উত্তরটি অবৈধ।


এর জন্য সমস্ত পার্টিশন [3, 2]:

[3, 2]
[0, 1] + [3, 1]
[0, 1] + [0, 1] + [3, 0]
[0, 1] + [0, 1] + [1, 0] + [2, 0]
[0, 1] + [0, 1] + [1, 0] + [1, 0] + [1, 0]
[0, 1] + [1, 0] + [2, 1]
[0, 1] + [1, 0] + [1, 0] + [1, 1]
[0, 1] + [1, 1] + [2, 0]
[0, 2] + [3, 0]
[0, 2] + [1, 0] + [2, 0]
[0, 2] + [1, 0] + [1, 0] + [1, 0]
[1, 0] + [2, 2]
[1, 0] + [1, 0] + [1, 2]
[1, 0] + [1, 1] + [1, 1]
[1, 1] + [2, 1]
[1, 2] + [2, 0]

আপনার উত্তরটি পরীক্ষা করতে এটি চালিয়ে যান [3, 2, 5, 2]। এটিতে 17939 পার্টিশন তৈরি করা উচিত, যার সবগুলিই যোগফল [3, 2, 5, 2], এবং সেগুলি অনন্য (


বাইটস মধ্যে সংক্ষিপ্ত কোড।

উত্তর:


3

পাইথন 2, 289 বাইট

সাধারণ ব্রুট ফোর্স অ্যালগরিদম। পুরো তালিকাটিকে বেস max(input)+1( b) এর সংখ্যা হিসাবে গণ্য করে এবং প্রতিটি "নম্বর" ব্যাপ্তিতে [0, b**(L*M))এটি পরীক্ষা করে দেখুন:

  1. সঠিক পরিমাণে যোগফল
  2. বর্ণানুক্রমিক ক্রমে (স্বতন্ত্রতা নিশ্চিত করে)

যদি তালিকাটি এই মানদণ্ডের সাথে মেলে, প্রোগ্রামটি সমস্ত শূন্য ভেক্টরগুলি ছিনিয়ে নিয়ে এটিকে আউটপুট করে।

মেমরি ব্যবহার

এই প্রোগ্রামটিতে আমি যে বৃহত্তম ডেটা স্ট্রাকচার ব্যবহার করি তা হ'ল দ্বিগুণ-নেস্টেড তালিকা, স্মৃতি দেওয়ার জন্য Mলিস দৈর্ঘ্যযুক্ত একটি তালিকা দৈর্ঘ্য ।LO(L*M)

আমার অন্যান্য ডেটা স্ট্রাকচারের জন্য আমার কাছে 3 টি গ্লোবাল ইনটস O(3), 1 তালিকার দৈর্ঘ্য L( O(L)), 1 অ্যারে দৈর্ঘ্য M( O(M)) এবং আউটপুট ( O(L*M)) আউটপুট দেওয়ার সময় বৃহত্তম অ্যারের একটি অনুলিপি রয়েছে ।

মোট, এটি আমাকে মেমরির ব্যবহার দেয় O(2*L*M + L + M + 3)যা O(L*M)মাপদণ্ডকে মাপসই করা সহজ করে।

সময়ের জটিলতা

ব্রেস্ট ফোর্স অ্যালগরিদম হওয়ায় এই অ্যালগরিদম অত্যন্ত ধীর। লুপটি ছাড়ার জন্য, অ্যারেতে চূড়ান্ত ইনট হওয়া দরকার b-1। লুপটি b**(L*M)ঘটে যাওয়ার আগে বার চালানো দরকার ।

তদতিরিক্ত, প্রতিটি সময় তালিকাটি চলমান হয়, এটি উভয় শর্তাদি পরীক্ষা করে নেওয়া উচিত এবং L*M+L+Mপুনরাবৃত্তিগুলি ব্যবহার করে তালিকাটি সবচেয়ে খারাপ অবস্থায় মুদ্রণ করা দরকার । এটি সামগ্রিকভাবে দিতে সহজ করে O(L*M * b**(L*M))। আমি আমার প্রোগ্রামটি পরীক্ষা করার চেষ্টা করেছি [3, 2, 5, 2], তবে 45 মিনিটের পরে ছেড়ে দিয়েছি ।

গল্ফ প্রোগ্রাম

v=input()
L=len(v)
M=sum(v)
b=max(v)
R=range
t=[L*[0]for i in R(M)]
def A(l,i):
 if i<L*M-1and~-b<l[i/L][i%L]:A(l,i+1)
 l[i/L][i%L]=-~l[i/L][i%L]%-~b
while t[-1][-1]<b:
 if v==[sum(q[i]for q in t)for i in R(L)]and all(`t[i]`>=`t[i+1]`for i in R(M-1)):print[x for x in t if[0]*L!=x]
 A(t,0)

আমি এটি আরও কিছুটা গল্ফ করতে সক্ষম হতে পারি, বিশেষত বর্ধিত অংশ। অবহেলিত কোড আসছে।


আমি এই প্রশ্নটি পোস্ট করার সময় আমি যে দক্ষতার জন্য আশা করেছিলাম তা অবশ্যই নয়, তবে আমার ধারণা এটি প্রযুক্তিগতভাবে সমস্যার সমাধান করে :)
orlp
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.