দূরত্বের চেয়ে দূরত্ব স্কোয়ার চেক ব্যবহারের কোনও অসুবিধা আছে কি?


29

বর্গমূলের (যেমন সরল দৈর্ঘ্যের চেকগুলিতে) ব্যয় না করা থেকে কর্মক্ষমতা বৃদ্ধির কারণে আমি মূলত আমার সমস্ত দূরত্ব (ভেক্টর 3 দৈর্ঘ্য) যাচাইয়ের জন্য দূরত্ব স্কোয়ার চেকগুলি ব্যবহার করি।

এর চেহারা থেকে, স্কোয়ার দূরত্বের চেকগুলি প্রতিটি পরিস্থিতিতে সূক্ষ্মভাবে কাজ করে:

if x^2 < y^2, then x < y, even when 0 < (x or y) < 1

দূরত্ব এবং দূরত্ব-বর্গক্ষেত্র সর্বদা ইতিবাচক হতে চলেছে বলে আমি x বা y 0 এর চেয়ে কম অবস্থার বিষয়ে বিবেচনা করছি না।

যেহেতু এটি কাজ করে, দেখে মনে হচ্ছে দূরত্বের চেকগুলি কখনই প্রয়োজন হয় না, তবে আমার মনে খুব মনে হয় যে আমি কিছু অনুপস্থিত missing এটি কি এখনও নির্ভুলতা-সংকটময় পরিস্থিতি ধরে রেখেছে?

উত্তর:


41

স্কোয়ার দৈর্ঘ্য দূরত্বের তুলনায় ব্যবহার করার সময় আমি কোনও অসুবিধা সম্পর্কে অবগত নই। এটি সম্পর্কে এটি ভাবুন: আপনি কেবল এড়িয়ে যাচ্ছেন sqrtযা আপনাকে কোনও অতিরিক্ত নির্ভুলতা দেয় না। আপনার যদি সত্যিকারের ইউক্লিডিয়ান দূরত্বের প্রয়োজন না হয় তবে আপনি নিরাপদে এটিকে ছেড়ে যেতে পারেনsqrt বাইরে ।

অবশ্যই স্কোয়ারড দৈর্ঘ্য দাঁড়িপাল্লা পুরোপুরি ভিন্ন চেয়ে ইউক্লিডিয় দূরত্ব এবং সেই কারণে একটি হল হিউরিস্টিক pathfinding ভালো জিনিস জন্য খারাপ প্রার্থী


16
বর্গমূল মূলত দূরত্বের চেক থেকে নির্ভুলতা সরিয়ে দেয়। আপনি এটিকে 1 থেকে 2 এর মধ্যে একটি নির্দিষ্ট পয়েন্ট সংখ্যার বর্গমূল গ্রহণের ফলাফল হিসাবে এবং ফলাফলটি একই পঞ্জিতে (1 এবং স্ক্র্যাট (2) এর মধ্যে) সংরক্ষণ করার চেষ্টা হিসাবে ভাবতে পারেন। কিছু দূরত্ব যা x ^ 2 <y compare 2 হিসাবে তুলনা করে আপনি বর্গমূল গ্রহণের পরে x = y হিসাবে তুলনা করবে। স্কোয়ার দৈর্ঘ্যের চেক দ্রুত এবং আরও সঠিক।
জন কলসবেক

আপনার চমৎকার উত্তর বামজ্যাক এবং জন কলসিবেকের জন্য আপনাকে ধন্যবাদ! আপনার প্রতিক্রিয়াগুলি সম্মিলিতভাবে আমার প্রশ্নের উত্তর দেয়। বর্গমূল ব্যবহার না করা থেকে আমি অতিরিক্ত মেমরির স্থান বিবেচনা করিনি, সেখানে খুব সুন্দর পিকআপ। এবং সেই হিউরিস্টিকস লিঙ্কটি দুর্দান্ত পঠনের জন্য তৈরি করে
অ্যারলাক্স

1
এ * এর ক্ষেত্রে বাদে। আমি একটি নিবন্ধ পড়ার কথা স্মরণ করি যা বিভিন্ন হিউরিস্টিক্সের পরীক্ষার বর্ণনা দিয়েছিল এবং d^2ভয়ঙ্কর পরিবেশিত হয়েছিল। এ * এ |dx| + |dy|সুন্দরভাবে কাজ করে। আমি একমাস বা পিছনে পড়ার সাথে আমার লিঙ্কটি নেই।
জোনাথন ডিকিনসন

3
এ * এর ক্ষেত্রে আপনি কেবল দূরত্বের তুলনা করছেন না, তবে সেগুলি যুক্ত করছেন, সুতরাং স্কয়ারটি এড়িয়ে যাওয়া কোনও পার্থক্য করে।
amitp

1
@ বোবোবো আমি সম্মত; আমি বেশিরভাগ ক্ষেত্রে এটি অন্য দিকে কোনও সম্ভাব্য যুক্তি অঙ্কুরিত করার জন্য তৈরি করেছিলাম, অর্থাৎ স্বাভাবিক দূরত্বটি কোনওরকমে আরও নির্ভুল।
জন কলসবিেক

14

পাথ-সন্ধানের উপমাটির সাথে ইঙ্গিত হিসাবে বামমজ্যাক, প্রতিবার যখন আপনি একসাথে দূরত্ব যুক্ত করেন তখন আপনাকে "স্বাভাবিক" দৈর্ঘ্যটি ব্যবহার করতে হবে এবং তাদের যোগফলের তুলনা করতে চান। (কেবলমাত্র দৈর্ঘ্যের স্কোয়ারের যোগফল দৈর্ঘ্যের স্কোয়ার সমষ্টি থেকে পৃথক)।

x ^ 2 + y ^ 2! = (x + y) ^ 2


4

বিপুল সংখ্যক লোকের সাথে ডিল করার সময় আমি কেবলমাত্র অসুবিধেটিই ভাবতে পারি যা বর্গাকার হলে উপচে পড়বে।

উদাহরণস্বরূপ, জাভাতে:

int x = Integer.MAX_VALUE / 1000000; //2147
int y = Integer.MAX_VALUE / 5000; //429496
System.out.println("x < y: " + (x < y)); //true
System.out.println("x*x: " + (x * x)); //4609609
System.out.println("y*y: " + (y * y)); //-216779712 - overflows!
System.out.println("x*x < y*y: " + (x * x < y * y)); //false - incorrect result due to overflow!

এছাড়াও টুকুনি যে যখন আপনি ব্যবহার যা হওয়ার তাই হল Math.pow () সঠিক একই নম্বর এবং ডবল থেকে int- এ ঢালাই পিছন থেকে ফিরে সঙ্গে Math.pow():

System.out.println("x^2: " + (int) (Math.pow(x, 2))); //4609609
System.out.println("y^2: " + (int) (Math.pow(y, 2))); //2147483647 - double to int conversion clamps to Integer.MAX_VALUE
System.out.println("x^2 < y^2: " + ((int) (Math.pow(x, 2)) < (int) (Math.pow(y, 2)))); //true - but for the wrong reason!

এটা কাজ করছে? কোন , এটি শুধুমাত্র সঠিক উত্তর কারণ দিলেন y*yহিসাবে ধার্য করা হয় Integer.MAX_VALUE, এবং x*xকম Integer.MAX_VALUE। যদি x*xএটিকেও ক্ল্যাম্প করা হয় Integer.MAX_VALUEতবে আপনি একটি ভুল উত্তর পেতে পারেন।

অনুরূপ নীতিগুলিও ফ্লোটস এবং ডাবলসের সাথে প্রযোজ্য (এগুলি বাহিত হওয়ার আগে তাদের স্পষ্টতই আরও বেশি পরিসর থাকে) এবং অন্য কোনও ভাষা যা নিঃশব্দে উপচে পড়ার অনুমতি দেয়।


বেশিরভাগ লোক floatস্থানাঙ্কের জন্য গুলি ব্যবহার করে যা প্রায় 10^38না পরে কেবল উপচে পড়ে int
বোবোবোবো

তবে 10 ^ 38 এ আপনি এত স্পষ্টতা হারিয়ে ফেলেছেন যে আপনার দূরত্বের তুলনা আরও কার্যকর কিনা তা আপনি সত্যই নিশ্চিত করতে পারবেন না - ওভারফ্লো এখানে কেবল সমস্যা নয়। Altdevblogaday.com/2012/02/05/dont-store-that-in-a-float দেখুন ("টেবিলগুলি" বিভাগটি 1 বিলিয়ন অবধি নির্ভুল ক্ষতির সংক্ষিপ্তসার জানিয়েছে)।
ম্যাক্সিমাস মিনিমাস

স্কয়ার্ট (x * x) এর সাথে আপনার একই ওভারফ্লো সমস্যা হবে। আমি আপনার বক্তব্য দেখতে পাচ্ছি না। এটি ম্যানহাটনের দূরত্ব ইত্যাদি সম্পর্কে নয়
বগলেজ

@ বোগ্লেজ - নির্ভর করে যদি আপনার গ্রন্থাগারটি (বা সিপিইউ) আপ-ক্যাসেট দ্বিগুণ হয় বা না।
ম্যাক্সিমাস মিনিমাস

3

একসময় আমি বর্গক্ষেত্রের দূরত্বে কাজ করছিলাম এবং জমে থাকা ভুল করেছিলাম একটি ওডোমিটার গণনার জন্য স্কোয়ার দূরত্বগুলি ।

অবশ্যই আপনি এটি করতে পারবেন না, কারণ গাণিতিকভাবে,

(a^2+b^2+c^2+d^2)!=(a+b+c+d)^2

সুতরাং, আমি সেখানে একটি ভুল ফলাফল দিয়ে শেষ করেছি। ওহো!


1
এছাড়াও আমি যুক্ত করতে পারি যে কয়েক বারেরও বেশি সময় আমি স্কোয়ার দূরত্ব ব্যবহার করার চেষ্টা করেছি, কেবলমাত্র সেই কোডের একই শাখায় পরে আমার প্রকৃত দূরত্বের প্রয়োজন খুঁজে পেতে । সুতরাং, এটি অতিরিক্ত না। কখনও কখনও আপনি যখন sqrtকোনওভাবে অপারেশন শেষ করতে হবে তখন কোনও জায়গায় স্কোয়ার সহগগুলি রাখার অসুবিধার পক্ষে মূল্য নেই ।
বোবোবোবো

3

আপনি যদি একটি অ্যালগরিদম লিখতে থাকেন তবে আপনার কোনও অনুকূলিত অবস্থানের গণনা করা দরকার তা আপনি সমস্যার মধ্যে পড়তে পারেন। উদাহরণস্বরূপ, ধরা যাক যে আপনার কাছে অবজেক্টের একটি সেট ছিল এবং আপনি সমস্ত অবজেক্টের থেকে সর্বনিম্ন মোট দূরত্বের সাথে অবস্থানটি গণনা করার চেষ্টা করছেন। কেবল একটি দৃ concrete় উদাহরণের জন্য, বলুন আমরা তিনটি বিল্ডিংকে পাওয়ার করার চেষ্টা করছি, এবং আমরা বিদ্যুত কেন্দ্রটি কোথায় যেতে হবে তা নির্ধারণ করতে চাই যাতে সর্বনিম্ন মোট দৈর্ঘ্যের তারের ব্যবহার করে আমরা এটিকে সমস্ত ভবনের সাথে সংযুক্ত করতে পারি। দূরত্ব স্কোয়ার্ড মেট্রিক ব্যবহার করে, আপনি বিদ্যুৎ কেন্দ্রের এক্স-স্থানাঙ্কনের সাথে সমস্ত ভবনের এক্স-কো-অর্ডিনেটের গড় (এবং y- স্থানাঙ্কের জন্য আনুষাঙ্গিকভাবে) সমাপ্ত হবেন। সাধারণ দূরত্বের মেট্রিক ব্যবহার করে সমাধানটি আলাদা হবে এবং প্রায়শই দূরত্ব স্কোয়ার সমাধান থেকে খুব দূরে থাকে।


এটি বিতর্কিত মনে হয় যা প্রদত্ত পরিস্থিতির জন্য আরও ভাল বা খারাপ হতে পারে। আমি মনে করি যে গণিতবিদরা প্রায়শই পয়েন্টের একটি সেটটিতে একটি লাইন লাগানোর সময় দূরত্ব-বর্গক্ষেত্র ব্যবহার করতে পছন্দ করেন। সম্ভবত তারা এটি করে কারণ এটি একাকী বহিরাগতদের প্রভাবকে হ্রাস করে। আপনার তিন-বিল্ডিংয়ের ক্ষেত্রে, আউটলিয়ারদের ঝুঁকি নাও থাকতে পারে। বা সম্ভবত তারা এটি করেন কারণ এর x^2সাথে কাজ করা সহজ |x|
জোয়েটউইলডে

@ জোয়েটউইডল আউটলিয়াররা প্রকৃত দূরত্বের চেয়ে কমপক্ষে স্কোয়াসের চেয়ে বেশি লিনিয়ার রিগ্রেশনকে বেশি প্রভাবিত করে। আপনি ঠিক বলেছেন যে এটি ব্যবহার করা হয়েছে কারণ এর সাথে কাজ করা সহজ। উদাহরণ হিসাবে আমি দিয়েছি (এমনকি যদি এটি বিশাল সংখ্যক বিল্ডিং ধারণ করেও পরিবর্তিত হয়) তবে দূরত্ব বর্গাকার মেট্রিক একটি সাধারণ সূত্র (প্রতিটি সমন্বয়ের গাণিতিক গড়) দিয়ে সমাধান করা হয় তবে পরম দূরত্বের মেট্রিকটি গাণিতিকভাবে জটিল হয় না এবং অবশ্যই এটি হতে পারে সংখ্যাগত পদ্ধতিতে একটি ব্যবহার করে প্রায় সমাধান করা ।
আলেকজান্ডার গ্রুবার

সংশোধনীর জন্য ধন্যবাদ. অবশ্যই আপনি ঠিক বলেছেন, দূরত্বের বর্গক্ষেত্রটি বহিরাগতদের জন্য একটি বৃহত্তর ত্রুটি উত্পন্ন করে, এটি প্রভাব হ্রাস করার পরিবর্তে তাদের প্রভাব বাড়িয়ে তোলে, যেমন আমি উপরে ভুলভাবে বলেছি। এটি চিত্তাকর্ষক যে ন্যূনতম-পরম-দূরত্বের সমাধান গণনা করা আরও কতটা কঠিন।
জোয়েটউইডেল 3'99

0

দূরত্ব স্কোয়ার ব্যবহার করা প্রায়শই ঠিক সূক্ষ্ম এবং পারফরম্যান্সের জন্য ভাল। নিম্নলিখিত বিবেচনাগুলি গুরুত্বপূর্ণ:

আপনি যদি বেশ কয়েকটি দূরত্বের যোগফল সম্পর্কে চিন্তা করতে চান তবে দূরত্ব স্কোয়ারটি ভুল হবে। উদাহরণস্বরূপ, আমার দুটি দূরত্ব রয়েছে এবং আমি নিশ্চিত করতে চাই যে তাদের যোগফল 10 এর চেয়ে কম less নীচের কোডটি ভুল:

a = get_distance_squared(c,d);
b = get_distance_squared(e,f);
assert(a+b < 10^2);

এটি নিম্নলিখিত অবৈধ ক্ষেত্রে জোর দেওয়া ব্যর্থ: a=36এবংb=49 । এই ক্ষেত্রে, প্রথম দৈর্ঘ্য 6 এবং দ্বিতীয় 7; তাদের যোগফল 10 এর চেয়ে বেশি, তবে স্কোয়ারের যোগফল 100 বা এর বেশি নয়।

আরেকটি বিবেচনা: বাস্তব-মূল্যবান দূরত্বের জন্য, দূরত্ব বর্গক্ষেত্র সর্বদা ধনাত্মক হবে। উদাহরণস্বরূপ আপনি যদি স্থানচ্যুতি পরিমাপ করেন তবে আপনার নেতিবাচক মানগুলির সাথে ডিল করার প্রয়োজন হতে পারে এবং সেগুলি স্কোয়ারিংয়ের কাজটি হবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.