字符串算法分析的排列

时间:2016-06-09 16:10:13

标签: c++ string algorithm permutation

我有两种打印字符串排列的算法

这是第一个。

#include<iostream>

int fact(int f)
{
   if(f == 0)
      return 1;
  return f*fact(f-1);
}
int main()
{   
   char A[] = "abc";
   int size = strlen(A);
   int per = fact(size);  // per is the number of permutations we will get

   int j = 0;   // j is the index of the elements of A we will swap

   // this is the algorithm
   for(int i=1;i<=per;i++)
   {   
      cout << A << endl;
      if(j == size-1)
         j = 0;
      swap(A[j],A[j+1]);
      j++;
   }

    return 0;
}

这是第二个。

// C program to print all permutations of the input string

#include <stdio.h>
#include <string.h>

// Function to swap values at two pointers 
void swap(char *x, char *y)
{    
   char temp = *x;
   *x = *y;
   *y = temp;
}

// Function to print permutations of string
This function takes three parameters:
1. String
2. Starting index of the string or sub-string
3. Ending index of the string 

void permute(char *a, int l, int r)
{
  int i;
  if (l == r)
     printf("%s\n", a);
  else
  {
     for(i = l; i <= r; i++)
     {  
        swap((a+l), (a+i));
        permute(a, l+1, r);
        swap((a+l), (a+i)); //backtrack to retain the original string
     }
  }
}

int main()
{
  char str[50];

  gets_s(str);

  int n = strlen(str);
  permute(str, 0, n-1);

  return 0;
}

根据我的说法......两者都应该表现相同....而且他们实际上做......但只适用于小输入......例如:“abc”,“abcd”。但是当字符串变大时..例如: “abcdefghi”......第一个花了很多时间而不是第二个。

我很难分析为什么第二个比第一个表现更好。可以有人向我解释这个吗?

1 个答案:

答案 0 :(得分:0)

在开始打印之前,只需在main函数中添加以下语句:

std::cout.sync_with_stdio(false);

这会禁用每个IO操作的标准C-streams同步。

详细了解here