Вы можете использовать API-помощник Material-ui
Some Text
. Вот ссылка на все настройки https://material-ui.com/api/grid/ .
Asaf,
Вы просите, чтобы мы оценили Ваш алгоритм, но Вы не объясняете свой алгоритм - даже в комментариях к коду. Таким образом, Вы хотите, чтобы все провели час или больше инженерного анализа алгоритма из кода, именно так мы можем понять Ваш вопрос, прежде чем мы ответим на это?
Отредактируйте свой вопрос объяснить Ваш алгоритм.
Одна вещь очевидна - объем потребляемой памяти Вашего кода является ужасающим. Даже для скромных значений n количество combinatations легко будет в миллиардах, которые потребуют большей памяти, чем большинство компьютеров имеет. Плюс Вы используют динамично выращенные массивы, которые продолжают перераспределять и копировать себя, когда они растут. Плюс Ваша программа генерирует подмножества в различных массивах и объединяет их. В целом, Ваша программа будет много раз требовать объема памяти, который был бы идеально необходим для хранения списка, и это потратит большую часть из, время, просто копируя данные назад и вперед.
Если у Вас должны быть все значения в массиве сразу, по крайней мере, начаться путем вычислений размера массива, Вам нужно - n! / (n-k)! / k! - и затем просто заполнение его.
Еще лучше был бы код, который "лениво" просто вычислил каждого члена последовательности, поскольку это было необходимо. Посмотрите этот вопрос от связанной боковой панели вопросов
Вот относительно простая/эффективная программа NCR, которую я записал только что в C:
main(n,k){float t=0,r=1;for(scanf("%d, %d",&n,&k);t++<k;r*=(1+n-t)/t);printf("%.0f\n",r);}
Хорошо... читаемая версия. =] (Не уверенный, если это 1:1 соответствующее с вышеупомянутым.)
void nCr(int n, int k) {
float curK = 0, r = 1;
while(curK < k) {
++curK;
printf("%.0f\n", r);
r *= (1 + n - curK) / curK;
}
}
Вместо печати Вы могли yield
или безотносительно (я не знаю C#) в Ваш список.
In C++ given the following routine:
template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Thomas Draper */
if ((first == last) || (first == k) || (last == k))
return false;
Iterator itr1 = first;
Iterator itr2 = last;
++itr1;
if (last == itr1)
return false;
itr1 = last;
--itr1;
itr1 = k;
--itr2;
while (first != itr1)
{
if (*--itr1 < *itr2)
{
Iterator j = k;
while (!(*itr1 < *j)) ++j;
std::iter_swap(itr1,j);
++itr1;
++j;
itr2 = k;
std::rotate(itr1,j,last);
while (last != j)
{
++j;
++itr2;
}
std::rotate(k,itr2,last);
return true;
}
}
std::rotate(first,k,last);
return false;
}
You can then proceed to do the following:
std::string s = "123456789";
std::size_t k = 3;
do
{
std::cout << std::string(s.begin(),s.begin() + k) << std::endl;
}
while(next_combination(s.begin(),s.begin() + k,s.end()));
Этот парень, кажется, проделали серьезную работу в области комбинаторики с использованием C # (CodeProject):
Перестановки, комбинации и вариации с использованием C # Generics