Упрощенный способ представления древовидных данных?

У меня есть некоторые данные JSON, которые я хочу сопоставить с определенным массивом идентификаторов. Так, например, JSON temperature: 80, weather: tornado может сопоставляться с массивом идентификаторов [15, 1, 82]. Этот массив идентификаторов является совершенно произвольным, и я сам определю его для этого конкретного ввода, он просто предназначен для предоставления рекомендаций на основе условий.

Таким образом, хотя temperature >= 80 в tornado условиях всегда соответствует [15, 1, 82], та же температура в cloudy условиях может быть [1, 16, 28] и так далее.

Проблема в том, что существует МНОГО потенциальных «ветвей». В моей программе есть 7 времен суток, каждый из этих time of day узлов имеет 7 потенциальных температурных диапазонов, и каждый из этих temperature range узлов имеет 15 возможных погодных явлений. Так что вручную писать операторы if для 735 комбинаций (если я правильно посчитал) было бы очень неуправляемо.

Я нарисовал «дерево решений», представляющее один путь для демонстрационных целей выше.

Каковы некоторые рекомендуемые способы представления этого в коде, помимо массово вложенных условных операторов/операторов case?

Спасибо.

Каков исходный формат данных?

trincot 22.01.2023 22:17

@trincot исходные данные представляют собой объект JSON с температурой и временем. Таким образом, «дерево решений» является чисто теоретическим, мне пришлось бы сначала построить/заполнить структуру данных, а затем использовать ее для поиска.

1sentenced 22.01.2023 22:29

Но тогда откуда взять список идентификаторов и их отношение к этим ключам?

trincot 22.01.2023 22:31

В моем случае список идентификаторов определяется вручную и произвольно. Например, температура 90 градусов и погода "торнадо" сами по себе приведут к определенному списку идентификаторов [1, 2, 3], которые я определил (которые используются для других целей). Тем не менее, есть много совпадений, так как температура 90 градусов и погода «шквала» могут привести к списку идентификаторов [2, 3, 19] и т. д. Итак, моя проблема — это большое дерево решений для ввода — но, как я сказал, не уверен, если я слишком много думаю

1sentenced 22.01.2023 22:35

Это довольно расплывчато. Можете ли вы отредактировать свой вопрос и предоставить код того, как делается ввод и что вы ожидаете на выходе? Я сомневаюсь, что вы действительно имеете дело с деревом решений. Какое здесь будет решение?

trincot 22.01.2023 22:59

Рассмотрим DAG для представления ваших данных. Используйте универсальный код для навигации. Я имею в виду, не пытайтесь вставлять данные в код. Небольшой универсальный код и большой DAG для хранения деталей.

Stanislav Volodarskiy 22.01.2023 23:33

@trincot конечно, снова обновил. Надеюсь, теперь это намного менее расплывчато. Ваше здоровье.

1sentenced 23.01.2023 01:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет необходимости в массовом ветвлении. Достаточно просто создать справочную таблицу с 735 возможными записями. Вы сказали, что сами добавите значения.

Создавайте перечисления для каждого времени суток, температурных диапазонов и погодных явлений. Таким образом, ваше время суток отображается от 0 до 6, ваши диапазоны температуры отображаются от 0 до 6, а ваши погодные события отображаются от 0 до 14. По сути, у вас есть трехмерный массив. И каждая запись в массиве представляет собой список списков идентификаторов.

В C# это будет выглядеть примерно так:

List<List<int>>[][][] = LookupTable[7][7][15];

Чтобы заполнить таблицу поиска, напишите программу, генерирующую JSON, которую вы можете включить в свою программу. В псевдокоде:

for (i = 0 to 6) {       // loop for time of day
  for (i = 0 to 6) {     // loop for temperature ranges
    for (i = 0 to 14) {  // loop for weather events
      // here, output JSON for the record
      // You'll probably want a comment with each record
      // to say which combination it's for.
      // The JSON here is basically just the list of
      // ID lists that you want to assign.
    }
  }
}

Возможно, вы захотите использовать эту программу для создания скелета JSON (т. е. одной записи для каждой комбинации [время суток, температура, погодное событие]), а затем вручную добавить список списков идентификаторов.

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

Вы можете сделать что-то подобное с картой или словарем. Вы бы сгенерировали JSON, как указано выше, но вместо того, чтобы загружать его в трехмерный массив, загрузите его в свой словарь с ключом, представляющим собой конкатенацию трех измерений. Например, ключ будет:

"early morning,lukewarm,squall"

Вероятно, есть и другие решения для таблицы поиска. Это первые два, которые я придумал. Дело в том, что у вас есть много статических данных, которые очень удобно индексировать. Воспользуйтесь этим.

Отличная идея, матричная структура не приходила мне в голову. Спасибо!

1sentenced 23.01.2023 05:13

Другие вопросы по теме

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

Алгоритм постоянного рабочего пространства для триангуляции набора точек
JavaScript: изменять серию каждый N-й раз (всегда начинать с 1)?
Приоритетная очередь с использованием сортировки вставками - лучший сценарий O (n)?
Учитывая строку s, найти длину самой длинной подстроки без повторяющихся символов? (Мне нужно найти ошибку в коде, который я написал)
Найдите триплеты из массива, такие что i<j<k, A[i]<A[j]<A[k] и B[i]+B[j]+B[k] максимальны
Выведите количество возможных непустых последовательностей букв
Алгоритм минимизации суммы произведений листовых значений и их глубины
Как перебрать все элементы разных отсортированных списков в отсортированном порядке?
Самый быстрый способ подсчитать, сколько раз каждая грань N-гранного игрального кубика появляется за M бросков
Как реализовать быструю процедуру вывода типов для комбинаторов SKI в Python?