যদি "দ্রুততম" আপনার সময় ব্যয় করে তার পরিমাণ অন্তর্ভুক্ত করে তবে সমাধানটি নির্ভর করবে আপনি কোন সফ্টওয়্যার নিয়ে আরামদায়ক এবং দ্রুত ব্যবহার করতে পারবেন তার উপর। নিম্নলিখিত মন্তব্যগুলি ফলস্বরূপ দ্রুততম গণনার সময় অর্জনের জন্য ধারণাগুলিতে ফোকাস করে ।
আপনি যদি কোনও ক্যানড প্রোগ্রাম ব্যবহার করেন, তবে অবশ্যই কেডি ট্রি বা চতুষ্কোণের মতো একটি পয়েন্ট-ইন-বহুভুজ ডেটা কাঠামো স্থাপন করার জন্য বহুগুণগুলি প্রাক-প্রক্রিয়াজাতকরণ করা সবচেয়ে ভাল যা আপনি করতে পারেন whose লগ (ভি) ) * (এন + ভি)) যেখানে ভি বহুভুজের মোট শীর্ষোক্ত সংখ্যা এবং এন পয়েন্টের সংখ্যা, কারণ ডেটা স্ট্রাকচারটি তৈরি করতে কমপক্ষে ও (লগ (ভি) * ভি) প্রচেষ্টা গ্রহণ করবে এবং তারপরে হবে প্রতিটি পয়েন্টের জন্য প্রতি-পয়েন্ট ব্যয়ে হে (লগ (ভি)) এ অনুসন্ধান করতে হবে।
কোনও বহুচ্ছন্নতার ধারণা ধরে নিয়ে আপনি বহুভুজগুলি প্রথমে গ্রিড করে উল্লেখযোগ্যভাবে আরও ভাল করতে পারেন। প্রতিটি গ্রিড সেল পুরোপুরি বহুভুজ অভ্যন্তরে থাকে ("সার্বজনীন বহুভুজ" এর অভ্যন্তর অন্তর্ভুক্ত), সেক্ষেত্রে বহুভুজের আইডির সাথে সেলটি লেবেল করা হয়, না হলে এটিতে এক বা একাধিক বহুভুজ প্রান্ত থাকে। সমস্ত প্রান্তকে রাস্টারাইজ করার সময় গ্রিড কোষগুলির সংখ্যার সমান এই রাস্টেরাইজেশনের ব্যয় হ'ল ও (ভি / সি) যেখানে সি একটি ঘরের আকার, তবে বিগ-ও নোটেশনে অন্তর্নিহিত ধ্রুবকটি সামান্য।
(এই পদ্ধতির একটি সৌন্দর্য হ'ল আপনি স্ট্যান্ডার্ড গ্রাফিক্সের রুটিনগুলি কাজে লাগাতে পারেন example উদাহরণস্বরূপ, আপনার যদি এমন কোনও সিস্টেম থাকে যা (ক) প্রতিটি বহুভুজের জন্য একটি পৃথক রঙ ব্যবহার করে (খ) ভার্চুয়াল স্ক্রিনে বহুভুজ আঁকবে এবং (সি) অনুমতি দেয় আপনি যে কোনও পিক্সেলকে সম্বোধন করতে আগ্রহী তার রঙ পড়তে পারেন, আপনি এটি তৈরি করেছেন))
এই গ্রিডটি স্থানে রেখে প্রতিটি পয়েন্ট (একটি হে (1) ক্রিয়াকলাপে কেবল কয়েকটি ঘড়ি প্রয়োজন) সমন্বিত সেলকে গণনা করে পয়েন্টগুলি প্রাক-স্ক্রিন করুন। বহুভুজ সীমানার চারদিকে পয়েন্টগুলি ক্লাস্টার না করা হলে এটি সাধারণত অস্পষ্ট ফলাফল সহ কেবল ও (সি) পয়েন্টগুলিতে ছেড়ে যায়। গ্রিড এবং প্রাক-স্ক্রিনিং নির্মাণের মোট ব্যয় অতএব O (V / c + 1 / c ^ 2) + O (N)। ও (লগ (ভি) * এন * সি) এর ব্যয়ে আপনাকে বাকী পয়েন্টগুলি (যেগুলি বহুভুজের সীমানার কাছাকাছি রয়েছে) প্রক্রিয়াকরণের জন্য আপনাকে অন্য কিছু পদ্ধতি (যেমন এখন পর্যন্ত প্রস্তাবিতগুলির মধ্যে কোনওটি) ব্যবহার করতে হবে ।
সি ছোট হওয়ার সাথে সাথে কম এবং কম পয়েন্ট একই প্রান্তের সাথে একই গ্রিড কক্ষে থাকবে এবং তাই কম ও কম সংখ্যক পরবর্তী ও (লগ (ভি)) প্রসেসিংয়ের প্রয়োজন হবে। এর বিপরীতে অভিনয় করা হ'ল ও (1 / সি ^ 2) গ্রিড সেলগুলি সঞ্চয় করা এবং বহুভুজগুলিকে ছড়িয়ে দেওয়ার জন্য O (V / c + 1 / c ^ 2) সময় ব্যয় করা। সুতরাং একটি অনুকূল গ্রিড আকার সি হবে। এটা ব্যবহার করে, মোট গণনীয় খরচ হে (লগ (ভী) * এন) কিন্তু অন্তর্নিহিত ধ্রুবক সাধারণত হয় পথ , টিনজাত পদ্ধতি ব্যবহার প্রাক প্রদর্শণের হে (এন) গতির কারণে চেয়ে ছোট।
20 বছর আগে আমি এই পদ্ধতির পরীক্ষা করেছি (পুরো ইংল্যান্ড এবং উপকূল জুড়ে অভিন্ন দুরত্বের পয়েন্টগুলি ব্যবহার করে এবং সেই সময়ের ভিডিও বাফারদের দ্বারা প্রস্তাবিত প্রায় 400K কোষের তুলনামূলকভাবে অপরিশোধিত গ্রিডটি ব্যবহার করেছি) এবং আমি প্রকাশিত সেরা অ্যালগরিদমের তুলনায় 2 গিগাবাইট স্পিডআপের আদেশ পেয়েছি অনুসন্ধান. বহুভুজগুলি যখন ছোট এবং সাধারণ হয় (ত্রিভুজগুলির মতো) তখনও আপনি কার্যত গতির গতির একটি আদেশের পক্ষে কার্যত আশ্বস্ত হন।
আমার অভিজ্ঞতায় গণনাটি এত দ্রুত ছিল যে পুরো অপারেশনটি ডেটা I / O গতির দ্বারা সীমাবদ্ধ ছিল, সিপিইউ দ্বারা নয়। আই / ও সম্ভবত বাধা হতে পারে এমন প্রত্যাশা করে, আপনি ডাটা পঠনের সময়কে হ্রাস করার জন্য পয়েন্টগুলি যথাসম্ভব সংক্ষেপিত বিন্যাসে সংরক্ষণ করে খুব দ্রুত ফলাফল অর্জন করবেন। ফলাফলগুলি কীভাবে সংরক্ষণ করা উচিত সে সম্পর্কেও কিছু চিন্তাভাবনা করুন, যাতে আপনি ডিস্কের লেখাকে সীমাবদ্ধ করতে পারেন।