我想写一个 JavaScript 功能验证的邮政编码,通过检查,如果邮政编码确实存在。这是一个列表中的所有邮政编码:

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


这真是一个压缩的问题。我想做到这一点的乐趣。OK,现在进行的方式,这是一个列表中的最优化过直hashtable我能想到的,觉得免费的增加任何东西我有没有想过:

  • 打破邮编入2件,第2位数和最后3位数字。
  • 做一个巨大的如果别的发言第一次检查的第一个2位数,然后检查范围内的最后3位数字。
  • 或者隐蔽的拉链收到六角,看看如果我能做相同的事情使用更小的群体。
  • 如果范围内的所有有效的邮政编码有更有效的邮政编码vs无效的邮政编码。写上述代码目标的小组。
  • 打碎的散列入单独的文件,并载入通过的Ajax作为用户类型的邮政编码。因此,也许打入2件,第一,用于第一次2个数字,第二过去3.

最后,我计划产生的JavaScript文件,使用另一种程序,不是通过手。

编辑:性事项在这里。我想利用这一点,如果它不吸。性能JavaScript执行代码+下载时间。

编辑2:JavaScript唯一的解决办法请。我没有访问应用程序服务器,加,这将使这成为一个整体的其他问题=)

有帮助吗?

解决方案

我想写一个JavaScript验证功能的邮政编码

可能是更多的努力,比它的价值,使其保持更新,以便在没有人真正有效的邮政编码被拒绝。你也可以尝试一个外部服务或做其他人不和刚刚接受任何5位数的电话号码!

这是一个列表中的最优化过直hashtable我能想到的

对不起破坏潜在的乐趣,但你可能不会来管理多更好的实际成绩的比JavaScript的目的给你当作为一个hashtable.物体的成员访问是一个最常见的行动在JS和将会超级优化;建立你自己的数据结构是不可能战胜它即使它们能更好地结构,从一台计算机科学的观点。特别是,任何使用'Array'是不会执行,以及你认为,因为列实际上实现为对象(hashtable)本身。

有的说,一个可能的空间压缩工具,如果你只需要知道的'有效或不会使用100000位bitfield,包装成一串。例如,对于空间只有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)) );
}

现在我们只需要找出最有效的方式得到bitfield向脚本。天真'\x00'填充的版本上是相当低效率的。传统的方法来减少这将是,例如。到base64encode:

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

这将得到100000旗帜下降到16.6kB。不幸的是爱图比自电子有限公司.是Mozilla只,所以一个额外的base64解码器,将需要为其他浏览器。(它是不是太困难的,但它是一个比较启动时间来解码。) 它还可能可以使用的AJAX请求转移的直接binary string(编码在ISO-8859-1文本responseText).这会把它拿下来到12.5kB。

但在现实可能是任何东西,即使是天真的版本将做的只要你的脚本中使用mod_deflate,这会压缩走了很多的冗余,并且还重复的'\x00'为所有长范围内的'无效的'代码。

其他提示

你可能做不可想象的,把代码为数字(记得它实际上不是一个数)。把你列入一系列范围,例如:

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(日志n)。

我用 谷歌地图API 检查是否邮政编码存在。

这是更精确。

假设你已经得到了拉链在排序阵列(似乎是公平的,如果你控制生成的datastructure),请参阅如果一个简单的二进制的搜索速度不够快。

所以...你在做客户端验证和希望,以优化对文件的尺寸?你可能不能打败大压缩。幸运的是,大多数浏览器支持gzip你,所以你可以用那么多的自由。

怎么一个简单的json编码字典,或列出与邮政编码的排序和做一个看起来在字典。这会压缩,因为它是一个可预测的序列,进口容易,因为它是式,使用浏览器中的建析程序,查找可能会以非常快的还有,由于这是一个javascript原始的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top