আর্ট অফ কম্পিউটার প্রোগ্রামিং ভলিউম 4: ফ্যাসিক্যাল 3 এ এর একটি টন রয়েছে যা আমি আপনার বর্ণনা থেকে কীভাবে আপনার নির্দিষ্ট পরিস্থিতির সাথে ফিট করতে পারি।
গ্রে কোডস
আপনি যে বিষয়টি নিয়ে আসবেন তা অবশ্যই মেমোরি এবং বেশ দ্রুত, আপনার সেটে 20 টি উপাদান দ্বারা সমস্যা হবে - 20 সি 3 = 1140 And এবং আপনি যদি সেটটি দিয়ে পুনরাবৃত্তি করতে চান তবে পরিবর্তিত ধূসর ব্যবহার করা ভাল if কোড অ্যালগরিদম যাতে আপনি তাদের সমস্তকে মেমোরিতে রাখছেন না। এগুলি পূর্বের থেকে পরবর্তী সংমিশ্রণ উত্পন্ন করে এবং পুনরাবৃত্তিগুলি এড়ায়। বিভিন্ন ব্যবহারের জন্য এর অনেকগুলি রয়েছে। আমরা কি ধারাবাহিক সংমিশ্রণের মধ্যে পার্থক্য সর্বাধিকতর করতে চাই? কমান? ইত্যাদি।
ধূসর কোডগুলি বর্ণনা করে এমন কিছু মূল কাগজ:
- কিছু হ্যামিল্টন পাথ এবং একটি ন্যূনতম পরিবর্তন অ্যালগরিদম
- সংলগ্ন ইন্টারচেঞ্জ সমন্বয় জেনারেশন অ্যালগরিদম
এখানে বিষয়টিকে আচ্ছাদিত আরও কিছু কাগজপত্র দেওয়া হল:
- Eades, হিকি এর একটি দক্ষ বাস্তবায়ন পড়ুন সংলগ্ন ইন্টারচেঞ্জ সমাবেশ জেনারেশন অ্যালগরিদম (পিডিএফ, পাসকাল কোড সহ)
- সংমিশ্রণ জেনারেটর
- সম্মিলিত গ্রে কোডগুলির সমীক্ষা (পোস্টস্ক্রিপ্ট)
- গ্রে কোডগুলির জন্য একটি অ্যালগরিদম
চেজের ট্যুইডল (অ্যালগোরিদম)
ফিলিপ জে চেজ, ` অ্যালগরিদম 382: এন অবজেক্টস এম এর মিশ্রণ '(1970)
সি এর অ্যালগরিদম ...
ডিক্সোগ্রাফিকাল অর্ডারের সংমিশ্রনের সূচক (বাকলস অ্যালগরিদম ৫১৫)
আপনি এর সূচী দ্বারা কোনও সংমিশ্রণটিও উল্লেখ করতে পারেন (অভিধানে ক্রমানুসারে)। সূচকের উপর নির্ভর করে সূচকটি ডান থেকে বামে কিছু পরিমাণ পরিবর্তন হওয়া উচিত যা আমরা এমন কিছু নির্মাণ করতে পারি যা একটি সংমিশ্রণ পুনরুদ্ধার করতে পারে।
সুতরাং, আমাদের একটি সেট আছে 2 1,2,3,4,5,6। ... এবং আমরা তিনটি উপাদান চাই। আসুন say 1,2,3 say বলি আমরা বলতে পারি যে উপাদানগুলির মধ্যে পার্থক্যটি একটি এবং ক্রম এবং ন্যূনতম। 2 1,2,4} এর একটি পরিবর্তন রয়েছে এবং এটি ডিক্সিকোগ্রাফিকভাবে 2 নম্বরে রয়েছে place সুতরাং শেষের স্থানে 'পরিবর্তন' সংখ্যাটি অভিধানিক ক্রমটির পরিবর্তনের জন্য দায়ী। এক পরিবর্তনের সাথে দ্বিতীয় স্থান {1,3,4 one এর একটি পরিবর্তন রয়েছে তবে এটি দ্বিতীয় স্থানে থাকার কারণে এটি আরও পরিবর্তনের জন্য অ্যাকাউন্ট রয়েছে (মূল সংখ্যার উপাদানগুলির সংখ্যার সাথে সমানুপাতিক)।
আমি যে পদ্ধতিটি বর্ণনা করেছি তা হ'ল ডিকনস্ট্রাকশন, যেমনটি মনে হয়, সূচি থেকে সেট থেকে শুরু করে আমাদের বিপরীতটি করা দরকার - যা অনেকটাই জটিল is এই হল কিভাবে Buckles সমস্যা solves। আমি সামান্য পরিবর্তনগুলির সাথে সেগুলি গণনা করতে কিছু সি লিখেছিলাম - আমি সেটটি উপস্থাপনের জন্য সংখ্যার ব্যাপ্তির চেয়ে সেটগুলির সূচকটি ব্যবহার করি, তাই আমরা সর্বদা 0 ... এন থেকে কাজ করছি। বিঃদ্রঃ:
- যেহেতু সংমিশ্রণগুলি আনঅর্ডারড, তাই {1,3,2} = {1,2,3} - আমরা তাদের অভিধানভুক্ত করার আদেশ দিই।
- এই পদ্ধতির প্রথম পার্থক্যের জন্য সেটটি শুরু করতে একটি অন্তর্নিহিত 0 রয়েছে।
ডিক্সোগ্রাফিকাল অর্ডারের মিশ্রণের সূচক (ম্যাকক্যাফ্রে)
আরও একটি উপায় আছে : এটির ধারণাটি উপলব্ধি করা এবং প্রোগ্রাম করা সহজ তবে এটি বাকলসের অপ্টিমাইজেশন ছাড়াই। ভাগ্যক্রমে, এটি সদৃশ সমন্বয়ও উত্পাদন করে না:
সেটটি সর্বাধিক , যেখানে ।
একটি উদাহরণস্বরূপ: 27 = C(6,4) + C(5,3) + C(2,2) + C(1,1)
। সুতরাং, চারটি জিনিসের 27 তম অভিধানের সংমিশ্রণটি হ'ল: 2 1,2,5,6 those, এগুলি আপনি যা দেখতে চান সেট সেট করে। নীচে উদাহরণ (ওক্যামল), choose
ফাংশন প্রয়োজন , পাঠকের কাছে বাম:
(* this will find the [x] combination of a [set] list when taking [k] elements *)
let combination_maccaffery set k x =
(* maximize function -- maximize a that is aCb *)
(* return largest c where c < i and choose(c,i) <= z *)
let rec maximize a b x =
if (choose a b ) <= x then a else maximize (a-1) b x
in
let rec iterate n x i = match i with
| 0 -> []
| i ->
let max = maximize n i x in
max :: iterate n (x - (choose max i)) (i-1)
in
if x < 0 then failwith "errors" else
let idxs = iterate (List.length set) x k in
List.map (List.nth set) (List.sort (-) idxs)
একটি ছোট এবং সাধারণ সংমিশ্রণ পুনরুক্তি
নিম্নলিখিত দুটি অ্যালগরিদমগুলি ডায়ডটিক উদ্দেশ্যে সরবরাহ করা হয়েছে। তারা একটি পুনরাবৃত্তকারী এবং (আরও সাধারণ) ফোল্ডার সামগ্রিক সংমিশ্রণগুলি প্রয়োগ করে। জটিলতা হে ( এন সি কে ) থাকার কারণে এগুলি যথাসম্ভব দ্রুত । স্মৃতিশক্তি গ্রহন দ্বারা আবদ্ধ k
।
আমরা পুনরুক্তি দিয়ে শুরু করব, যা প্রতিটি সংমিশ্রনের জন্য কোনও ব্যবহারকারী প্রদত্ত ফাংশনটি কল করবে
let iter_combs n k f =
let rec iter v s j =
if j = k then f v
else for i = s to n - 1 do iter (i::v) (i+1) (j+1) done in
iter [] 0 0
আরও সাধারণ সংস্করণ প্রারম্ভিক অবস্থা থেকে শুরু করে রাষ্ট্রের পরিবর্তনশীল সহ ব্যবহারকারী প্রদত্ত ফাংশনটিকে কল করবে। যেহেতু আমাদের বিভিন্ন রাজ্যের মধ্যে রাষ্ট্রটি পাস করতে হবে আমরা লুপটি ব্যবহার করব না, পরিবর্তে পুনরাবৃত্তি ব্যবহার করব,
let fold_combs n k f x =
let rec loop i s c x =
if i < n then
loop (i+1) s c @@
let c = i::c and s = s + 1 and i = i + 1 in
if s < k then loop i s c x else f c x
else x in
loop 0 0 [] x