У меня проблема с сортировкой матрицы: каждая строка содержит как минимум два числа, а остальные столбцы имеют значение «Нет». Мне нужно отсортировать эту матрицу так, чтобы:
Каждый столбец располагался в порядке возрастания, что позволяло использовать значения None между числами.
Каждое число появляется только один раз в столбце.
Если две строки имеют перекрывающиеся значения в одном или нескольких столбцах (т. е. они имеют одно и то же число хотя бы в одном столбце и не имеют конфликтующих значений), их следует объединить в одну строку.
может быть размещен только после второй или третьей строки.
Поскольку допустимые диапазоны для 1 и 6 не пересекаются, алгоритм приходит к выводу, что вставка новой строки невозможна. Однако мы можем увидеть это, изменив матрицу на:
Как я могу улучшить логику вставки строки или сортировки матрицы, чтобы она надежно обрабатывала эти случаи?
Есть ли какие-либо математические концепции или алгоритмы, которые можно было бы применить к этой проблеме и помочь мне оптимизировать или упростить решение? В частности, меня интересует, как идентифицировать и обобщать «отдельные» разделы матрицы, как показано в примере, где два левых столбца независимы от двух правых столбцов.
В моем нынешнем подходе я предполагаю, что нам дана отсортированная матрица и новая строка, которую необходимо вставить, соблюдая при этом следующие правила:
Каждый столбец остается в порядке возрастания.
Числа могут появляться в каждом столбце только один раз.
Если какие-либо числа перекрываются в строке, они должны оставаться в той же строке.
Вот как работает этот подход:
Проверьте, появились ли числа в новой строке в соответствующих столбцах:
Для каждого числа в новой строке алгоритм выполняет поиск, появлялось ли это число уже в соответствующем столбце матрицы.
Если число появилось в своем столбце, то номер новой строки должен быть вставлен в ту же строку, что и та, где ранее появлялось число.
Обрабатывать случаи где числа раньше не появлялись:
Если ни одно из чисел в новой строке ранее не появлялось в своих столбцах, алгоритм:
Определяет разрешенный диапазон для каждого вставляемого числа (т. е. позиции, в которых число может быть размещено, сохраняя возрастающий порядок в столбце).
Находит перекрытие разрешенных диапазонов для всех чисел в новой строке.
Если есть допустимое перекрытие, новую строку можно вставить в первую доступную позицию в этом перекрывающемся диапазоне.
Вернуть false, если действительная позиция не найдена:
Если нет перекрываются в разрешенных диапазонах чисел, алгоритм приходит к выводу, что вставить строку без нарушения правил невозможно, и возвращает False.
У меня проблема с сортировкой матрицы: каждая строка содержит как минимум два числа, а остальные столбцы имеют значение «Нет». Мне нужно отсортировать эту матрицу так, чтобы: [list] [*]Каждый столбец располагался в порядке возрастания, что позволяло использовать значения None между числами.[*]Каждое число появляется только один раз в столбце. [*]Если две строки имеют перекрывающиеся значения в одном или нескольких столбцах (т. е. они имеют одно и то же число хотя бы в одном столбце и не имеют конфликтующих значений), их следует объединить в одну строку. [/list] Действительные и недопустимые комбинации: [list] [*]Действительная комбинация:
[code][1, 2, None, None][/code] и [None, 2, 3, None] можно объединить с [1, 2, 3, None], поскольку они имеют общее значение 2 во втором столбце и не имеют противоречивых значений. [/list]
[*]Недопустимая комбинация: [list][code][1, 2, None, None][/code] и [None, None, 3, 4] нельзя объединять, поскольку ни в одном столбце у них нет общих чисел. [*][code][1, 2, None, None][/code] и [2, 2, None, None] невозможно объединить из-за конфликта значений в первом столбце. [/list]
К концу этого процесса матрица должна быть отсортирована так, чтобы: [list] [*]Каждое число появляется не более одного раза в каждом столбце. [*]Каждый столбец располагается в порядке возрастания. [*]Если процесс невозможен (например, не существует допустимой комбинации) , функция должна возвращать False. [/list] Пример проблемы: Рассмотрим следующую матрицу:< /p> [code]matrix = [ [1, 2, None, None], [None, None, 3, 4], [3, 5, None, None] ] [/code] Теперь я хочу вставить новую строку: [code]new_row = [None, 1, 6, None] [/code] Мой текущий подход проверяет разрешенные диапазоны чисел в новой строке. Он обнаруживает: [list] [*][code]1[/code] можно размещать только над первой строкой.
[*][code]6[/code] может быть размещен только после второй или третьей строки. Поскольку допустимые диапазоны для 1 и 6 не пересекаются, алгоритм приходит к выводу, что вставка новой строки невозможна. Однако мы можем увидеть это, изменив матрицу на: [code][ [None, None, 3, 4], [1, 2, None, None], [3, 5, None, None] ]
[/code]
[/list] Вопросы: [list] [*]Как я могу улучшить логику вставки строки или сортировки матрицы, чтобы она надежно обрабатывала эти случаи? [*]Есть ли какие-либо математические концепции или алгоритмы, которые можно было бы применить к этой проблеме и помочь мне оптимизировать или упростить решение? В частности, меня интересует, как идентифицировать и обобщать «отдельные» разделы матрицы, как показано в примере, где два левых столбца независимы от двух правых столбцов. [/list]В моем нынешнем подходе я предполагаю, что нам дана отсортированная матрица и новая строка, которую необходимо вставить, соблюдая при этом следующие правила: [list] [*]Каждый столбец остается в порядке возрастания. [*]Числа могут появляться в каждом столбце только один раз. [*]Если какие-либо числа перекрываются в строке, они должны оставаться в той же строке. [/list] Вот как работает этот подход: [list] [*] [b]Проверьте, появились ли числа в новой строке в соответствующих столбцах[/b]: [list] Для каждого числа в новой строке алгоритм выполняет поиск, появлялось ли это число уже в соответствующем столбце матрицы. [*]Если число [b]появилось[/b] в своем столбце, то номер новой строки должен быть вставлен в ту же строку, что и та, где ранее появлялось число. [/list]
[*][b]Обрабатывать случаи где числа раньше не появлялись[/b]: [list] Если ни одно из чисел в новой строке ранее не появлялось в своих столбцах, алгоритм:
Определяет [b]разрешенный диапазон[/b] для каждого вставляемого числа (т. е. позиции, в которых число может быть размещено, сохраняя возрастающий порядок в столбце). Находит [b]перекрытие разрешенных диапазонов[/b] для всех чисел в новой строке. [*]Если есть допустимое перекрытие, новую строку можно вставить в первую доступную позицию в этом перекрывающемся диапазоне. [/list]
[*][b]Вернуть false, если действительная позиция не найдена[/b]: [list] Если нет перекрываются в разрешенных диапазонах чисел, алгоритм приходит к выводу, что вставить строку без нарушения правил невозможно, и возвращает False. [/list]
У меня проблема с сортировкой матрицы: каждая строка содержит как минимум два числа, а остальные столбцы имеют значение «Нет». Мне нужно отсортировать эту матрицу так, чтобы:
Каждый столбец располагался в порядке возрастания, что позволяло...
У меня проблема с сортировкой матрицы: каждая строка содержит как минимум два числа, а остальные столбцы имеют значение «Нет». Мне нужно отсортировать эту матрицу так, чтобы:
Каждый столбец располагался в порядке возрастания, что позволяло...
Мне нужно выполнить вычисления для каждой записи матрицы в Rcpp::List. Список содержит произвольную комбинацию плотных и разреженных матриц. Этот список передается в C++ из R. Мой вопрос касается как подходов к реализации, так и эффективности. Моя...
Работая в Google Sheet, я имею список мест работы или отделов людей в столбцах A или G, их имена в столбцах B или H и их добавочные номера в столбцах C или I. Он отформатирован таким образом, чтобы его можно было распечатать. на одном листе бумаги...
Работая в Google Sheet, я имею список мест работы или отделов людей в столбцах A или G, их имена в столбцах B или H и их добавочные номера в столбцах C или I. Он отформатирован таким образом, чтобы его можно было распечатать. на одном листе бумаги...