1

我想编写一个JavaScript函数,通过检查邮政编码是否实际存在来验证邮政编码。以下是所有邮政编码的列表:

http://www.census.gov/tiger/tms/gazetteer/zips.txt (我只关心第2栏)


这确实是一个压缩问题。我想这样做是为了好玩。好的,现在已经不碍事了,这是我能想到的对直接哈希表的优化列表,请随意添加我没有想到的任何内容:

  • 将邮政编码分为 2 部分,前 2 位数字和后 3 位数字。
  • 做一个巨大的 if-else 语句,首先检查前 2 位数字,然后检查最后 3 位数字内的范围。
  • 或者,将拉链转换为十六进制,看看我是否可以使用较小的组来做同样的事情。
  • 找出在所有有效邮政编码范围内是否有更多有效邮政编码与无效邮政编码。针对较小的群体编写上述代码。
  • 将散列分解为单独的文件,并通过 Ajax 加载它们作为邮政编码中的用户类型。所以也许分成两部分,第一部分是前 2 位,第二部分是后 3 位。

最后,我计划使用另一个程序而不是手动生成 JavaScript 文件。

编辑:性能在这里很重要。我确实想用这个,如果它不烂的话。JavaScript 代码执行性能 + 下载时间。

编辑 2:请仅使用 JavaScript 解决方案。我无权访问应用程序服务器,另外,这将成为另一个问题 =)

4

6 回答 6

4

您可以做不可思议的事情并将代码视为数字(请记住,它实际上不是数字)。将您的列表转换为一系列范围,例如:

zips = [10000, 10001, 10002, 10003, 23001, 23002, 23003, 36001]
// becomes
zips = [[10000,10003], [23001,23003], [36001,36001]]
// make sure to keep this sorted

然后测试:

myzip = 23002;
for (i = 0, l = zips.length; i < l; ++i) {
    if (myzip >= zips[i][0] && myzip <= zips[i][1]) {
        return true;
    }
}
return false;

这只是使用非常简单的线性搜索(O(n))。如果您保持列表排序并使用二进制搜索,则可以实现 O(log n)。

于 2009-03-05T01:56:33.617 回答
2

我想编写一个验证邮政编码的 JavaScript 函数

可能比它的价值更多的努力,保持更新,以便在任何时候都不会拒绝某人真正有效的邮政编码。您也可以尝试外部服务,或者像其他人一样做,只接受任何 5 位数字!

这是我能想到的对直接哈希表的优化列表

很抱歉破坏了潜在的乐趣,但您可能无法管理比 JavaScript 的 Object 在用作哈希表时提供的更好的实际性能。对象成员访问是 JS 中最常见的操作之一,将进行超级优化;即使从计算机科学的角度来看它们可能是更好的结构,构建自己的数据结构也不太可能击败它。特别是,任何使用 'Array' 的东西都不会像你想象的那么好,因为 Array 实际上是作为一个对象(哈希表)本身实现的。

话虽如此,如果您只需要知道“有效与否”,一个可能的空间压缩工具就是使用一个 100000 位的位域,打包成一个字符串。例如,对于只有 100 个邮政编码的空间,其中代码 032-043 是“有效的”:

var zipfield= '\x00\x00\x00\x00\xFF\x0F\x00\x00\x00\x00\x00\x00\x00';
function isvalid(zip) {
    if (!zip.match('[0-9]{3}'))
        return false;
    var z= parseInt(zip, 10);
    return !!( zipfield.charCodeAt(Math.floor(z/8)) & (1<<(z%8)) );
}

现在我们只需要找出最有效的方法来获取脚本的位域。上面简单的 '\x00' 填充版本效率很低。减少这种情况的传统方法是,例如。对其进行base64编码:

var zipfield= atob('AAAAAP8PAAAAAAAAAA==');

这将使 100000 个标志降至 16.6kB。不幸的是 atob 仅适用于 Mozilla,因此其他浏览器需要额外的 base64 解码器。(这不是太难,但它需要更多的启动时间来解码。)也可以使用 AJAX 请求来传输直接二进制字符串(以 ISO-8859-1 文本编码到 responseText)。这会将它降低到 12.5kB。

但实际上,只要您使用 mod_deflate 提供脚本,可能任何事情,即使是幼稚的版本,都会做,这将压缩掉很多冗余,以及所有长范围的 'invalid 重复 '\x00' '代码。

于 2009-03-05T02:21:36.520 回答
1

我使用Google Maps API检查邮政编码是否存在。

它更准确。

于 2009-03-05T01:59:06.637 回答
0

假设您已经在排序数组中找到了 zip(如果您正在控制数据结构的生成,这似乎很公平),请查看简单的二进制搜索是否足够快。

于 2009-03-05T01:56:02.650 回答
0

这可能有用:

PHP邮政编码范围和距离计算

以及邮政编码列表

于 2009-03-05T02:00:08.990 回答
0

所以...您正在进行客户端验证并希望针对文件大小进行优化?您可能无法击败一般压缩。幸运的是,大多数浏览器都为您支持 gzip,因此您可以免费使用它。

一个简单的 json 编码字典或带有按排序顺序的邮政编码的列表,然后查看字典。它会很好地压缩,因为它是一个可预测的序列,很容易导入,因为它是 json,使用浏览器内置的解析器,并且查找也可能非常快,因为这是一个 javascript 原语。

于 2009-03-05T04:36:10.143 回答