首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web开发 >

有什么算法,该如何解决

2012-02-21 
有什么算法有什么算法比可以较快地判断一条线段与另外多条线段是否相交(条件:这些线段都是Y轴都是0,而且其

有什么算法
有什么算法比可以较快地判断一条线段与另外多条线段是否相交(条件:这些线段都是Y轴都是0,而且其他线段也不相交,不要告诉我是一个个去比较)

[解决办法]
1,对线段A1--A2和B1--B2来说

只要判断x轴坐标就可以
(A1-B1)*(A2-B2) <=0

2,不需要挨个比较,
二维数组要变成两个一维数组,因为y都是0,所以x实际上是(A1,A2,B1,B2,C1,C2...)2n个元素
如果排过序的,就肯定是每个线段两个点都是挨着的,可以折半查找(二分法)。

先找到第n个元素,判断它比你新输入的点大还是小,如果大,就在3/4处寻找,反之在1/4处寻找
再折半,直到不能折为止。可以用递归,也可以用非递归。


以下是折半查找的例子,道理类似

<script language= "vbs ">
Arr=array(1,4,5,7,8,9,10,12,15,22,23,27,32,35)
' '二分法搜索,折半查找,最大复杂度1+log n
function BINERYSEARCH(A,x)
n=ubound(A)
low=0
high=n
j=0
while low <=high and j=0
m=int(low+high)/2
if x=A(m) then
j=m
else
if x <A(m) then high=m-1 else low=m-1
end if
wend
BINERYSEARCH=j
end function

alert BINERYSEARCH(Arr,22)
</script>


3,折半查找的前提是排序,排序可以采用速度比较快的算法,网上有很多,我就不写了。



[解决办法]
(A1,A2,B1,B2,C1,C2...)2n个元素
如果你新的线段是X1,X2,输入这两个数

那么你首先二分查找X1落在了哪两个连续值之间,

如果是落在了连续的左偶右奇数下标中间,比如B2和C1中间,说明X1可能为有效输入
反之,如果落在了连续的左奇右偶下标中间,比如B1和B2中间,说明X2点无效。

当X1,X2都是有效输入的时候,你的线段才是不重合线段。
[解决办法]
可以仿照二叉树,写一个插入方法。
http://community.csdn.net/Expert/topic/4891/4891358.xml?temp=.9778406

热点排行