【问题标题】:Why computer takes more time in arranging different permutations?为什么计算机需要更多时间来安排不同的排列?
【发布时间】:2016-05-08 00:42:30
【问题描述】:

我刚刚学习了堆的算法。好吧,对象的数量越大,系统将它们安排在所有可能的排列中的时间就越多。 但是当我在计算器中计算该数量对象的阶乘时,结果是即时的。 为什么会发生同样的情况。的排列比计算阶乘需要更多时间?

   #include <stdio.h>
   #include <stdlib.h>
   #include<iostream>
    using namespace std;
    int len;
   void swap (int *x, int *y)
  {
     int temp;
     temp = *x;
     *x = *y;
     *y = temp;
  }
   void print(const int *v)
  {
     int i;
     int size = len;
     if (v != 0) {
     for ( i = 0; i < size; i++) {
     cout<< v[i] ;
}
cout<<'\n';
}
}
void heappermute(int v[], int n) {
int i;
if (n == 1) {
    print(v);
}
else {
    for (i = 0; i < n; i++) {
        heappermute(v, n-1);
        if (n % 2 == 1) {
            swap(&v[0], &v[n-1]);
    }
        else {
            swap(&v[i], &v[n-1]);
        }
   }
  }
 }

 int main()
 {
  int num[11];
  int  i;
  cout<<"How many numbers you want to enter: ";
  cin>>len;
  cout<<"\nEnter the numbers: ";
  for ( i = 0 ; i < len; i++)
   cin>>num[i];
  heappermute(num, len);
  return 0;
 }

【问题讨论】:

  • 你是如何计算排列的?显示代码。我怀疑一种方法可能是生成所有排列并计算它们,这比通过数学计算出有多少要昂贵得多。
  • @ShadowRanger 我已经编写了代码。这是我用的。
  • printfscanf 在 C++ 中通常不受欢迎。
  • @VermillionAzure:这段代码中没有一个特定于 C++ 的东西;想知道它是否真的是 C 或 C11 之类的,并且标签是错误的。
  • 另外,您的swap 方法正在将intchar 值交换,其中输入都指向int 数据,您将在这里得到各种数据丢失.

标签: sorting c++11 permutation heaps-algorithm


【解决方案1】:

您正在为您的计算机程序和您的计算器分配两个不同的任务。生成一组对象的每一个可能的排列与找到这些排列的数量是一个不同的问题。

十亿以下有多少个正偶数?这些是什么? (全部列出。)哪一个需要更长的时间才能弄清楚?

除了列出所有可能性之外,还有其他方法可以计算阶乘。请参阅this question,它给出了朴素的递归方法 (F(n) = n*F(n-1)),即 Omega(n em>2 log n) 还有一个 O(n log n log log n em>) 算法。

也可以估计一个阶乘,它可能足够接近。我不确切知道您的计算器使用的是什么方法,但一种可能是Stirling's approximation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2013-09-09
    • 2022-06-16
    相关资源
    最近更新 更多