У меня есть таблица в базе данных под названием Control:Лучший Алгоритм поиска пересечения между 2 Интервалы
Структура таблицы:
Id | Имя | MinValue (десятичный) | MaxValue (десятичное)
У меня есть некоторые ограничения на эту таблицу, один из его ограничений нет: нет перекрестков.
Пример: если таблица имеет некоторые значения следующим образом:
Row1: 1 | Test1 | 1.3 | 2.5 // действует
row2: 2 | Test2 | 3,3 | 4.5 // действует
row3: 3 | Test3 | 5 | 6 // действует
Теперь, если я хочу, чтобы добавить новую запись, она не должна пересекаться с какой-либо другой строки
Пример:
row4: 4 | Test4 | 5.1 | 10 // не имеет значения номер с 5 до 6 зарезервирован
row5: 5 | Test5 | 1.0 | 1,4 // не действует, поскольку слот от 1,3 до 2,5 зарезервирован
Я использую этот код, и он работал отлично, но мне интересно, если есть лучшее решение, и более эффективным:
var allRows = db.Control.ToList();
var minValue = control.MinimumValue;
var maxValue = control.MaximumValue;
bool flag = true;
foreach(var row in allRows)
{
for(var i = minValue; i <= maxValue && flag ; i = decimal.Add(i , (decimal) 0.01))
{
if(i >= row.MinimumValue && i <= row.MaximumValue)
{
flag = false;
min = row.MinimumValue;
max = row.MaximumValue;
break;
}
}
}
if (flag)
{
//add
}
else
{
//intersection
}
Любые предложения?
Eсть нет такой вещи, как «пересечение между двумя точками». Точка - это почти единственное геометрическое понятие, которое не может пересекаться с другим. –
Внутренний цикл не имеет смысла, есть перекрытие, если minValue row.minValue. Выводит его из O (n * m) в O (n). Вы также можете оптимизировать его до O (log (n)) с помощью SortedList. –
не работал, @HansPassant –