Re: cpp и математика
От: MasterZiv СССР  
Дата: 07.08.16 21:02
Оценка:
Здравствуйте, ferz1, Вы писали:

F>Допустим прихожу я устраиваться на с++ разработчика, какой должен быть минимальный уровень знания математики? каких разделов и где та линия после которой меня примут?


Если работа не связана с какими-то специальными математическими методами и моделями -- ноль.
Re[3]: cpp и математика
От: MasterZiv СССР  
Дата: 07.08.16 21:04
Оценка:
Здравствуйте, ferz1, Вы писали:

F>еще вопрос, зачем питон срр программисту?


Скрипты писать, конечно ....
На Python (сложные) на bash простые.
Re[2]: cpp и математика
От: rg45 СССР  
Дата: 08.08.16 06:13
Оценка: +2
Здравствуйте, rm822, Вы писали:

R>Я иногда спрашиваю во сколько раз сортировка 1млн элементов медленнее 100к элементов, и выгоняю тех кто не может посчитать двоичный логарифм от 10 или считает его по основанию e


А вот здесь я не понял. Исходя из оптимальной сложности сортировки O(n * log(n)), ответом будет 10 * log(1M) / log(100K). Мы вольны выбирать здесь любое удобное основание для логарифмирования, потому как отношение логарифмов не зависит от их основания и при любом основании будет одинаковым. И самым удобным в данном случае является не 2, и не e, а 10: 10 * 6 / 5 = 12. Поясни, пожалуйста, почему ты считаешь, что основание должно быть именно 2 и зачем вообще здесь нужно считать логарифм от десяти?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 08.08.2016 6:26 rg45 . Предыдущая версия . Еще …
Отредактировано 08.08.2016 6:24 rg45 . Предыдущая версия .
Re[3]: cpp и математика
От: Evgeny.Panasyuk Россия  
Дата: 08.08.16 07:35
Оценка:
Здравствуйте, rg45, Вы писали:

R>>Я иногда спрашиваю во сколько раз сортировка 1млн элементов медленнее 100к элементов, и выгоняю тех кто не может посчитать двоичный логарифм от 10 или считает его по основанию e

R>А вот здесь я не понял. Исходя из оптимальной сложности сортировки O(n * log(n)), ответом будет 10 * log(1M) / log(100K). Мы вольны выбирать здесь любое удобное основание для логарифмирования, потому как отношение логарифмов не зависит от их основания и при любом основании будет одинаковым. И самым удобным в данном случае является не 2, и не e, а 10: 10 * 6 / 5 = 12. Поясни, пожалуйста, почему ты считаешь, что основание должно быть именно 2 и зачем вообще здесь нужно считать логарифм от десяти?

Во-первых вычислительная сложность выражается не только асимптотическими оценками, но и например точным/абсолютным ограничением на количество операций. Например std::partition_point делает не более log2(N)+2 сравнений. Ограничения на std::stable_sort также выражены через двоичный логарифм в абсолютном виде.
(при этом количество каких-то из операций необязательно прямо пропорционально затраченному времени на реальном железе, поэтому строго говоря нужно делать соответствующие оговорки)

Во-вторых асимптотическая сложность Θ не даёт ответа на вопрос "во сколько раз медленнее N=100k vs N=1M" в прямом смысле, а лишь классификацию по классам эквивалентности.
Отредактировано 08.08.2016 7:40 Evgeny.Panasyuk . Предыдущая версия .
Re[4]: cpp и математика
От: rg45 СССР  
Дата: 08.08.16 07:50
Оценка: +1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Во-первых вычислительная сложность выражается не только асимптотическими оценками, но и например точным/абсолютным ограничением на количество операций. Например std::partition_point делает не более log2(N)+2 сравнений. Ограничения на std::stable_sort также выражены через двоичный логарифм в абсолютном виде.

EP>(при этом количество каких-то из операций необязательно прямо пропорционально затраченному времени на реальном железе, поэтому строго говоря нужно делать соответствующие оговорки)
EP>Во-вторых асимптотическая сложность Θ не даёт ответа на вопрос "во сколько раз медленнее N=100k vs N=1M" в прямом смысле, а лишь классификацию по классам эквивалентности.

Даже при этих уточнения остаются без ответов вопросы: зачем нужен логарифм десяти, и почему непременно по основанию два.
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: cpp и математика
От: Evgeny.Panasyuk Россия  
Дата: 08.08.16 08:26
Оценка:
Здравствуйте, rg45, Вы писали:

R>Даже при этих уточнения остаются без ответов вопросы: зачем нужен логарифм десяти, и почему непременно по основанию два.


Да, согласен — не нужно ни то, ни другое. Подозреваю что логарифм десяти взялся из попытки разложить логарифм произведения, на сумму логарифмов.
Re[3]: cpp и математика
От: _hum_ Беларусь  
Дата: 08.08.16 09:05
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, rm822, Вы писали:


R>>Я иногда спрашиваю во сколько раз сортировка 1млн элементов медленнее 100к элементов, и выгоняю тех кто не может посчитать двоичный логарифм от 10 или считает его по основанию e


R>А вот здесь я не понял. Исходя из оптимальной сложности сортировки O(n * log(n)), ответом будет 10 * log(1M) / log(100K). Мы вольны выбирать здесь любое удобное основание для логарифмирования, потому как отношение логарифмов не зависит от их основания и при любом основании будет одинаковым. И самым удобным в данном случае является не 2, и не e, а 10: 10 * 6 / 5 = 12. Поясни, пожалуйста, почему ты считаешь, что основание должно быть именно 2 и зачем вообще здесь нужно считать логарифм от десяти?


скорее всего он под 100K имел в виду 100 тысяч и из-за употребления "K" у него мысль немного мигрировала в сторону двоичной арифметики, смешав в кучу десятичный логарифм с двоичным (наверное, он хотел сказать "выгоняю тех кто не может посчитать десятичный логарифм от 10 или считает его [ логарифм в формуле максимального времени ] по основанию e")
Re[8]: cpp и математика
От: B0FEE664  
Дата: 08.08.16 12:12
Оценка:
Здравствуйте, LaptevVV, Вы писали:

BFE>>>>Единственное, что приходит на ум, это граф переходов конечного автомата.

EP>>>А как же например вездесущие деревья?
BFE>>Деревья — это частный случай, который намного проще.
LVV>Не. Зависит от графа и дерева...
LVV>В-деревья, АВЛ-деревья — покруче некоторых графов будут...
Не могу согласиться. Деревья принципиально проще графов. Достаточно посмотреть на количество открытых проблем с ними связанных, чтобы это подметить.
И каждый день — без права на ошибку...
Re[10]: cpp и математика
От: B0FEE664  
Дата: 08.08.16 12:35
Оценка:
Здравствуйте, Erop, Вы писали:

BFE>>Давайте конкретно: какие математические свойства и какие из алгоритмов для графов вы используете в коде.

E>Ну, A*, например, часто использую...
И что это означает?

BFE>>Когда я говорю про графы, я не говорю про деревья.

E>Если пользоваться общепринятой терминологией, понимать коллег будет проще...
Если дерево называть графом, то проблемы в понимании будут.

EP>>>Это смотря как посмотреть. Список может иметь цикл, а дерево — нет

BFE>>Что-то я не припомню, чтобы я когда-то использовал список с циклом внутри... Наличие цикла внутри списка свидетельствует об ошибке, так что в тестовых целях я поиск цикла в списке писал, но назвать это работой с графом...
E>std::list когда-нибудь юзал?..
да.

BFE>>И вы хотите сказать, что где-то в коде, в явном виде хранится этот граф переходов?

E>А что такое "в явном виде"?
Это когда хранятся и используются все переходы графа.

E>Ну и ты же алгоритмы просил?

да.
E>Как найти длину цикла генератора?
Мне на практике такая задача никогда не встречалась, но я сомневаюсь, что для её решения надо строить граф переходов в памяти компьютера.

BFE>>Ну и где там граф? Там нельзя получить граф, как структуру. Нельзя запустить поиск по графу, если я правильно понимаю.

E>Таки std::vector<std::vector<int> > g, где g[i] — массив индексов соседних с i-й вершин -- одно из популярных ЯВНЫХ представлений графов
Я в курсе. Но если из всего внешнего массива доступен только один элемент, то это не граф.
И каждый день — без права на ошибку...
Re[11]: cpp и математика
От: Erop Россия  
Дата: 08.08.16 12:54
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

E>>Ну, A*, например, часто использую...

BFE>И что это означает?
Гуглофу на нуле что ли?

BFE>Если дерево называть графом, то проблемы в понимании будут.

А если лес, например? А если в дереве склеивать совпадающие подветки? Это будет дерево или ациклический направленный граф?

E>>std::list когда-нибудь юзал?..

BFE>да.
AFAIK, одна из популярных реализаций базируется на зацикленном списке нод...

BFE>Это когда хранятся и используются все переходы графа.

А что значит "хранятся"? Если есть функция, которая по id ноды может вернуть id следующей ноды, это в явном виде? Если таки да, то чем ГПСЧ не "явный граф"?
Чем списки соседей в соц. сети не явное представление графа?

BFE>Мне на практике такая задача никогда не встречалась, но я сомневаюсь, что для её решения надо строить граф переходов в памяти компьютера.

А для поиска цикла в списке, нужно?

BFE> Я в курсе. Но если из всего внешнего массива доступен только один элемент, то это не граф.

Это ты о чём?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: cpp и математика
От: B0FEE664  
Дата: 08.08.16 13:44
Оценка:
Здравствуйте, Erop, Вы писали:

E>>>Ну, A*, например, часто использую...

BFE>>И что это означает?
E>Гуглофу на нуле что ли?
А область применения?
А то я однажды решал задачу прокладки пути от A к B с обходом препятствий и оказалось, что графы там не нужны.

BFE>>Если дерево называть графом, то проблемы в понимании будут.

E>А если лес, например? А если в дереве склеивать совпадающие подветки? Это будет дерево или ациклический направленный граф?
Это будет два объекта: дерево и список.

E>>>std::list когда-нибудь юзал?..

BFE>>да.
E>AFAIK, одна из популярных реализаций базируется на зацикленном списке нод...
Интересно. Где можно глянуть?

BFE>>Это когда хранятся и используются все переходы графа.

E>А что значит "хранятся"? Если есть функция, которая по id ноды может вернуть id следующей ноды, это в явном виде? Если таки да, то чем ГПСЧ не "явный граф"?
Конечно это не граф.
Вы наверное и вот здесь:
int f(int n)
{
    return (n + 1) % 5;
}

граф увидите.

E>Чем списки соседей в соц. сети не явное представление графа?

Вот когда список всех пользователей соц. сети лежит в базе данных, то можно сказать, что в базе данных лежит граф в явном виде. Но если в ничего с этим графом не делаете, то вам от этого ни жарко, ни холодно. Для того, чтобы его можно было рассматривать как граф, нужно чтобы к нему применялись спец алгоритмы применимые к графу. Evgeny.Panasyuk нашел один такой алгоритм, который, наверное, применяется в LinkedIn — поиск знакомого, через знакомого. Вы знаете ещё такие же задачи?

BFE>>Мне на практике такая задача никогда не встречалась, но я сомневаюсь, что для её решения надо строить граф переходов в памяти компьютера.

E>А для поиска цикла в списке, нужно?
Нет, конечно.

BFE>> Я в курсе. Но если из всего внешнего массива доступен только один элемент, то это не граф.

E>Это ты о чём?
Это я о списке друзей из соц сети.
объект std::vector<std::vector<int> > является графом только тогда, когда к нему применяются алгоритмы применимые к графу.
И каждый день — без права на ошибку...
Re[13]: cpp и математика
От: Erop Россия  
Дата: 08.08.16 15:02
Оценка: 10 (1) +1
Здравствуйте, B0FEE664, Вы писали:

E>>Гуглофу на нуле что ли?

BFE>А область применения?
Поиск путей в графе

BFE>А то я однажды решал задачу прокладки пути от A к B с обходом препятствий и оказалось, что графы там не нужны.

Бывает. Я, обычно, ищу пути в довольно абстрактных графах. Хотя, иногда, и в графах вполне графической природы. Например, в графе линейного деления...

E>>А если лес, например? А если в дереве склеивать совпадающие подветки? Это будет дерево или ациклический направленный граф?

BFE>Это будет два объекта: дерево и список.
Что? Ациклический граф, полученный склеиванием одинаковых веток деревьев?

BFE>Интересно. Где можно глянуть?

Начни с реализации stl в твоём компиляторе
На самом деле, зачем хранить ДВЕ ноды — терминатора, когда можно хранить ОДНУ? То, что возвращает end -- поле list, элемент двусвязного циклического списка. Его next -- это begin списка. Сверху этого всего декоратор, для rbegin и т. д...

BFE>
BFE>int f(int n)
BFE>{
BFE>    return (n + 1) % 5;
BFE>}
BFE>

BFE>граф увидите.


Ну, да. Это можно интерпретировать, как граф. Например, если рассматривать любые целые n...

E>>Чем списки соседей в соц. сети не явное представление графа?

BFE>Вот когда список всех пользователей соц. сети лежит в базе данных, то можно сказать, что в базе данных лежит граф в явном виде. Но если в ничего с этим графом не делаете, то вам от этого ни жарко, ни холодно. Для того, чтобы его можно было рассматривать как граф, нужно чтобы к нему применялись спец алгоритмы применимые к графу. Evgeny.Panasyuk нашел один такой алгоритм, который, наверное, применяется в LinkedIn — поиск знакомого, через знакомого. Вы знаете ещё такие же задачи?

Поиск людей, к которым ведёт много коротких путей, что бы предложить их добавить в своих друзей.
Анализ структуры графа, что бы выявлять накрутки и т. д...

E>>А для поиска цикла в списке, нужно?

BFE>Нет, конечно.
Ну так список с циклом это же таки граф?
Почему поиск цикла в таком списке -- это алгоритм на графе, а поиск цикла в ГПСЧ -- нет? Алгоритм-то тот же?

BFE>объект std::vector<std::vector<int> > является графом только тогда, когда к нему применяются алгоритмы применимые к графу.

И?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: cpp и математика
От: rm822 Россия  
Дата: 08.08.16 15:34
Оценка: :)
Ни зачем, считай как хочешь лишь бы правильно было, задача на устный счет и адекватность, прнимаются ответы и "чуть больше десяти" и любой конкретный от 12 до 15
Почти все адекватные по привычке работают с 2-чным степенным рядом
Неадекватные
* не могут связать вопрос с n log n
* не знают что такое логарифм
* умерли на подсчетах взяв его по основанию е
Re[14]: cpp и математика
От: B0FEE664  
Дата: 08.08.16 16:37
Оценка:
Здравствуйте, Erop, Вы писали:

E>Поиск путей в графе

Это понятно, что поиск пути. А в какой задаче его искать-то потребовалось?

BFE>>А то я однажды решал задачу прокладки пути от A к B с обходом препятствий и оказалось, что графы там не нужны.

E>Бывает. Я, обычно, ищу пути в довольно абстрактных графах. Хотя, иногда, и в графах вполне графической природы. Например, в графе линейного деления...
Ну а я как-то обхожусь без этого.

E>>>А если лес, например? А если в дереве склеивать совпадающие подветки? Это будет дерево или ациклический направленный граф?

BFE>>Это будет два объекта: дерево и список.
E>Что? Ациклический граф, полученный склеиванием одинаковых веток деревьев?
Значит я не понял, что значит склеивать.

BFE>>Интересно. Где можно глянуть?

E>Начни с реализации stl в твоём компиляторе
E>На самом деле, зачем хранить ДВЕ ноды — терминатора, когда можно хранить ОДНУ? То, что возвращает end -- поле list, элемент двусвязного циклического списка. Его next -- это begin списка. Сверху этого всего декоратор, для rbegin и т. д...
О звёзды! Это что? В списке всегда хранится один лишний элемент с аллоцированной памятью под пользовательские данные? Какой кошмар...
Похоже, что авторы, таки, реализовали эту абсурдную идею с графом из одной вершины.
Нет, ну я не могу отвечать за это извращение. Мало ли, что там под капот засунули...

BFE>>
BFE>>int f(int n)
BFE>>{
BFE>>    return (n + 1) % 5;
BFE>>}
BFE>>

BFE>>граф увидите.
E>Ну, да. Это можно интерпретировать, как граф. Например, если рассматривать любые целые n...
А можно и не рассматривать...

E>Поиск людей, к которым ведёт много коротких путей, что бы предложить их добавить в своих друзей.

Ok. Принимается.
E>Анализ структуры графа, что бы выявлять накрутки и т. д...
Не, анализ — это не то...
Анализ — это не для пользователей, а для аналитиков. Аналитики любят красивые картинки...

E>>>А для поиска цикла в списке, нужно?

BFE>>Нет, конечно.
E>Ну так список с циклом это же таки граф?
Да, список с циклом, это, таки, граф. А что?

E>Почему поиск цикла в таком списке -- это алгоритм на графе, а поиск цикла в ГПСЧ -- нет? Алгоритм-то тот же?

Потому, что список существует как структура и к ней применяется алгоритм. А при поиске цикла в ГПСЧ нам сама структура не нужна, насколько я понимаю.

BFE>>объект std::vector<std::vector<int> > является графом только тогда, когда к нему применяются алгоритмы применимые к графу.

E>И?
И они крайне редко нужны на практике.
И каждый день — без права на ошибку...
Re[15]: cpp и математика
От: Evgeny.Panasyuk Россия  
Дата: 08.08.16 17:12
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>>>Интересно. Где можно глянуть?

E>>Начни с реализации stl в твоём компиляторе
E>>На самом деле, зачем хранить ДВЕ ноды — терминатора, когда можно хранить ОДНУ? То, что возвращает end -- поле list, элемент двусвязного циклического списка. Его next -- это begin списка. Сверху этого всего декоратор, для rbegin и т. д...
BFE>О звёзды! Это что? В списке всегда хранится один лишний элемент с аллоцированной памятью под пользовательские данные? Какой кошмар...

Нет, необязательно. У end'а может быть другой тип (базовый), не включающий память под пользовательские данные.

E>>Почему поиск цикла в таком списке -- это алгоритм на графе, а поиск цикла в ГПСЧ -- нет? Алгоритм-то тот же?

BFE>Потому, что список существует как структура и к ней применяется алгоритм. А при поиске цикла в ГПСЧ нам сама структура не нужна, насколько я понимаю.

Алгоритм тот же самый, который как раз обходит структуру. А тот же самый он потому, что структура (в общепринятом математическом смысле) в обоих случаях одинаковая.
А вот выражены ли связи в коде явно как указатели, или же задаются функцией перехода — на применимость алгоритма не влияют
Re[16]: cpp и математика
От: B0FEE664  
Дата: 08.08.16 17:48
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

E>>>На самом деле, зачем хранить ДВЕ ноды — терминатора, когда можно хранить ОДНУ? То, что возвращает end -- поле list, элемент двусвязного циклического списка. Его next -- это begin списка. Сверху этого всего декоратор, для rbegin и т. д...

BFE>>О звёзды! Это что? В списке всегда хранится один лишний элемент с аллоцированной памятью под пользовательские данные? Какой кошмар...
EP>Нет, необязательно. У end'а может быть другой тип (базовый), не включающий память под пользовательские данные.
Может, но в исходниках именно так. А почему вообще нельзя обойтись без этой ноды?

E>>>Почему поиск цикла в таком списке -- это алгоритм на графе, а поиск цикла в ГПСЧ -- нет? Алгоритм-то тот же?

BFE>>Потому, что список существует как структура и к ней применяется алгоритм. А при поиске цикла в ГПСЧ нам сама структура не нужна, насколько я понимаю.
EP>Алгоритм тот же самый, который как раз обходит структуру. А тот же самый он потому, что структура (в общепринятом математическом смысле) в обоих случаях одинаковая.
EP>А вот выражены ли связи в коде явно как указатели, или же задаются функцией перехода — на применимость алгоритма не влияют

В теории — да, не влияют, а вот на практике зависит от задачи.
В тех же соц. сетях, например, граф друзей сейчас и через секунду — это два разных графа.
И каждый день — без права на ошибку...
Re[14]: cpp и математика
От: B0FEE664  
Дата: 08.08.16 18:18
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

BFE>>>>Иначе это уже не список.

EP>>>Почему? Например кольцевой список
BFE>>Например потому, что std::find к нему применить прямо не получится.
EP>Это не "не список", а "не диапазон по определению STL". Но речи о том что это будет диапазоном STL — не было.
Хорошо, согласен. Кольцевой буфер я использовал на практике, кольцевой список — никогда.

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

Ассоциативность явно применяется во многих рекурсивных алгоритмах вида:
f(a,b,c...)
{
  return a + f(b,c...);
}



EP>Мои основные тезисы:

EP>- обозначенные знания не являются жёстким требованием ко всем программистам. Да, без них получится создавать реальный код, решающий некоторые реальные задачи, и получать за это реальное вознаграждение.
EP>- для тех кто хочет стать хорошим программистом — эти знания обязательны.
EP>- даже если допустить что эти знания являются балластом и на практике не нужны — они всё равно проверяются на некоторых реальных собеседованиях, что немаловажно.

Согласен. Но не понятно, почему выбраны именно эти знания.

EP>- программирование по большей части это математическая активность — так как происходит оперирование абстрактными объектами, идеями и структурами. Более того — это строгая (rigour) математическая активность, так как нет возможности пропустить "очевидные" этапы и шаги — нужно закодировать всё — от самых низших уровней до высших. ЕМНИП, подобный тезис был у Александра Степанова. С этой позиции заявления вида "программистам математика не нужна" нелепы.


Не соглашусь. В математике легко можно пропустить те или иные действия (по ошибке), в отличии от программирования.
И каждый день — без права на ошибку...
Re[17]: cpp и математика
От: Evgeny.Panasyuk Россия  
Дата: 08.08.16 18:39
Оценка:
Здравствуйте, B0FEE664, Вы писали:

E>>>>На самом деле, зачем хранить ДВЕ ноды — терминатора, когда можно хранить ОДНУ? То, что возвращает end -- поле list, элемент двусвязного циклического списка. Его next -- это begin списка. Сверху этого всего декоратор, для rbegin и т. д...

BFE>>>О звёзды! Это что? В списке всегда хранится один лишний элемент с аллоцированной памятью под пользовательские данные? Какой кошмар...
EP>>Нет, необязательно. У end'а может быть другой тип (базовый), не включающий память под пользовательские данные.
BFE>Может, но в исходниках именно так.

Я посмотрел в исходниках libstdc++ — насколько я распарсил, там именно так — последний узел имеет только два указателя, без места под данные.
В других реализациях может быть по-другому.

BFE>А почему вообще нельзя обойтись без этой ноды?


Ты имеешь в виду использовать вместо неё nullptr? Не получится — список двусвязный, мы можем взять std::prev от .end(). Можно конечно попробовать без дополнительного узла, но будет сложнее, а главное медленнее.

Да и проблемы в дополнительной ноде нет никакой — она хранится по значению в std::list, и содержит только два указателя которые нужны в любом случае.
То есть схематически там следующая структура данных:
template<typename T, ...>
class list
{
    struct base_node
    {
        base_node *prev, *next;
    };

    struct value_node : base_node
    {
        T value;
    };
    
    base_node end_node;
    
    ...
};


Из этого кстати вытекает что итератор .end() у такого списка инвалидируется при swap'е и т.п., что не запрещено стандартном:

no swap() function invalidates any references, pointers, or iterators referring to the elements of the containers being swapped. [ Note: The end() iterator does not refer to any element, so it may be invalidated. —end note ]

Отредактировано 09.08.2016 5:56 Evgeny.Panasyuk . Предыдущая версия .
Re[17]: cpp и математика
От: Evgeny.Panasyuk Россия  
Дата: 08.08.16 18:50
Оценка:
Здравствуйте, B0FEE664, Вы писали:

E>>>>Почему поиск цикла в таком списке -- это алгоритм на графе, а поиск цикла в ГПСЧ -- нет? Алгоритм-то тот же?

BFE>>>Потому, что список существует как структура и к ней применяется алгоритм. А при поиске цикла в ГПСЧ нам сама структура не нужна, насколько я понимаю.
EP>>Алгоритм тот же самый, который как раз обходит структуру. А тот же самый он потому, что структура (в общепринятом математическом смысле) в обоих случаях одинаковая.
EP>>А вот выражены ли связи в коде явно как указатели, или же задаются функцией перехода — на применимость алгоритма не влияют
BFE>В теории — да, не влияют, а вот на практике зависит от задачи.
BFE>В тех же соц. сетях, например, граф друзей сейчас и через секунду — это два разных графа.

Не вдаваясь в конкретные детали сказанного, то о чём ты говоришь — это переход к другой математической структуре, в которой возможно не выполняются изначальные математические требования.

Например если у тебя есть нечто похожее на группу, но например не имеющее обратного элемента каждому, то применять алгоритмы для групп и использовать теоремы/свойства групп естественно некорректно.
Но из этого не следует ни бесполезность теории групп, ни математики в целом. У тебя в этом случае другая математическая структура, например моноид, и ты можешь использовать алгоритмы и математические свойства для моноидов. Либо например можешь выделить группу из этой структуры, по аналогии с GLn(R) — и уже работать с этой группой.

Также и с графами — если у тебя например не один граф, а целое множество графов соответствующее предыдущим состояниям во времени — то и используй соответствующий мат.аппарат
Отредактировано 08.08.2016 18:57 Evgeny.Panasyuk . Предыдущая версия .
Re[15]: cpp и математика
От: Evgeny.Panasyuk Россия  
Дата: 08.08.16 19:30
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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

BFE>Ассоциативность явно применяется во многих рекурсивных алгоритмах вида:
BFE>
BFE>f(a,b,c...)
BFE>{
BFE>  return a + f(b,c...);
BFE>}
BFE>

BFE>

Это не применение ассоциативности, а как раз наоборот — использование жёсткого порядка, а конкретно правая свёртка а-ля foldr.

Применение ассоциативности это например быстрый алгоритм возведения в натуральную степень, который как раз работает за счёт "перестановки скобок"
https://www.sgi.com/tech/stl/power.html
И даже там, ассоциативность непосредственно в коде явно никак не выражена, только в имени типа и в документации. Там нигде нету выражения (x*y)*z == x*(y*z), тем не менее это математическое свойство используются неявно.

EP>>Мои основные тезисы:

EP>>- обозначенные знания не являются жёстким требованием ко всем программистам. Да, без них получится создавать реальный код, решающий некоторые реальные задачи, и получать за это реальное вознаграждение.
EP>>- для тех кто хочет стать хорошим программистом — эти знания обязательны.
EP>>- даже если допустить что эти знания являются балластом и на практике не нужны — они всё равно проверяются на некоторых реальных собеседованиях, что немаловажно.
BFE>Согласен. Но не понятно, почему выбраны именно эти знания.

Видимо потому что это общие знания, которые широкоприменимы и широкоизвестны.

EP>>- программирование по большей части это математическая активность — так как происходит оперирование абстрактными объектами, идеями и структурами. Более того — это строгая (rigour) математическая активность, так как нет возможности пропустить "очевидные" этапы и шаги — нужно закодировать всё — от самых низших уровней до высших. ЕМНИП, подобный тезис был у Александра Степанова. С этой позиции заявления вида "программистам математика не нужна" нелепы.

BFE>Не соглашусь. В математике легко можно пропустить те или иные действия (по ошибке), в отличии от программирования.

Так я же и говорю что программирование как математическая активность более строгая нежели другие распространённые варианты — именно потому что нельзя ничего пропустить и отдать на откуп интуиции, нужно всё закодировать начиная с самого низкого уровня.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.