写JavaScript邮政编码验证功能
-
03-07-2019 - |
题
我想写一个 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原始的。