Алгоритм минимизации суммы произведений листовых значений и их глубины

Я застрял с проблемой информатики, которую я пытаюсь решить. Предположим, у вас есть бинарное дерево (которое не нужно балансировать), в котором каждый узел имеет не более двух дочерних узлов и где только лист может содержать целочисленное значение (корневой и средний узлы не содержат). Нам дан массив значений и нужно построить такое дерево с ограничением:

𝐷𝑚 = мин ∑𝑛𝑖=1 𝐴𝑖 𝑑𝑖

Где 𝐴𝑖 — значение элемента массива 𝑖, а 𝑑𝑖 — глубина этого элемента. Сумма этих продуктов должна быть сведена к минимуму.

Как написать алгоритм со средой выполнения 𝑛log(𝑛), который строит такое дерево?

Похоже на кодирование Хаффмана, где A — массив частот.

user3386109 21.01.2023 20:16

Спасибо @trincot за редактирование. Как мне использовать Tex в Stack Overflow?

Luxdragon 21.01.2023 20:17

К сожалению, в Stack Overflow нет поддержки Tex.

trincot 21.01.2023 20:17

@user3386109 user3386109 Да, я никогда об этом не думал! Я проверю это

Luxdragon 21.01.2023 20:18

@trincot, но как тебе удалось включить символы Tex в свое редактирование?

Luxdragon 21.01.2023 20:19

Набор символов Юникода большой ;-) И вы можете использовать теги <sub> и <sup>. Просто щелкните ссылку редактирования, как если бы вы собирались редактировать свой пост, и вы увидите, как он был напечатан.

trincot 21.01.2023 20:20

Все значения положительные?

Damien 21.01.2023 21:10

Да, значения должны быть положительными целыми числами

Luxdragon 21.01.2023 22:16

Согласитесь с @user3386109, это либо проблема Хаффмана, либо проблема оптимального бинарного дерева поиска в зависимости от того, допустимо ли переупорядочивать листья относительно массива.

David Eisenstat 22.01.2023 14:46
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как предполагает @user3386109 в комментариях, это именно проблема поиска оптимального кода без префиксов для набора символов с учетом их количества.

Кодирование Хаффмана простое и известное как оптимальное:

  • Начните с одноэлементного дерева для каждого значения
  • Несколько раз соединяйте два дерева с наименьшим общим значением, пока не останется только одно дерево.

Чтобы доказать, что это оптимально, рассмотрим, что:

  • Независимо от формы вашего дерева, самый глубокий уровень всегда будет содержать как минимум 2 листа, у которых есть общий родитель.
  • Было бы оптимально присвоить этим листьям два наименьших значения.

Поэтому объединение двух наименьших значений всегда является оптимальным решением. Затем остальные соединения можно выполнить, решив меньший экземпляр той же задачи:

Допустим, вы соединяете значения a и b. Тогда стоимость размещения нового родителя на глубине d становится равной (a+b)*(d+1) = d(a+b) + a + b. Затем из всех возможных решений можно вычесть константу a+b.

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