我有大量整数数组(大小在 10'000 到 1'400'000 之间)。我想让第一个整数大于一个值。该值永远不会在数组内。
我一直在寻找各种解决方案,但我只发现:
估计每个值并且不是为排序列表或数组设计的方法(时间复杂度为 O(n))。
递归的和/或不是为非常大的列表或数组设计的方法(虽然在其他语言中具有 O(n) 或更多时间复杂度,所以我不确定)。
我设计了自己的方法。这里是 :
int findClosestBiggerInt(int value, int[] sortedArray) {
if( sortedArray[0]>value ||
value>sortedArray[sortedArray.length-1] ) // for my application's convenience only. It could also return the last.
return sortedArray[0];
int exp = (int) (Math.log(sortedArray.length)/Math.log(2)),
index = (int) Math.pow(2,exp);
boolean dir; // true = ascend, false = descend.
while(exp>=0){
dir = sortedArray[Math.min(index, sortedArray.length-1)]<value;
exp--;
index = (int)( index+ (dir ? 1 : -1 )*Math.pow(2,exp) );
}
int answer = sortedArray[index];
return answer > value ? answer : sortedArray[index+1];
}
它具有 O(log n) 时间复杂度。对于长度为 1'400'000 的数组,它将在 while 块内循环 21 次。不过,我不确定它是否可以改进。
没有外部包的帮助,有没有更有效的方法?节省任何时间都是很好的,因为这种计算经常发生。
森栏
相关分类