Главная страница
    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.48 MB
Время: 0.042 c
2-1176275300
jeen
2007-04-11 11:08
2007.04.29
Как распечатать содержимое фрейма ?


2-1176295220
I-New
2007-04-11 16:40
2007.04.29
Динамическая загрузка картинок в Timage


2-1176053929
Baffi
2007-04-08 21:38
2007.04.29
отчет в Excel


9-1148749074
Зм1й
2006-05-27 20:57
2007.04.29
Венера


2-1176330215
proger007
2007-04-12 02:23
2007.04.29
Табуляция в ListBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский