C# Splitting An Array
I need to split an array of indeterminate size, at the midpoint, into two separate arrays.
The array is generated from a list of strings using ToArray().
9 Answers 9
You could use the following method to split an array into 2 separate arrays
I also want to add a solution to split an array into several smaller arrays containing a determined number of cells.
A nice way would be to create a generic/extension method to split any array. This is mine:
Moreover, this solution is deferred. Then, simply call split(size) on your array.
Как получить срез коллекции C#
C#
Введение в Array Slicing(срез массива) в C#
Срез массива в C# — это операция, при которой из массива можно получить подмножество элементов. Это подмножество обычно определяется начальным индексом и количеством элементов, которые необходимо включить в срез массива.
В C # появилось множество различных методов и операторов, которые можно использовать для слайсинга массивов.
Всего существует два логических способа нарезки массива. Один из способов – создать новый массив и добавить к нему срез элементов. Другой – создание оболочки вокруг массива, которая может содержать указатели на определенные элементы внутри массива без создания нового элемента.
Давайте перейдем к коду.
Срез массива используя LINQ
Допустим, у нас есть массив из десяти записей, и мы хотим вернуть пользователю только пять из них с намерением вернуть остальные по запросу. Это известно как пагинация и достигается с помощью двух методов LINQ Skip() и Take() . Итак, давайте импортируем LINQ и используем эти два метода:
Split array into subarrays at minimum cost by minimizing count of repeating elements in each subarray
Given an array arr[] having N integers from the range [1, N] and an integer K, the task is to find the minimum possible cost to split the array into non-empty subarrays that can be achieved based on the following conditions:
- If no unique element is present in the subarray, the cost is K.
- Otherwise, the cost is K + Sum of frequencies of every repeating element.
Examples:
Input: arr[] = <1, 2, 3, 1, 2, 3>, K = 2
Output: 4
Explanation:
Splitting the array into subarrays <1, 2, 3>and <1, 2, 3>generates the minimum cost, as none of the subarrays contain any repeating element.
All other splits will cost higher as one subarray will contain at least one repeating element.
Therefore, the minimum possible cost is 4.Input: arr[] = <1, 2, 1, 1, 1>, K = 2
Output: 6
Naive Approach: The simplest idea to solve the problem is to generate all possible subarrays to precompute and store their respective costs. Then, calculate the cost for every possible split that can be performed on the array. Finally, print the minimum cost from all the splits.
Follow the steps below to solve the problem:
- Pre-compute the cost of every subarray based on the above conditions.
- Generate all possible split that can be performed on the array.
- For each split, calculate the total cost of every splitter subarray.
- Keep maintaining the minimum total cost generated and finally, print the minimum sum.
Time Complexity: O(N!)
Auxiliary Space: O(N)
Efficient Approach: The idea is to use Dynamic Programming to optimize the above approach. Follow the steps below to solve the problem:
Реализация быстрой сортировки на C/C++
До текущего момента единственной публикацией о сортировке в моем блоге была статья про реализацию топологической сортировки вершин графа. Пора это исправлять! Строить грандиозных планов о покорении всех видов сортировки я не стану, а начну с одной из самых популярных — быстрая сортировка.
Я буду далеко не первым и не последним, кто скажет, что «быстрая» она только в названии и сейчас существует куча аналогов, и вообще для каждого типа данных нужна своя сортировка. Да, это все правда, но эта правда не отменяет простого факта, что собственноручная реализация быстрой сортировки оттачивает навыки программирования в общем, и она всегда будет в университетских курсах, я в этом уверен. Из этих же соображений был выбран язык программирования для реализации, ибо тут же можно попрактиковаться в использовании указателей в C/C++.
Предлагаю перейти к делу и для начала кратко рассмотреть суть алгоритма.
Как работает быстрая сортировка
Схему алгоритма можно описать таким образом:
- Выбрать опорный элемент в массиве — часто встречается вариант с центральным элементом.
- Разделить массив на две части следующим образом: все элементы из левой части, которые больше или равны опорному, перекидываем в правую, аналогично, все элементы из правой, которые меньше или равны опорному кидаем в левую часть.
- В результате предыдущего шага в левой части массива останутся элементы, которые меньше или равны центральному, а в правой — больше либо равны.
Наглядно это можно показать таким образом:
|———————|—————————|———————|
| mas[i] <= mid | mid = mas[size/2] | mas[i] >= mid |
|———————-|—————————|———————| - Рекурсивно повторяем действие для левой и правой части массива.
Заходы в рекурсию прекратятся в тот момент, когда размер обоих частей будет меньше или равен единице.
Иллюстрацию одного шага алгоритма я позаимствовал отсюда , больно уж она наглядная.
Рекурсивная реализация быстрой сортировки
На вход функция принимает сам массив(указатель на начало) и его размер.
Заключение
Это задание одновременно помогает понять, как работает рекурсия и учит прослеживать изменение данных во время исполнения алгоритма. Рекомендуется «дойти» и написать это самостоятельно, но все же вот моя реализация, мне и самому она может пригодиться. На этом у меня все, спасибо за внимание!