我必须对照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中,在哈希之前转换为字符串也非常便宜),因此这将非常快。

09-11 19:27
查看更多