나는 자바에서 사용할 수있는 라이브러리가 있는지 모른다. 사실, 나는 Java에 대해 거의 안다. :) 그러나 도움이된다면 문제 해결을위한 알고리즘을 제공 할 수있다.
1) 첫 번째 정수는 이진 IP 주소의 표현 (ABCD 인 정수 쌍으로 IP 주소를 변환 ->를 < < 24 + B < < 16 + C < < 8 + d) 상기 두 번째 정수는 32입니다 (즉, 처음에는 각 주소가 자신의 서브넷 [1] 임).
2) 쌍 목록을 정렬하십시오.
3) 이제 두 번째 쌍부터 정렬 된 목록을 스캔하십시오. 각 쌍마다 이전의 조합과 조합 할 수 있다면 가능한 한 결합 할 때까지 계속 시도하십시오. 두 쌍 [base1, bits1]
과 [base2, bits2]
은 bits1 == bits2
과 base2^base1 == 1 << (32 - bits1)
인 경우 결합 할 수 있습니다. 이 경우 조합은 [base1, bits1 - 1]
입니다.
4) 마지막으로 쌍을 CIDR 표기법으로 다시 변환하십시오. 첫 번째 정수는 서브넷의베이스 (점으로 된 십진수로 다시 변환 될 때)이고 두 번째 정수는 비트 폭입니다.
모두 2와 3 O(n log n)
각주 1입니다 단계 : 당신의 예에서, 당신이 내 알고리즘 테스트 케이스에 실패 할 것을 의미합니다 마지막 바이트 0과 주소를 포함하지 않는다. 목록에 추가해야합니다. 이 점은 CIDR 서브넷의 정의에서 미묘하지만 중요한 세부 사항을 나타냅니다. 기술적으로 가장 작은 가능한 서브넷은/30입니다. 범위의 첫 번째 및 마지막 IP가 모두 예약되어 있기 때문입니다. 따라서/31에는 유효한 IP 주소가 없습니다. 그러나 사람들은 종종 CIDR 서브넷이라는 용어를 필터 표현식과 같이 "IP 주소 집합을 인식하는 비트 마스크"라는 의미로 사용합니다.
@compdev에서 언급 한 오류를 수정하기위한 고정 된 계산 – rici