Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Prolog]Сортировка бинарными включениями 
V
    Опции темы
Proksima
Дата 24.11.2006, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите, пожалуйста, написать на прологе сортировку бинарными включенниями.

Заранее благодарю. smile
PM MAIL   Вверх
skyboy
Дата 24.11.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



опиши алгоритм. постараюсь помочь.
PM MAIL   Вверх
Proksima
Дата 24.11.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Метод прямых вставок: Делаются проходы по части списка, и в его начале "вырастает" отсортированная последовательность. Можно считать, что эта последовательность упорядочена. По ходу алгоритма в нее будут вставляться все новые элементы. Поиск подходящего места для очередного элемента входной последовательности осуществляется путем последовательных сравнений с элементом, стоящим перед ним.    В зависимости от результата сравнения элемент либо остается на текущем месте(вставка завершена), либо они меняются местами и процесс повторяется. 
Алгоритм сортировки бинарными включениями представляет из себя оптимизированную версию алгоритма сортировки простыми вставками, отличие заключается в том, что при поиске место, на которое надо вставить элемент ai  в уже упорядоченную совокупность a0 , ..., ai-1 , определяется алгоритмом деления пополам (отсюда и название алгоритма "бинарные включения" здесь понимаем как "включения делением пополам"). 
 
Вот сам алгоритм:

Код

Procedure Binary_Insertion(n:word; Var a:massiv);
Var
  i,j,l,r,m:word;

         x:item;

   BEGIN

         For i:=2 To n Do

         begin

               x:=a[i]; l:=1; r:=i-1;

               While l<=r Do

               begin

                  m:=(l+r) div 2;

                  If x.key<a[m].key Then r:=m-1

                                              Else l:=m+1

               end;

               For j:=i-1 DownTo l Do a[j+1]:=a[j];

               a[l]:=x

         end

   END;{Binary_Insertion}


Эту же сортировку когда-то описывала на лиспе. Было задание в одной из лабораторных работ... А вот с прологом что-то не заладилось...

Можно помочь?


M
Guedda
Не забывайте пользоваться кнопкой "Код"!


Это сообщение отредактировал(а) Guedda - 25.11.2006, 08:22
PM MAIL   Вверх
Artemios
Дата 25.11.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Proksima @  24.11.2006,  02:10 Найти цитируемый пост)
сортировку бинарными включенниями.

сделал немножко иначе, чем:

Цитата(Proksima @  24.11.2006,  21:00 Найти цитируемый пост)
Делаются проходы по части списка, и в его начале "вырастает" отсортированная последовательность.

а именно, построил бинарное дерево сортировки, а затем линеаризовал его:

Код

конкатенация( [], L, L ). % конкатенация списков
конкатенация( [X | L1], L2, [X | L3]) :- 
    конкатенация( L1, L2, L3).

линеаризация( [X|L], L1 ) :-  % Линеаризация многоуровневого списка
     линеаризация( X, H ),
     линеаризация( L, T ),
     конкатенация( H, T, L1 ).
линеаризация( [], [] ).
линеаризация( X, [X] ).

сорт_вставка( X, [], [[],X,[]] ). % сорированная вставка в бинарное дерево
сорт_вставка( X, [A,B,C], [A,B,D] ) :- 
    X >= B,
    сорт_вставка(X,C,D).
сорт_вставка( X, [A,B,C], [D,B,C] ) :- 
    X < B,
    сорт_вставка(X,A,D).

бинарное_дерево( [], [] ). % построение бинарного дерева сортировки
бинарное_дерево( [X|L], D ) :-
    бинарное_дерево(L,D1),
    сорт_вставка(X,D1,D).

бин_сортировка(L1,L2) :-
    бинарное_дерево(L1,D),
    линеаризация(D,L2).


Проверка:
Цитата

?- бин_сортировка([3,1,7,2,5,4,8,9],L).

L = [1, 2, 3, 4, 5, 7, 8, 9]

Yes
?-   


Это сообщение отредактировал(а) Artemios - 25.11.2006, 19:48


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Proksima
Дата 25.11.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Artemios, большое спасибо!
PM MAIL   Вверх
ImSassy
Дата 16.9.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Proksima, помоги, пожалйста, у тебя случайно не осталось этой сортировки на лиспе? А то мне нужно лабу сдавать, а я вообще бум-бум(((
PM MAIL   Вверх
Rodman
Дата 20.9.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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




M
Rodman
Модератор: Название темы должно отражать ее суть!

PM MAIL WWW Skype GTalk YIM MSN   Вверх
brianosally
Дата 22.12.2010, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Artemios @ 25.11.2006,  19:34)
Цитата(Proksima @  24.11.2006,  02:10 Найти цитируемый пост)
сортировку бинарными включенниями.

сделал немножко иначе, чем:

Цитата(Proksima @  24.11.2006,  21:00 Найти цитируемый пост)
Делаются проходы по части списка, и в его начале "вырастает" отсортированная последовательность.

а именно, построил бинарное дерево сортировки, а затем линеаризовал его:

Код

конкатенация( [], L, L ). % конкатенация списков
конкатенация( [X | L1], L2, [X | L3]) :- 
    конкатенация( L1, L2, L3).

линеаризация( [X|L], L1 ) :-  % Линеаризация многоуровневого списка
     линеаризация( X, H ),
     линеаризация( L, T ),
     конкатенация( H, T, L1 ).
линеаризация( [], [] ).
линеаризация( X, [X] ).

сорт_вставка( X, [], [[],X,[]] ). % сорированная вставка в бинарное дерево
сорт_вставка( X, [A,B,C], [A,B,D] ) :- 
    X >= B,
    сорт_вставка(X,C,D).
сорт_вставка( X, [A,B,C], [D,B,C] ) :- 
    X < B,
    сорт_вставка(X,A,D).

бинарное_дерево( [], [] ). % построение бинарного дерева сортировки
бинарное_дерево( [X|L], D ) :-
    бинарное_дерево(L,D1),
    сорт_вставка(X,D1,D).

бин_сортировка(L1,L2) :-
    бинарное_дерево(L1,D),
    линеаризация(D,L2).


Проверка:
Цитата

?- бин_сортировка([3,1,7,2,5,4,8,9],L).

L = [1, 2, 3, 4, 5, 7, 8, 9]

Yes
?-   


%линеаризация(уничтожение многоуровневости списка к пр. [a,[b,[c]]]  -->  [a,b,c])

lineariz([H|L],L1):-lineariz(H,LS),lineariz(L,LS2),union_lists(LS,LS2,L1).
lineariz([],[]).
lineariz(H,[H]).

[a,[b,[c]]]  -->  [a,b,c]
[a,[b,[c]]]  -->  [a,b,c,[]]
[a,[b,[c]]]  -->  [a,b,c,[],[]]
[a,[b,[c]]]  -->  [a,b,c[],[],[]]
...........................................
[a,[b,[c]]]  -->  [a,b,[c]] и т. д.


Но если добавить ! в выражение, то обратный ход отсечется, как и куча лишних вариантов:

%линеаризация(уничтожение многоуровневости списка к пр. [a,[b,[c]]]  -->  [a,b,c])

lineariz([H|L],L1):-lineariz(H,LS),lineariz(L,LS2),!,union_lists(LS,LS2,L1).
lineariz([],[]).
lineariz(H,[H]).


результат :
[a,[b,[c]]]  -->  [a,b,c]

%второй вариант у меня так и не заработал, но может кто усовершенствует:
%lineariz([[H|L]|H1],L2):-lineariz([H|[L|H1]],L2).
%lineariz([H|[L|H1],[H|L2]):-lineariz([L|H1],[H|L2]).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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