Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализовать список поверх бинарного дерева. 
V
    Опции темы
pathfinder
Дата 3.3.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: нет
Всего: 10



Название темы лучше читать как - "Реализация динамического массива поверх сбалансированного бинарного дерева"

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

Обе эти структуры данных реализуют одну и ту же линейную структуру, т.е. структуру на которой определены позиционные операции get/insert/delete/update.

А что если в качестве линейной структуры взять бинарное сбалансированное дерево(например АВЛ-дерево). В каждом узле дерева хранить(и соотвественно обновлять) счетчик - количество элементов хранимых в левом(относительно заданного узла) поддереве.  Данные будут распологаться в листьях, при этом элементы распологающиеся слева от узла будут иметь номера меньше чем узлы распологающиеся справа. Поскольку дерево сбалансировано, то при операциях insert/delete необходимо будет обновить счетчики не более чем в log(n) количестве узлов.

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

Стоимость всех операций get/insert/delete/update пропорциональна log(n).
  
  
  

Это сообщение отредактировал(а) pathfinder - 3.3.2010, 22:22
PM MAIL   Вверх
maxdiver
Дата 3.3.2010, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Ну да, это известный путь. Всяческие деревья - это среднее между массивом и списком, расплатой за что является логарифмическое время на обеих основных операциях вместо константного. Ну собственно во многих библиотеках и даже языках "массивы" именно так и хранятся - на деревьях.

Кроме того, в деревьях можно дополнительно кучу всего другого выполнять. Особенно интересны неявные декартовы деревья, которые за то же логарифмическое время помимо обычных минимумов на отрезке / суммы на отрезке / прибавление(присвоение) на отрезке, также такие необычные штуки как изменение порядка элементов в подотрезке на противоположный / удаление(вставка) подотрезка / перестановка подотрезков.
PM MAIL WWW ICQ   Вверх
pathfinder
Дата 3.3.2010, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: нет
Всего: 10



Цитата(maxdiver @  3.3.2010,  22:20 Найти цитируемый пост)
Ну да, это известный путь. Всяческие деревья - это среднее между массивом и списком, расплатой за что является логарифмическое время на обеих основных операциях вместо константного. Ну собственно во многих библиотеках и даже языках "массивы" именно так и хранятся - на деревьях.


Можно ссылку на такие реализации, а то в стандартной библиотеке Java ничего подобного нету

Добавлено @ 22:33
To maxdiver огромное спасибо.

Тему можно закрывать.

Это сообщение отредактировал(а) pathfinder - 3.3.2010, 22:33
PM MAIL   Вверх
maxdiver
Дата 4.3.2010, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Обычно это в интерпретируемых языках, - в императивных программист сам решает, какую структуру данных выбрать.
PM MAIL WWW ICQ   Вверх
pathfinder
Дата 4.3.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: нет
Всего: 10



Цитата(maxdiver @  3.3.2010,  22:20 Найти цитируемый пост)
Всяческие деревья - это среднее между массивом и списком, расплатой за что является логарифмическое время на обеих основных операциях вместо константного.


Насчет логорифмичности операции доступа - это так, но на списках очень часта операция последовательного доступа к элементам, поэтому если построить сбалансированное декартово дерево поверх двусвязного списка(если прохождение последовательности будет в обработном направлении) тогда доступ к первому элементу последовательности log(n), к последующим элементам = 0, причем можно кэшировать последний элемент(вмысле его индекс I) и проводить оптимизацию - если будеь запрашиваться элемент с индексом J, такой что |I - J| < log(n), будет дешевле пробежаться по двусвязному списку до элемента J, нежели искать его через дерево.

Примеры последовательного доступа - отображение в графических элементах пользовательского интерфейса типа Список/Таблица/КобмоБокс данных из запроса к базе данных.

Это сообщение отредактировал(а) pathfinder - 4.3.2010, 16:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1374 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.