Перечислите все возможные комбинации k целых чисел между 1 … n (n, выбирают k),

Вы можете использовать API-помощник Material-ui


    Some Text

. Вот ссылка на все настройки https://material-ui.com/api/grid/ .

11
задан Asaf R 13 April 2010 в 14:10
поделиться

4 ответа

Asaf,

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

Отредактируйте свой вопрос объяснить Ваш алгоритм.

Одна вещь очевидна - объем потребляемой памяти Вашего кода является ужасающим. Даже для скромных значений n количество combinatations легко будет в миллиардах, которые потребуют большей памяти, чем большинство компьютеров имеет. Плюс Вы используют динамично выращенные массивы, которые продолжают перераспределять и копировать себя, когда они растут. Плюс Ваша программа генерирует подмножества в различных массивах и объединяет их. В целом, Ваша программа будет много раз требовать объема памяти, который был бы идеально необходим для хранения списка, и это потратит большую часть из, время, просто копируя данные назад и вперед.

Если у Вас должны быть все значения в массиве сразу, по крайней мере, начаться путем вычислений размера массива, Вам нужно - n! / (n-k)! / k! - и затем просто заполнение его.

Еще лучше был бы код, который "лениво" просто вычислил каждого члена последовательности, поскольку это было необходимо. Посмотрите этот вопрос от связанной боковой панели вопросов

2
ответ дан 3 December 2019 в 09:42
поделиться

Вот относительно простая/эффективная программа 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#) в Ваш список.

-1
ответ дан 3 December 2019 в 09:42
поделиться

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()));
9
ответ дан 3 December 2019 в 09:42
поделиться

Этот парень, кажется, проделали серьезную работу в области комбинаторики с использованием C # (CodeProject):

Перестановки, комбинации и вариации с использованием C # Generics

1
ответ дан 3 December 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: