如何将两组 1000 个数字相互比较?

2022-08-30 09:11:42

我必须对照其他1000个数字检查大约1000个数字。

我加载了两者并在服务器端进行了比较:

foreach( $numbers1 as $n1 ) {
  foreach( $numbers2 as $n2 ) {
    if( $n1 == $n2 ) {
      doBla();
    }
  }
}

这花了很长时间,所以我尝试使用两个隐藏元素进行相同的比较客户端。然后使用JavaScript比较它们。加载页面仍需要 45 秒(使用隐藏元素)。divdiv

我不需要加载不相同的数字。

有没有更快的算法?我正在考虑比较它们数据库端,只加载错误号,然后对剩余的非错误号进行Ajax调用。但是MySQL数据库足够快吗?


答案 1

首先对列表进行排序。然后,您可以从一开始就向上浏览两个列表,并随时进行比较。

循环将如下所示:

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中,在散列之前转换为字符串也非常便宜),这将非常快。