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

Вниз

Иерархоческая сортировка   Найти похожие ветки 

 
Seleznew   (2009-09-18 07:56) [0]

Доброго времени суток, мастера!

Вопрос по сортировке.
Есть массив в котом содержатся значения  вида:
12
13
121
123
22
27
221
1211

нужно отсортировать этот массив так, чтобы последовательность стала такой:

12
121
1211
123
13
22
221
27

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


 
Seleznew   (2009-09-18 07:58) [1]

извините ошибся в названии темы:
Иерархическая сортировка


 
MBo ©   (2009-09-18 08:13) [2]

Лексикографическое упорядочение - проще всего сортировать строковые представления.


 
Seleznew   (2009-09-18 08:39) [3]

Спасибо! А не подскажите, где почитать про реализацию на delphi?


 
MBo ©   (2009-09-18 08:59) [4]

да что там - загнать все числа (переводя в строки) в TStringList и использовать его встроенную сортировку


 
Seleznew   (2009-09-18 09:03) [5]

а в память такой метод не упрется? О_о


 
Сергей М. ©   (2009-09-18 09:08) [6]


> в память такой метод не упрется?


А массив у тебя в память не уперся ?


 
Seleznew   (2009-09-18 09:09) [7]

почти на грани.
только я читал где-то что сорт стринглистовский отжирает много памяти...


 
Сергей М. ©   (2009-09-18 09:18) [8]


> почти на грани


И откуда к тебе такой граненый массив свалился, можно полюбопытствовать ?


> сорт стринглистовский отжирает много памяти


Глупостей ты начитался)


 
MBo ©   (2009-09-18 09:18) [9]

>сорт стринглистовский отжирает много памяти
нет, не отжирает

Только если у тебя сотни миллионов чисел и соответственно строк - то список строк в памяти, конечно, будет больше места занимать, чем числа.
Каковы реальные количества чисел?


 
palva ©   (2009-09-18 09:48) [10]

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


 
Anatoly Podgoretsky ©   (2009-09-18 11:03) [11]


> Для таких массивов сразу хочется реализовать поразрядную
> сортировку.

А это и будет строковая, лексикографическая сортировка, а с числами возможна только двоичная поразрядная.


 
palva ©   (2009-09-18 16:12) [12]

Если хочется, то почему бы не сделать? (Как говорят в среде питерских, пацан сказал - пацан сделал.)
Сортирует она лексикографически, но в коде нет сравнений.
Ну там есть пара сравнений технического характера, но они возникают из-за того, что строки имеют различную длину.

{$APPTYPE CONSOLE}
const
 arsize = 7;
 numrazr = 3;
type
 TArr = array [0..arsize-1] of string;
var
 ar: TArr = ("12","13","124","123","28","27","121");
 artemp: array [Boolean] of TArr;
 arnum: array["/".."9"] of Integer;
 b, nb: Boolean;
 c: Char;
 r, i: integer;
begin
 b := False;
 artemp[b] := ar;
 for r:=numrazr downto 1 do begin
   // Подсчет
   for c:="/" to "9" do arnum[c]:=0;
   for i:=0 to arsize-1 do begin
     if r <= Length(artemp[b][i]) then c:=artemp[b][i][r]
     else c:="/";
     Inc(arnum[c]);
   end;
   for c:="0" to "9" do arnum[c]:=arnum[c]+arnum[Pred(c)];
   for c:="9" downto "0" do arnum[c]:=arnum[Pred(c)];
   arnum["/"] := 0;
   // Перенос
   nb := not b;
   for i:=0 to arsize-1 do begin
     if r <= Length(artemp[b][i]) then c:=artemp[b][i][r]
     else c:="/";
     artemp[nb][arnum[c]] := artemp[b][i];
     Inc(arnum[c]);
   end;
   b := nb;
 end;
 ar := artemp[b];
 for i:=0 to arsize-1 do Write(" ", ar[i]);
 WriteLn;
 readln;
end.


 
palva ©   (2009-09-18 16:23) [13]

На Delphimaster есть статья, посвященная поразрядной сортировке
http://www.delphimaster.ru/articles/dsort/index.html
Но реализация там другая.


 
новый   (2009-09-18 16:31) [14]


> И откуда к тебе такой граненый массив свалился, можно полюбопытствовать
> ?

выгрузка из билинговой системы.


> Каковы реальные количества чисел?

ну соответственно откуда куда может позвонить человек в пределах одного оператора связи.


> Если хочется, то почему бы не сделать?

Спасибо! буду тестить... В принципе за весь день начитался всякого и что-то такое уже крутилось в голове... Только оно не успело оформиться вот в такую законченную форму)) Только я думал при заполнении массива задаться определенной максимальной длинной и дописывать нули в начало строки....


 
новый   (2009-09-18 16:36) [15]

Или я не прав? Сергей это же Вы? прошу прощения что невольно вмешался в дискуссию... Ник Ваш довольно приметен.. решил отблагодорить коллег за Вас :Р


 
Alx2 ©   (2009-09-18 16:41) [16]

>и дописывать нули в начало строки....
Имхо, если в массиве только числа (целые), то не дописывать нули в строку (в которую еще перегонять надо), а перед сравнением дописывать нули слева к меньшему числу, так чтобы разрядность (в десятичной системе) выровнять и затем - сравнивать.

PS
Поразрядную, при заявленном дефиците памяти, подобрать трудно будет - в качестве вспомогательной нужна т.н. сохраняющая порядок сортировка, не требующая O(n) дополнительной памяти. Но если получится - на огромных количествах будет быстрее, конечно, чем quickSort или ее родственники, которые для сортировки используют только сравнения.


 
Alx2 ©   (2009-09-18 16:44) [17]

>а перед сравнением дописывать нули

Или сделать это предварительно, на шаге предобработки, если не жалко данных.


 
Alx2 ©   (2009-09-18 16:45) [18]

Черт. Один опечатки:

>дописывать нули слева
Справа, конечно :)


 
Anatoly Podgoretsky ©   (2009-09-18 16:52) [19]

> Alx2  (18.09.2009 16:45:18)  [18]

И потом решать как и сколько удалять


 
Seleznew   (2009-09-18 16:54) [20]

Прошу прощения за оффтоп...
Но тут имеет место некоторое нарушение этикета.
Товарищ новый! Я бы попросил Вас впредь не следить за моими ветками, а разбираться со своими тараканами! У нас с Вами был уговор: честное выполнение проекта. Кто раньше успеет тому и заказ. Я не знаю каким образом вы прознали про сей достойный форум, но если шпионите, то хотя-бы делали бы это тихо!!! И еще: Уважаемый конкурент!!!! Я бы не стал на Вашем месте трубить на весь интернет про этот проект. Имхо заказчик будет недоволен...

Уважаемая администрация! если этот и предыдущие посты нарушают правила форума, прошу удалить их или закрыть ветку. Еще раз спасибо всем откликнувшимся.


 
palva ©   (2009-09-18 16:54) [21]

Дописывать нули (справа, естественно) чревато следующим: строки
123
1230
123
1230
сохранят свой порядок, тогда как по логике вещей первая и третья строки меньше, чем вторя и четвертая. Хотя возможно, что по смыслу задачи это не принципиально.


 
Seleznew   (2009-09-18 16:59) [22]

palva ©

> Дописывать нули (справа, естественно) чревато следующим...

ну насколько мне известно (хотя это надо будет проверить) одинаковых входных значений быть там не может. точно так же как и нулей.


 
Seleznew   (2009-09-18 17:01) [23]

А нет. нули есть. одинаковых значений нет.


 
Alx2 ©   (2009-09-18 17:08) [24]

>Anatoly Podgoretsky ©   (18.09.09 16:52) [19]

А... Если важно не запороть данные, то нули лепить только на этапе сравнения.
Типа:
if valueExpandedWithZeros(a[k])>valueExpandedWithZeros(a[l]) then ...

palva ©   (18.09.09 16:54) [21]

Точно :( Я не учел, что ноль тоже имеет значение. Тогда ой.


 
palva ©   (2009-09-18 17:11) [25]

Поразрядная сортировка требует два массива дополнительной памяти равновеликие исходному массиву (при усложнении алгоритма можно обойтись одним массивом) и целый массив размера равного мощности одного разряда. Время сортировки линейно зависит от длины массива и от длины ключа. Приведенный мной алгоритм используется как основной рабочий алгоритм для внутренней сортировки в СУБД ADABAS (на IBM 360).


 
palva ©   (2009-09-18 17:15) [26]

У меня строка как бы дополняется символами "/" код которых на единицу меньше чем код символа "0".


 
Seleznew   (2009-09-18 17:35) [27]

я тут катался под столом)
Вы тут типо уже на меня забили все и промеж собой пробавляетесь???


 
palva ©   (2009-09-18 17:38) [28]

А делать-то нечего... работы нет... кризис...


 
Seleznew   (2009-09-18 17:39) [29]

ага


 
Alx2 ©   (2009-09-18 17:44) [30]

>Seleznew   (18.09.09 17:39) [29]

Сорри. Тут довольно часто удовлетворенность автора топика задвигается куда подальше, а вот поднятая тема долго еще торкает :)


 
Seleznew   (2009-09-18 19:18) [31]

ну... я помню... Правда когда мне этот форум помогал осваивать d, тут были совсем другие порядки)))


 
Seleznew   (2009-09-19 08:28) [32]

Может все таки подскажите идею алгоритма с числами без сравнений?


 
palva ©   (2009-09-19 10:05) [33]

А о каком алгоритме речь? У вас же строки, а не числа. Вы хотите предварительно преобразовать в строки, что ли? Если строки состоят только из цифр, то их можно представить в виде чисел. Если каждая строка не слишком велика, скажем, до 9 цифр, то для представления строки подойдет тип Integer. Этот тип можно эффективно сравнивать одной процессорной командой. И зачем тогда алгоритм без сравнений? Кроме того, вы потратите время на преобразование туда и обратно. Будет ли это быстрее, чем просто загрузить массив в StringList и применить Sort - не знаю. Если у вас проблемы с памятью, то полезнее подумать об экономном формате массива. Например, использовать строки для хранения десятичных цифр довольно неэкономно. Простой переход к хранению двух цифр в одном байте уже даст экономию.


 
MBo ©   (2009-09-19 10:22) [34]

размер массива до сих пор не озвучен...


 
Seleznew   (2009-09-19 12:24) [35]


> размер массива до сих пор не озвучен...

65536*(+/-)200-250


> У вас же строки, а не числа

дело в том, что у меня как я выгружу так и будет....
вот функции которые я могу использовать:
.valueAsString
.valueAsInteger
.valueAsReal
.valueAsDouble
.valueAsDWord
.valueAsWord

Ну думаю пояснений не надо...


 
Inovet ©   (2009-09-19 13:57) [36]

> [35] Seleznew   (19.09.09 12:24)
> > У вас же строки, а не числа
>
> дело в том, что у меня как я выгружу так и будет....
>
> Ну думаю пояснений не надо...

Надо. Нафиг там строки, если это числа ещё и целые видимо?


 
Alx2 ©   (2009-09-19 14:38) [37]

Возможные решения:

Время работы O(n*log(n)), затраты памяти O(log(n)) - алгоритмы семейства quickSort

Время работы O(n*log(Max-Min)), затраты памяти O(log(Max-Min)) -
алгоритмы семейства поразрядной сортировки.
Растотчительность на памяти порядка O(n) в radixSort достаточно лего фиксится.

Время работы O(n*log(n)), затраты памяти O(1) -
алгоритмы семейства heapSort

Осталось узнать критерий.
Так как размеры массива оказались и не такие большие, то:
Если элементы массивы сильно разнородные - рекомендую quickSort
Если мало отличаются друг от друга (мала разница максимального и минимального) - то "спецзаточенный" radixSort (соединить идеи quickSort с raidxSort). Кол-во проходов по массиву в нем можно сделать равным количеству разрядов в двоичном представлении разности Max-Min. Память кушать можно не больше, чем в quickSort.


 
Anatoly Podgoretsky ©   (2009-09-19 20:46) [38]

> Inovet  (19.09.2009 13:57:36)  [36]

Да какие там числа, если
только по недоразумению.
Это обычные идетификаторы,
типа номеров счетов или
телефонных номеров, по
природе строки.

 "Inovet" <anvas@fromru.com>
сообщил/сообщила в
новостях следующее:
news:1253246214.36@delphimaster.ru...
 Inovet © (19.09.2009 13:57) [36]
 > [35] Seleznew   (19.09.09 12:24)
 > > У вас же строки, а не
числа
 >
 > дело в том, что у меня как я
выгружу так и будет....
 >
 > Ну думаю пояснений не
надо...

 Надо. Нафиг там строки,
если это числа ещё и целые
видимо?


 
СовестьДМ ©   (2009-09-19 21:03) [39]


> > И откуда к тебе такой граненый массив свалился, можно
> полюбопытствовать > ?выгрузка из билинговой системы.

почему-то жалко провайдера услуг
а впрочем пофиг - сам сэкономил на программистах- сам дураг


 
Inovet ©   (2009-09-19 21:19) [40]

> [38] Anatoly Podgoretsky ©   (19.09.09 20:46)
> > Inovet  (19.09.2009 13:57:36)  [36]
>
> Да какие там числа, если только по недоразумению.
> Это обычные идетификаторы, типа номеров счетов или телефонных номеров, по природе строки.

Вообще-то да, похоже. Только вот функции смущают из

> [35] Seleznew   (19.09.09 12:24)



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

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

Наверх





Память: 0.55 MB
Время: 0.004 c
2-1296738757
Conflict
2011-02-03 16:12
2011.05.08
Диалог выбора папки ShBrowseForFolder с определенной директории


15-1295990985
Юрий
2011-01-26 00:29
2011.05.08
С днем рождения ! 26 января 2011 среда


15-1295518833
UserNet
2011-01-20 13:20
2011.05.08
Объеденить сети


15-1295515030
Knight
2011-01-20 12:17
2011.05.08
RAID1


15-1295641340
Интересующийся
2011-01-21 23:22
2011.05.08
Жаль что у вас нет раздела для сишников





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