最近在看機會,前幾天去面試,又一次碰壁而回。這次一共做了四道題,都沒能夠當時就給出明確的解決方案。
剛剛把其中的一題重新做了一下,現在拿出來跟大家分享一下,也期待大家能幫忙想一下有沒有更好的解決方案。
題目大概是這樣的:
在一個直角坐標線中,有10萬個點,現在給出一個坐標(x,y),快速的找出離這個坐標最近的3個點。
思路一:
計算出所有點與這個坐標(x,y)的距離,再排序,取出前三個。
優缺點分析:這個思路無疑是程序員見到這個題目最直接的反應。但仔細想想,如果坐標點的數量增加到百萬千萬,再加上大並發的話,服務的壓力可想而知。
思路二:
以(x,y)為中心不斷向外畫正方形,正方形的面積增量,通過點的密度及一個修正值決定。在找到超過3個點時,調用思路一中的方法。
優缺點分析:如果讓一個人去做這件事,他一定拿起一個圓規,然后目測一下點的分布密度,然后再以(x,y)為中心,畫一個圓。這樣就大大的縮小了刷選范圍。此思路就是來源於此。
曾經不太好的的思路
1、本來想畫圓來着,但是仔細考慮了一下,計算距離需要平方相加再開方,還不如直接比較xy值的大小。
2、另外也考慮過了二分法確定面積增量,但是考慮到遍歷的次數會太多,就放棄了。
簡單寫了一下代碼
沒有寫注釋,見諒:http://files.cnblogs.com/fantong/Lm.Test.rar
測試結果如下: