Архив автора: admin

Простая Математика для Простых Программистов

Простая Математика для Простых Программистов

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

Скачать с mail облака

2022-03-15T12:06:51Книги и Курсы

Как восстановить программное обеспечение стиральной машины

Современная техника становится все более умной. В каждом бытовом приборе стоит электронный модуль управления. Теперь для каждой модели посудомоечной, сушильной машины или стиральной машины пишется свое программное обеспечение. По заверением представителя сервисного цента ремонта бытовой техники, которая производит ремонт стиральных машин в Красногорске, производители техники очень заинтересованы в конечном итоге: чтобы пользователю было удобно пользоваться изделиями выпускаемые фирмой. Совсем недавно в продаже появились стиральные машины серии SMART. Эти изделия удобны тем. что ими можно управлять со смартфона. Можно даже заранее запрограммировать выполнение определённых программ. Стирка запустится в определённое время и постирает белье.

Всеми этими процессами управляет блок управления стиральной машины. В нём зашита специальная программа. К слову сказать, данные программ стиральных машинах не очень защищены от скачков напряжения. Даже может стереться программа из памяти ПЗУ, даже если рядом будет разряд молнии, а машинка в это время работала. Для того, чтобы восстановить программное обеспечение, придётся обращаться в сервисный центр. Или вызывать мастера на дом, чтобы он провёл ремонт стиральной машины в домашних условиях. В некоторых моделях реализована простая функция перепрограммирования. Можно не привозить стиральную машину в мастерскую: мастер приедет со специальным оборудованием, подключит компьютер к стиралке и «зальет» программу управления в электронный блок.

Сложность программирования блока управления стиральной машиной

Некоторые модели бюджетных стиральных машин можно без особых усилий перепрошить даже самостоятельно. Достаточно купить специальный шлейф для соединения разъёма в машинке и ноутбука. Скачать специальную программу и перепрограммировать устройство. Некоторые производители бытовой техники например Бош и Сименс не выкладывают в свободном доступе свое программное обеспечение. Это считается интеллектуальной собственностью фирмы и имеется только авторизованных сервисных центрах. Так что при ситуациях, когда программа «слетела», придётся обращаться только к официальным представителям данной фирмы вашем регионе. Если вам нужен ремонт стиральной машины в Нахабино — обращайтесь в эту фирму.

Причины по которым ломается блок управления в стиральной машине

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

 

Цены

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



2022-03-14T22:02:30
Программное обеспечение

Python. NumPy pad()

В этой статье будет рассмотрена NumPy pad(). Мы также рассмотрим его синтаксис и аргументы для лучшего понимания. Затем на нескольких примерах мы покажем, как все элементы теории применяются на практике. Но сначала давайте посмотрим на определение функции, чтобы лучше понять ее.

 

Определение NumPy и его синтаксис

Как мы все знаем, NumPy — это мощный математический пакет Python. Он включает в себя функцию под названием NumPy pad(), которая добавляет отступы к массивам. По мере продвижения по тексту определение, которое мы только что обсуждали, станет более ясным. Синтаксис, относящийся к этой функции, будет рассмотрен в прилагаемом разделе.

# numpy.pad(array, pad_width, mode='')

 

Общий синтаксис нашей функции показан выше. Существуют различные критерии, которые сопровождают это, и мы рассмотрим их сегодня. Параметр «array» указывает входной массив, к которому должно быть применено заполнение. Количество значений, добавленных к краю каждой оси, представлено аргументом «pad_width».

«mode» — это параметр. Он может представлять собой одно из приведенных ниже строковых значений или предоставленную пользователем функцию.

  • constant: при использовании этой опции заполнение выполняется с постоянным значением.
  • edge: в этой ситуации заполнение выполняется значением края массива.
  • maximum: когда выбран этот параметр, заполнение рассчитывается путем сложения наибольшего значения всех частей вектора вдоль указанной оси.
  • mean: заполнение в этой ситуации использует среднее значение всех секций вектора вдоль указанной оси.
  • median: когда выбран этот параметр, заполнение использует наибольшее значение из всех частей вектора вдоль предоставленной оси.
  • reflect: в этом случае вектор дополняется путем отражения его между начальным и последним значениями по каждой оси.

‘maximum,” mean,”median,’ и ‘minimum’ используют аргумент длины «stat». Статистическое значение рассчитывается с использованием количества значений на краю каждой оси.

В «constant» используется параметр «constant values». Значения используются для заполнения значений для каждой оси здесь.

 

Пример 1:

Мы рассмотрим, как работает этот метод и как он помогает нам достичь желаемого результата в этой части, когда мы рассмотрели всю теорию, лежащую в основе NumPy pad(). Мы начнем с простого экземпляра и перейдем к более сложным. Мы рассмотрим, как работает функция клавиатуры NumPy, в нашем первом примере.

Во-первых, мы импортировали модуль NumPy в пример программы ниже. После этого мы определили вход (обозначенный как abc), на котором должна быть выполнена операция. Затем мы использовали наш синтаксис, чтобы получить желаемый результат.

В этом примере мы выбрали «maximum» в качестве нашего режима. В результате передняя и задняя части дополняются максимум до 32 (максимальное значение). Ниже приведена реализация, как вы можете видеть.

import numpy as ppool

abc=[2,32,7,8]

print(ppool.pad(abc,(2,3),"maximum"))

 

Вот результат, где вы можете увидеть максимальное значение в начале и в конце массива.

[32 32 2 32 7 8 32 32 32]

 

Пример 2:

Давайте посмотрим на другой пример, используя другой режим. Вторая иллюстрация, похожая на первую. Однако в данном случае мы использовали другой массив. Кроме того, мы выбрали «reflect» в качестве режима наблюдения. Можно увидеть изменение выхода.

import numpy as p

abc=[12,33,22,37,60,80,2]

print(p.pad(abc,(5,1),"reflect"))

 

Вот результирующий экран приведенного выше кода.

[80 60 37 22 33 12 33 22 37 60 80 2 80]

 

Пример 3:

Первый аргумент, один (3,2) кортеж, указывает, что в этом примере три компонента добавляются перед осью, а два элемента добавляются после оси.

Опция режима определяет тип значения, которое будет использоваться для заполнения массива. Мы используем постоянные значения 1 и 5 для заполнения массива в нашем коде, но мы можем изменить этот режим на медианный, средний, пустой, перенос и т. д. Каждый режим добавляет новый элемент в массив, чтобы дополнить его.

import numpy as p

one = [2,4,6,8]

two = p.pad(one,(3, 2), mode =  'constant', constant_values = (1, 5))

print(two)

 

Ниже приведен экран вывода для вашей помощи.

[1 1 1 2 4 6 8 5 5]

 

Пример 4:

В этом случае мы импортировали NumPy с псевдонимом «pp» в приведенном выше коде. Используя вектор, ширину площадки, ось и kwargs, мы разработали метод pad. Чтобы получить значения заполнения из предоставленной функции get(), мы объявили значение переменной padding.

Значения заполнения были предоставлены части вектора.

Мы использовали функцию np.arange() для построения массива «one» и функцию reshape() для изменения его формы. Результирующее значение функции np.pad() было присвоено переменной ‘two’. Функция предоставила список «один» и параметр ширины pad. Наконец, мы попытались напечатать значение «two».

import numpy as pp

def pad_with(vector, pad width, iaxis, kwargs):

         padding_val = kwargs.get('padder', 5)

         vector[:pad_width[0]] = padding_val

         vector[-pad_width[1]:] = padding_val

one = pp. arange(6)

one = one.reshape((3, 2))

two = pp. pad(one, 2, pad_with)

print(two)


Результирующий экран показывает ndarray, дополненный определенным размером и значениями в выходных данных.

[[5 5 5 5 5 5]

 [5 5 5 5 5 5]

 [5 5 0 1 5 5]

 [5 5 2 3 5 5]

 [5 5 4 5 5 5]

 [5 5 5 5 5 5]

 [5 5 5 5 5 5]]

 

Заключение

Pad() — очень важная функция для специфического кодирования, она стала часто используемой функцией в Python. Функция позволяет изменять массив, чтобы ограничить количество конфликтов системы памяти. Функция numpy.pad() широко используется для полной функциональности AST. Эта функция, в частности, позволяет пользователю указать новый размер или даже позволить системе автоматически рассчитать размер для них.

В результате возможность оптимизации ресурсов памяти была настроена так, чтобы сократить время обработки системы. Этот пост был о том же, и мы обсудили функцию с несколькими примерами для вашей помощи.



2022-03-12T15:06:48
Python

Как приобрести лучшее серверное оборудование для малого бизнеса

Прежде чем покупать сервер, важно оценить потребности малого и среднего бизнеса. Ознакомьтесь с этими семью шагами, описывающими факторы, которые организация должна учитывать перед покупкой сервера.

Организации любого размера полагаются на серверы для поддержки своих рабочих нагрузок, и малые предприятия не являются исключением. Однако покупка сервера может оказаться непростой задачей, поскольку необходимо учитывать множество факторов, помимо самого сервера. Приобрести качественное серверное оборудование https://itelon.ru/catalog/oborudovanie/servers можно по ссылке.

Здесь мы рассмотрим эти факторы и представим пять серверов от Asus, Dell, HPE, Fujitsu и Lenovo.

Основы серверного оборудования

Серверное оборудование в стойках

Термин «сервер» может относиться как к физическому компьютеру, так и к программному обеспечению. В данном случае мы рассматриваем только физический компьютер, состоящий из множества аппаратных компонентов, способных поддерживать бизнес-приложения и их рабочие нагрузки.

Сервер разделяет ресурсы и обеспечивает выполнение рабочих процессов в сети. Серверы часто взаимодействуют с Интернетом и поддерживают локальных и удаленных пользователей. Система обычно работает круглосуточно, обрабатывая запросы от множества пользователей и приложений — часто одновременно. В некоторых случаях сервер может обрабатывать большие файлы или объемы данных, в зависимости от рабочей нагрузки.

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

Точная конфигурация может значительно отличаться у разных серверов и производителей, поэтому СМБ важно подходить к выбору сервера с осторожностью.

Как приобрести правильный сервер

Малый и средний бизнес может купить выделенный сервер, арендовать готовую систему, собрать ее или приобрести отремонтированный сервер.

Следующие семь шагов описывают многие факторы, которые SMB должны учитывать перед выбором сервера.

Определите требования к рабочей нагрузке

  • Перечислите типы приложений и сервисов, которые вы планируете запускать на сервере, и требования к работе каждого из них, включая процессор, память и хранилище.
  • Уточните количество пользователей каждого приложения и то, как они его используют.
  • Укажите объем и тип данных, которые сервер должен обрабатывать и хранить, включая размеры файлов. Учитывайте данные в состоянии покоя и в движении.
  • Определите, как SMB реализует каждое приложение — «голый металл», виртуальный сервер или контейнер — и включите в планирование гипервизор и программное обеспечение для контейнеров.
  • Рассчитайте требования к рабочей нагрузке на ближайшее и отдаленное будущее.

Рассчитайте бюджет на сервер

  • Получите смету на сервер, включая дополнительные функции и опциональные соглашения об обслуживании. Учитывайте возможность долгосрочного масштабирования и замены деталей. Менее дорогой сервер может показаться заманчивым, но он может оказаться недостаточно мощным и надежным, чтобы справляться с критически важными рабочими нагрузками.
  • Оцените ИТ-ресурсы, необходимые для установки, настройки, обслуживания и обновления сервера. Включите расходы на обучение персонала или привлечение внешних специалистов для устранения неполадок или обслуживания сервера.
  • Изучите стоимость размещения, питания и охлаждения сервера.
  • Рассмотрите расходы, связанные с лицензированием ОС, программного обеспечения для обеспечения безопасности, программного обеспечения для управления и любого другого программного обеспечения, необходимого для поддержания работоспособности сервера.
  • Включите расходы, связанные с защитой данных, сервера и его физической среды от нарушений безопасности, стихийных бедствий или других событий, которые могут привести к потере, повреждению или компрометации данных.

Определите операционные требования

  • Укажите все требования к безопасности, конфиденциальности и соответствию нормативным требованиям, применимые к серверу.
  • Укажите требования к надежности и доступности, применимые к доставке данных и текущей работе сервера.
  • Определите требования к краткосрочной и долгосрочной масштабируемости.

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

Выбор ОС

  • Изучите доступные в настоящее время серверные ОС, например Microsoft Windows Server или RHEL.
  • Определите, какая ОС лучше всего соответствует требованиям SMB к рабочей нагрузке. Из этого выбора выберите лучшую версию и издание для удовлетворения этих требований.
  • Определите уровень квалификации сотрудников для работы с конкретной ОС.

    Подумайте, сколько нужно обучить ИТ-персонал работе с конкретной ОС или нужно ли СМБ привлекать внешних специалистов.
  • Перечислите инструменты администрирования, которые SMB использует в настоящее время, и укажите, являются ли они специфическими для конкретной ОС.
  • Перечислите другие серверы, которые SMB обслуживает в настоящее время, и ОС, работающие на каждом из них.

Выбор форм-фактора сервера

Серверное оборудование

  • Оцените форм-факторы серверов, включая башню, лезвие и стойку, с учетом известных ограничений по пространству, питанию, охлаждению и другим экологическим соображениям.
  • Учитывайте среду, в которой будет работать сервер, с точки зрения его влияния на других людей, например, не размещайте шумный сервер в углу офиса.
  • Учитывайте наличие других серверов или ИТ-оборудования, работающих в данной среде, например маршрутизатора или источника бесперебойного питания.

Оцените доступные серверы

  • Ограничьте поиск только серверами, доступными в выбранном организацией форм-факторе, и серверами, сертифицированными для работы с выбранной SMB ОС.
  • Определите физические размеры каждого сервера или занимаемое им место в стойке.
  • Оцените способность каждого сервера поддерживать рабочие нагрузки СМБ с точки зрения процессора, памяти, хранилища и других ресурсов, включая требования к виртуализации.
  • Проверьте способность каждого сервера соответствовать эксплуатационным требованиям СМБ, таким как надежность и масштабируемость. Оцените тип безопасности, встроенный в компоненты сервера, и встроенное программное обеспечение.
  • Определите количество и типы доступных портов, слотов расширения, сетевых карт, отсеков для хранения данных и носителей, а также контроллеров хранения. Также проверьте наличие стандартных или дополнительных приводов, например DVD или DVD-RW.
  • Проверьте тип блока питания и его мощность.
  • Проверьте уровень избыточности, встроенный в каждый сервер.
  • Оцените гарантии, сервисные контракты, договоры на обслуживание и уровень технической поддержки, доступной для сервера.

Примите решение

  • Определите приоритеты серверов, исходя из того, какие из них лучше всего соответствуют рабочей нагрузке и операционным требованиям СМБ, включая стоимость, лицензирование и дополнительные платежи за обслуживание или поддержку. Будьте осторожны, чтобы не недооценить и не переоценить будущие потребности, поскольку любой из этих сценариев может привести к ненужным расходам.
  • Определите, какие поставщики считаются лидерами в выбранной категории серверов, и ознакомьтесь с их репутацией в плане поставки качественных продуктов и соблюдения соглашений об обслуживании.
  • Узнайте, что говорят клиенты и рецензенты о серверах, которые попали в окончательный список.

Итоги

Ключевым моментом при выборе сервера для малого и среднего бизнеса является поиск системы, наиболее полно отвечающей требованиям организации. Это означает тщательное определение ее потребностей, а затем оценку доступных продуктов и предлагающих их поставщиков.

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



2022-03-11T15:31:29
Вопросы читателей

Сжатие изображений: пресеты WebP, HEIC, AVIF, JPEG XL

Как время летит. Восемь лет назад я написал сообщение в блоге об эксперименте с изображениями WebP на веб-сайте End Point, чтобы описать и продемонстрировать, как формат изображения WebP может хранить изображение эквивалентного качества в гораздо меньшем размере файла, чем старые форматы JPEG, PNG и GIF.

Основным недостатком в то время было то, что среди основных браузеров только Chrome и Opera поддерживали WebP, а тогда Chrome был гораздо менее популярен, чем сейчас.

 

Могу ли я использовать его?

Поскольку iOS 14 и macOS 11 (Big Sur) от Apple стали доступны в конце 2020 года, формат изображений WebP теперь работает во всех поддерживаемых в настоящее время основных операционных системах и браузерах: Linux, Windows и macOS, работающих под управлением Chromium, Chrome, Brave, Edge, Opera, Firefox, и Safari.

Прошло всего около 10 лет! 😁

Таким образом, для вас, кто размещает веб-сайты, все посетители вашего сайта могут видеть изображения и анимацию WebP, за исключением тех, кто исчезает с помощью Internet Explorer (теперь его поддержка Microsoft давно закончилась и его использование опасно), и люди (или их организации), которые преднамеренно не разрешать обновлять свои старые браузеры и операционные системы.

Это означает, что вы можете продолжать использовать изображения JPEG, PNG и/или GIF в местах, имеющих решающее значение для отображения основных функций вашего сайта, чтобы люди могли понять основные вещи, которые ваш сайт пытается сообщить.

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

 

Как создавать изображения WebP?

Мобильные телефоны и цифровые камеры обычно сохраняют изображения в формате JPEG, HEIF или необработанные (несжатые) изображения. Некоторые коллекции стоковых фотографий можно загрузить через WebP, но многие по-прежнему используют JPEG.

Таким образом, во многих случаях вы не будете начинать с изображения WebP, и вы будете конвертировать какое-то другое изображение в WebP, вероятно, после обрезки, масштабирования и других настроек.

GIMP (программа обработки изображений GNU) поддерживает изображения WebP примерно с 2017 года, а Adobe Photoshop изначально не поддерживает, но может использовать бесплатный плагин WebPShop.

Самый старый способ преобразования изображений в WebP, который до сих пор очень полезен для пакетной обработки или тонкой настройки, — это конвертер WebP от Google «cwebp».

 

Настройки cwebp

С мощными предложениями «cwebp» связаны некоторые сложности, но в основном они безвредны.

Запустите эту команду, чтобы увидеть множество вариантов:

cwebp -longhelp


 

Или прочтите то же самое в его онлайн-документации.

Там, среди прочего, вы увидите параметр -z, который активирует предустановленные функции для кодирования без потерь, с целочисленным уровнем, выбранным от 0 до 9, где 0 — самый быстрый, но сжимает меньше, а 9 — самый медленный, но сжимает лучше. Используйте это для замены файлов PNG, если вы вообще не хотите ухудшения качества изображения.

В документации также показаны полезные функции -presetи -hintпараметры сжатия с потерями, аналогичные тому, что делает JPEG, но лучше:

-preset <string> ....... preset setting, one of:

                          default, photo, picture,

                          drawing, icon, text



-hint <string> ......... specify image characteristics hint,

                         one of: photo, picture or graph


 

Значение некоторых из этих терминов, особенно «фото» и «изображение», было для меня неясным и не определялось нигде в документации, которую я мог видеть.

Чтобы выяснить это, мне пришлось быстро заглянуть в исходный код, и там есть комментарии, немного объясняющие вариант использования каждой опции:

Комментарии к варианту -preset:

WEBP_PRESET_PICTURE,  // digital picture, like portrait, inner shot

WEBP_PRESET_PHOTO,    // outdoor photograph, with natural lighting

WEBP_PRESET_DRAWING,  // hand or line drawing, with high-contrast details

WEBP_PRESET_ICON,     // small-sized colorful images

WEBP_PRESET_TEXT      // text-like


 

И комментарии к варианту -hint:

WEBP_HINT_PICTURE,    // digital picture, like portrait, inner shot

WEBP_HINT_PHOTO,      // outdoor photograph, with natural lighting

WEBP_HINT_GRAPH,      // Discrete tone image (graph, map-tile etc).


 

Короче говоря, «cwebp» считает «изображение» в помещении и крупным планом, а «фото» — на улице и, скорее всего, с более дальним фокусом. Это хорошо знать.

 

Пакетное преобразование

Имея это в виду, я могу преобразовать стопку скриншотов, которые были собраны на моем компьютере, чтобы обращаться к ним позже. Один из видов скриншотов, которые я иногда делаю, — это видеовстречи, на которых люди в основном смотрят в помещении. Для них я буду использовать предустановку «изображение».

Простой bashскрипт хорошо работает для обработки множества изображений подряд:

for infile in Screenshot*.png

do

    echo $infile

    base=$(basename "$infile" .png)

    cwebp -preset picture -v "$infile" -o "$base".webp

done


 

Если у вас есть много изображений для преобразования в WebP и вы хотите сделать несколько одновременно, чтобы сделать это быстрее, вы можете использовать GNU parallel.

Мои скриншоты при преобразовании из PNG в WebP постоянно занимают около 3% исходного пространства, в 33–35 раз меньше! И качество примерно такое же. Удивительно.

 

Конкуренты WebP

Другие новые форматы изображений также находились в разработке в течение многих лет, преследуя некоторые из тех же целей. Должны ли мы пропустить WebP и использовать вместо этого один из них?

 

HEIC

Подмножество HEIC (High-Efficiency Image Container) стандарта HEIF (High Efficiency Image File Format) использует высокоэффективное кодирование видео (HEVC, H.265) для хранения изображений с суффиксом .heic.

По сравнению с JPEG, HEIC предлагает приятные преимущества меньшего размера файла при том же уровне качества (примерно половина размера эквивалентного JPEG) и поддержку анимации (для замены GIF).

С другой стороны, HEIC обременен патентами, которые ограничивают его использование в крупных коммерческих проектах даже на устройствах, лицензированных для потребительского использования. Он также медленнее кодирует/декодирует. И, что касается архивариусов, HEIC показывает серьезное визуальное повреждение всего изображения, если часть файла повреждена. Напротив, в поврежденных файлах JPEG визуальное повреждение обычно локализовано в отдельных небольших квадратных областях, а не во всем изображении.

HEIC используется в операционных системах Apple с момента выпуска в 2017 году iPhone 7, iOS 11 и macOS 10.13 (High Sierra). Позднее поддержка была добавлена ​​в Windows 10, Android 9 и Ubuntu 20.04.

На момент написания этой статьи ни один из основных браузеров изначально не поддерживал HEIC , даже собственный Safari от Apple.

Так что на данный момент HEIC в основном используется Apple для более эффективного хранения фотографий на своих мобильных устройствах.

 

AVIF

AVIF (формат файла изображения AV1) конкурирует с HEIC и, что сбивает с толку, использует тот же формат файла контейнера HEIF, что и HEIC. Эта путаница на практике уменьшается за счет использования отдельного расширения файла..avif.

AVIF поддерживается в текущих версиях Chrome, Firefox и Opera. Поддержка была добавлена ​​в WebKit в 2021 году, но до сих пор не появилась в Safari. Он также работает в новых версиях VLC, GIMP, Windows, Android и т. д.

У Netflix есть очень подробный пост в блоге , в котором сравниваются AVIF и JPEG и демонстрируются многочисленные преимущества AVIF.

 

JPEG XL

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

Принимая во внимание, что другие новые форматы изображений, упомянутые выше, обычно теряют некоторое качество при повторном сжатии JPEG и других изображений, которые уже были сжаты с потерями, согласно Объединенной группе экспертов по фотографии (JPEG) :

Существующие файлы JPEG можно без потерь перекодировать в JPEG XL, значительно уменьшив их размер.

Сообщалось, что JPEG XL, как ожидается, станет доступен в своей окончательной стандартной форме в 2022 году, а поддержка уже доступна в предварительной форме в некоторых программах (см . статью об JPEG XL в Википедии ).

Это, конечно, означает, что на данный момент ни один из основных браузеров изначально не поддерживает JPEG XL.

 

Используйте WebP прямо сейчас

Таким образом, все другие новые параметры еще не могут использоваться для обычных веб-изображений. WebP в настоящее время является очевидным выбором, хотите ли вы заменить фотографии JPEG с потерями, заменить без потерь изображения PNG или заменить анимацию GIF.

Наши разработчики настроили на сервере автоматическое преобразование высококачественных PNG-оригиналов в WebP или JPEG на стороне приложения на лету, при этом размер изображения зависит от размера области просмотра браузера. И мы работали с Cloudinary, Cloudflare и другими CDN, чтобы использовать их услуги преобразования изображений. Мы также готовы помочь с вашими проектами.



2022-03-10T22:51:04
Программное обеспечение

Алгоритм Прима

Минимальное связующее дерево:

Граф, не имеющий направлений, называется неориентированным графом. Каждый граф должен иметь путь от одного узла к другому узлу. Остовное дерево также является неориентированным связным графом, в котором присутствуют все узлы графа с минимальным количеством ребер. Если остовное дерево не имеет всех узлов графа, то мы не можем сказать, что это остовное дерево. Суммарные веса остовного дерева будут меньше исходного веса графа, так как мы соединили его через ребра минимального веса. Покрывающее дерево также не имеет цикла. Любой граф имеет более одного остовного дерева, но только одно из них будет уникальным. Мы называем это минимальным остовным деревом, поскольку пытаемся создать полный граф со всеми узлами, сохраняя при этом низкий вес.

Мы можем нарисовать остовное дерево с помощью следующих двух методов:

  1. Алгоритм Крускала
  2. Алгоритм Прима

 

В этой статье мы собираемся обсудить алгоритм Прима. Алгоритм Крускала будет рассмотрен в следующей статье.

 

Алгоритм Прима:

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

 

Шаги алгоритма Прима:

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

  • Шаг 1: Выберите любую исходную вершину в графе.
  • Шаг 2: Найдите ребро минимального веса, которое примыкает к источнику, а затем соедините его с остовным деревом.
  • Шаг 3: Повторяйте шаг 2, пока все узлы не будут добавлены в минимальное остовное дерево.

 

Пример :

Ниже приведен пример поиска минимального остовного дерева с использованием алгоритма Прима.

1. Выбираем любой случайный узел из графа G и добавляем его в MST (минимальное остовное дерево). Мы выбираем здесь узел 0.

Алгоритм Прима

 

2. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

3. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0 или 1), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

4. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0, 1 или 3), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

5. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0, 1, 3 или 4), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

6. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0, 1, 3, 4 или 6), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

7. Теперь мы выбираем то ребро, которое является смежным с исходным узлом (0, 1, 3, 4, 6 или 2), но с наименьшим весом, а затем добавляем этот узел с наименьшим весом в минимальное остовное дерево.

Алгоритм Прима

 

Выше наш окончательный MST (минимальное остовное дерево), а общая стоимость равна 6.

 

Программа C++ Prim MST (минимальное связующее дерево):

#include<iostream>



#include<vector>



#include<queue>



#include<algorithm>



#include<cstring>



typedef std :: pair<int,int> SII;



typedef std :: vector<SII> SSII;



int PrimsMST (int sourceNode, std :: vector<SSII> & graph){



    // В этой очереди будут храниться сведения о каждом узле

    // вместе с их весовой ценностью.



    std :: priority_queue<SII, std :: vector<SII>, std :: greater<SII>> k;



 



    k.push(std :: make_pair(0, sourceNode));



    bool nodesAdded[graph.size()];



    memset(nodesAdded, false, sizeof(bool)*graph.size());



    int mst_tree_cost = 0;



    while (!k.empty()) {



        // We are selecting here the node which has minimum cost



        SII itemNode;



        itemNode = k.top();



        k.pop();



        int Node = itemNode.second;



        int Cost = itemNode.first;



        // Здесь мы проверяем, не был ли какой-либо узел добавлен в MST,



        // затем добавляем этот узел.



        if (!nodesAdded[Node]) {



            mst_tree_cost += Cost;



            nodesAdded[Node] = true;



            // Выполните итерацию по узлам negibour, которые недавно были удалены



            // из очереди приоритетов.



            // и добавлен в MST, который еще не добавлен



            for (auto & pair_node_cost : graph[Node]) {



                int adjency_node = pair_node_cost.second;



                if (nodesAdded[adjency_node] == false) {



                    k.push(pair_node_cost);



                }



            }



        }



    }



    return mst_tree_cost;



}



    int main(){



    // Подробная информация о графике со стоимостью и узлом смежности.



    SSII fromNode_0_in_graph_1  = { {1,1}, {2,2}, {1,3},



    {1,4}, {2,5}, {1,6} };



    SSII fromNode_1_in_graph_1   = { {1,0}, {2,2}, {2,6} };



    SSII fromNode_2_in_graph_1   = { {2,0}, {2,1}, {1,3} };



    SSII fromNode_3_in_graph_1 = { {1,0}, {1,2}, {2,4} };



    SSII fromNode_4_in_graph_1  = { {1,0}, {2,3}, {2,5} };



    SSII fromNode_5_in_graph_1  = { {2,0}, {2,4}, {1,6} };



    SSII fromNode_6_in_graph_1   = { {1,0}, {2,2}, {1,5} };



    int num_of_nodes = 7; // Total Nodes (0 to 6)



    std :: vector<SSII> primsgraph;



    primsgraph.resize(num_of_nodes);



    primsgraph[0] = fromNode_0_in_graph_1;



    primsgraph[1] = fromNode_1_in_graph_1;



    primsgraph[2] = fromNode_2_in_graph_1;



    primsgraph[3] = fromNode_3_in_graph_1;



    primsgraph[4] = fromNode_4_in_graph_1;



    primsgraph[5] = fromNode_5_in_graph_1;



    primsgraph[6] = fromNode_6_in_graph_1;



    // Как мы уже знаем, мы должны выбрать исходную вершину,



    // поэтому мы начинаем с узла вершины 0.



    std :: cout << "Общая стоимость минимального связующего дерева после алгоритма Прима : "



                "" << PrimsMST(0, primsgraph) << std :: endl;





    return 0;



}

Выход:

Общая стоимость минимального связующего дерева после алгоритма Прима : 6



Process finished with exit code 0

Временная сложность алгоритма MST Prim:

  1. Общее время, необходимое для обработки и выбора определенного узла очереди с приоритетом, который еще не добавлен в MST, составляет logV. Но поскольку это работает для каждой вершины, общая временная сложность составляет V (logV).
  2. Граф неориентированный, и общее количество ребер будет 2E. Поскольку мы должны поместить узлы в приоритетную очередь, это займет журнал общего времени (V). Однако, поскольку у нас есть в общей сложности 2E ребра, наша общая операция отправки будет 2E (log (V)).
  3. Общая сложность после операции 1 и 2 составляет O( (E + V ) log (V )).

 

Заключение:

Мы изучили минимальное остовное дерево Prim, которое большинство людей предпочитает в первую очередь, когда им нужно найти граф MST из графа. Алгоритм Prim прост для понимания и реализации в реальном приложении. Алгоритм Prim очень полезен в реальных приложениях, например, при соединении железнодорожных путей с целыми городами. Так что это всего лишь один пример, но его применение огромно, поэтому мы должны понять этот алгоритм.



2022-03-10T18:08:39
Программирование