আপনি set
ইতিমধ্যে দেখেছেন যে রাজ্যগুলি সংরক্ষণ করতে আপনি কোনও (শব্দের গাণিতিক অর্থে, অর্থাত্ একটি সংগ্রহ যা ডুপ্লিকেট থাকতে পারে না) ব্যবহার করতে পারেন। আপনার এতে পরিচালনা করতে সক্ষম হওয়া অপারেশনগুলি হ'ল:
- উপাদান সন্নিবেশ
- উপাদানগুলি ইতিমধ্যে সেখানে আছে কিনা তা পরীক্ষা করে দেখানো হচ্ছে
খুব সুন্দর প্রতিটি প্রোগ্রামিং ভাষার ইতিমধ্যে একটি ডেটা স্ট্রাকচারের জন্য সমর্থন থাকা উচিত যা ধ্রুবক ( ) সময়ে এই উভয় ক্রিয়াকলাপ সম্পাদন করতে পারে । উদাহরণ স্বরূপ:ও ( 1 )
set
পাইথনে
HashSet
জাভাতে
প্রথম নজরে, এটি দেখে মনে হতে পারে যে আপনি যে কোনও রাজ্যের এই ধরণের সেটগুলিতে দেখেন সেগুলি ব্যয়বহুল মেমরি-ভিত্তিক হবে, তবে আপনার সীমান্তের জন্য আপনার ইতিমধ্যে যে স্মৃতি প্রয়োজন তার তুলনায় এটি খুব খারাপ নয়; যদি আপনার শাখাবিন্যাস ফ্যাক্টর , আপনার সীমান্ত দ্বারা বৃদ্ধি পায় নোড যে আপনার পরিদর্শন প্রতি উপাদানের (অপসারণ "দর্শন" এটা, যোগ করার জন্য সীমান্ত থেকে নোড , নতুন উত্তরাধিকারী / শিশু) যেহেতু আপনার সেট শুধুমাত্র দ্বারা বৃদ্ধি পায় অতিরিক্ত নোড প্রতি পরিদর্শন নোডখখ - 11খ1
সিউডোকোডে, এই জাতীয় সেট (আসুন এটির নাম দিন closed_set
, উইকিপিডিয়ায় সিউডোকোডের সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য নীচে ব্রাডথ-ফার্স্ট অনুসন্ধানে ব্যবহার করা যেতে পারে:
frontier = First-In-First-Out Queue
frontier.add(initial_state)
closed_set = set()
while frontier not empty:
current = frontier.remove_next()
if current == goal_state:
return something
for each child in current.generate_children()
if child not in closed_set: // This operation should be supported in O(1) time regardless of closed_set's current size
frontier.add(child)
closed_set.add(current) // this should also run in O(1) time
(এই সিউডোকোডের কিছু ভিন্নতা খুব কার্যকর হতে পারে এবং পরিস্থিতির উপর নির্ভর করে কমবেশি দক্ষ হতে পারে; উদাহরণস্বরূপ, আপনি closed_set
ইতিমধ্যে সীমান্তে বাচ্চাদের যোগ করেছেন এমন সমস্ত নোড থাকতে পারে এবং পুরোপুরি generate_children()
কলটি এড়ান যদি current
ইতিমধ্যে হয় closed_set
।)
আমি উপরে যা বর্ণনা করেছি তা হ'ল এই সমস্যাটি হ্যান্ডেল করার মানক উপায়। স্বজ্ঞাতভাবে, আমি সন্দেহ করি যে একটি ভিন্ন "সমাধান" হ'ল সীমান্তে যুক্ত করার আগে উত্তরসূরি রাষ্ট্রগুলির নতুন তালিকার ক্রমটি এলোমেলো করে দেওয়া হতে পারে। এইভাবে, আপনি মাঝে মধ্যে যুক্ত করার সমস্যাটি এড়াবেন না যে আপনি ইতিমধ্যে সীমান্তে প্রসারিত হয়ে গেছেন, তবে আমি মনে করি এটি অসীম চক্রের আটকে যাওয়ার ঝুঁকিকে উল্লেখযোগ্যভাবে হ্রাস করতে হবে।
সতর্কতা অবলম্বন করুন : আমি এই সমাধানটির কোনও আনুষ্ঠানিক বিশ্লেষণ জানি না যা প্রমাণ করে যে এটি সর্বদা যদিও অসীম চক্র এড়িয়ে যায়। আমি যদি এটিকে আমার মাথার মাধ্যমে "চালানোর" চেষ্টা করি, স্বজ্ঞাতভাবে, আমার সন্দেহ হয় যে এটির মতো কাজ করা উচিত, এবং এটির জন্য কোনও অতিরিক্ত মেমরির প্রয়োজন হয় না। প্রান্তের ঘটনাগুলি থাকতে পারে যা আমি এখনই চিন্তা করছি না, সুতরাং এটি কেবল কার্যকর নাও হতে পারে, উপরে বর্ণিত স্ট্যান্ডার্ড সমাধানটি একটি নিরাপদ বাজি (আরও স্মৃতির মূল্যে) হবে।