Ответы пользователя по тегу Массивы
  • Как в C++ создать массив с неизвестным числом элементов?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно через new[] выделить массив:
    cin >> n;
    int *array = new int[n];
    // ввод, и работа с массивом.
    
    // не забудьте в конце удалить выделенную память.
    delete[] array;
    Ответ написан
  • Выдает ошибку, как ее можно исправить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Индексы в сравнении напутаны. Вы делаете один проход пузырька (как бы полусортировка) поочередно по возрастанию каждого столбца. Вместо того, чтобы сделать все проходы сравнивая один и тот же 0-ой столбец.
    Ответ написан
    Комментировать
  • Как лучше развернуть двумерный массив?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Если не обязательно делать поворт на месте, то вся суть алгоритма вот в этой одной строке:
    result[i][j] = arr[n-1-j][i];
    Надо только циклы прогнать по нужным границам, да массив нужного размера создать.

    Если матрица квадратная, то элементы сдвигаются по кругу в четверках - и это можно сделать без дополнительного массива . Можно делать сдвиг по кругу со временной переменной. Что-то вроде этого:
    tmp = arr[i][j];
    arr[i][j] = arr[n-1-j][i];
    arr[n-1-j][i] = arr[n-1-i][n-1-j];
    arr[n-1-i][n-1-j] = arr[j][n-1-i];
    arr[j][n-1-i] = tmp;


    И надо аккуратно границы цикла подобрать, чтобы там только левый верхний угол обработался. Иначе вы 4 раза в каждом круге сдвините, и ничего не поменяется.
    Ответ написан
    Комментировать
  • Почему непопулярен динамический многомерный массив?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Случай, когда у вас динамически добавляются новые строки, но все они фиксированной длины - редок. Да и в этом случае можно завести vector из array'ов. Ничего городить нового, тем более в стандартах, не надо.

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

    Но, да, итерация как бы медленнее будет. Но не на много. В одном случае у вас лишняя адресация, а в другом - умножение. И там и там есть обращение к памяти лишнее, но в векторе векторов - читаются данные из массива указателей, а в плоской структуре - одна и та же длина строк. Ну и данные не так локально в векторе лежат. В целом не стоит эта проблема особого внимания.
    Ответ написан
    4 комментария
  • При выводе на экран список сокращается. Как сделать чтоб выводился весь список?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    pd.options.display.max_rows = 1000 перед выводом.
    Ответ написан
    3 комментария
  • Как оптимизировать элементы на двухмерном массиве(пиксели) в прямоугольники?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    По идее, должно быть пофигу, сколько там вызовов. Каждый вызов newRect закрашивает какие-то пиксели и работает пропорционально площади. Поэтому объединение клеток в прямоугольники сократит лишь количество вызовов, но не сократит время работы никак.

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

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

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

    Но вообще, задача разбить область на минимальное количество прямоугольников - очень сложная. Решение скорее всего будет медленнее прописовки каждой клетки отдельно.
    Ответ написан
    Комментировать
  • Как перемешать между собой слова создав новые?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Т.е. вам надо сгенерировать перестановку заданных слов? Ну без разницы же, что перемешивать: числа или слова.
    Получите массив из ваших слов, разбив строку по пробелам. Потом перемешайте массив стандартным алгоритмом. Потом выведите их через пробел.

    Стандартный алгоритм перемешивания таков:
    for i in range(len(a)):
      j = random.randint(0, i);
      a[i], a[j] = a[j], a[i]


    Тут поддерживается инвариант, что первые i элементов равномерно и случайно перемешаны. На каждой итерации выбирается случайная позиция для нового элемента (возможно последняя и элемент никуда не переместится). Дальше достаточно только лишь поменять новый элемент со стоящим на его месте. Ведь по инварианту все остальные элементы уже случайно перемешаны и в итоге случайно перемешанными оказываются N+1 элементов.
    Ответ написан
  • Как сравнить группу элементов в одномерном массиве в с++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Разбейте задачу на подзадачи:

    1) Проверить, что данный элемент надо удалить
    1.1) Проверить, что элемент не уникальный
    1.2) Проверить, что элемент - не первый среди одинаковых (один-то его надо оставить)
    2) Удалить элемент из массива дописав 0 в конце.

    Все эти пункты выполняются циклом. в первых пунктах будет удобно завести булевую переменную, которая после цикла будет содержать значение проверки.
    Ответ написан
    Комментировать
  • Как в php сравнить два огромных txt файла до 100гб, удалив дубликаты?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Файлы надо отсортировать. А потом это стандартная задача слияния отсортированных списков (читаете по одной строке из файла, меньшую по алфавитному порядку записываете в ответ, читаете из ее файла следующую строку. Если 2 строки одинаковые - читайте следующую строку в каждом файле. Если файл закончился, считайте что там бесконечно большая лексикографически строка).

    Сортировка очень больших файлов - тоже стандартная тема. Лучше всего, наверно, подойдет radix sort. Правда, нужно будет свободного места на диске чтобы копии файлов тоже помещались, да лучше с запасом. Тут надо будет 3 раза (или какая там у вас длина строки) прочитать файл. Прочитанные строки надо распихивать по 256 (или сколько там символов различных может быть) файлам. Потом все эти файлы надо собрать воедино в нужном порядке.

    Надо только хорошо порыться в документации - нужны функции php которые читают файл построчно и не грузят его весь целиком в память. Если, конечно, у вас не ~128гб оперативки. Тогда лучше каждый файл загрузить в память целиком и сортировать quick sort'ом.
    Ответ написан
    Комментировать
  • Массив. выделение памяти. ошибка сегментирования. но почему?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Во-первых, код надо вставлять текстом, через кнопку </> в редакторе.
    Во-вторых, пройдитесь вы дебаггером.

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

    В вашем случае arr[i] + abs(min), очевидно, может запрасто выйти за границы 0.. temp_arr_length-1.
    Ответ написан
    Комментировать
  • Как задать условие для цикла?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    По уму, надо выделять последовательность нулей в цикле и там смотреть, а не с начала ли дня она идет и не до конца ли дня.

    Но можно проще. Считайте вообще все последовательности нулей. до какой-то пары (это значит сейчас 0 - а следующаяя ячейка не ноль.). Но так посчитаются недо-окна перед первыми парами. Вы можете эти недо-окна подсчитать. Это просто те дни, в которых в начале стоит 0. Но тут, вы правильно заметили, проблема. День в котором одни нули посчитается недо-окном и вычтется, но ничего к ответу не прибавит. Поэтому вам надо отдельно прибавить количество дней из одних только нулей.
    Ответ написан
    Комментировать
  • Сдвиг двумерного массива, появление ошибки Stack around the variable 'arr' was corrupted. Как исправить без переписывания кода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Код исправляется элементарно. Надо внутренний цикл по j гнать не до 0, а до 1. Что бы не вылезать за границу массива, вы же там к j-1 -ому элементу обращаетесь. А поскольку вы делаете swap, то вы меняете элементы массива с памятью перед ним. Массив - локальная переменая, а значит он лежит на стеке и вот это вот затирание памяти рядом с массивом и есть это самое "Stack around the variable 'arr' was corrupted".

    Ну и по стилю - вместо i > -1 обычно пишут i >= 0.
    Ответ написан
    Комментировать
  • Как сделать чтобы нейросеть поняла входные данные?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы сети скармливаете какие-то 2 картинки. У нее 2 input'а

    print(model.predict([image,image2]))

    Втавьте вот в этот код выше перед вызовом predict вывод размеров image и image2.

    Сдается мне, что вы одну картинку как-то на 2 куска порезали и так и скормили сети. Если это не ваш код, то он возможно ожидает на вход картинку 128x64.
    Ответ написан
  • Можно ли изменить массив (объединить слова в нём) до и после определенного слова?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Можно. Для этого можно, например, пройтись циклом по словам формируя список-ответ. Если текущее слово не содержит символ параграфа, то его надо или добавить к списку ответа, или добавить к последнему слову там. Или проще может быть поддерживать переменную с текущим объединением слов. Если слово в списке не соедржит парагафа - добавляйте к переменной. Если встретили прагараф, то добавляйте в ответ переменную и слово с параграфом и отчищайте переменную.
    Ответ написан
    Комментировать
  • Почему неправильно выводит максимальное число?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Код работает ровно так, как написан.

    Можете строчка за строчкой объяснить, что происходит в коде? Я начал, вы дополните в остальных строчках. Сразу должно стать понятно, где ошибка в логике:

    numbers = input().split()               # получаем в numbers массив из отдельных слов в введенной строке
    flag = 0                                # инициализируем счетчик нулем
    for i in range(len(numbers)):           # проходимся по всей длине массива (по всем словам)
        if numbers[i].isdigit() == True:    # Если текущее слово состоит только из цифр (т.е. оно число)
            flag += 1                       # Увеличиваем счетчик
    if flag == len(numbers):                # если все слова в строке - числа
        for i in range(len(numbers)-1):     # ???
            print(numbers[i], numbers[i+1]) # ???
            if numbers[i] < numbers[i+1]:   # ???
                mx = numbers[i+1]           # ???
    print(mx)
    Ответ написан
  • Перебрать все комбинации массивов строк?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Рекурсивная функция должна принимать текущий набор строк и номер следующего массива. Функция циклом перебирает строку из следующего массива, добавляет эту строку к текущему набору и вызывается рекурсивно. После вызова последнюю строку надо из текущего набора удалить. Если в начале функции вы видите, что обработаны уже все массивы - выводите текущий набор в ответ и возвращайтесь из функции.

    Еще, естественно, надо передавать в функцию массив массивов строк - ваши исходные данные.
    Ответ написан
    Комментировать
  • Трёхмерный массив с разными размерами внутренних массивов?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Используйте vector<vector<vector<int>>>> - каждая строка/столбец могут быть любого нужного вам размера.

    Еще можно хранить ваши массивы как указатели в одном массиве указателей. Ведь эти сишные массивы - это по сути и есть указатели на начало. Вот только в таком виде вам придется как-то где-то помнить их размеры и вручную высчитывать индексацию в виде a[i*6+j], b[i*7+j].
    Ответ написан
    1 комментарий
  • Как соединить в пары элементы двумерного массива?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Надо обязательно массив массивов? Или подойдут кортежи? Так-то есть zip.

    А дальше можно через np.asarray и map преобразовать массив touples в массив массивов.
    Ответ написан
  • Как работают пермутации (arrays)?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Это рекурсивный метод генерации всех перестановок. Сначала рекурсивно генерируется перестановки для всех символов, кроме первого. Потом к каждой перестановке в каждую возможную позицию вставляется первый символ.

    Так, для генерации всех перестановок "abc", сначала рекурсивно будет получен массив {"bc", "cb"}, потом для каждого его элемента в ответ будет добавлена перестановка с "a" вставленным в позицию 0, 1 и 2: "abc", "bac", "bca" для первого элемента, и "acb", "cab" и "cba" для второго.

    Или вам не понятно, что делают reduce, slice, substring, concat, join?
    Ответ написан
    Комментировать
  • Как определить, можно ли из символов первого массива создать строку идентичную второму массиву?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Подсчитайте, сколько каждого символа встречается в первой строке и убедитесь, что во второй - их не больше.
    Самый простой способ сделать это - это завести массив счетчиков на 256 элементов. Для символов первой строки увеличивайте счетчик по индексу static_cast<int>(s[i]) на 1, для второй строки - вычитайте 1. Если где-то получили -1, то составить нельзя.

    И еще, это же у вас C++, судя по тегам и cin? Ну так используйте std::string. Зачем вы сишные строки выделяете?
    Ответ написан
    Комментировать