近几天在处理的一个项目,需要频繁对一些有序超大集合进行目标查找,二分查找算法是这类问题的最优解。但是java的Arrays.binarySearch()方法,如果集合中有重复元素,而且遇到目标元素正好是这些重复元素之一,该方法只能返回一个,并不能将所有的重复目标元素都返回,没办法,只能自造轮子了。
先复习下二分查找的经典算法:
1 private intbinarySearch1(Integer[] A, Integer x) {2 int low = 0, high = A.length - 1;3 while (low <=high) {4 int mid = (low + high) / 2;5 if(A[mid].equals(x)) {6 returnmid;7 } else if (x
思路很简单,先定位到中间元素,如果中间元素比目标元素大,则扔掉后一半,反之扔掉前一半,如果正好一次命中,直接返回。
略做改进:
1 private ListbinarySearch2(Integer[] A, Integer x) {2 List result = new ArrayList();3 int low = 0, high = A.length - 1;4 while (low <=high) {5 int mid = (low + high) / 2;6 if(A[mid].equals(x)) {7 if (mid > 0) {8 //看前一个元素是否=目标元素
9 if (A[mid - 1].equals(x)) {10 for (int i = mid - 1; i >= 0; i--) {11 if(A[i].equals(x)) {12 result.add(i);13 } else break;14 }15 }16 }17 result.add(x);18 if (mid
20 if (A[mid + 1].equals(x)) {21 for (int i = mid + 1; i <= high; i++) {22 if(A[i].equals(x)) {23 result.add(i);24 } else break;25 }26 }27 }28 returnresult;29 } else if (x