ฉันกำลังทำงานกับลอจิกแบบเวกเตอร์เพื่อถามว่า: ฉันสามารถประหยัดเวลาตัวประมวลผลโดยทำให้ความไม่เท่าเทียมนี้ลดความซับซ้อนลง:
distance(vector1, vector2) < distance(vector1, vector3)
ฉันเห็นว่าvector1
มีการทำซ้ำในทั้งสองกรณี
ฉันกำลังทำงานกับลอจิกแบบเวกเตอร์เพื่อถามว่า: ฉันสามารถประหยัดเวลาตัวประมวลผลโดยทำให้ความไม่เท่าเทียมนี้ลดความซับซ้อนลง:
distance(vector1, vector2) < distance(vector1, vector3)
ฉันเห็นว่าvector1
มีการทำซ้ำในทั้งสองกรณี
คำตอบ:
ใช่คุณสามารถทำให้สิ่งนี้ง่ายขึ้น ก่อนอื่นหยุดเรียกพวกมันว่าเวกเตอร์ พวกเขาเป็นจุด ขอเรียกพวกเขาA
, และB
C
ดังนั้นคุณต้องการสิ่งนี้:
dist(A, B) < dist(A, C)
แทนที่ระยะทางด้วยระยะทางยกกำลังสองจากนั้นเปลี่ยนเป็นผลิตภัณฑ์ดอท (จากคำจำกัดความของความยาวแบบยุคลิดแทนที่AC
ด้วยAB + BC
(ตอนนี้นี่คือเวกเตอร์จริง) ขยาย, ลดความซับซ้อน, ปัจจัย:
dist(A, B)² < dist(A, C)²
dot(AB, AB) < dot(AC, AC)
dot(AB, AB) < dot(AB + BC, AB + BC)
dot(AB, AB) < dot(AB, AB) + dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC + 2 AB, BC)
นั่นแหละ:
dot(AB + AC, BC) > 0
ด้วยสัญลักษณ์เวกเตอร์ของคุณ:
dot(v2 - v1 + v3 - v1, v3 - v2) > 0
นั่นคือการเพิ่มเติมบางส่วนและหนึ่งผลิตภัณฑ์ดอทแทนผลิตภัณฑ์สองจุดก่อนหน้านี้
dist(A, B)²
เป็นเช่นเดียวกับdot(AB, AB)
มันมาจากนิยามของความยาวแบบยุคลิด
ใช่. สมมติว่าdistance
ฟังก์ชั่นของคุณใช้สแควร์รูทคุณสามารถทำให้มันง่ายขึ้นโดยการลบสแควร์รูท
เมื่อพยายามที่จะหาสิ่งที่มีขนาดใหญ่ (หรือขนาดเล็ก) ของระยะทางที่ยังคงถือสำหรับจริงx^2 > y^2
x > y
อย่างไรก็ตามความพยายามเพิ่มเติมในการทำให้สมการทางคณิตศาสตร์ง่ายขึ้นนั้นไม่มีจุดหมาย ระยะห่างระหว่างvector1
และvector2
ไม่เหมือนกับระยะห่างระหว่างvector1
และvector3
และในขณะที่สมการสามารถทำให้ง่ายขึ้นทางคณิตศาสตร์ตามคำตอบของแซมแสดงให้เห็นว่ารูปแบบของมันในปัจจุบันมีแนวโน้มที่ง่ายเหมือนที่คุณจะได้รับจากมุมมองการใช้งานโปรเซสเซอร์
คณิตศาสตร์บางอย่างสามารถช่วยได้
สิ่งที่คุณพยายามทำคือ:
<v1, v2> < <v1, v3> =>
sqrt((y2-y1)^2+(x2-x1)^2) < sqrt((y3-y1)^2+(x3-x1)^2) =>
y2^2 - 2*y2y1 + y1^2 + x2^2 - 2*x2x1 + x1^2 < y3^2 - 2*y3y1 + y1^2 + x3^2 - 2*x3x1 + x1^2
จากสิ่งที่คุณสามารถลบตัวแปรซ้ำและจัดกลุ่มอื่น ๆ ได้ การดำเนินการที่คุณต้องตรวจสอบคือ:
y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0
หวังว่ามันจะช่วย
คำถามจริงดูเหมือนจะเป็นวิธีการลดการคำนวณสำหรับการกำหนดวัตถุที่ใกล้ที่สุด?
การเพิ่มประสิทธิภาพนี้มักจะทำในเกมแม้ว่าจะมีการปรับให้เหมาะสมทั้งหมดควรมีการแนะนำโปรไฟล์และบ่อยครั้งที่ไม่ทำให้สิ่งต่าง ๆง่ายขึ้น
วิธีหลีกเลี่ยงการคำนวณระยะทางที่ไม่จำเป็นเพื่อกำหนดสิ่งที่ใกล้ที่สุด - หรือทุกสิ่งภายในช่วงที่กำหนด - คือการใช้ดัชนีเชิงพื้นที่ e กรัมoctree
สิ่งนี้จะจ่ายออกหากมีวัตถุจำนวนมากเท่านั้น สำหรับวัตถุสามชิ้นเท่านั้นมันไม่น่าเป็นไปได้ที่จะชำระหนี้และแน่นอนว่าจะไม่ทำให้รหัสง่ายขึ้น
มันขึ้นอยู่กับว่าเอาต์พุตของระยะทาง (v1, v2) คืออะไร
ถ้ามันเป็นทศนิยม (ลอยหรือสองครั้ง) เหนือเวกเตอร์ก็มีแนวโน้มว่า distancesquared จะเร็วกว่ามาก
float
จะเกี่ยวข้องกับอะไร