【发布时间】:2019-03-09 08:37:00
【问题描述】:
如何利用二分搜索来提高我的算法时间复杂度?
我正在审查一些面试的时间复杂度,但我无法让我的算法更省时。这是我对 3-Sum 问题的强力解决方案:有多少个三元组总和正好为 0?背景:我没有 CS 学位。
//BRUTE FORCE SOLUTION: N^3
var threeSum = function(list){
var count = 0;
//checking each triple
for(var i = 0; i < list.length; i++){
for(var j = i+1; j < list.length; j++){
for(var k = j+1; k < list.length; k++){
if(list[i] + list[j] + list[k] === 0){count++;}
}
}
}
return count;
};
//binary search code
var binarySearch = function(target, array){
var lo = 0;
var hi = array.length - 1;
//base case
while(lo <= hi){
var mid = Math.floor( lo + (hi - lo) / 2 );
if(target === array[mid]) return mid;
if(target < array[mid]){
hi = mid - 1;
}
if(target > array[mid]){
lo = mid + 1;
}
}
// value not found
return -1;
}
我正在复习普林斯顿大学的在线算法课程,教授指出,使用二分搜索算法可以提高该算法的效率。
根据教授的说法,我们会:
- 对列表进行排序
- 对于每对数字 array[ i ] & array[ j ] 二分查找 -(array[ i ] + array[ j ])
但是,我无法理解二进制搜索是如何解决问题的。这是讲座中的一张幻灯片,我仍在努力理解,但可能对其他人有用:
我确信那里有几种有效的解决方案:请随时加入您的实施,因为它可能对我和其他未来的读者有所帮助。谢谢
【问题讨论】:
-
条件
list[i] + list[j] + list[k] === 0等价于(或多或少)list[k] === -(list[i] + list[j]),这使得蛮力解决方案的k循环成为线性搜索,将被二分搜索取代。
标签: javascript algorithm time-complexity binary-search