毫秒到秒 JS 二分查找

Posted

技术标签:

【中文标题】毫秒到秒 JS 二分查找【英文标题】:Milis to seconds JS binary search 【发布时间】:2020-11-20 14:27:35 【问题描述】:

我只是在练习二进制搜索算法,我想知道以秒为单位需要多少时间。

我对待 startMilis 和 endMilis 的方式是获得时间测量的正确方式吗?谢谢。

let ar = [3,4,6,7,4,3,2,1,5,8,7,6,4,3,5,6,7,8,9];

console.log(binarySearch(ar, 7));

function binarySearch(arr, value)
    let startMilis = Date.now();
    let endMilis = 0;

    let sorted = arr.sort((a,b)=>return a-b;);    
    let high = sorted.length-1;
    let low = 0;
    let mid = 0;

    //console.log("input array sorted to: "+sorted);

    while(low <= high)
        mid = Math.floor( (low+high)/2 );
        
        if(sorted[mid] == value)
            endMilis = Date.now();
            return `$value found at index: $mid in $(endMilis-startMilis)/1000 seconds`;
        
        else if(sorted[mid] < value) low = mid+1;
        else if(sorted[mid] > value) high = mid-1;
    

    endMilis = Date.now();
    return "The requested value was not found, duration: "+(endMilis-startMilis)/1000+" seconds";

【问题讨论】:

【参考方案1】:

是的,但您也可以将起点和终点放在函数之外,这样您就不必担心处理所有返回

let ar = [3,4,6,7,4,3,2,1,5,8,7,6,4,3,5,6,7,8,9];

let startMilis = Date.now();
console.log(binarySearch(ar, 7));
let endMilis = Date.now();
console.log("search duration: "+(endMilis-startMilis)/1000); 

function binarySearch(arr, value)

let sorted = arr.sort((a,b)=>return a-b;);    
let high = sorted.length-1;
let low = 0;
let mid = 0;

//console.log("input array sorted to: "+sorted);

while(low <= high)
    mid = Math.floor( (low+high)/2 );
    
    if(sorted[mid] == value)
        return `$value found at index: $mid`;
    
    else if(sorted[mid] < value) low = mid+1;
    else if(sorted[mid] > value) high = mid-1;

return "The requested value was not found";

【讨论】:

【参考方案2】:

如果您想测量特定功能的性能,请使用分析代码对其进行包装以获得无偏见的结果。例如:

console.time('binarySearch');
binarySearch(ar, 7)
console.timeEnd('binarySearch');

我在这里推荐的另一件事是分离关注点。您的函数应该只返回一个找到的值(以及一些“未找到”情况的特殊值),仅此而已。记录一些指标(如速度、内存或其他)不应附加到该返回值。

通过这种方法,使用特定于平台的分析工具(甚至像 console.time/timeLog/timeEnd 一样简单)用于的唯一目的 - 分析会容易得多。

作为旁注,您实际上不应该对源数组进行排序,因为它是就地排序;除非有充分的理由,否则应避免修改函数参数等副作用。

【讨论】:

谢谢,是的,关于返回值和日志,我明白你的意思。毕竟我只是在练习算法本身。关于数组排序困难,在实现二进制排序时,我是否应该始终假设源数组已经排序? @J.Albert 是的,这就是我在这里的建议。事实上,Lodash 作者也是这样做的:他们将 binary search on sorted arrays 与 plain search on array of unknown sequentality 分开。

以上是关于毫秒到秒 JS 二分查找的主要内容,如果未能解决你的问题,请参考以下文章

7JS实现二分查找

js 二分查找法之每日一更

js实现二分法查找

js 二分查找(Binary Search)

js二分查找树实现

JS数组操作(扁平化去重排序交集并集差集二分查找峰值位置)