문제

하고 싶 쓰기 JavaScript 기능의 유효성을 검사하는 우편 번호,체크하는 경우 우편 번호는 실제로 존재합니다.여기에 모든 목록 우편 번호:

http://www.census.gov/tiger/tms/gazetteer/zips.txt (나만 관리에 대해 2 번째 열)


이것은 정말 압축 문제입니다.나는 이에 대한 재미 있습니다.OK,이제 그 밖의 방법으로,여기에는 목록의 최적화를 통해 바로 해시 테이블을 생각할 수 있고,무료 아무것도 추가 생각하지 않았습니다:

  • 휴 우편 번호 2 부분으로,첫 번째 2 개의 숫자 및 지난 3 자리입니다.
  • 거대한 경우-다른 문을 먼저 확인하는 2 자리 숫자로,그 확인하는 범위 내에서 지난 3 자리입니다.
  • 또,비밀의 옷으로 진수,고 할 수 있다면 같은 것을 사용하는 작은 그룹이 있습니다.
  • 알면의 범위 내에서 모든 유효한 우편 번호가 있는 보다 유효한 지 vs 잘못이 있었습니다.쓰 위의 코드를 대상으로 작은 그룹입니다.
  • 헤어 해쉬로 별도의 파일을 로드하 Ajax 를 통해자의 사용자 유형으로 우편 번호.그래서 아마도 break2 부분으로,처음에 대한 첫 번째 2 자리 숫자로,두 번째는 지난 3.

마지막으로,내가 계획을 생성하는 자바 스크립트 파일을 사용하여 다른 프로그램,지 않습니다.

편집:성능에 대한 문제입니다.내가 이것을 사용하고 싶지 않는 경우,빨.성능 JavaScript 코드의 실행+다운로드 시간입니다.

Edit2:JavaScript 만 솔루션십시오.액세스할 수 없는 응용 프로그램 서버,플러스,하는 것이로 전혀 다른 문제=)

도움이 되었습니까?

해결책

우편 번호를 검증하는 JavaScript 함수를 작성하고 싶습니다.

가치가있는 것보다 더 많은 노력이 될 수 있으며, 누군가의 진정한 유효한 우편 번호가 거부되도록 업데이트를 계속 업데이트하십시오. 외부 서비스를 시도하거나 다른 사람들이하는 일을하고 5 자리 번호 만 수락 할 수 있습니다!

다음은 내가 생각할 수있는 스트레이트 해시 가능에 대한 최적화 목록입니다.

잠재적 인 재미를 망치게되어 죄송합니다. 그러나 당신은 아마도 JavaScript의 객체가 당신에게 해시 가능으로 사용하는 것보다 훨씬 더 나은 실제 성능을 관리하지 않을 것입니다. Object Member Access는 JS에서 가장 일반적인 작업 중 하나이며 최적화됩니다. 컴퓨터 과학의 관점에서 잠재적으로 더 나은 구조이더라도 자체 데이터 구조를 구축하는 것은 이길 수 없습니다. 특히, '배열'을 사용하는 것은 배열이 실제로 객체 (Hashtable) 자체로 구현되기 때문에 생각만큼 성능이 없습니다.

그러나 '유효한 것'만 알아야한다면 가능한 공간 압축 도구는 문자열에 포장 된 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-encode :

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

그것은 100000 깃발을 16.6KB로 줄입니다. 불행히도 ATOB은 Mozilla 전용이므로 다른 브라우저에는 추가 Base64 디코더가 필요합니다. (너무 어렵지는 않지만 디코딩하는 데 약간 더 많은 시작 시간입니다.) AJAX 요청을 사용하여 직접 이진 문자열을 전송할 수도 있습니다 (ISO-8859-1 텍스트로 인코딩 된 텍스트로 인코딩). 그것은 12.5KB로 줄어 듭니다.

그러나 실제로, 순진한 버전조차도 Mod_deflate를 사용하여 스크립트를 제공하는 한, 그 중복성을 많이 압축 할 수 있고, 'Invalid의 모든 긴 범위에 대해' 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 (log n)를 달성 할 수 있습니다.

나는 사용한다 Google 매핑 API 우편 코드가 존재하는지 확인합니다.

더 정확합니다.

가정을 지퍼로 잠그에 정렬된 array(인 페어 당신을 제어하세대의 큰 데이터 구조를),시면 간단한 검색이 충분히 빠르다.

그래서 ... 클라이언트 측 유효성 검사를하고 파일 크기를 최적화하고 싶습니까? 일반 압축을 이길 수는 없습니다. 다행히도 대부분의 브라우저는 GZIP를 지원하므로 무료로 사용할 수 있습니다.

단순한 JSON 코딩 된 독기 또는 우편 번호가 정렬 된 순서로 목록을 작성하고 DITT를 찾아보십시오. 예측 가능한 시퀀스이므로 JSON이기 때문에 쉽게 가져 오기 때문에 잘 압축 될 것입니다. 브라우저 내에서 구축 된 파서를 사용하여 조회가 매우 빠를 것입니다.

유용 할 수 있습니다.

PHP 우편 번호 범위 및 거리 계산

만큼 잘 우편 번호 목록.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top