Получи случайную криптовалюту за регистрацию!

iksergeyru

Логотип телеграм канала @iksergeyru — iksergeyru I
Логотип телеграм канала @iksergeyru — iksergeyru
Адрес канала: @iksergeyru
Категории: Технологии
Язык: Русский
Количество подписчиков: 5
Описание канала:

IT, игры, алгоритмы, математика, программирование

Рейтинги и Отзывы

3.00

2 отзыва

Оценить канал iksergeyru и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

1

3 звезд

0

2 звезд

1

1 звезд

0


Последние сообщения

2023-01-09 08:47:14 Алгоритмы! Давайте поговорим про эффективность алгоритмов!

Что такое эффективный алгоритм? Быть может тот, который выполняется быстрее всего

Рассмотрим задачу: В массивe из size элементов. Нужно найти максимальную сумму из m подряд идущих элeментов.

Пример 1: size = 10, m = 3,
array = { 4 5 0 [7 4 4] 6 2 6 3 }
max_sum = 15

Пример 2: size = 20, m = 5,
array = { 7 8 4 8 3 4 3 1 [7 7 8 9 9] 0 7 9 8 8 1 5 }
max_sum = 40

Как можно решать?

Первый способ — на мой взгляд, самый неэффективный

Найти все трёхэлементные суммы, затем среди них найти максимальный элемент. То есть

int m = ...
int[] array = ...

int[] sums = new int[size - m + 1];

for (int i = 0; i < size - m; i++)
{
int t = 0;
for (int j = i; j < i + m;j++) t += array[j];
sums[i] = t;
}

int max = sums[0];
for (int i = 0; i < sums1.Length; i++)
{
if (sums[i] > max) max = sums[i];
}

Второй способ — хороший (как может показаться), но на деле не отличающийся от первого по времени, но лучше по используемым ресурсам:
Искать суммы очередных m элементов и сравнивать с ранее найденной суммой


int max = 0;
for (int i = 0; i < size - m; i++)
{
int t = 0;
for (int j = i; j < i + m; j++)
{
t += array[j];
}
if (t > max) max = t;
}


Третий — на мой взгляд, самый хороший:
Найти сумму первых m элементов

int max = 0;
for (int i = 0; i < m; i++) max += array[i];

Затем вычитать из полученной суммы первый элемент, входящий в сумму и добавлять следующий по порядку, сравнивая текущую сумму с ранее найденной:

int temp = max;
for (int i = 1; i < size - m; i++)
{
temp = temp - array[i - 1] + array[i + (m - 1)];
if (temp > max) max = temp;
}

Например, результаты поиска максимальной суммы по времени на каком-то компьютере могут выглядеть так:

для size = 1 000 000 и m = 3
Способ 1: 14 ms
Способ 2: 5 ms
Способ 3: 2 ms

для size = 1 000 000 и m = 5 000
Способ 1: 5 679 ms
Способ 2: 5 696 ms
Способ 3: 2 ms

для size = 1 000 000 и m = 10 000
Способ 1: 11 339 ms
Способ 2: 11 240 ms
Способ 3: 2 ms

для size = 1 000 000 и m = 100 000
Способ 1: 103 155 ms
Способ 2: 103 239 ms
Способ 3: 2 ms

для size = 1 000 000 и m = 250 000
Способ 1: 215 566 ms
Способ 2: 214 921 ms
Способ 3: 2 ms

PS про память не говорил, так как понятно, что первому способу всегда нужно больше всего.

Так что же такое эффективный алгоритм?

Исходник на github

#алгоритмы #csharp
833 views05:47
Открыть/Комментировать
2023-01-01 19:55:40 Испорчен математикой, хотя математику не знаю.

Наконец-то понял (приблизился к пониманию так точно), почему так часто пишут в лекциях "Всё быстро! Ничего не понятно! Ничего не объясняют!"

Пока некоторые заправляют оливье и разогревают котлеты (кстати, мне охлаждённые нравятся больше ), я погрузился в теорию множеств. Вот что заметил: "читаю" книгу, идёт какое-то рассуждение или доказательство какого-то факта, в этом доказательстве написано что-то вроде "воспользуемся трансфинитной индукцией" т к я (о позор мне ) не слышал раньше про "трансфинитную индукцию" я иду искать, что это. За какое-то время разбираюсь и продолжаю чтиво, через три строки "ординалы используются..." и тут я такой "так стоп, что такое ординалы?" — ищу... Потом "по лемме Цорна"... В итоге в книге "прочитаны" две страницы, а времени потрачено много часов. Т е если идёт повествование в рамках заявленной темы — авторы книг отбрасывают всё то, что не относится к текущему контексту, как бы вынося за скобки знания смежных областей, пологая, что читающий может разобрать это самостоятельно.

Что самое любопытное — так было с самого первого курса физмата, нам давали факт и доказывали его ссылаясь на что-то вспомогательное. Если это "вспомогательное" было простым или точно всем известным тогда без доказательства, а если сложное — доказывалось. Особенно часто на первых курсах было "Докажем теорему А. Чтобы доказать теорему А, нам потребуется теорема Б. Докажем сперва теорему Б..." на первых курсах это было совсем сложно и непонятно, а потом вроде и ок, а теперь так и вообще "а разве может быть иначе?". Во-первых, всё знать нельзя, а во-вторых чтобы чем-то пользоваться не нужно знать абсолютно всё.

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

ЗЫ. второе — почему все горят желанием бесконечно изучать "Hello world'ы", а вот разобраться с ООП получается далеко не сразу и не у всех? Причина этого в том, что чем дальше идём, тем больше цепляем смежных областей и знаний: теория алгоритмов, математика, проектирование, контекст новой пребметной области, знание прошлых курсов и... И, для того чтобы разобраться с материалом А нужно воспользоваться материалом Б, поэтому сперва изучим материал Б…

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

#запискиюногопрограммиста
3.1K views16:55
Открыть/Комментировать
2022-12-31 14:58:06 Поздравляю всех с наступающим Новым Годом!

2022 для многих был очень сложным во всех смыслах.
Кто-то отважился на покорение новых высот, а у кого-то это уже получилось.
При этом не стоит расслабляться, нам предстоит сперва поставить новые цели, а потом приложить много сил, чтобы добиться их.

Самое важное – близкие люди и здоровье, берегите себя!
3.4K views11:58
Открыть/Комментировать
2022-12-31 07:46:39 Новогодние каникулы — идеальное время для подготовки к собеседованию

Нужно переопределить метод equals в Java.

Помогите ответить на вопрос: выполнение каких требований нужно придерживаться?

Пишите ответы в комментариях

#java #ооп
3.5K views04:46
Открыть/Комментировать
2022-12-31 03:03:51 Синтаксический сахар .net c# и java, лямбды, dry

Пост на бусти, как продолжение делегатов c# и философии методов. Пример разбавлен java

#dotnet #java
2.8K views00:03
Открыть/Комментировать
2022-12-28 06:12:31 Системы компьютерной математики, сам пользуюсь и вам советую

Много лет назад проект задумывался как математический интеллект т е можно спросить:
heart equation и получить или batman equation или weather in Smolensk, Russia или Leo Tolstoy

Но чаще его используют для более житейских вещей, например:

— Показать 20 знаков числа √2 N[Sqrt[2],20] > url

— Деление "обычное" N[14/5, 5] > url

— Нахождение неполного частного Quotient[14, 5] > url или PolynomialQuotient[5 * x^5 + x^2, x^3] позволяет найти неполное частное при делении многочленов

— Нахождение остатка от деления Mod[14, 5] или 14 mod 5 > url

— PolynomialMod может для многочленов PolynomialMod[5 * x^5 + x^2, x^3]

— Построить график функции ƒ(x), для x ∈ [a, b] это Plot[(Sin[x] + x) / x, {x, -10, 20}] > url

— Построить несколько графиков в одной системе координат Plot[{Sin[x] , Cos[0.25 * x]}, {x, -10, 10}] > url

— Решить уравнение Solve[x^2 + 4 == 0, x] > url

— Решить систему уравнений Solve[{y == 5 + x, y == 0.2 * x}, {x, y}] > url

— Раскрыть скобки Expand[(a + b)^2] > url или Expand[(a + b)^5 + (a + 2 * b)^3] > url

— Упростить выражение Simplify[a^2 + 4*a*x + 4*x^2] > url

— Разложить многочлен на множители Factor[z^11 + 1991.5 * z^10 + 2985 * z^9 + 28 * z^2 + 55762 * z + 83580] > url

и много что ещё, развлекайтесь https://www.wolframalpha.com

#математика
3.9K viewsedited  03:12
Открыть/Комментировать
2022-12-27 19:29:22 Век живи — век учись.

Кремниевая долина ассоциируется с IT — тут спорить будет мало кто, а вот про то, что Голливуд «закрался» в программирование я вообще не знал.

Про IoC-контейнеры знаю много лет, а вот про «Принцип Голливуда» узнал пять минут назад.

Кто бы мог подумать, что это одно и тоже
3.6K views16:29
Открыть/Комментировать
2022-12-26 15:43:00
Как начать в Java
В хорошем качестве тут

Первая очередь Java JDK
Если ушло/заблокировано: Open JDK
Заглянуть на Brew

#java #vscode
3.5K views12:43
Открыть/Комментировать
2022-12-26 14:07:01 Как начать в код: философия методов

Видео для подписчиков boosty

Принимаются предложения

Часть 3
#dotnet #vscode
3.0K viewsedited  11:07
Открыть/Комментировать
2022-12-26 12:03:01
Как начать в код: от кода к методам

В хорошем качестве тут

Часть 2
#dotnet #vscode
3.0K viewsedited  09:03
Открыть/Комментировать