Comments 120
Лучше методом Монте-Карло:-)
И причем, даже если попытаться приложить ММК сюда, точность метода будет настолько «высока», что эта функция ни одного теста нормально не пройдет) Проще сразу с помощью генератора случайных чисел индекс выбирать)
Проводилось ли Code Review?
Зачем проводить Code Review для сотрировки методом пузырька? И так сойдёт!
Обычно, дальше спрашивают почему не следует его использовать. :)
У этого чувака, похоже, не спрашивали ни того ни другого. Сам отличился.
Раз такое спрашивают — значит в компании так и кодят :-)
А если серьёзно, то для малых массивов пузырёк может оказаться быстрее, за счёт своей простоты. Но для поиска максимум, конечно, никакой пузырёк не нужен.
Вроде бы у quicksort не такая большая константа, чтобы скорость пузырька была заметно больше даже на очень маленьких массивах. Или я ошибаюсь?
Даже если оно всего в 3 раза медленнее по константе (а там ведь рекурсия, так что, думаю, больше разница), все-равно n log n от n^2 при маленьких n почти не отличается. Так 3 n log n > n^2 при n < 10.
https://www.wolframalpha.com/input/?i=3*x*log(x),+x%5E2,+x+from+0+to+10
Вот если в пять раз то разница действительно есть.
https://www.wolframalpha.com/input/?i=5*x*log(x),+x%5E2,+x+from+0+to+10
P.S. В целом, мне еще не нравится подход что код для сортировки написан с нуля и нет какой-нибудь отдельной функции вроде sort_little_array которая использовалась бы повсеместно, раз есть задача сортировать маленькие массивы.
Нет, я прав. Логарифм-то надо двоичный использовать:
https://www.wolframalpha.com/input/?i=3*x*log(x)%2Flog(2),+x%5E2,+x+from+0+to+10
EDIT:
Если десетичный, то там и будет в константе разница все 10 раз.
Сначала не так написал, потом, подумав, исправил.
Х =!(A & B & C) // по де Моргану это !A | !B | !C
P = X | A | B = !C
Q = X | A | C = !B
R = X | B | C = !A
смета: 1 инвертор, 1 тройной «и» (или два двойных), 5 двойных «или» либо 3 двойных и один тройной…
Собственно, по этому принципу можно одним инвертором сколько угодно сигналов инвертировать, надо полагать…
Как проинвертировать три сигнала двумя инверторами
How to invert three signals with only two NOT gates
"- Расскажите несколько слов о методе сортировки пузылька?
— О, хорошо что вы спросили! На прошлом месте я именно так и делал большинство задач. Вот у вас какой телефон? Андроид? Отлично, значит, у вас в руках пример того, как эффективно я решал задачи этим методом!"
И ведь впечатлит он этой речью!
Как известно любому, кто знаком с алгоритмами сортировки, сортировка пузырьком — алгоритм учебный, и в промышленном коде обычно не применяющийся в силу своей неэффективностиНеверно. Для маленьких массивов она более эффективна — вот если нужно сортировать миллион массивов по 10-100 элементов, то пузырёк — прекрасный кандидат. Более того, если производительность не стоит во краю угла, а библиотечная сортировка недоступна по той или иной причине (например, для кода микроконтроллера), то пузырьковая или линейная сортировки будут отличным выбором.
И даже если массив мал — все равно не нужно. Для этих случаем есть другие алгоритмы, столь же простые, но все же более эффективные (вставки, сортировка выбором, етц).
Более эффективные с точностью до константы? :) Ага, а особенно, вставкой.
С другой стороны, если бы этот перец вместо пузырька использовал сортировку выбором то, возможно, догадался бы выкинуть внешний цикл и максимум получил бы естественным образом :).
Вставки действительно не самый удачный пример, если речь идет про сплошной массив (это скорее метод для списков). А вот выбором отличный метод — очень понятный, естественный и совершенно точно быстрее пузыря.
Как раз insertion sort самый быстрый для небольших массивов. В большинстве серьёзных алгоритмов сортировки в конце рекурсии переключаются именно на него. Быстрее только сортирующие сети.
На массивах из трёх элементов? Или на четырёх ещё тоже? ;)
Там проще развернуть циклы любой простой сортировки и выкинуть лишнее. Получится примерно одно и тоже. Полагаю, оптимизатор так и делает иногда :).
Примерно до 15-20 элементов. Смотреть например тут.
Там проще развернуть циклы любой простой сортировки и выкинуть лишнее
Первое просто, а вот второе совсем нетривиально. Компилятору это не под силу. Даже ученым-людям сети сортировки (опримальный результат выкидывания лишнего) размеров порядка 20-30 стали известны совсем недавно.
Не понимаю акцента не пузырьке. O() у него может и не очень, зато константы хорошие. Проблема ведь не в методе сортировки, а в самой сортировке.
Да. Надо было отсортировать максимумом, а потом взять первый элемент.
Зато все такое же огромное количество сравнений.
На практике не занимался сравнением производительности сортировок в вырожденных случаях, но Сэджвик пишет, что пузырёк решает на почти упорядоченных входах. Склонен ему верить.
На практике не занимался сравнением производительности сортировок в вырожденных случаях, но Сэджвик пишет, что пузырёк решает на почти упорядоченных входах.Это если пузырёк нормально написать. В данном случае всё сделано максимально криво и сложность работы всегда такая же, как в «максимально вырожденном случае».
double absmax(double *x, int n)
{
if (n<1) {
CDBG("%s: Zero array x length.\n", __func__);
return -1;
}
double xmax=ABS(x[0]);
for(j = 1; j < n; j++) if (ABS(x[j]) > xmax) xmax = ABS(x[j]);
return xmax;
}
он распознать не смог с листа
ему давали в детстве мало
Кнута
Кроме того в коде происходит выделение памяти 2 раза (т.е. это можно использовать для проверки)
Может быть для целей спецслужб нужно хранить x но для целей прохода проверок это не нужно
Так возникает массив в памяти абсолютных величин.
Возможно изначально в коде было все немного иначе, но в результате упрощений…
for(i = 0; i < n; i++) {
for(j = 0; j <n-1; j++) {
И не важно, что возможно весь массив был уже давно отсортирован, циклы пройдут до конца =)) До полной наихудшей сложности пузырка. Всегда.
Если абстрагироваться от идиотского решения и рассмотреть функции беспристрастно то можно еще попридираться.
Например после сортивки вместо того чтобы вытащить первый элемент отсортированного массива ( в котором лежит нужное число ( абсолютная величина ) — берется индекс, а уже по индексу берется оригинальный элемент и к нему снова применятся отбрасывание знака.
То есть вместо
bubblesort(y, n, l);
index = l[0];
free(l);
free(y);
return ABS(x[index]);
можно было бы сделать
bubblesort(y, n, l);
ret = y[0];
free(l);
free(y);
return ret;
Функция absmax() возврщает double == -1 для сообщения об ошибке. Мне вот лично не нравится использовать значения не целочисленных типов для таких целей.
Кстати, есть прекрасные алгоритмы сортировки — отсортировать только M элементов из N.
Да, я не против сортировки ради поиска максимума, если код не пишется руками, а просто комбинация библиотечных функций. И нет особых требований к производительности.
Но неужели там не было просто max?
var max = items.Sort().Last();
var max = items.Max();
items.OrderBy(_ => _).Reverse().First()
(Sarcasm mode on, если что :) )
И плевать на условия и причины создания обсуждаемого участка кода…
Ведь у нас всегда куча времени на создания элегантных решений и на создания нескольких элементарных функций дается неделя, а на исправления логик и т.п. — месяц, и нет более важных задач нежели елозиться с мелочами =)
А если серьезно, только что посмотрел, самый дешевый смартфон (около $35) с процом 1.3ГГц, 512МБ озу… смартфоны среднего ценового диапазона — в два раза выше параметрами… с головой достаточно выполнять подобные операции…
почитал остальной код в репозитарии… там вообще особо не заморачиваются делать оптимально со стороны потребления ЦПУ\ОЗУ, видимо оно им и не нужно… похоже то что написано — делает свою работу…
… а может начальник дурак… нам не известны причины такого подхода :)
А вот в приведенном примере возмущают, собственно, два факта:
1. Применение явно наихудшего возможного решения: O(n^2) супротив O(n) при сопоставимых константах.
2. ВременнАя стоимость реализации этого решения примерно равна стоимости реализации любого другого варианта. Тут не требуется никакого исследования, никаких разработок собственных сложных алгоритмов и т.п.
Если бы поленился, то сделал бы в один проход. Тут скорее наоборот слишком много свободного времени у не самого опытного программиста.
Знаете, как в анекдоте про математиков — как вскипятить чайник? Если чайник пустой, налить в него воды, включить плиту и т.д. А если чаник полный? Тогда вылить воду и тем самым задача сводится к уже известной, решение которой приведено выше.
Вот только вопрос не в элегантности решения — сортировка для получения максимального не нужна в принципе
lValue по типу сишной логической переменной или вроде того.
if (lValue == 1) lTmp = True
else if (lValue ==0) lTmp = False
else че-то там;
if lTmp.ToString.ToUpper == «TRUE» return True else return False;
Copyright © 2013 Qualcomm Technologies, Inc. All Rights Reserved.Это теперь новая мода такая, заливать на Хабр проприетарный код, да еще и вырезая копирайты?
Qualcomm Technologies Proprietary and Confidential.
Хоть под спойлер бы убрали…
Статью просмотрели уже примерно 10 тыс человек, потом какая-то часть из них пойдет писать код для своих, или, что хуже, чужих opensource-проектов, создавая совершенно ненужные риски их владельцам. What has been seen cannot be unseen.
или, что хуже, чужих opensource-проектов, создавая совершенно ненужные риски их владельцам. What has been seen cannot be unseen.
Если они скопипастят код прямо с хабра, да еще такой, то поделом.
Зачем вам весь код, <...> Вы взяли кусок,Это не кусок, это и есть весь код по ссылке. За исключением копирайта.
особенно мусорные шапкиDura lex, sed lex. Какими «мусорными» бы законы не были, их надо соблюдать.
Это не кусок, это и есть весь код по ссылке. За исключением копирайта.
Потому что он — ненужный для статьи мусор. Это частный случай, когда модуль короток и весь — чистый шик и блеск. Было бы это 10 строк из 1000 — было бы то же самое.
Dura lex, sed lex. Какими «мусорными» бы законы не были, их надо соблюдать.
Автор статьи не приписал себе авторство и оставил ссылку на оригинал. Все корректно.
Автор статьи не приписал себе авторство и оставил ссылку на оригинал. Все корректно.
Qualcomm Technologies Proprietary and Confidential.Вы сейчас серьезно? Тем более, что автор не оставил ссылку на оригинал.
Dura lex, sed lex. Какими «мусорными» бы законы не были, их надо соблюдать.Дык, эта:
Допускается без согласия автора или иного правообладателя и без выплаты вознаграждения, но с обязательным указанием имени автора, произведение которого используется, и источника заимствования: цитирование в оригинале и в переводе в научных, полемических, критических или информационных целях правомерно обнародованных произведений в объеме, оправданном целью цитирования, включая воспроизведение отрывков из газетных и журнальных статей в форме обзоров печатиГде вы несоблюдение законов нашли? Хотите сказать этот под был прочитирирован не в «критических целях»?
Допускается без согласия автора или иного правообладателя и без выплаты вознаграждения, но с обязательным указанием имени автора, произведение которого используется, и источника заимствования: цитирование в оригинале и в переводе в научных, полемических, критических или информационных целях правомерно обнародованных произведений в объеме, оправданном целью цитирования, включая воспроизведение отрывков из газетных и журнальных статей в форме обзоров печатиА потом то, что написал правообладатель, и что MacIn выше назвал «мусором»:
Copyright © 2013 Qualcomm Technologies, Inc. All Rights Reserved.
Qualcomm Technologies Proprietary and Confidential.
А потом то, что написал правообладатель, и что MacIn выше назвал «мусором»:
Для статьи вида «смотрите какой странный код попадается» это действительно мусор. Здесь обсуждается алгоритм и его некорректное применение. Авторство кода автор хабрастатьи не оспорил, вы загоняетесь и передергиваете. Если вас смущает распространение кода, помеченного как proprietary и confidential, то тогда непонятна претензия по поводу отсутствия этой пометки в статье: что, от того что вставят p&c, пропадет распространение confidential кода? Тут уж точно противоречие — вы определитесь с тем, что именно вас смущает.
Авторство кода автор хабрастатьи не оспорил, вы загоняетесь и передергиваете.И я не оспариваю того, что он не оспорил. Я только отмечаю в дополнение к вышесказанному, что согласно законам РФ (и большинства других стран) этот код тут просто не имеет права находиться. Ни в виде цитаты, ни в какой-либо другой форме. Но это так, на заметку желающим выше процитировать мне гражданский кодекс.
Я только отмечаю в дополнение к вышесказанному, что согласно законам РФ (и большинства других стран) этот код тут просто не имеет права находиться.Проблема только в том, что вы не приводите никаких разумных обоснований к этому тезису.
нужно ли ему читать чужой проприетарный код, ставя под вопрос лицензионную чистоту своих собственных программ.Чтение чужого проприетарного кода не может «ставить под вопрос» чистоту чего-бы-то-ни-было.
Копирование чужого проприетарного кода может быть проблемой — но равно для этого и вводится норма, которая требует чтобы цитата обязательно сопровождалась указанием авторства и была отделена от остального текста. Ссылок на оригинал при этом не требуется.
Проблема только в том, что вы не приводите никаких разумных обоснований к этому тезису.Обоснование — четвертая часть ГК (если мы обсуждаем РФ). Вы привели в контр-пример статью о цитировании, но она тут не действует. В коде написано, что он является собственностью «Qualcomm Technologies», и что это часть ее закрытого проекта. Без разницы, предпринимала компания попытки удалить его, или нет.
Чтение чужого проприетарного кода не может «ставить под вопрос» чистоту чего-бы-то-ни-было.Не хочу себя деанонимизировать, но если в общих чертах, то именно по этой причине меня забанили в одном очень крупном OpenSource-проекте. Само по себе чтение чужих исходников нарушением закона не является, верно, но это создает повод для одной очень крупной корпорации подать в суд на разработчиков, и у «одного крупного OpenSource-проекта» нет ни денег, ни желания в этих делах участвовать. Поэтому поверьте, я из своего личного опыта знаю, о чем говорю.
Чтобы у вас не возникло сомнений в адекватности разработчиков, проект действительно крупный. И вы даже наверняка им хотя бы раз в жизни пользовались. А может, даже пользуетесь постоянно.
В коде написано, что он является собственностью «Qualcomm Technologies»,Это, извините, ничего не доказывает. На YouTube — тоже полно материалов с пометками о чьём-то авторстве, однако же подавляющее большинство материала размещено там без нарушения чьих-либо прав и именно это и постулирует закон (американский): вы можете пытаться использовать какие-то подобные метки, чтобы, по косвенным признакам, пытаться «угадать» что-то, но по американскому закону этого не требуется. Пока нет заявления от правообладателя — размещение на площадке провайдера информации считается правомерным.
и что это часть ее закрытого проекта.Эта часть — вообще к авторскому праву отношения не имеет, как я уже сказал — это вообще о коммерческой тайне и судить за нарушение тут можно вообще только работников Quallcomm'а и тех, кто имел доступ к этому тексту до того, как оно перестало быть тайной.
Чтобы у вас не возникло сомнений в адекватности разработчиков, проект действительно крупный. И вы даже наверняка им хотя бы раз в жизни пользовались. А может, даже пользуетесь постоянно.Охотно верю — но внутренние правила какого-либо проекта, независимо от его размера, не могут быть заменой закону. Я, по той же причине, например, не могу читать и использовать некоторые документы, которые вообще размещены публично на публичных сайтах — тоже из соображений что наши конкуренты могут использовать это как повод… но это же не значит что теперь всему миру туда смотреть нельзя!
На YouTube — тоже полно материалов с пометками о чьём-то авторствеВерно, а сразу под ними название лицензии, под которой оно размещено. И написано там обычно что-то вроде «Стандартная лицензия YouTube», а не «Proprietary and Confidential».
Пока нет заявления от правообладателя — размещение на площадке провайдера информации считается правомерным.Насколько я понимаю, речь там идет о другом. Если вы владелец GitHub, и некая редиска залила к вам исходники Windows 10, то вы как бы не при делах, пока Microsoft не обратится к вам с требованием это безобразие удалить. Но это не значит, что эти исходники там какое-то время размещены легально, и вы можете цитировать их «посмотрите, какие в MS говнокодеры».
Эта часть — вообще к авторскому праву отношения не имеет, как я уже сказал — это вообще о коммерческой тайнеЭто в частности о том, что это не открытый OpenSource-проект. В примере с Windows выше, ее исходники уже утекали в сеть, и на GitHub их наверняка тоже кто-нибудь заливал. Но это не значит, что Windows вдруг стала открытым проектом. Более того, Micorosoft через суд добилась удаления кода с большинства сайтов. И ее совершенно не волновало, что вы там цитировали, что вы там знали/не знали, что там у кого утекало и т. д.
Я, по той же причине, например, не могу читать и использовать некоторые документы, которые вообще размещены публично на публичных сайтахЗамечательно, тогда я не понимаю, почему мы до сих пор спорим. Как бы вы отнеслись к тому, что некий HotMusicWater залил бы на Хабр эти документы, удалив при этом надпись «Совершенно секретно», мотивируя это тем, что все и так всем доступно, а надпись все-равно потеряла свою актуальность в связи с утечкой? Напомню, мой самый первый комментарий в этой ветке был:
Это теперь новая мода такая, заливать на Хабр проприетарный код, да еще и вырезая копирайты?
Хоть под спойлер бы убрали…
Но это не значит, что эти исходники там какое-то время размещены легально, и вы можете цитировать их «посмотрите, какие в MS говнокодеры».
Почему не значит? Можете рассказать об ответственности за цитирование исходников не прошедших процедуру публичного обнародования? Не публикации, а именно цитирования.
Это в частности о том, что это не открытый OpenSource-проект.
Для того, чтобы быть опубликованным (втч совершенно легально) проекту не обязательно быть открытым опенсорсным.
Как бы вы отнеслись к тому, что некий HotMusicWater залил бы на Хабр эти документы, удалив при этом надпись «Совершенно секретно», мотивируя это тем, что все и так всем доступно, а надпись все-равно потеряла свою актуальность в связи с утечкой?
Вы, возможно, не поверите, но вы можете цитировать документы с викиликс. Если мне не изменяет память, на хабре периодически появляются такие статьи.
В сфере публикаций действуют несколько иные правила и законы, нежели в сфере корпоративного патентного права. Давайте я вас ещё больше шокирую — таким образом совершенно легально иногда можно обойти ограничения на распространение закрытых технологий — почитайте любопытную историю PGP и Циммермана.
да еще и вырезая копирайты?
Вы так этими копирайтами озабочены, как будто из наличие-отсутствие что-то меняет. Вы не можете использовать гнутые, например, исходники, вырезав копирайт, но при чём здесь цитирование в статье?
Замечательно, тогда я не понимаю, почему мы до сих пор спорим.Потому что вы пытаетесь внутренние правила некоего проекта превратить, каким-то образом, в закон. Так это не работает.
Как бы вы отнеслись к тому, что некий HotMusicWater залил бы на Хабр эти документы, удалив при этом надпись «Совершенно секретно», мотивируя это тем, что все и так всем доступно, а надпись все-равно потеряла свою актуальность в связи с утечкой?Если бы не было указано авторство? Плохо отнёсся бы — так же как и закон. Если авторство было бы указано и там была бы только цитата? Скорее всего не стал бы читать соответствующую статью, только и всего.
Напомню, мой самый первый комментарий в этой ветке был:Именно. И ответ, с которым вы ну никак не можете примириться, таков: нет — это не новая мода, это — нормальное поведение.
Это теперь новая мода такая, заливать на Хабр проприетарный код, да еще и вырезая копирайты?
Хоть под спойлер бы убрали…
Но это не значит, что эти исходники там какое-то время размещены легально, и вы можете цитировать их «посмотрите, какие в MS говнокодеры».Значит. Посмотрите сюда. Что мы тут видим? Кусок совершенно секретного документа. И не просто какого-то там «исходного кода», на который ярлык «confidential & proprietary» навесили «для перестраховки», а документа секретной службы, которая, ну при всём желании, не может быть интерпретирована как «open-source project». И что? А ничего: это цитата с целью критики — а потому ничего с этим сделать нельзя. И даже на секретность ссылаться нельзя, так как документ «утёк» на WikiLeaks и, соответственно, никаких секретов больше содержать не может…
Почему вдруг Хабр должен быть «святее папы римского»?
Фраза «Proprietary and Confidential» — это вообще отсылка к коммерческой тайне, а эта защита, в отличие от авторского права, перестаёт действовать если соответствующий документ «утёк», никакого отношения к авторскому право она не имеет вообще.
Если оно лежит на GitHub'е и правообладатель не озаботился его отзывом, то по умолчанию считается, что оно там расположено правомерно.Ух ты, может, у вас еще и ссылочка на закон имеется? Пойду тогда скачивать WRK. И пофиг, что Microsoft запрещает — не удалили за год, значит, правомерно.
перестаёт действовать если соответствующий документ «утёк»Никакая утечка не отменяет того, что произведение могло быть выложено в нарушение авторских прав.
Ух ты, может, у вас еще и ссылочка на закон имеется?Разумеется.
Пойду тогда скачивать WRK.Я бы не советовал.
И пофиг, что Microsoft запрещает — не удалили за год, значит, правомерно.Размещение на github'е — правомерно, пока правообладатель не заявил об обратном. А вот создание своих, личных, копий (а не цитат «в целях критики») — таки требует лицензии.
Разумеется.Вы точно ту ссылку скопировали? У меня по ней открывается статья о DMCA на Википедии. И там нет ни слова о том, что если компания не успела обнаружить нелегальный репозиторий на Github, то он автоматически становится легальным. Да, возможно, пользователя, клонировавшего себе репозиторий, и не заметившего «мусор» в комментариях (либо «мусор» был вырезан тем, кто разместил код), признают пострадавшим и не станут привлекать к ответственности, но это не значит, что репозиторий был легальным. Он им не был, поскольку правообладатель не давал своего согласия на его размещение там.
Я бы не советовал.Я и не собирался. К счастью, у меня есть своя голова на плечах, чтобы не верить всему, что пишут в Интернетах.
И там нет ни слова о том, что если компания не успела обнаружить нелегальный репозиторий на Github, то он автоматически становится легальным.А там этого нет — и быть не может. Вы, почему-то, рассматриваете GitHub только как набор Git-репозиториев. А это, кроме всего прочего, ещё и web-сайт, который позволяет вам публиковать текстовые материалы. И как любая площадка он защищён заявкой 512. Её недостаточно для того, чтобы дать вам права на использование кода как, собственно, кода — но достаточно для того, чтобы текст программ, размещённый непосредственно на GitHub'е — мог считаться правомочно там размещённым.
И этой, ограниченной и урезанной, роли GitHub'а — достаточно для того, чтобы из правомерно опубликованных на нём материалов можно было дёргать цитаты «с целью критики».
Он им не был, поскольку правообладатель не давал своего согласия на его размещение там.Это можно выяснить только пост-фактум. До заявления правообладателя размещение считается законным. Принцип тот же, что и с публикацией комментариев на Хабрахабре: пока нет какого-либо заявления считается, что всё что мы тут понаписали — опубликовано законно и, соответственно, Хабрахабр имеет право наши каракули показывать всему миру не испрашивая у нас с вами письменного разрешения.
Так а в чем вина кодера?
В том, что он идиот?
Это менеджерский состав толжен быть покаран.
За то, что взяли на работу идиота? Вполне возможно.
Наверняка времени на просто подумать даже не дали.
Вы это знаете или просто придумали? И, простите, как вы думаете, сколько времени ему дали? 38 секунд? Полторы минуты? Как вы себе это представляете? "чтобы через полторы минуты был написан код поиска максимального элемента!" И рядом стоит менеджер с секундомером и линейкой, чтобы бить по рукам при выходе за "дедлайн", ага. Ну, что за бред.
Может это сказка про ASAP?
Да не даёт Богатырю победить Зло лютое одно клятое слово «ASAP». Сколько-то златых монет семье надо ASAP, постоянно. Дабы заработала машина чёртова супостатная, что царь Менеджер требует — ASAP, постоянно. Всю силушку богатырскую ASAP вытягивает, конца да края не видать…
Сказку ту мы пока продолжаем писать, да правнукам, коли сами себя не погубим, будет что рассказать.
Попробуйте отсортировать по дате ~1000 файлов в диалоговом окне проводника Windows 7.
Сортировка пузырьком в коде Qualcomm