Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка вставками в бинарном дереве 
V
    Опции темы
ImSassy
Дата 16.9.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребят, помогите, пожалуйста, с задачей по Лиспу:
реализовать алгоритм сортировки вставками в бинарном дереве (без сбалансировки)
Что-то у меня вобще никак лисп не идёт((((
Буду очень благодарна
PM MAIL   Вверх
VH_
Дата 23.9.2009, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Для «обыкновенного» списка сортировка вставками выглядит, вероятно, так:
Код
(defun SORT_INSERT (L)
 (cond
  ((null L) nil)
  ((null (cdr L)) L)
  (T (INSERT (car L) (SORT_INSERT (cdr L))))))
(defun INSERT (E L)
 (cond
  ((null L) (cons E nil))
  ((< E (car L)) (cons E L))
  (T (cons (car L) (INSERT E (cdr L))))))

Как устроено Ваше бинарное дерево?

Это сообщение отредактировал(а) VH_ - 23.9.2009, 07:32
PM MAIL   Вверх
ImSassy
Дата 23.9.2009, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это лаба, и, впринципе, о каких-то усобых условиях для дерева ничего не оговаривается... Спасибо за помощь)))
PM MAIL   Вверх
VH_
Дата 23.9.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вы можете словесно изложить алгоритм "сортировки вставками" именно "в бинарном дереве" (либо дать ссылку на такое описание)?
PM MAIL   Вверх
ImSassy
Дата 23.9.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так вот в том-то и дело, что гугл даже в теории такого не знает, я уточню в универе и отпишу, а то понятно только то, что ничего не понятно
PM MAIL   Вверх
ImSassy
Дата 23.9.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем, вводим список, а потом по нему проходим - на каждом шаге элемент вставляем в дерево, начиная с корня, дальше - если следующий элемент больше, чем элемент в корне, идём на правую ветку, иначе - в левую, и так до листа, а тудо вставляем данный элемент. И дальше нужно вывести уже отсортированный список через отдельную функцию
PM MAIL   Вверх
lonli
Дата 26.9.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если ещё актуально, могу сходу набросать структуру дерева и функцию вставки.
Структура такая: каждый "элемент" (я не знаком с терминологией) - cons-ячейка, где car часть - собственно значение.
cdr часть cons-ячейка, гда car содержит левую, а cdr правую ветки, если веток нет, то соотв. части равны nil.

Код

(defun insert-foo (tree val)
  (if tree ; на передали древо или 
      (let ((tree-val (car tree)) ; значение в корне
        (new-tree (cdr tree))) ; собственно оставшееся дерево
    (if (< val tree-val) ; идём направо или налево ?
        ;; налево
        (if (car new-tree) ; проверка, а есть ли уже левая ветка, или там пока пусто
        ;; ветка есть
        (insert-foo (car new-tree) val) ; для наглядности используем рекурсию
        ;; ветки нет. создаём.
        (setf (car new-tree) (cons val (cons nil nil))))
        ;; направо
        (if (cdr new-tree) ; проверка, а есть ли уже правая ветка, или там пока пусто
        ;; ветка есть
        (insert-foo (cdr new-tree) val) ; для наглядности используем рекурсию
        ;; ветки нет. создаём.
        (setf (cdr new-tree) (cons val (cons nil nil)))))))


Для первого элемента сортируемого списка корень дерева создаём вручную.
Код

(let ((tree (cons (car list) (cons nil nil))))
  (dolist (i (cdr list)) ; (cdr list) == (rest list) потому, что первый элемент уже обработан
    (insert-foo tree i))
  развёртываем дерево в новый список)


Правильность работы не проверял. 

P.S. (cons foo nil) эквивалентно (list foo), но так как мы рассматриваем tree не как вложенный список, для понятности я писал cons.
PPS есть более "красивый"  вариант в функциональной парадигме (без setf, каждый раз insert-foo создаёт новую ячейку), но он гораздо менее понятен.

Это сообщение отредактировал(а) lonli - 26.9.2009, 11:43
PM MAIL ICQ   Вверх
VH_
Дата 29.9.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код
(defun SORT (L)
 (if L
  (INSERT (car L) (SORT (cdr L)))))

Код
(defun INSERT (elem tree)
 (if tree
  (apply
  '(lambda (root left right)
    (if (< elem root)
     (list root (INSERT elem left) right)
     (list root left (INSERT elem right))))
   tree)
  (list elem nil nil)))

Разве это может быть «гораздо менее понятно»?
PM MAIL   Вверх
VH_
Дата 30.9.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Развертывание дерева в линейный список:
Код
(defun LINE (tree)
 (if tree
  (apply
  '(lambda (root left right)
    (append
     (LINE left) (list root) (LINE right)))
   tree)))


PM MAIL   Вверх
ImSassy
Дата 1.11.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо Вам огромное за помощь)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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