реклама на сайте
подробности

 
 
14 страниц V  « < 7 8 9 10 11 > »   
Reply to this topicStart new topic
> Кризис в самообразовании.
Guest_TSerg_*
сообщение Apr 5 2017, 13:53
Сообщение #121





Guests






Цитата(dxp @ Apr 5 2017, 06:20) *
Ну, так в варианте в посте №106 именно этот финт и использован. И тоже только для положительных целых.

Разумеется, просто здесь без лямбд.
А так, да - Ваш на первой полочке, хотя и с ограничением на диапазон.

Вот без ограничений на знак:
Код
const
  m=-MaxInt-1;

for i:=0 to Length(Arr)-1 do Arr[i]:=(Arr[i] xor m) shr 1 xor -(Arr[i] and 1 xor 1);
Sort(Arr);
for i:=0 to Length(Arr)-1 do Arr[i]:=(Arr[i] shl 1 xor m) xor -(Arr[i] shr 31) xor 1;
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 5 2017, 14:08
Сообщение #122


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Два раза бегать по массиву - это чемпион? w00t.gif
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Apr 5 2017, 14:31
Сообщение #123





Guests






Цитата(ViKo @ Apr 5 2017, 17:08) *
Два раза бегать по массиву - это чемпион? w00t.gif

Где сказано, что это "чемпион"?
Да и два раза пробежаться - это линейная сложность.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 5 2017, 14:40
Сообщение #124


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Два раза бегать или сортировать только натуральные числа - такая альтернатива?
Два раза бегать - это два раза. Сегодня в обед испытал удовольствие, забыл кошелек, обнаружил уже у кассы. К черту такую линейную сложность.
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Apr 5 2017, 14:47
Сообщение #125





Guests






Цитата(ViKo @ Apr 5 2017, 17:40) *
Два раза бегать или сортировать только натуральные числа - такая альтернатива?
Два раза бегать - это два раза. Сегодня в обед испытал удовольствие, забыл кошелек, обнаружил уже у кассы. К черту такую линейную сложность.

Вам хочется поспорить ни о чем? Предоставляю это увлекательное занятие в форме Вашего же само-диалога.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 5 2017, 15:57
Сообщение #126


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Здесь не о чем спорить. Констатация факта в форме вопроса.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 6 2017, 04:17
Сообщение #127


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (TSerg @ Apr 5 2017, 20:53) *
Разумеется, просто здесь без лямбд.

Да тут не в лямбдах дело. Лямбда - это просто способ внедрить тело функции в выражение. Предыдущий пример без лямбды:
CODE
def get_key():
    return (1, -1*x) if x & 0x1 else (0, x)

rnd.sort(key=get_key(), reverse=True)


QUOTE (TSerg @ Apr 5 2017, 20:53) *
А так, да - Ваш на первой полочке, хотя и с ограничением на диапазон.

Предыдущий пример (120-й пост и этот выше) без ограничений на диапазон.

QUOTE (ViKo @ Apr 5 2017, 21:08) *
Два раза бегать по массиву - это чемпион? w00t.gif

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2017, 05:10
Сообщение #128


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(dxp @ Apr 6 2017, 07:17) *
А сколько проходов по массиву совершается внутри функции сортировки? Или вы полагаете, что внутри sort() оно за один проход сортирует? И вообще, каков вес (в смысле затрат) прохода по массиву - сиречь, работа с памятью, - на фоне операций сортировки?

Логично, что того, кто пробежал дополнительный круг, вряд ли назовут чемпионом. Вот последнее ваше решение вполне может претендовать. Наряду с подобными на других языках - функция метода сравнения + сама библиотечная функция сортировки. Правда, ничего восхитительного в этом нет. Казуальное решение, оно и есть лучшее.
Количество проходов от функции сортировки зависит. Будем считать, используется быстрая. Сколько надо, столько и есть. Проход по массиву с инвертированием членов, удовлетворяющих условию, думаю, соизмерим с проходом со сравнением пары и обменом местами.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 6 2017, 07:43
Сообщение #129


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (ViKo @ Apr 6 2017, 12:10) *
Логично, что того, кто пробежал дополнительный круг, вряд ли назовут чемпионом.

Сперва надо определить, что есть "дополнительный круг". Если предварительная подготовка данных упрощает дальнейшую обработку так, что там в разы всё легче и быстрее, это как раз "сокращение дистанции", а не "дополнительный круг".

Вы судите по виду исходного кода, но тут просто такие средства языка, который является низкоуровневым. На питоне это выглядит компактно и стройно, но по скорости может оказаться заметно хуже, хотя в данном случае вряд ли, т.к. функция сортировка написана на Си, а вычисление ключа делается не путём эн-кратного вызова функции, а путём прогона данных через функцию, что в целом даст результат, похожий на явный проход по циклу в низкоуровневом языке вроде Си.

QUOTE (ViKo @ Apr 6 2017, 12:10) *
Вот последнее ваше решение вполне может претендовать. Наряду с подобными на других языках - функция метода сравнения + сама библиотечная функция сортировки.

Так у TSerg по сути используется тот же метод. В моём примере выполняется подготовка ключей - массив элементов, каждый из которых связан с целевым сортируемым элементом, а затем собственно сортировка целевых элементов на основе значений ключей. У TSerg делается принципиально то же самое: сначала он готовит ключи, модифицируя элементы массива так, чтобы они могли выполнять роль ключей, затем сортировка по этим ключам. Ну, и финально вернуть значения элементов массива в исходному виду. Стандартные способы тут ничем не вырвутся вперёд.

QUOTE (ViKo @ Apr 6 2017, 12:10) *
Проход по массиву с инвертированием членов, удовлетворяющих условию, думаю, соизмерим с проходом со сравнением пары и обменом местами.

Проход со сравнением пары и перестановкой местами - это что, "пузыёк"? "Пузырёк" - один из самых медленных (хотя и один из самых простых и незатратных) способов сортировки. Там совершается почти столько проходов по массиву, сколько в массиве элементов. На этом фоне лишний проход по массиву ничего не портит.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2017, 07:49
Сообщение #130


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Нет, не "пузырек". Многие функции сортировки работают с парой элементов одинаково - сравнивают и, если нужно, переставляют местами. В том числе и быстрая сортировка.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 6 2017, 08:37
Сообщение #131


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (ViKo @ Apr 6 2017, 14:49) *
Нет, не "пузырек". Многие функции сортировки работают с парой элементов одинаково - сравнивают и, если нужно, переставляют местами. В том числе и быстрая сортировка.

quicksort (который Хоара), насколько мне известно, сравнивает с опорным элементом, а переставляет пару, в которую опорный не входит. Но это не важно. Там всё равно суммарно получается эн проходов по массиву, где эн зависит логарифмически от количества элементов. Да, гораздо лучше "пузырька", особенно, когда элементов много. Один лишний проход снаружи сортировки погоды не портит.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 6 2017, 09:54
Сообщение #132


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(dxp @ Apr 6 2017, 11:37) *
quicksort (который Хоара), насколько мне известно, сравнивает с опорным элементом, а переставляет пару, в которую опорный не входит. Но это не важно. Там всё равно суммарно получается эн проходов по массиву, где эн зависит логарифмически от количества элементов. Да, гораздо лучше "пузырька", особенно, когда элементов много.

В сообщении 105 алгоритм быстрой сортировки показан. Пусть не так работает с парой, это, действительно не существенно.
Цитата
Один лишний проход снаружи сортировки погоды не портит.

Вообще-то, даже два: один до сортировки, один после. А можно без них, внутри функции сортировки все выполнить. Экономия очевидна.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 6 2017, 10:52
Сообщение #133


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (ViKo @ Apr 6 2017, 16:54) *
Вообще-то, даже два: один до сортировки, один после. А можно без них, внутри функции сортировки все выполнить. Экономия очевидна.

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
@Ark
сообщение Apr 6 2017, 11:58
Сообщение #134


Знающий
****

Группа: Участник
Сообщений: 688
Регистрация: 13-05-16
Пользователь №: 91 710



Цитата(dxp @ Apr 6 2017, 13:52) *
Вообще-то, тут не просто сортировка, а сортировка с дополнительным условием (чёт-нечет), и это тоже надо как-то учитывать. Т.е. это выливается в некие дополнительные действия, и не факт, что они будут менее затратными, нежели один доп. проход по массиву.

Это все издержки ЯВУ. sm.gif На любом асме эта проблема ничего не стоит. Просто считаем младший бит числа самым старшим и все.
Можете, чисто для удобства, "крутануть" циклически весь регистр вправо, перед сравнением...
Чет будет в начале, нечет - в конце отсортированного списка. Если нужен обратный порядок - инвертируем бит перед сравнением.
P.S. По-моему, основной вопрос для любого языка - кому должно быть "удобно": программисту или процессору? sm.gif

Go to the top of the page
 
+Quote Post
Gruffly
сообщение Apr 6 2017, 21:50
Сообщение #135


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 6-04-17
Пользователь №: 96 386



Весело тут у Вас sm.gif
Кто-то считает, что линейный пробег по массиву сравним по быстродействию с любой сортировкой, даже самой быстрой?
Таки я его разочарую.
Берем алгоритм из поста #121.
Делаем точные замеры ( на PC, Win7, Delphi 7, размерность времени в мкс) и что видим?
Ой!
- prepare и post - линейная пробежка по массиву;
- sort - сортировка массива методом QuickSort, можно еще Radix-сортировку применить, но не принципиально что-то изменится.

Прикрепленное изображение
Прикрепленное изображение


Сообщение отредактировал Gruffly - Apr 6 2017, 21:52
Go to the top of the page
 
+Quote Post

14 страниц V  « < 7 8 9 10 11 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016