Есть вопрос по поводу второго абзаца: от какого момента отсчитываем сотни тысяч лет?
Если от момента большого взрыва, то за это время разве что успели сконденсироваться первые атомы. Образование звезд — это уже миллионы лет от большого взрыва.
Во-первых забудем про предельные величины, бесконечности и все связанное с ними, т.е. будем рассматривать деление с чисто алгебраической точки зрения.
В алгебре, деление определяется через обратный элемент. Т.е. условно: если есть действительное число a, то обратным к нему элементом будет A, такой что a * A = A * a = 1. Тогда деление b / a, это просто умножение на обратный элемент b * A. Но если a = 0, то такого Aпросто не существует, т.е. операция деления на 0 не определена.
Теперь, откуда там берется эта самая бесконечность. Тут вмешивается математический анализ со своими предельными величинами, и у людей в голове бывает все путается. Но суть в том, что даже тут деление на 0 все так же неопределено, а все эти бесконечности получаются при взаимодействии предельных величин.
Например:
1) Если у нас есть частное c = 1/x и x -> 0, то чем ближе x к нулю, тем больше c, и понятно, что с будет все возрастать и возрастать с приближением x к нулю, т.е. c будет бесконечно большой величиной. Тут-то и появляется эта самая ∞.
2) Пусть теперь имеем с = (1/2 * x) / (2*x), x -> 0. Тут, 1/2 * x стремится к 0, при x -> 0; 2*x тоже стремится к 0, при x -> 0, и вроде бы у нас получается неопределенность 0/0. Но это не так, фактически мы имеем тут отношение двух бесконечно малых величин (в пределе равных нулю), но эти бесконечно малые, что называется, одного порядка малости и lim_{x -> 0} (1/2*x)/(2*x) = 1/4,
т.е. данная неопределенность раскрылась в обычное конечное действительное число.
3) Пусть теперь с = x^2/(2*x), x -> 0. Тут, как и в пункте 2) имеет место неопределенность 0/0, однако отличие в том, что x^2 стремится к нулю гораздо быстрее, чем 2*x, т.е. это величина большего порядка малости, и lim_{x -> 0} x^2/(2*x) = 0,
т.е. в данном случае 0/0 у нас, грубо говоря, равен 0.
Но все это только с точки зрения предельных величин — частное от деления на обычный 0, как было, так и остается неопределенным.
P.S. Прощу прощения у профессионалов, возможно читающих данный комментарий, за не совсем идеологически верные примеры и серьезное упрощение — сложно в таком объеме строго прояснить данный вопрос.
Прямо всегда-всегда? ^_^ А 0/0 — что получится? Или ∞/0?
Вообще деление на 0 — не такая однозначная процедура, и по сути является абстракцией при работе с бесконечно малыми, как собственно и ∞.
Но мой комментарий не про математику, а про то, что пушку еще нужно разогнать до скорости света, и вообще говоря масса ее при этом будет равна той самой ∞, а для этого нужно ∞ количество энергии, как справедливо заметил камрад в комментарии выше.
Или, если брать Ваш пример кода, то нужно сделать следующие небольшие изменения:
for (int i=1;i<n;i++)
for (int j=0;j<i;j++)
if (to_sort[ref[j]] > to_sort[ref[j+1]])
swap(ref[j],ref[j+1);
В чем суть: это небольшое изменение снизит количество сравнений с n*(n-1) до n*(n-1)/2, при этом оставив сортировку корректной. Насколько я знаю, это лучшая возможная реализация сортировки пузырьком.
О корректности:
К концу первой итерации внешнего цикла максимальный элемент будет находится в конце массива. Потому, на второй итерации, когда мы будем гнать «второй сверху» элемент на предпоследнее место в массиве, нам нет смысла сравнивать его с последним, потому что тот, заведомо больше. Отсюда и условие j < i.
Не совсем понятно, что автор имеет в виду, говоря, что после преобразования Фурье каждый бит информации касательно временных данных будет потерян. «Не будет в прямой доступности» — да, но потерян? Обратное преобразование Фурье еще никто не отменял.
А можете указать конкретный юзкейс? У меня просто с этим проблем не возникало.
Да установка любого нативного гема, часто превращается в кошмар, тот же json, например, или therubyracer, который вообще не собрать под виндой. В принципе, сборка чего либо по Windows, мне видится гораздо менее тривиальной задачей, чем сборка под Linux.
Без обид, но это конечно уж совсем какой-то не корректный вывод, не подкреплённый ничем. Вообще это тема для отдельного спора. Разумеется, когда мы говорим о рельсах и рубях — имеем ввиду GNU/Linux окружение, что называется, by default. Но есть множество людей, которые пишут и деплоят приложения на винде и у них проблем не возникает абсолютно. И я в их числе.
Успешность использования того или иного инструмента зависит во многом от задач, которые Вы решаете с его помощью. Если мне нужен Sidekiq для своего проекта, я не рискну связываться с Windows. Мой комментарий, что для Ruby\Rails разработки лучше использовать Linux означал, что при прочих равных возникнет гораздо меньше проблем связанных с настройкой рабочего окружения и функционированием отдельных его компонент при использовании Linux, а не Windows. Т.е. все, что я могу сделать в Windows я могу сделать и в Linux и скорее всего это будет даже проще, но не все, что я могу сделать в Linux, я могу сделать в Windows. Default, он, знаете ли, не просто так default.
Я понимаю, что пост нацелен на то, чтобы помочь поднять рельсы людям, которые не рискнули немного поднапрячься и погуглить или заглянуть в pick axe. И возможно это дело благое, все-таки все по разному обучаются, и не мне судить. Но упрощая, не создавайте дополнительный хаос высказываниями вроде
"@" означает, что переменная будет передана в шаблон.
не стоит забывать, что мы все-таки не на рельсах программируем, а на руби.
Ну, на винде, к слову гораздо меньше проблем с тем, чтобы поднять рельсы — railsinstaller.org/; на все про все пару кликов.
Вот когда у Вас возникнуть проблемы на винде, так это когда Вам нужно будет собирать гемы — процесс до того временами тяжкий, что даже сильного мужчину заставит плакать.
В общем, лучше не использовать винду для разработки на руби и для работы с рельсами.
Если от момента большого взрыва, то за это время разве что успели сконденсироваться первые атомы. Образование звезд — это уже миллионы лет от большого взрыва.
А попу Jennifer Selter Вы не трогайте, она для науки.
CapsLock
была для меня неприятной неожиданностью.Во-первых забудем про предельные величины, бесконечности и все связанное с ними, т.е. будем рассматривать деление с чисто алгебраической точки зрения.
В алгебре, деление определяется через обратный элемент. Т.е. условно: если есть действительное число a, то обратным к нему элементом будет
A
, такой чтоa * A = A * a = 1
. Тогда делениеb / a
, это просто умножение на обратный элементb * A
. Но еслиa = 0
, то такогоA
просто не существует, т.е. операция деления на 0 не определена.Теперь, откуда там берется эта самая бесконечность. Тут вмешивается математический анализ со своими предельными величинами, и у людей в голове бывает все путается. Но суть в том, что даже тут деление на 0 все так же неопределено, а все эти бесконечности получаются при взаимодействии предельных величин.
Например:
1) Если у нас есть частное
c = 1/x
иx -> 0
, то чем ближеx
к нулю, тем большеc
, и понятно, что с будет все возрастать и возрастать с приближением x к нулю, т.е. c будет бесконечно большой величиной. Тут-то и появляется эта самая ∞.2) Пусть теперь имеем
с = (1/2 * x) / (2*x), x -> 0
. Тут,1/2 * x
стремится к 0, приx -> 0
;2*x
тоже стремится к 0, приx -> 0
, и вроде бы у нас получается неопределенность0/0
. Но это не так, фактически мы имеем тут отношение двух бесконечно малых величин (в пределе равных нулю), но эти бесконечно малые, что называется, одного порядка малости иlim_{x -> 0} (1/2*x)/(2*x) = 1/4
,т.е. данная неопределенность раскрылась в обычное конечное действительное число.
3) Пусть теперь
с = x^2/(2*x), x -> 0
. Тут, как и в пункте 2) имеет место неопределенность 0/0, однако отличие в том, чтоx^2
стремится к нулю гораздо быстрее, чем2*x
, т.е. это величина большего порядка малости, иlim_{x -> 0} x^2/(2*x) = 0
,т.е. в данном случае 0/0 у нас, грубо говоря, равен 0.
Но все это только с точки зрения предельных величин — частное от деления на обычный 0, как было, так и остается неопределенным.
P.S. Прощу прощения у профессионалов, возможно читающих данный комментарий, за не совсем идеологически верные примеры и серьезное упрощение — сложно в таком объеме строго прояснить данный вопрос.
Вообще деление на 0 — не такая однозначная процедура, и по сути является абстракцией при работе с бесконечно малыми, как собственно и ∞.
Но мой комментарий не про математику, а про то, что пушку еще нужно разогнать до скорости света, и вообще говоря масса ее при этом будет равна той самой ∞, а для этого нужно ∞ количество энергии, как справедливо заметил камрад в комментарии выше.
j < n-i
, опечаточка вышла.Или, если брать Ваш пример кода, то нужно сделать следующие небольшие изменения:
В чем суть: это небольшое изменение снизит количество сравнений с n*(n-1) до n*(n-1)/2, при этом оставив сортировку корректной. Насколько я знаю, это лучшая возможная реализация сортировки пузырьком.
О корректности:
К концу первой итерации внешнего цикла максимальный элемент будет находится в конце массива. Потому, на второй итерации, когда мы будем гнать «второй сверху» элемент на предпоследнее место в массиве, нам нет смысла сравнивать его с последним, потому что тот, заведомо больше. Отсюда и условие
j < i
.Успешность использования того или иного инструмента зависит во многом от задач, которые Вы решаете с его помощью. Если мне нужен Sidekiq для своего проекта, я не рискну связываться с Windows. Мой комментарий, что для Ruby\Rails разработки лучше использовать Linux означал, что при прочих равных возникнет гораздо меньше проблем связанных с настройкой рабочего окружения и функционированием отдельных его компонент при использовании Linux, а не Windows. Т.е. все, что я могу сделать в Windows я могу сделать и в Linux и скорее всего это будет даже проще, но не все, что я могу сделать в Linux, я могу сделать в Windows. Default, он, знаете ли, не просто так default.
не стоит забывать, что мы все-таки не на рельсах программируем, а на руби.
Вот когда у Вас возникнуть проблемы на винде, так это когда Вам нужно будет собирать гемы — процесс до того временами тяжкий, что даже сильного мужчину заставит плакать.
В общем, лучше не использовать винду для разработки на руби и для работы с рельсами.