我必须对照1000个其他数字来检查大约1000个数字。
我加载了两个文件,并在服务器端进行了比较:
foreach( $numbers1 as $n1 ) {
foreach( $numbers2 as $n2 ) {
if( $n1 == $n2 ) {
doBla();
}
}
}
这花费了很长时间,所以我尝试使用两个隐藏对象来做相同的比较客户端
div
元素。然后使用JavaScript比较它们。加载页面仍需要45秒(使用隐藏的div
元素)。我不需要加载不相同的数字。
有更快的算法吗?我正在考虑比较它们的数据库端,只加载错误号,然后对其余的非错误号进行Ajax调用。但是MySQL数据库足够快吗?
最佳答案
首先对列表进行排序。然后,您可以从头开始浏览两个列表,然后进行比较。
循环看起来像这样:
var A = getFirstArray().sort(), B = getSecondArray().sort();
var i = 0, j = 0;
while (i < A.length && j < B.length) {
if (A[i] === B[j]) {
doBla(A[i]);
i++; j++;
}
else if (A[i] < B[j]) {
i++;
}
else
j++;
}
(这是JavaScript;您也可以在服务器端进行操作,但是我不知道PHP。)
编辑-为了公平对待所有哈希表支持者(我当然尊重),使用JavaScript做到这一点很容易:
var map = {};
for (var i = 0; i < B.length; ++i) map[B[i]] = true; // Assume integers.
for (var i = 0; i < A.length; ++i) if (map[A[i]]) doBla(A[i]);
或者,如果数字是或可能是浮点数:
var map = {};
for (var i = 0; i < B.length; ++i) map['' + B[i]] = true; // Assume integers.
for (var i = 0; i < A.length; ++i) if (map['' + A[i]]) doBla(A[i]);
由于数字对于哈希而言非常便宜(即使在JavaScript中,在哈希之前转换为字符串也非常便宜),因此这将非常快。