আমার কাছে একটি সীমাবদ্ধ আকারের টাইলসের গ্রিড রয়েছে যা একটি মানচিত্র তৈরি করে। মানচিত্রের অভ্যন্তরে কিছু টাইলস একটি অঞ্চল হিসাবে পরিচিত সেটে রাখা হয়। এই অঞ্চলটি সংযুক্ত, তবে এর আকৃতি সম্পর্কে কিছুই জানা যায়নি। বেশিরভাগ সময় এটি মোটামুটি নিয়মিত ব্লব হবে তবে এটি একদিকে খুব দীর্ঘায়িত হতে পারে এবং এটিতেও সম্ভবত গর্ত হতে পারে। আমি এই অঞ্চলের (বাহ্যিক) সীমানা সন্ধান করতে আগ্রহী।
অর্থাৎ, আমি সমস্ত টাইলগুলির একটি তালিকা চাই যা অঞ্চলটিতে থাকা কোনও টাইলকেই স্পর্শ করে। এটি সন্ধান করার একটি দক্ষ উপায় কী?
অতিরিক্ত অসুবিধার জন্য, এটি ঘটে যে আমার টাইলগুলি হেক্সস, তবে আমি সন্দেহ করি এটি খুব বেশি পার্থক্য রাখে না, প্রতিটি টাইল এখনও একটি পূর্ণসংখ্যা x এবং y স্থানাঙ্ক সহ লেবেলযুক্ত এবং একটি টাইল দেওয়া হলে আমি সহজেই তার প্রতিবেশীদের সন্ধান করতে পারি। নীচে কয়েকটি উদাহরণ দেওয়া হল: কালো হ'ল অঞ্চল, এবং নীল রঙের সীমানাটি আমি সন্ধান করতে চাই। এটি নিজেই, একটি কঠিন সমস্যা নয়, সিউডো-পাইথন-এ এটির জন্য একটি সাধারণ অ্যালগরিদম হ'ল:
def find_border_of_territory(territory):
border = []
for tile in territory:
for neighbor in tile.neighbors():
if neighbor not in territory and neighbor not in border:
border.add(neighbor)
তবে এটি ধীর এবং আমি আরও ভাল কিছু চাই। অঞ্চলটির উপর আমার ও (এন) লুপ রয়েছে, সমস্ত প্রতিবেশীর উপরে আরেকটি লুপ (একটি সংক্ষিপ্ত, তবে এখনও) রয়েছে এবং তারপরে আমাকে দুটি তালিকার উপরে সদস্যতা পরীক্ষা করতে হবে, যার একটি আকার এন। এটি ও (n ^ 2) এর একটি ভয়াবহ স্কেলিং দেয়। আমি সীমানা এবং অঞ্চলগুলির জন্য তালিকার পরিবর্তে সেট ব্যবহার করে ও (এন) এটিকে হ্রাস করতে পারি যাতে সদস্যতা চেক করা দ্রুত হয়, তবে এটি এখনও দুর্দান্ত নয়। আমি প্রত্যাশা করি এমন অনেক ক্ষেত্রেই ঘটবে যেখানে অঞ্চলটি বড় তবে লাইন স্কেলিংয়ের তুলনায় সরল ক্ষেত্রের কারণে সীমানাটি ছোট। উদাহরণস্বরূপ যদি অঞ্চলটি 5 ব্যাসার্ধের হেক্স হয় তবে এটি 91 মাপের হয় তবে সীমানাটি কেবল আকার 36 হয়।
কেউ কি আরও ভাল কিছু প্রস্তাব করতে পারেন?
সম্পাদনা:
নীচে কিছু প্রশ্নের উত্তর দিতে। অঞ্চলটি প্রায় 20 থেকে 100 বা আরও বেশি আকারের হতে পারে। অঞ্চলটি গঠনের টাইলগুলির সেটটি কোনও বস্তুর একটি বৈশিষ্ট্য, এবং এটিই এই অবজেক্টটির জন্য সমস্ত সীমানা টাইলগুলির একটি সেট প্রয়োজন।
প্রাথমিকভাবে অঞ্চলটি একটি ব্লক হিসাবে তৈরি করা হয় এবং তারপরে বেশিরভাগ ক্ষেত্রে একে একে টাইলস অর্জন করা হয়। এই ক্ষেত্রে, এটি সত্য যে দ্রুততম উপায়টি কেবল সীমান্তের একটি সেট রাখা এবং এটি প্রাপ্ত টাইলটিতে কেবল আপডেট করা। মাঝেমধ্যে এই অঞ্চলে একটি বড় পরিবর্তন হতে পারে - সুতরাং এটি সম্পূর্ণরূপে পুনরায় গণনা করা দরকার।
আমি এখন এই মতামত নিয়েছি যে একটি সাধারণ সীমানা-সন্ধানের অ্যালগরিদম করাই সেরা সমাধান। এই উত্থাপিত একমাত্র অতিরিক্ত জটিলতা হ'ল সীমান্ত যতবার হওয়া দরকার তার প্রতিবার পুনরায় গণনা করা হয়েছে তা নিশ্চিত করা, তবে এর চেয়ে বেশি নয়। আমি যথেষ্ট আত্মবিশ্বাসী যে এটি আমার বর্তমান কাঠামোয় নির্ভরযোগ্যভাবে করা যেতে পারে।
সময়সীমা হিসাবে, আমার বর্তমান কোডে আমার কিছু রুটিন রয়েছে যা অঞ্চলের প্রতিটি টাইল পরীক্ষা করতে হবে। প্রতিবার নয়, সৃষ্টিতে এবং মাঝে মাঝে পরে। এটি সম্পূর্ণ প্রোগ্রামের খুব ছোট একটি অংশ হলেও আমার টেস্ট কোডের স্যুটটির চলমান সময়ের 50% এর বেশি সময় নেয়। তাই আমি কোনও পুনরাবৃত্তি হ্রাস করতে আগ্রহী ছিল। তবুও, পরীক্ষার কোডটি প্রোগ্রামের স্বাভাবিক চলমান (প্রাকৃতিক) তুলনায় অনেক বেশি অবজেক্ট তৈরির সাথে জড়িত, তাই আমি বুঝতে পারি এটি খুব প্রাসঙ্গিক নাও হতে পারে।