আপনার যদি এমন কোনও কিছু প্রয়োজন হয় যা কোনও দূরত্বে রৈখিক থেকে যায় (বিপরীত distance^2
) এবং তবুও অস্পষ্টভাবে বিজ্ঞপ্তি প্রদর্শিত হয় (স্কোয়ারিশ চেবিশেভ এবং হীরকের মতো ম্যানহাটনের দূরত্বের বিপরীতে), আপনি অষ্টভুজ আকারের দূরত্বের আনুমানিকতা পেতে পরবর্তী দুটি কৌশল গড়ে তুলতে পারেন:
dx = abs(x1 - x0)
dy = abs(y1 - y0)
dist = 0.5 * (dx + dy + max(dx, dy))
ওল্ফ্রাম আলফাকে ধন্যবাদ এখানে ফাংশনটির একটি ভিজ্যুয়ালাইজেশন (কনট্যুর প্লট) দেওয়া হল :
এবং ইউক্লিডিয়ান দূরত্বের সাথে তুলনা করার সময় এটির ত্রুটি কার্যকারিতার একটি প্লট রয়েছে (রেডিয়ানস, প্রথম চতুর্থাংশ কেবল)
আপনি দেখতে পাচ্ছেন, ত্রুটির অক্ষটি 0% থেকে লবগুলিতে প্রায় 12% পর্যন্ত হয় to সহগকে কিছুটা সংশোধন করে আমরা এটিকে +/- 4% এ নামিয়ে আনতে পারি:
dist = 0.4 * (dx + dy) + 0.56 * max(dx, dy)
হালনাগাদ
উপরের সহগগুলি ব্যবহার করে সর্বাধিক ত্রুটিটি +/- 4% এর মধ্যে থাকবে তবে গড় ত্রুটি এখনও + 1.3% থাকবে। শূন্য গড় ত্রুটির জন্য অনুকূলিত করা, আপনি এটি ব্যবহার করতে পারেন:
dist = 0.394 * (dx + dy) + 0.554 * max(dx, dy)
যা -5% এবং + 3% এর মধ্যে ত্রুটি দেয় এবং গড় ত্রুটি + 0.043% দেয়
এই অ্যালগরিদমের জন্য কোনও নামের জন্য ওয়েব অনুসন্ধান করার সময়, আমি এই অনুরূপ অষ্টভুজাকার অনুমানটি পেয়েছি :
dist = 1007/1024 * max(dx, dy) + 441/1024 * min(dx, dy)
নোট করুন যে এটি মূলত সমতুল্য (যদিও উদ্দীপকগুলি পৃথক - এইগুলি একটি -1.5% থেকে 7.5% ত্রুটি দেয় তবে এটি +/- 4% তে ম্যাসেজ করা যেতে পারে) কারণ max(dx, dy) + min(dx, dy) == dx + dy
। এই ফর্মটি ব্যবহার করে, min
এবং max
কলগুলি পক্ষে যেতে পারে:
if (dy > dx)
swap(dx, dy)
dist = 1007/1024 * dx + 441/1024 * dy
এটি কি আমার সংস্করণের চেয়ে দ্রুত হতে চলেছে? কে জানে ... সংকলক এবং কীভাবে এটি লক্ষ্য প্ল্যাটফর্মের জন্য প্রতিটিকে অনুকূল করে on আমার অনুমান যে কোনও পার্থক্য দেখা বেশ কঠিন হবে।