毫秒到秒 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 二分查找的主要内容,如果未能解决你的问题,请参考以下文章