нужен алгоритм для сворачивания netblock диапазоны в списки диапазонов надмножества

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
13
задан Laurent Etiemble 3 June 2010 в 07:15
поделиться

4 ответа

Вы знаете, что можно легко преобразовать адреса IPv4 в международные числа (int32 числа), не так ли? Работа с международными числами намного легче. Таким образом, в основном каждый адрес является числом в диапазоне 0 к 2^32. Каждый диапазон имеет число запуска и число конца. Ваш пример

1.1.1.1 to 2.2.2.5
1.1.1.2 to 2.2.2.4

может быть записан как

16,843,009 to 33,686,021
16,843,010 to 33,686,020

, Таким образом, довольно легко видеть, ли один диапазон в другом диапазоне. Диапазон полностью в другом диапазоне, если следующее условие дано

startIP2 >= startIP1 && startIP2 <= endIP1 &&
endIP1 >= startIP1 && endIP2 <= endIP1

В этом случае, диапазон startIP2-endIP2 полностью в startIP1-endIP1. Если только первая строка верна, то startIP2 в диапазоне startIP1-endIP1, но конец вне диапазона. Если только вторая строка верна, endIP в диапазоне, но IP запуска вне диапазона. В этом случае, если только одна строка верна, необходимо развернуть диапазон вначале или в конце. Если обе строки являются ложью, диапазоны являются абсолютно непересекающимися, в этом случае они - два абсолютно независимых диапазона.

4
ответ дан 1 December 2019 в 22:58
поделиться

Это - объединение вычисления сегментов. Оптимальный алгоритм (в O (nlog (n))) состоит в выполнении следующего:

  1. вид все конечные точки (начальные и конечные точки) в списке L (каждая конечная точка должна знать сегмент, это принадлежит). Если конечная точка равна начальной точке, отправная точка должна быть рассмотрена меньшая, чем enpoint.
  2. проходят отсортированный список L слева направо и поддерживают РЕ LE номер , где LE является количеством левых конечных точек, которые Вы уже передали, и , РЕ является количеством правильных конечных точек, которые Вы уже передали.
  3. каждый раз РЕ LE достигает нуля, Вы в конце связанного объединения сегментов, и Вы знаете, что объединение сегментов, которые Вы видели прежде (начиная с предыдущего возврата к нулю) является одним надмножеством.
  4. , если Вы также поддержали минуту и макс. между каждым возвратом к нулю, у Вас есть границы надмножества.

В конце, Вы получаете отсортированный список непересекающихся надмножеств. Однако, два надмножества A и B могут быть смежными (конечная точка A незадолго до начальной точки B). Если Вы хотите, чтобы A и B были объединены, можно сделать это или простым шагом постобработки, или путем небольшого изменения шага 3: когда РЕ LE достигает нуля, Вы считали бы это концом надмножества, только если следующий элемент в L не является прямым преемником Вашего элемента тока.

16
ответ дан 1 December 2019 в 22:58
поделиться

То, что необходимо сделать, просто проверить диапазоны на перекрытие. Если два диапазона накладываются, то они объединяются в единственный диапазон. Диапазоны накладываются, если правая сторона одного диапазона больше, чем левая сторона другого.

0
ответ дан 1 December 2019 в 22:58
поделиться

Хорошо, мой коллега придумал этот ответ, который я думаю, довольно превосходно. Сообщите мне, видите ли Вы какие-либо проблемы:

  • Порядок диапазоны IP StartingIP
  • Для каждой строки "x" для вставки:
    • , Если существует предыдущая строка "y" в списке, выборке: <ул.> <литий>, Если X и Y непрерывны, Еще расширьте y до EndingIP x <литий> если x. StartingIP < = y. StartingIP и x. EndingIP> y. EndingIP, расширьте y до x. EndingIP <литий> Еще, если x является подмножеством y, ничего Еще не сделайте <литий>, Еще создайте новый диапазон
    • , создайте новый диапазон и вставьте в список
0
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: