【发布时间】:2017-06-04 23:35:14
【问题描述】:
我准备了 2 个 Javascript 函数来查找匹配的整数对,它们相加并返回一个布尔值。
第一个函数使用这样的二分搜索:
function find2PairsBySumLog(arr, sum) {
for (var i = 0; i < arr.length; i++) {
for (var x = i + 1; x < arr.length; x++) {
if (arr[i] + arr[x] == sum) {
return true;
}
}
}
return false;
}
对于第二个函数,我实现了自己的单链表,在其中我将互补整数添加到总和中并在链表中搜索值。如果在链接列表中找到值,我们就知道存在匹配项。
function find2PairsBySumLin(arr, sum) {
var complementList = new LinkedList();
for (var i = 0; i < arr.length; i++) {
if (complementList.find(arr[i])) {
return true;
} else {
complementList.add(sum - arr[i]);
}
}
return false;
}
当我运行这两个函数时,我清楚地看到链接列表搜索的执行速度快了约 75%
var arr = [9,2,4,1,3,2,2,8,1,1,6,1,2,8,7,8,2,9];
console.time('For loop search');
console.log(find2PairsBySumLog(arr, 18));
console.timeEnd(‘For loop search’);
console.time('Linked List search');
console.log(find2PairsBySumLin(arr, 18));
console.timeEnd('Linked List search');
true
For loop search: 4.590ms
true
Linked List search: 0.709ms
我的问题是:链接列表方法是真正的线性搜索吗?毕竟我循环遍历所有节点,而我的外部循环遍历初始数组。
这是我的 LinkedList 搜索功能:
LinkedList.prototype.find = function(data) {
var headNode = this.head;
if(headNode === null) {
return false;
}
while(headNode !== null) {
if(headNode.data === data) {
return true;
} else {
headNode = headNode.next;
}
}
return false;
}
更新:
回过头来根据目前的 cmets 重新思考问题是个好主意。
感谢@nem035 对小型数据集的评论,我运行了另一个测试,但这次使用了 1 到 8 之间的 100,000 个整数。我将 9 分配到第一个和最后一个位置,并搜索了 18 以确保将搜索整个数组。
感谢@Oriol,我还加入了相对较新的 ES6 Set 函数进行比较。
顺便说一句,@Oriol 和@Deepak 你是对的。第一个函数不是二分查找,而是 O(n*n) 查找,没有对数复杂度。
事实证明,我的 Linked List 实现是所有搜索中最慢的。我为每个函数单独运行了 10 次迭代。结果如下:
For loop search: 24.36 ms (avg)
Linked List search: 64328.98 ms (avg)
Set search: 35.63 ms (avg)
这里对 10,000,000 个整数的数据集进行相同的测试:
For loop search: 30.78 ms (avg)
Set search: 1557.98 ms (avg)
总结:
因此,对于高达 ~1,000 的较小数据集,Linked List 似乎非常快,而 ES6 Set 则非常适合较大的数据集。 然而,For 循环 在所有测试中都是明显的赢家。
所有 3 种方法都将随数据量线性扩展。
请注意:ES6 Set 不向后兼容旧浏览器,以防此操作必须在客户端完成。
【问题讨论】:
-
小输入大小的基准测试不是很有用。尝试大量输入并多次尝试。
-
您究竟是如何得出嵌套循环具有对数复杂度的结论的???
-
您也可以尝试将
Object.create(null)用作散列或稀疏数组,而不是ES6 集合。 -
您是如何管理那个 JAVASCRIPT 标题的? meta.stackoverflow.com/questions/341916/…
标签: javascript node.js binary-search singly-linked-list