Найдите пересечение диапазона числа

Используйте showModalBottomSheet больше примеров: modal_bottom_sheet_demo persistent_bottom_sheet_demo

экзамен:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Modal bottom sheet'),
      ),
      body: Center(
        child: RaisedButton(
          child: const Text('SHOW BOTTOM SHEET'),
          onPressed: () {
            showModalBottomSheet(
              context: context,
              builder: (BuildContext context) {
                return Container(
                  child: Padding(
                    padding: const EdgeInsets.all(32.0),
                    child: Text(
                      'This is the modal bottom sheet. Tap anywhere to dismiss.',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                          color: Theme.of(context).accentColor, fontSize: 24.0),
                    ),
                  ),
                );
              },
            );
          },
        ),
      ),
    );
  }

9
задан deceze 22 October 2008 в 08:30
поделиться

4 ответа

Просто псевдо предположение кода:

Set<Range> determineIntersectedRanges(Range range, Set<Range> setofRangesToTest)
{
  Set<Range> results;
  foreach (rangeToTest in setofRangesToTest)
  do
    if (rangeToTest.end <range.start) continue; // skip this one, its below our range
    if (rangeToTest.start >range.end) continue; // skip this one, its above our range
    results.add(rangeToTest);
  done
  return results;
}
20
ответ дан 4 December 2019 в 07:24
поделиться

Я сделал бы класс Диапазона и дал бы его, булевская переменная метода пересекается (Диапазон). Затем можно сделать a

foreach(Range r : rangeset) { if (range.intersects(r)) res.add(r) }

или, если Вы используете некоторое функциональное программирование стиля Java 8 для ясности:

rangeset.stream().filter(range::intersects).collect(Collectors.toSet())

Само пересечение - что-то как

this.start <= other.end && this.end >= other.start
6
ответ дан 4 December 2019 в 07:24
поделиться

В Python

class nrange(object):
    def __init__(self, lower = None, upper = None):
        self.lower = lower
        self.upper = upper
    def intersection(self, aRange):
        if self.upper < aRange.lower or aRange.upper < self.lower:
            return None
        else:
            return nrange(max(self.lower,aRange.lower), \
                          min(self.upper,aRange.upper))
1
ответ дан 4 December 2019 в 07:24
поделиться

Это в большой степени зависит от Ваших диапазонов. Диапазон может быть большим или маленьким, и кластеризируемый или не кластеризованным. Если у Вас будут большие, кластеризованные диапазоны (думайте "обо всех положительных 32-разрядных целых числах, которые могут быть разделены на 2), то простой подход с Диапазоном (ниже, верхний) не успешно выполнится.

Я предполагаю, что могу сказать следующее: если у Вас есть небольшие диапазоны (кластеризация, или не кластеризация не имеет значения здесь), рассмотрите битовый векторы. Эти маленькие существа сверкают быстро относительно объединения, пересечения и тестирования членства, даже при том, что повторение по всем элементам могло бы требовать времени, в зависимости от размера. Кроме того, потому что они просто используют единственный бит для каждого элемента, они являются довольно маленькими, если Вы не бросаете огромные диапазоны в них.

если у Вас есть меньше, большие диапазоны, то класс Диапазон, как описывают otherswill, достаточен. Этот класс имеет атрибуты, ниже и верхние, и пересечение (a, b) в основном b.upper <a.lower или a.upper> b.lower. Объединение и пересечение могут быть реализованы в постоянное время для единственных диапазонов и для диапазонов compisite, время растет с количеством поддиапазонов (таким образом, Вы не хотите не слишком много небольших диапазонов),

Если у Вас есть огромное пространство, где Ваши числа могут быть, и диапазоны распределяются противным способом, необходимо смотреть на бинарные схемы принятия решений (BDDs). Эти изящные схемы имеют два нижних характеристических класса, Истину и ложь и узлы решения для каждого бита входа. Узел решения имеет немного, это смотрит на, и два после узлов графика - один для "бита один", и один для "бита нуль". Учитывая эти условия, можно закодировать большие спектры в крошечном пространстве. Все положительные целые числа для произвольно больших количеств могут быть закодированы в 3 узлах в графике - в основном единственный узел решения для младшего значащего бита, который переходит ко Лжи на 1 и к Истинному на 0.

Пересечение и Объединение являются довольно изящными рекурсивными алгоритмами, например, пересечение в основном берет два соответствующих узла в каждом BDD, пересеките 1 край, пока некоторый результат не открывается и проверяет: если одним из результатов является Ложный Терминал, создайте 1 ответвление к Ложному терминалу в результате BDD. Если оба - Истинный Терминал, создают 1 ответвление к Истинному терминалу в результате BDD. Если это - что-то еще, создайте 1 ответвление к этому что-то еще в результате BDD. После этого некоторая минимизация умирает (если 0-и 1 ответвление узла переходят к тому же после BDD / терминал, удаляют ее и вытягивают входящие переходы к цели), и Вы являетесь золотыми. Мы даже пошли далее, чем который, мы работали над моделированием добавления наборов целых чисел на BDDs для улучшения прогноза значения для оптимизации условий.

Эти соображения подразумевают, что Ваши операции ограничены суммой битов в Вашем диапазоне числа, то есть, log_2 (MAX_NUMBER). Просто думайте о нем, можно пересечь произвольные наборы 64 разрядных целых чисел в почти постоянное время.

Больше информации может быть, например, в Википедии и бумагах, на которые ссылаются.

Далее, если ложные положительные стороны терпимы, и Вам нужна проверка существования только, можно посмотреть на фильтры Цветка. Фильтры цветка используют вектор хешей, чтобы проверить, содержится ли элемент в представленном наборе. Пересечение и Объединение являются постоянным временем. Основная проблема здесь состоит в том, что Вы получаете увеличивающийся ложно-положительный уровень, если Вы заполняете фильтр цветка слишком много. Информация, снова, в Википедии, например.

Hach, представление набора является забавным полем.:)

3
ответ дан 4 December 2019 в 07:24
поделиться
Другие вопросы по тегам:

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