一、最近對問題:即從一個二維或多位的空間中找出距離最近的兩個點
1、步驟
a、分別計算每一對點之間的距離
b、找出距離最近的那一對
(為了避免重復計算,只考慮i<j的那些對)
2、JavaScript實現
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>最近對問題</title> 6 </head> 7 <body> 8 9 </body> 10 <script type="text/javascript"> 11 var point = function(x, y) { 12 var _arr = new Array(); 13 _arr = [x, y]; 14 _arr.x = x; 15 _arr.y = y; 16 return _arr; 17 } 18 19 var caculate = function(p1, p2) { 20 return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y); 21 } 22 23 function search(arr) { 24 var dis = Number.POSITIVE_INFINITY; 25 var indexX = null; 26 var indexY = null; 27 for(var i = 0; i < arr.length - 1; i++){ 28 for(var j = i+1; j < arr.length; j++){ 29 var d = caculate(arr[i], arr[j]); 30 if(d < dis){ 31 dis = d; 32 indexX = i; 33 indexY = j; 34 } 35 } 36 } 37 return "第 "+indexX+" 個點和第 "+indexY+" 個點之間的距離最近"; 38 } 39 40 //實驗階段 41 //創建四個點坐標分別為(0,0),(2,0),(0,3),(2,1) 42 var p1 = new point(0,0); 43 var p2 = new point(2,0); 44 var p3 = new point(0,3); 45 var p4 = new point(2,1); 46 console.log(search([p1, p2, p3, p4])) 47 </script> 48 </html>
3、算法分析
可使用(Xi - Xj)2 +(Yi - Yj)2代替sqrt((Xi - Xj)2 +(Yi - Yj)2),盡量避免開方;所以本算法的基本操作是求平方,執行次數C(n) = Σ[i=1 to n-1]Σ[j=i+1 to n] 2 = n(n - 1),屬於Θ(n2)
一、凸包問題
1、凸集合概念:對於平面上一個點集合,如果以集合中任意兩點P和Q未斷電的線段,均屬於該集合,則集合是凸的
2、凸包:凸包是包含所有點的最小凸集合
3、一般判斷方法:判斷是否所有其他點都在連接P1和P2的直線同一側
4、一般時間效率:它屬於Θ(n3);對於不同的點的每一個n(n-1)/2,都要比較其它n-2個點的符號