Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Вниз

Добавление элемента в отсортированную структуру.   Найти похожие ветки 

 
Riply ©   (2007-04-11 05:27) [0]

Здравствуйте !
Допустим, у нас есть некая структура, отсортированная в соответствии с неким правилом.
Нам надо добавить в нее новый элемент, сохранив сортировку.
Для наглядности возьмем TList.
Добавить элемент можно двумя способами:
1.
  List.Add(NewElement);
  List.Sort(SortCompare);
2.
  Находим индекс для вставки (в соответствии с нашим правилом сортировки)
  List.Insert(Index, NewItem);

Допустим, у нас есть List с N элементами, и мы хотим добавить еще M элементов.
Как выбрать, из перечисленных выше способов добавления, наиболее оптимальный
для конкретных значений N и M ?


 
SlymRO ©   (2007-04-11 05:41) [1]

1. Сортируем множество M
2. Вставляем M[i] в List по нужному индексу
3. Для нахождения дальнейших индексов за начало списка List брать предыдущий индекс.

//forward declaration
procedure Sort(array or list);
function FindMinIndex(First,Last,Value,List):integer;
//...

Sort(M);
index:=0;
for i:=0 to length(M)-1 do
begin
 index:=FindMinIndex(index,List.Size-1,M[i],List);
 List.Insert(M[i]);
end;


 
SlymRO ©   (2007-04-11 05:44) [2]

SlymRO ©   (11.04.07 5:41) [1]
List.Insert(M[i],Index);


 
SlymRO ©   (2007-04-11 05:51) [3]

Модификация 2.:
First мы ограничили предыдущим индексом
Но можно и ограничит и Last произведя предварительно поиск и вставку последнего элемента M-

Sort(M);
index:=0;
LastIndex:=FindMinIndex(index,List.Size-1,M[High(M)],List);
List.Insert(M[High(M)],LastIndex);
for i:=Low(M) to High(M)-1 do
begin
index:=FindMinIndex(index,LastIndex,M[i],List);
List.Insert(M[i],index);
end;


 
MBo ©   (2007-04-11 06:13) [4]

Решение задачи зависит от порядка N и M.
Если сразу добавлять M, сравнимое с N, то проще просто добавить, затем пересортировать.
Вообще для динамического поддержания сортированного порядка есть специальные структуры данных - например, бинарные деревья (лучше сбалансированные - например, RB или AVL), очереди по приоритетам или кучи (Heap). Они позволяют выполнить операции вставки за O(LogN) времени, в то время как массив или список требует O(N) времени (у массива - на сдвиг, у списка - на поиск).


 
MBo ©   (2007-04-11 06:24) [5]

Пардон, антитезу забыл дописать
>Если сразу добавлять M, сравнимое с N, то проще просто добавить, затем пересортировать.

Если же M заметно меньше N, то можно отдельно отсортировать эти новые элементы и выполнить слияние сортированных массивов  - время O(MLogM +(M+N))~O(N+M)


 
Думкин ©   (2007-04-11 08:57) [6]

> MBo ©   (11.04.07 06:24) [5]

Сам и ответил на вопрос, который дал в ветке на сообразительность. :(


 
MBo ©   (2007-04-11 09:48) [7]

>Думкин
Ну это я извращенно - сначала ответил, потом спросил ;)
А ты сюда не читай, ты туда только читай :)) //  © Джент. удачи


 
Riply ©   (2007-04-11 09:52) [8]

Спасибо !
P.S. А про какую ветку идет речь ?


 
MBo ©   (2007-04-11 11:56) [9]

>А про какую ветку идет речь ?
http://delphimaster.net/view/15-1176199472/



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.062 c
2-1176025604
kate_1
2007-04-08 13:46
2007.04.29
помогите составить программу в Delphi6


2-1175834208
Alex8
2007-04-06 08:36
2007.04.29
Пропажа записей


15-1175605808
infom
2007-04-03 17:10
2007.04.29
Шрифт кода в программировании


5-1152615242
NewMan
2006-07-11 14:54
2007.04.29
Создание Компонена на основе TCustomControl


6-1162409754
Amt2001
2006-11-01 22:35
2007.04.29
Типы Indy 10





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский