Теория алгоритмов

23.06.25

Разработка - Математика и алгоритмы

Правильный выбор алгоритма и структуры данных – это залог эффективной и быстрой работы вашей программы. В статье рассказывается о процессе построения алгоритмов и принципах работы с ними

 

Меня зовут Александр, я программист Python, C#, PHP, 1C в компании Programming Store, а также действующий преподаватель (доцент) ИЖГТУ им. М. Т. Калашникова, кандидат технических наук, читаю курс «Технологии и методы программирования».

 

В данной статье я хотел бы поделиться процессом построения алгоритмов и принципами работы с ними.

Содержание

1. Зачем нужна теория алгоритмов.

2. Процесс построение алгоритма.

3. Массивы. Алгоритмы для работы с массивами.

4. Списки. Алгоритмы для работы со списками

5. Деревья. Алгоритмы работы с деревьями.

6. Хэш-таблица

7. Типизированные файлы (бинарные файлы)

8. Резюме

 

Зачем нужна теория алгоритмов

Представьте, что вы написали программу, которая отлично работает на небольшом наборе данных. Но что произойдет, если количество данных увеличится в разы или даже на порядки? Скорость работы может упасть, программа начнет «тормозить», а иногда и вовсе зависнет. Именно здесь на помощь приходит анализ алгоритмов.

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

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

 

Процесс построение алгоритма

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

1. Постановка задачи.

Четкое определение проблемы, которую нужно решить. Определение входных данных и ожидаемого результата.

2. Построение модели.

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

  •  математическая модель: уравнения, формулы, описывающие поведение системы;

  •  логическая модель: правила, логические выражения, определяющие условия;

  •  графическая модель: диаграммы, блок-схемы, отображающие процессы.

3. Разработка алгоритма.

Определение шагов, необходимых для решения задачи на основе построенной модели. Использование блок-схем, псевдокода или языка программирования.

4. Реализация алгоритма.

Перевод алгоритма в код на выбранном языке программирования.

5. Тестирование и отладка.

Проверка правильности работы алгоритма на различных входных данных и исправление ошибок.

6. Анализ алгоритма.

Оценка эффективности алгоритма по времени выполнения и объему используемой памяти.

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

 

Массивы. Алгоритмы для работы с массивами

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

Характерные алгоритмы для массивов — это, конечно же, поиск элемента. Если массив не сортирован, то поиск идет обычным перебором и сравнением. Если массив отсортирован, то можно применить бинарный поиск, который работает значительно быстрее. Также типичной операцией является поиск в массиве минимума и максимума, вычисление его суммы, среднего арифметического либо иной агрегатной функции,  инвертирование массива и поиск дубликатов.

Разберем некоторые из этих алгоритмов подробнее.

 Линейный поиск. Это последовательный перебор элементов массива до нахождения искомого элемента. Простой, но неэффективный для больших массивов. В C# такой алгоритм реализует метод массива IndexOf().

Бинарный поиск. Работает только для отсортированных массивов. Делит массив пополам и сравнивает средний элемент с искомым. Эффективен для больших массивов (логарифмическая сложность). В C# этот алгоритм реализован в методе BinarySearch().

Отличие линейного и бинарного поиска можно проиллюстрировать следующими картинками.

Вот линейный поиск, он перебирает все элементы, пока не найдёт искомый или пока не кончится список (массив):

 

 

А вот бинарный поиск, он на каждой итерации делит список (массив) на две части, каждый раз сужая область поиска, за счет чего количество итераций сильно уменьшается и алгоритм работает очень быстро:

 

 

Теперь поговорим о сортировке массивов.

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

Работу этого алгоритма иллюстрирует такая картинка:

 

 

Быстрая сортировка (Quicksort). Выбирает опорный элемент и разделяет массив на две части: элементы меньше опорного и элементы больше опорного. Рекурсивно сортирует каждую часть. Эффективна для большинства случаев.

Этот алгоритм иллюстрирует следующая картинка:

 

 

Во многих языках программирования есть встроенная функция быстрой сортировки:

  •  C#: Array.Sort() (использует различные алгоритмы сортировки, включая Quicksort)

  •  Python: sorted() (возвращает новый отсортированный список), list.sort() (сортирует список на месте)

Пример реализации (C#):

int[] numbers = { 5, 2, 8, 1, 9 };
Array.Sort(numbers); // Сортировка массива по возрастанию
Console.WriteLine(string.Join(", ", numbers)); // Вывод: 1, 2, 5, 8, 9

Пример реализации (Python):

numbers = [5, 2, 8, 1, 9]
numbers.sort() # Сортировка списка на месте
print(numbers) # Вывод: [1, 2, 5, 8, 9]

 

Списки. Алгоритмы для работы со списками

Список (List) – это динамическая структура данных, позволяющая хранить упорядоченную последовательность элементов.  В отличие от массивов размер списка может изменяться во время выполнения программы.

Алгоритмы для работы со списками:

•   Добавление элемента:

    *   В конец списка (Append/Add).

    *   В начало списка (Insert).

    *   В произвольную позицию (Insert).

•   Удаление элемента:

    *   По значению (Remove/RemoveAt).

    *   По индексу (RemoveAt).

•   Поиск элемента:  Линейный поиск (аналогичен массивам).

•   Сортировка списка:  Аналогично массивам.

•   Другие алгоритмы:

    *   Инвертирование списка.

    *   Объединение списков.

    *   Разделение списка.

C#: List<T>

Python: list

Пример реализации (C#):

R03;R03;R03;R03;R03;R03;R03;List<string> names = new List<string>() { "Alice", "Bob", "Charlie" };
names.Add("David"); // Добавление в конец
names.Insert(0, "Eve"); // Добавление в начало
Console.WriteLine(string.Join(", ", names)); // Вывод: Eve, Alice, Bob, Charlie, David

Пример реализации (Python):

names = ["Alice", "Bob", "Charlie"]
names.append("David") # Добавление в конец
names.insert(0, "Eve") # Добавление в начало
print(names) # Вывод: ['Eve', 'Alice', 'Bob', 'Charlie', 'David']

 

Деревья. Алгоритмы работы с деревьями

Дерево – это иерархическая структура данных, состоящая из узлов (nodes), соединенных ребрами (edges). Один узел является корнем (root) дерева, а остальные узлы являются его потомками (children). Узел, не имеющий потомков, называется листом (leaf).

Алгоритмы работы с деревьями:

•  Обходы дерева:

  •  Прямой обход (Preorder). Посещение корня, затем обход левого поддерева, затем обход правого поддерева.

  •  Центрированный обход (Inorder). Обход левого поддерева, затем посещение корня, затем обход правого поддерева (используется для отсортированных деревьев).

  •  Обратный обход (Postorder). Обход левого поддерева, затем обход правого поддерева, затем посещение корня.

•   Кроме того, бывает еще и обход дерева в ширину Breadth-First Search, BFS. Посещение узлов по уровням.

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

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

•  Поиск элемента в дереве:

  •  Обычно используется для двоичных деревьев поиска (Binary Search Tree, BST).

  •  Сравнение искомого элемента с текущим узлом.

  •  Переход в левое поддерево, если искомый элемент меньше, или в правое поддерево, если искомый элемент больше.

•  Вставка элемента в дерево: аналогично поиску.

•  Удаление элемента из дерева: более сложный алгоритм, требующий перестройки дерева.

 

Примеры деревьев:

•  Двоичное дерево поиска (BST).

•  Сбалансированное дерево (AVL-дерево, красно-черное дерево).

•  Дерево решений.

 

Для языков C# и Python нативных средств работы с деревьями нет, поэтому их нужно реализовать самостоятельно.

Реализация деревьев на C# и Python обычно предполагает создание классов для узлов дерева и методов для выполнения операций над деревом. Примеры реализации выходят за рамки данной статьи, но в интернете можно найти множество примеров реализации различных типов деревьев.

 

Хэш-таблица

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

Основные принципы работы:

1. Хэш-функция: ключевым элементом хэш-таблицы является хэш-функция. Хэш-функция принимает ключ в качестве входных данных и возвращает хэш-код – целое число, представляющее собой индекс ячейки в массиве (который и является основной структурой хранения в хэш-таблице). Идеальная хэш-функция должна:

  •  быть детерминированной: для одного и того же ключа всегда возвращать один и тот же хэш-код;

  •  быстро вычисляться;

  •  равномерно распределять ключи по всему диапазону хэш-кодов, минимизируя коллизии (см. ниже).

2. Массив (бакеты): данные хранятся в массиве, каждая ячейка которого называется бакетом (bucket). Размер массива часто обозначается как N. Хэш-код, полученный от хэш-функции, используется для определения индекса бакета, в котором будет храниться пара «ключ-значение». Обычно хэш-код берется по модулю N (количество бакетов), чтобы получить индекс в пределах массива.

Вот как такая структура выглядит в памяти компьютера (иллюстрация):

 

3. Коллизии: поскольку количество возможных ключей обычно намного больше, чем размер массива, коллизии неизбежны. Коллизия возникает, когда два разных ключа отображаются в один и тот же индекс массива (имеют одинаковый хэш-код по модулю N).

Существует несколько способов разрешения коллизий:

  •  раздельное связывание (Separate Chaining): каждый бакет хранит не одно значение, а список (связанный список или другую структуру данных) пар «ключ-значение», которые имеют одинаковый хэш-код. При поиске элемента в бакете происходит последовательный перебор списка.

  •  Открытая адресация (Open Addressing): если возникает коллизия, алгоритм ищет свободную ячейку в массиве. Наиболее распространенные методы открытой адресации:

      Линейное пробирование (Linear Probing):* Поиск следующей свободной ячейки последовательно.

      Квадратичное пробирование (Quadratic Probing):* Поиск свободной ячейки с использованием квадратичной функции.

      Двойное хэширование (Double Hashing):* Использование второй хэш-функции для определения шага при поиске свободной ячейки.

 Операции:

  •  Вставка (Insert): вычисление хэш-кода ключа, определение индекса бакета, добавление пары «ключ-значение» в этот бакет (с учетом разрешения коллизий).

  •  Поиск (Search): вычисление хэш-кода ключа, определение индекса бакета, поиск значения в этом бакете (с учетом разрешения коллизий).

  •  Удаление (Delete): вычисление хэш-кода ключа, определение индекса бакета, удаление пары «ключ-значение» из этого бакета (с учетом разрешения коллизий).

Характеристики:

•  Средняя временная сложность:

  •  Вставка: O(1)

  •  Поиск: O(1)

  •  Удаление: O(1)

•  Худшая временная сложность:

  •  Вставка: O(n) (в случае сильных коллизий, например, при использовании раздельного связывания с длинными списками).

  •  Поиск: O(n) (в случае сильных коллизий).

  •  Удаление: O(n) (в случае сильных коллизий).

•  Пространственная сложность: O(n), где n – количество элементов, хранящихся в хэш-таблице.

Преимущества:

•  высокая скорость доступа к данным: в среднем время доступа к элементам составляет O(1), что делает хэш-таблицы очень эффективными для поиска, вставки и удаления.

•  простота реализации: основные принципы хэш-таблиц относительно просты для понимания и реализации.

•  гибкость: хэш-таблицы могут хранить ключи и значения различных типов.

 

Недостатки:

•  возможность коллизий: коллизии могут снизить производительность хэш-таблицы до O(n) в худшем случае.

•  неупорядоченность: хэш-таблицы не сохраняют порядок элементов. Если вам важен порядок, используйте другие структуры данных, в частности, OrderedDict в Python или SortedDictionary в C#.

•   зависимость от хэш-функции:  эффективность хэш-таблицы сильно зависит от качества хэш-функции. Плохая хэш-функция может привести к большому количеству коллизий и снижению производительности.

•   необходимость перехэширования (Resizing): при достижении определенного порога заполненности (load factor), необходимо увеличивать размер массива (перехэшировать), что может быть дорогостоящей операцией.

 

Реализация в различных языках:

•   Python:  встроенный тип данных dict (словарь) реализован как хэш-таблица.

•   C#:  класс Dictionary<TKey, TValue> реализован как хэш-таблица.

•   Java: классы HashMap и Hashtable реализуют хэш-таблицы.

 

Когда использовать хэш-таблицы:

•   когда требуется быстрый поиск, вставка и удаление элементов по ключу;

•   когда порядок элементов не важен;

•   когда количество элементов заранее неизвестно.

 

Примеры использования:

•   кэширование: хэш-таблицы идеально подходят для кэширования данных, так как обеспечивают быстрый доступ к часто используемым значениям;

•   индексирование: в базах данных хэш-таблицы могут использоваться для создания индексов, что позволяет быстро находить записи по определенным полям;

•   реализация словарей и ассоциативных массивов:  Python dict, C# Dictionary, Java HashMap и т.д.;

•   счетчики частот: подсчет количества вхождений различных элементов в наборе данных;

•   проверка уникальности: быстрая проверка, существует ли уже элемент в наборе.

 

Типизированные файлы (бинарные файлы)

Типизированные файлы — это файлы произвольного доступа, структура которых представляет собой последовательность компонентов одного типа. Одна из главных особенностей типизированного файла — возможность прямого обращения к его отдельным компонентам. Это достигается за счёт того, что заранее известен тип компонент файла.

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

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

 

Алгоритмы для работы с типизированными файлами:

•  чтение данных: чтение данных определенного типа (int, float, string, структура) из файла;

•  запись данных: запись данных определенного типа в файл;

•  позиционирование: перемещение указателя чтения/записи в определенную позицию в файле (для произвольного доступа к данным).

 

C#: BinaryReader, BinaryWriter, FileStream

Python: open('filename', 'rb'), open('filename', 'wb'), struct module (для упаковки и распаковки данных)

 

Пример реализации (C#):

using (BinaryWriter writer = new BinaryWriter(File.Open("data.bin", FileMode.Create)))
{
    writer.Write(123); // Запись целого числа
    writer.Write("Hello"); // Запись строки
}

using (BinaryReader reader = new BinaryReader(File.Open("data.bin", FileMode.Open)))
{
    int number = reader.ReadInt32();
    string text = reader.ReadString();
    Console.WriteLine($"Number: {number}, Text: {text}");
}

Можно записать в бинарный файл целый объект. Правда, при этом он должен быть помечен как сериализуемый, то есть иметь атрибут Serializable.

Сериализация есть и в Python:

import struct
with open("data.bin", "wb") as f:
    f.write(struct.pack('i', 123)) # Запись целого числа
    f.write("Hello".encode()) # Запись строки (в байтах)

with open("data.bin", "rb") as f:
    number = struct.unpack('i', f.read(4))[0] # Чтение целого числа
    text = f.read().decode() # Чтение строки (в байтах)
    print(f"Number: {number}, Text: {text}")

      

 Резюме

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

Помните: правильный выбор алгоритма и структуры данных – это залог эффективной и быстрой работы вашей программы.

Вступайте в нашу телеграмм-группу Инфостарт

алгоритм сортировка поиск бинарный поиск хеш-таблица словарь массив список алгоритмическая сложность оптимизация проблема производительности

См. также

Математика и алгоритмы Программист 1C v8.2 1C:Бухгалтерия Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    8920    stopa85    12    

42

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    15410    user1959478    57    

37

Математика и алгоритмы Разное 1С v8.3 1C:Бухгалтерия Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    8592    maksa2005    8    

27

Математика и алгоритмы Инструментарий разработчика Программист 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    16630    10    SpaceOfMyHead    20    

63

Математика и алгоритмы Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    9930    RustIG    9    

29

Механизмы платформы 1С Математика и алгоритмы Программист 1С v8.3 Россия Бесплатно (free)

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

23.11.2022    9062    gzharkoj    15    

26

Математика и алгоритмы Программист 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    10267    8    kalyaka    11    

45

Математика и алгоритмы Программист 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    11270    fishca    12    

39
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. starik-2005 3180 23.06.25 10:19 Сейчас в теме
Статья в общем-то хорошая, но не отвечает на вопрос о том, зачем нужны алгоритмы. Не приведены примеры математической модели, графических и логических моделей. Про хеш-таблицу не сказано, что она занимает много памяти, ибо должна как минимум вместить все возможные ключи, т.е. если ключ будет 16 бит, то хеш-таблица будет состоять минимум из 2^16 х [Размер указателя] байт.

Если дополнить статью, то можно сказать, что алгоритмы в том понимании, в котором они даются в книжках какого-нить Кнута, большинству программистов нужны крайне редко, не такое большое количество программистов даже математические модели строит (фактически, нумерованный список операций с переходами ветвлений), не говоря уже о графических моделях. И, в общем-то, справляются со своей работой без всего этого. Но есть случаи, когда неплохо было бы знать эффективность доступа к тем или иным объектам той же 1С, чтобы не писать очень долго работающий код. С третьей стороны - железо все стерпит, на то оно и железо.
zqzq; almierm; Трактор; brr; mifka186; +5 Ответить
2. SerVer1C 925 23.06.25 10:44 Сейчас в теме
Статья больше из раздела Computer Science. Далеко НЕ все здешние адынэсники знают шарп или питон. Вот вы бы лучше натянули всё это на 1С. Было бы понятнее и интереснее. И тогда оказалось бы, что в массив можно запихнуть разные типы данных и что хеш-таблица - это Соответствие и т.д.
zqzq; BackinSoda; +2 Ответить
3. RustIG 1884 23.06.25 11:09 Сейчас в теме
Для 1сников требуется адаптация любых англоязычных книжек по алгоритмам - во многих книгах по алгоритмам упоминаются стеки (кучи) и очереди, хотя в 1с подобных структур (классов) нет. И где используются не известно. Получается, что есть некие базовые структуры, которые используются в алгоритмах низкоуровневых языков, но не используются в высокоуровневых языках, но продолжают преподаваться по старым книжкам-лекалам...
Могу ошибаться, поскольку системного преподавательского опыта не имею. Тут на ИС преподавателей по программированию совсем не хватает...
4. starik-2005 3180 23.06.25 11:26 Сейчас в теме
(3)
во многих книгах по алгоритмам упоминаются стеки (кучи) и очереди
В 1С есть "стеки" и "очереди" - LIFO/FIFO ))))

С другой стороны, стек и очередь без проблем "эмулируются" массивом.
wonderboy; pavlov_dv; RustIG; +3 Ответить
5. RustIG 1884 23.06.25 15:05 Сейчас в теме
(4) лифо где используется сейчас ? ;)
6. starik-2005 3180 23.06.25 15:15 Сейчас в теме
(5)
лифо
В управленческом учете, особенно при росте цен, что у нас некоторым образом имеет место быть. Полезная штука, чтобы оценить реальные реальности.
pavlov_dv; RustIG; +2 Ответить
7. DmitriyV 3 23.06.25 16:21 Сейчас в теме
"В отличие от массивов размер списка может изменяться во время выполнения программы."
Чойта?
8. gml 23.06.25 20:58 Сейчас в теме
(7) В С++/С#. Там память выделяется под массив сразу (количество элементов*размер элемента) одним сплошным куском. Добавление/удаление элементов не предусмотрено. Индексы элемента (а их может быть несколько) однозначно определяют область памяти, в которой находятся данные этого элемента.

Для элементов списков в С++/С# память выделяется динамически. по мере надобности. При удалении элемента списка память освобождается программистом(С++) либо сборщиком мусора (С#). Индексирование/нумерация элементов "из коробки" отсутствует, есть только ссылки на следующий/предыдущий элемент.


Массивы в 1С - вообще-то похожи больше на списки (можно добавлять и удалять любые элементы - правда, при этом сползает вроде-бы присутствующая нумерация/индексация), разные элементы могут иметь разный тип (а вот это - вообще ни на что не похоже...).
brr; RustIG; +2 Ответить
9. SerVer1C 925 23.06.25 21:40 Сейчас в теме
(8) почему же? на питончик:
Прикрепленные файлы:
11. booksfill 24.06.25 12:29 Сейчас в теме
(8)
/С#. ...Добавление/удаление элементов не предусмотрено

Что-то тут не так, а какже Resize для C#?
В С++, да, нельзя менять размер даже динамического массива (можно для этих целей использовать vector, но не суть). Правда, я почти совсем забыл С++ могу врать.


(8)
разные элементы могут иметь разный тип (а вот это - вообще ни на что не похоже...).

Это почему же?
"use strict"
let hh = () => console.log("dddd");
let j = false;
let myArray = ["Яблоко", "Апельсин", 12, j, hh];
for (let myStr of myArray) {
console.log(myStr)
}

hh();
18. gml 24.06.25 23:48 Сейчас в теме
(11)
(11)
какже Resize для C#?


Вот что на этот счет говорит Алиса:
В языке C# изменить размер массива можно с помощью метода Array.Resize. Этот метод выделяет новый массив с указанным размером, копирует элементы из старого массива в новый, а затем заменяет старый массив новым.

Операция получается крайне неэффективная и по памяти, и по времени. Вставлять таким образом элементы по одному (а ведь старые придётся ещё и раздвигать) - совсем некрасиво. В связном списке вставка выполняется гораздо проще.
SerVer1C; RustIG; +2 Ответить
22. booksfill 25.06.25 09:56 Сейчас в теме
(18) Не понял как неэффективность опровергает существование resize, на что было указано в ответ на ваше утверждение: "Добавление/удаление элементов не предусмотрено."

Могу еще добавить, что resize, вроде как, не умеет изменять многомерный массив. :)


Понятия не имею, что под капотом 1С, но, скорее-всего "обычный" массив это - vector, а фиксированный массив - array.
Если это так, то я бы старался использовать фиксированный массивы, когда точно известно кол-во элементов (можно с некоторым запасом).

На небольших коллекциях, конечно, разницу не найти.

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

Но вспомнить когда приходилось работать с огромными массивами в 1С не могу.
В отличие от тз - несчесть любителей запихивать туда результаты запроса.

Хм.... А кстати что у тз под капотом?
Ну пусть в терминологии C# это DataTable.
Но что у нее внутри?
Класс -обертка внутри которого массив элементов класса\структур?

Никто не просвятит?
19. gml 25.06.25 00:00 Сейчас в теме
(13)
Да обычный массив, ничего там в 1С нет сверху.


Вот три определения:

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


Массив в C++ — это определённое число ячеек памяти, расположенных подряд. Нумерация в массивах начинается с нуля, а не с единицы. Массивы в C++ — иммутабельные (неизменяемые). Можно скорректировать значения отдельных элементов, но не сам массив — нельзя изменить его длину или присвоить одному массиву другой.

Массив в C# — это структура данных, содержащая несколько переменных, доступ к которым осуществляется по вычисляемым индексам. Содержащиеся в массиве переменные именуются элементами этого массива. Все они имеют одинаковый тип, который называется типом элементов массива.


Ключевое слово одно и то же "Массив", а определяет оно в разных языках совсем разные понятия.
24. starik-2005 3180 25.06.25 10:33 Сейчас в теме
(19)
Массив
В русском языке это слово означает какую-то совокупность чего-либо. Лесной массив, жилой массив, ... Так что не нужно плодить сущности без необходимости и пытаться найти детали, которых нет. Массив - коллекция с индексом, доступ к элементам которой осуществляется за О(1). Все.
13. starik-2005 3180 24.06.25 14:13 Сейчас в теме
(8)
разные элементы могут иметь разный тип (а вот это - вообще ни на что не похоже...).
Да обычный массив, ничего там в 1С нет сверху. То, что разные типы, так внутри массива лежит указатель на Variant, который сам по себе разный тип. В любом языке ты можешь создать массив указателей, положить в него указатели на разные объекты, а потом или через приведение типа "(тип)указатель", или, если объекты является потомками базового типа, то даже приведения типов не нужно - просто вызывай метод, объект сам найдет его адрес по таблице адресов, которая засовывается в объект при создании для тех самых виртуальных методов - полиморфизмом называется.

Ну и да - существуют динамические массивы. Для них выделяется память порционно. При увеличении размера массива, если размер превышает текущую выделенную для него память, память выделяется дополнительно. Они есть почти везде. В том же C++ есть вектора - в принципе это как раз динамический массив с О(1) для доступа к элементу по индексу.
В C++, vector - это динамический массив, который является частью стандартной библиотеки (STL) и обеспечивает возможность хранения и управления последовательностью элементов одного типа. Он позволяет изменять свой размер во время выполнения программы, добавляя или удаляя элементы.
Преимущества:
vector обеспечивает быстрый доступ к элементам по индексу (как и обычный массив) и позволяет эффективно добавлять элементы в конец (функция push_back).
Недостатки:
Вставка элементов в середину или начало vector может быть неэффективной, так как может потребовать перемещения существующих элементов.

20. RustIG 1884 25.06.25 09:08 Сейчас в теме
(7) это больше относилось к другим языкам, нежели к 1С.

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

это больше относилось к другим языкам, нежели к 1С. - типы в других языках программирования: array и list - отличаются от 1с-овских Массив и СписокЗначений.
В 1С аналог для array и list - это больше тип Массив.
Тип СписокЗначений - это уже "над" или "сверх" массивов - создан для интерактивных целей работы - связан с полем ввода. И все же его также можно использовать программно наравне с Массивом.
33. DmitriyV 3 25.06.25 13:35 Сейчас в теме
(20) Инфостарт все-таки про 1С. Поэтому и ожидание от статьи что это про 1С, по умолчанию. Как знание того что в каких-то других языках массив ограничен, поможет "вывести проект", если проект на 1С?

Я в университете писал программы на pascal, c#, java, php, javascript, Prolog, C, С++, Assembler. Даже какую-то эмуляцию машины Тьюрина программировали, там язык своебразный был, не вспомню название. На тот момент изучали языки и знал тонкости. Сейчас для 1С мне это не нужно. Если буду уходить из 1с в другой, то легко и быстро увижу что для массива указывается длина, как минимум посмотрев на описание синтаксиса.
36. RustIG 1884 25.06.25 14:10 Сейчас в теме
(33)
Я в университете писал программы на pascal, c#, java, php, javascript, Prolog, C, С++, Assembler. Даже какую-то эмуляцию машины Тьюрина программировали, там язык своебразный был, не вспомню название. На тот момент изучали языки и знал тонкости. Сейчас для 1С мне это не нужно. Если буду уходить из 1с в другой, то легко и быстро увижу что для массива указывается длина, как минимум посмотрев на описание синтаксиса.

это все всё понимают...


(33)
Инфостарт все-таки про 1С. Поэтому и ожидание от статьи что это про 1С, по умолчанию. Как знание того что в каких-то других языках массив ограничен, поможет "вывести проект", если проект на 1С?

вы видите человека с мозолями в определенной профессии - сразу отпадают вопросы, что он практик. когда специалист читает литературу по алгоритмам, на сегодняшний день - это в основном в примерах на Питон, Си шарп - все что угодно, кроме 1С - то там такие нюансы встречаются часто, как говориться "глаз мозолит".

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

Я нисколько не умаляю ваши знания и опыт. Проекты 1С для большинства внедренцев и разработчиков - это пока доработать печатные формы и формы документов, отчеты разработать. Я сам упираюсь в то, что задач, где нужны сложные алгоритмы средним и мелким фирмам не надо - не будут платить, в постановке ТЗ не сильны... Мы с вами решаем приземленные задачи... Откуда взяться интересу читать про алгоритмы и знакомиться со сложными алгоритмами матзадач?
37. DmitriyV 3 25.06.25 14:40 Сейчас в теме
(36) "Откуда взяться интересу читать про алгоритмы и знакомиться со сложными алгоритмами матзадач?"

Ну не знаю откуда у меня интерес, он есть и есть. Я на habr постоянно айтишные статьи читаю. Но так чтобы вечером после работы приходить и программировать алгоритмы на условном С. Нет, не хочу. Я вне работы стараюсь не подходить к компьютеру. Я лучше с лука постреляю, в волейбол поиграю, на выходных с палаткой в лес схожу)
elegam; RustIG; +2 Ответить
10. booksfill 24.06.25 12:10 Сейчас в теме
Вот без обид, Вы правда думаете, что кто-то не найдет реализацию/блок-схему той же быстрой сортировки за 5 минут на C#?
Соврал, нашел за 10 секунд,с картинками и реализацией. Не библиотекой, в чем образовательного смысла 0, а своим кодом.

Мне кажется, что от статьи был бы какой-то смысл, если бы там была реализация на 1С.
Тогда. например, можно было бы попробовать тот или иной кусок дать, скажем, на собеседовании junior, ну, когда стало понятно, что по остальному он плавает, но вроде как умный парень.
Вот и пускай не сам пишет, а хотя бы посмотрит на код той же быстрой сортировки, и объяснит, что он делает.

Еще можно свою библиотечку предложить, например, с методами работы с массивами, всякими там, pop/push, shift/unshift, at, toString, compare,BinarySearch, fill, FindAll, sort ... (Не спрашивайте зачем - пусть будет:))
Вы же написали, что преподаватель, в т.ч. и по 1С, вот и осчастливьте студентов - пусть и методы напишут, и их быстродействие посчитают и свои идеи по ускорению предложат.
Например, вспомнят, что в 1С есть поле HTML документа и реализуют работу с массивами через JavaScript и сравнят эффективность.
12. starik-2005 3180 24.06.25 14:06 Сейчас в теме
(10)
Вы правда думаете, что кто-то не найдет реализацию/блок-схему той же быстрой сортировки за 5 минут
Сортировка в 1С, в шарпах, плюсах и далее уже давно не пишется никем - юзаются библиотеки для этого. В 1С сортировка есть у списков значений и таблиц значений, в запросах. Надо массив отсортировать - засунь его в список и выгрузи назад после сортировки. Остальное сортируется в форме, отчете - там для этого кнопки и иные методы есть.

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

Джуна про это спросить? Ну не знаю. Проще спросить как раз о том, как отсортировать массив. Если сделает через список, то уже не джун )))
14. booksfill 24.06.25 15:10 Сейчас в теме
(12)
тобы понимать, как это вообще компьютер делает

По мне очень полезный навык.

А понимание того как работает готовый алгоритм - это не столько про сам алгоритм, сколько про умение работать с кодом в принципе. Если человек не сможет объяснить как работает готовая сортировка, то ...

Особенно в свете пришествия AI, если он не сможет понять, где бред, а где просто неэффективный вариант, совсем все плохо будет.

P.S.
Вы не поверите, но несколько раз просил человека написать запрос, находящий номенклатуру с задвоением наименования. Вот вообще без подводных камней и изысков типа латинских букв, пробелов и т.п.
ВНИМАНИЕ! Разрешив пользоваться интернет.
По результатам сильно расстроился.

Более неприятное чувство было только во времена СССР, когда выяснил, что, не страдающий психическим расстройством и, вообще, нормальный, приятный человек со всеобщим :) средним образованием не знает что такое простая дробь.
Т.е. в его вселенной вообще не было такого понятия, как дробь.
И нет, он не был "художником" и, вообще, обычный рабочий парень.
15. starik-2005 3180 24.06.25 15:27 Сейчас в теме
(14)
Если человек не сможет объяснить как работает готовая сортировка, то ...
Вот у меня друган есть - юрист, он не смог рассказать, как он расставляет фигурки по размеру, при том расставить их по этому самому размеру он смог.

Думаю, что то же самое и с дробями. Ну хрен его знает, что такое "простая дробь". Может это дробь, которая не может сокращаться? Ну мало ли что человек себе думает. Вот если бы ты спросил, что он думает о дробях и слыхал ли когда про числители и знаменатели, то он бы тебе сразу что-то типа 1/2 написал, ибо "пол второго" для него точно что-то значит, например, время обеда. Значит и дроби он знает, просто не знает, что именно вот это и есть та самая "простая дробь". Так что зря ты так про людей. Им нужно задавать много вопросов, чтобы они дали хоть какой-то ответ.
16. booksfill 24.06.25 16:40 Сейчас в теме
(15)
Вот если бы ты спросил, что он думает о дробях и слыхал ли когда про числители и знаменатели, то он бы тебе сразу что-то типа 1/2 написал

Задавал, и рисовал как выглядит. Минут 10 пытался, даже поругались.
Какие там числители и знаменатели. Но, да, скока будет пол-литра и пол-литра знает, негодник. :)

Я многого и не жду от некоторых людей с якобы лучшим образованием, если на них действует реклама типа "наше средство моет до 2-х раз дольше". Но дроби в моем понимании люди не могут не знать, ну хотя бы на уровне 1/2 + 1/2.


(15)
юрист, он не смог рассказать, как он расставляет фигурки по размеру, при том расставить их по этому самому размеру он смог

Отсюда следует, что расставлять фигурки по размеру ему можно доверить только, если их мало и не надо их еще сортировать по весу и объему, да еще и на время. Где-то тут лежит различие между юристом и простым кодером.

Если спросить юриста он что-то такое же скажет про программиста и его понимание как на самом деле работает судопроизводство.
17. starik-2005 3180 24.06.25 16:46 Сейчас в теме
(16)
судопроизводство
Если производство судов, то был я на днях на ВДНХ и общался с челом, который яхту спортивную показывал. Они сейчас 27-метровые начали делать ходовые - не спортивные, но пока еще в серию не пошли. Очень интересно было с ним поболтать на эту тему, особенно про материалы, но ценник - да, не три копья. В фильме "Довод", кстати, гг и главный плохиш как раз на такого типа спортивной яхте соревновались.

По поводу дробей, то многие знают это на базовых понятиях, а не на уровне терминологии. Фактически, дилетант от профессионала уровнем знания терминологии и отличается, при том не факт, что на выходе у профессионала получится лучше, чем у дилетанта.
21. RustIG 1884 25.06.25 09:26 Сейчас в теме
(10)
Вот без обид, Вы правда думаете, что кто-то не найдет реализацию/блок-схему той же быстрой сортировки за 5 минут на C#?
Соврал, нашел за 10 секунд,с картинками и реализацией. Не библиотекой, в чем образовательного смысла 0, а своим кодом.


Вы задаете очень хороший вопрос!

Попробую ответить на него:
1. после прочтения статьи https://infostart.ru/pm/2410072/ - я вновь погрузился в изучение алгоритмов. и вновь открыл для себя много нового и полезного.
2. в представленной статье я увидел начало - первую часть - будут и другие - поэтому самое интересное еще впереди.
3. Но даже в первой части очень много полезного. К примеру, я постоянно задавался вопросом почему нет готовых методов по работе с деревьями и графами.
Оказалось, что это во всех языках так:
Для языков C# и Python нативных средств работы с деревьями нет, поэтому их нужно реализовать самостоятельно.

Реализация деревьев на C# и Python обычно предполагает создание классов для узлов дерева и методов для выполнения операций над деревом.


4. И теперь я подвожу вас к главному - если вы сумеете написать пузырьковую сортировку массива, то с большей вероятностью вы сможете написать сортировку более сложных структур , например дерева (графа).

5. Одно из основных когнитивных пониманий "пузырьковых методов" - обязательное наличие третьего буферного элемента (переменной) temp, без него поменять значения местами не получится. Однажды поняв это, в других задачах и проектах начинаешь действовать по шаблону: поменять в массиве местами Структуры ? - не вопрос - зададим переменную времСтруктуру с теми же ключами.... Массив структур это что у нас ? это более сложная структура данных, аналог джейсон.

6. Образование - это движение от простого к сложному. Проблема любого образования - не объясняют зачем изучать простые вещи и как, и где это пригодится в будущем...
23. booksfill 25.06.25 10:18 Сейчас в теме
(21)
Одно из основных когнитивных пониманий "пузырьковых методов" - обязательное наличие третьего буферного элемента (переменной) temp, без него поменять значения местами не получится.


Не удержусь, есть ограничения по переполнению и типу данных (пузырек с легкостью позволяет сортировать по определенному принципу и не числовые данные), но все же:
a = 10;
b = 20;

a = a + b;
b = a - b;
a = a - b;

(21)
Проблема любого образования - не объясняют зачем изучать простые вещи и как, и где это пригодится в будущем...

В большинстве случаев именно так..

В общем-то, именно это недостаток, как показалось, есть и в статье.
Возьмите что-то одно, например, использование хэш таблиц и попробуйте на их основании создать алгоритм быстрого поиска в персистентных данных. В частности как альтернативу ограничений 1С на создание своих произвольных индексов.
Если получится - будет отличная статья.

А сортировка, что сортировка - кто не хочет в ней разбираться, воспользуется готовым функционалом, кому интересно найдет и быструю и шейкерную и гномью и т.п. Что-то типа доказывания теоремы Пифагора 100500 способами.
25. starik-2005 3180 25.06.25 10:48 Сейчас в теме
(23)
персистентных данных
Слышал я о персисстентных структурах данных, а вот о персистентных данных - нет. Персистентность - фактически свойство сохраняться и восстанавливать сохраненное состояние. Для структур это как раз версионирование, т.е. способность таких вот персистентных структур сохранять свои версии. Поэтому не совсем понял про создание алгоритма быстрого поиска в них. Можно это как-нить развернуть, чтобы и дураку стало ясно?

По поводу сортировки, то оптимальный алгоритм - это создание упорядоченного списка, вставка в который производится за log₂N. Т.к. N растет с каждой вставкой, то алгоритм имеет эффективность чуть лучше, чем O(N x log₂N). Быстрее могут быть только специфические случаи почти упорядоченных списков, в которых количество элементов не на своем месте меньше, чем то самое log₂N.
26. booksfill 25.06.25 11:29 Сейчас в теме
(25)
Персистентность - фактически свойство сохраняться и восстанавливать сохраненное состояние.

Именно, например, это делают таблицы базы (там же, кстати, и версии 1С хранит).

Можно обеспечить подобное поведение и для объектов памяти, на время их существования, лучше используя шаблон "Хранитель" (он в 1С применим без эмуляций классов).

Но спорить не буду, если не нравится слово, то давайте использовать "эмуляция пользовательских индексов на объектах базы данных путем использования хэш таблиц".


(25)
оптимальный алгоритм - это создание упорядоченного списка

Тут не компетентен, но мне кажется быстрее будет использовать обычный неупорядоченный список, еще лучше фиксированный массив. Вставка туда будет быстрей, а потом уже упорядочивание полученного хаоса.
Но зависит от задачи, да.
27. starik-2005 3180 25.06.25 11:39 Сейчас в теме
(26)
Вставка туда будет быстрей, а потом уже упорядочивание полученного хаоса.
Если мы говорим об упорядочивании, то быстрая вставка, а потом дополнительно еще упорядочивание - это как-то избыточно ))) Суть упорядоченного списка как раз в том, что после вставки в него всех значений, список уже упорядочен и больше ничего не надо делать. Это, условно, самый быстрый алгоритм для упорядочивания данных. Может быть квантовые алгоритмы тут могут что-то внести в тему скорости, но там эффективность поиска максимального/минимального значения - это корень квадратный из N. А корень - это сильно больше, чем логарифм. Возможно, квантовая система может сама упорядочиваться за условное О(1), но я тут уже не знаю. Интернеты про это молчат.
Квантовая сортировка на основе поиска:
Некоторые квантовые алгоритмы сортировки основаны на алгоритмах поиска, таких как алгоритм Гровера. Алгоритм Гровера позволяет находить нужный элемент в неупорядоченном массиве за корень квадратный от n операций, в то время как классический алгоритм требует в среднем n операций. Однако, это не означает, что алгоритм Гровера можно напрямую использовать для сортировки, так как для сортировки требуется не просто найти элемент, а найти его место в отсортированном массиве.
28. RustIG 1884 25.06.25 11:59 Сейчас в теме
(23) я вас не понял. вы как будто мой ответ засунули в чат джипити, и выдали его ответ за свой.
Набор мудрогенератора. Попроще напишите. И что за "а минус б"? это точно человек (хомо сапиенс) написал ?
29. SerVer1C 925 25.06.25 12:21 Сейчас в теме
(21)
обязательное наличие третьего буферного элемента (переменной) temp, без него поменять значения местами не получится.
В питоне ещё как получится!
a, b = b, a

Дополню:
В любом Си-подобном языке можно поменять числа через побитовые операции.
Да и в любом другом языке можно подобным хаком (не для всех входных данных сработает) поменять значение чисел:
a = a * b
b = a / b
a = a / b
31. RustIG 1884 25.06.25 13:14 Сейчас в теме
(29) Сергей, все понятно, но это игры в песочнице. Питон - это компиляция определенного кода и алгоритма, в котором
все равно будет использован временный параметр. Я еще в Си помню, как мы добавляли указатель для нового временного элемента в памяти. Использование временной переменной - это универсальный алгоритм менять элементы местами. Побитовая смена - это красиво для чисел. Спасибо за подробный ответ. Я за свою историю подобные красивости не использовал, и в книгах по алгоритмам не встречал, наверное потому, что на практике не используются. Возможно в книге Кнута об этом есть. И все же эти примеры оторваны от контекста.
34. RustIG 1884 25.06.25 13:58 Сейчас в теме
(29) сейчас интересные книги по алгоритмам появились - например изд-в Аст, "Алгоритмы - в задачах и примерах. Самые эффективные способы и решения от сообщества Stack Overflow"
нашел там реализацию пузырьковой сортировки 7 способами на 6 языках. Да, я не знаючи синтаксиса Питон - удостоверился, в Питон именно так меняют местами, в некоторых языках используют метод swap(а,b). Это все лишь синтаксис... В основном используется временная переменная.
Сейчас много появилось книг, не то что 20 лет назад.... Кроме Кнута ничего не было...
35. SerVer1C 925 25.06.25 14:03 Сейчас в теме
(34)
В основном используется временная переменная.
В любом случае в конце значение всё равно попадёт в оперативную память / регистр процессора и будет представлять из себя просто заряд на основе электронов )
38. gml 25.06.25 21:32 Сейчас в теме
(29) ну-ну!!!

поменяйте-ка местами a=1 и b=0...
39. SerVer1C 925 25.06.25 21:34 Сейчас в теме
(38) >>> "(не для всех входных данных сработает)" !!!
а вот XOR'ом или через плюс_минус можно
40. gml 25.06.25 21:39 Сейчас в теме
(39)
а вот XOR'ом можно


Можно, если исходные данные имеют одинаковый размер, в процессоре/языке имеется инструкция/операция побитового XOR и используемый язык программирования позволяет оперировать с числами как с битовыми строками.
30. booksfill 25.06.25 12:24 Сейчас в теме
Не надо ругаться, напишите пожалуйста, что именно не понятно в коде, демонстрирующем замену одного значения на другое, без использования промежуточной переменной.
Заодно было бы интересно почему Вы решили, что общеизвестный код нуждается в помощи ChatGPT.

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


Попробую по шагам (если что это не издевательство,я правда не понимаю на каком шаге Вы споткнулись)
Дано:
две переменные a и b.
a = 10;
b = 20;

Задача:
Поменять значения этих переменных, не используя промежуточную переменную.

Дополнительная цель:
Доказать, что использование промежуточной переменной не во всех случаях является обязательным.

Решение:
- Сложим значения переменных и поместим их в уже существующую переменную а:
a = a + b; // а = 10 + 20 = 30;

- вычтем из переменной а переменную b
b = a - b; // b = 30 - 20 = 10
Теперь b содержит то, значение, что имела переменная а в начале задачи, а именно 10

- теперь вычтем b из а, помня, что сейчас в переменной b содержится уже 10
a = a - b; // а = 30 - 10 = 20

Итак:
Задача решена без использования промежуточной переменной.

Ограничения решения:
Подобный способ обмена значений применим не ко всем типам данных, кроме того, при даже при использовании чисел возможно получить ошибку переполнения (при совпадении знаков) данных в операции a = a + b;
32. RustIG 1884 25.06.25 13:23 Сейчас в теме
(30) в вашем примере нет развития - от малого к великому.
поменяли числа местами - размяли мозги - что дальше? в программировании мы имеем дело со структурами данными , а не с чистой алгеброй - подходы к построению алгоритмов отличаются. Я вас так долго и упрямо подводил к главной мысли, что однажды поняв, как менять местами на простом примере в массиве, вы сможете это сделать в задачах с деревьями. Я не утверждал, что для примитивных числовых данных нельзя придумать другой способ. Во всех общих правилах всегда найдется место упрощению для более простых объектов. В задачах поиска в дереве, для более простых бинарных деревьев находится более простое решение, чем универсальное для всех типов деревьев. Коллеги, вы тут все красавчики, уверен, знаете больше чем остальные. Но я теряю нить обсуждения с вами.
Оставьте свое сообщение