直接两两检测是n方级别的时间复杂度,其实可以提高的。以下是一种基于排序的方法,针对1维,整数精度的情况,也就是许多整数区间中哪些相交的问题。
基本思想是对所有区间的下界和上届都混在一起进行排序,并记下每个端点的序号,如果某个区间的上界序号不是下界序号+1的话,那就说明发生了相交。在此基础上,可以二分查找和哪些个端点相交了。无碰撞情况时间复杂度是logN(快排,数量很大的话用计数基数排可以进一步降到N) + N(检查)。全碰撞情况时间复杂度是logN + NlogN。这方法在时间和空间上算是做个折中吧。
对于序号相同和排序稳定性引起的可能漏检的问题,比如两个长度为1完全重合的区间,很可能排序成aSt,aEd,bSt,bEd的情况。为此,在排序前先对各区间的范围做个变换使得st一定排在ed前。st‘ = st*2, ed‘=ed*2+1。但还是会可能出现aSt,bSt,bEd,aEd的情况,这时需注意,检测不是双向的,仅有a能检测到b与之相交,b却发现不了包在他外面的a。如果使用稳定的排序算法,或者进一步进行坐标变换,使得st相同时,进一步使用区间的其他稳定可比较信息可以解决。
接下来考虑和基于桶的排序比较下哪种更适用于目前的情况。在做规约冲突的识别。
时间: 2024-10-09 17:57:24