473,399 Members | 4,192 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,399 software developers and data experts.

How to generate all possible permutations with repetitions?

Hello,

I need help with an algoritm that given a set of "n" distinct
numbers will
generate all the possible permutations of fixed length "m" of these
numbers WITH repetitions (a total of n^m possibilities). For example:

given the set {1, 2} would output: 111,112,121,122,211,212,221,222 if
we fix m=3.

What I could do so far is an iterative algorithm which could be used
only if we know before runnin the program "m" and "n" which is not
often the case :)

int n=2; //stores the numebr of elements in the set
int m=3; //stores the length of the desired permutation
char s[] = "12"; //stores our set of numbers
char s1[] = new char[m]; //will store every permutation generated (of
length 3)
int i, j, k; // loop variables

for (i=0; i<length(s); i++) { // first loop
for (j=0; j<length(s); j++) { // second loop
for (k=0; k<length(s); k++) { // third loop
// this code is executed 2^3=8 times
s1[0] = s[i];
s1[1] = s[j];
s1[2] = s[k];
printf("%s\n", s1); // print the permutation
}
}
}
How can I generalize this for any m and n? I suppose some sort of a
recursive algorithm should be used (I don't believe this can be done
by simply iterating). Unfortunately I don't feel much confortable with
recursion. In fact what I am looking for is what would be the
recursive version of the following multiple loops algorithm:

for (i=0;i<n;i++)
for (j=0;j<n;j++)
for (k=0;k<n;k++)
for (l=0;l<n;l++)
etc... (m times)
// Do something here
}
}
}
}
Could you help me with some pseudo code please? And please appologize
me if the term "permutation" that I used here is not correct.

Thanks,
Darin
Nov 14 '05 #1
4 8183


darin dimitrov wrote:
Hello,

I need help with an algoritm that given a set of "n" distinct
numbers will
generate all the possible permutations of fixed length "m" of these
numbers WITH repetitions (a total of n^m possibilities). For example:

given the set {1, 2} would output: 111,112,121,122,211,212,221,222 if
we fix m=3.

What I could do so far is an iterative algorithm which could be used
only if we know before runnin the program "m" and "n" which is not
often the case :)

int n=2; //stores the numebr of elements in the set
int m=3; //stores the length of the desired permutation
char s[] = "12"; //stores our set of numbers
char s1[] = new char[m]; //will store every permutation generated (of new is C++, not C: Use malloc() length 3)
int i, j, k; // loop variables

for (i=0; i<length(s); i++) { // first loop
for (j=0; j<length(s); j++) { // second loop
for (k=0; k<length(s); k++) { // third loop
// this code is executed 2^3=8 times
s1[0] = s[i];
s1[1] = s[j];
s1[2] = s[k];
printf("%s\n", s1); // print the permutation
}
}
} Your C++ code lacks a delete s1 here, in C: a free() call.
How can I generalize this for any m and n? I suppose some sort of a
recursive algorithm should be used (I don't believe this can be done
by simply iterating). Unfortunately I don't feel much confortable with
recursion. In fact what I am looking for is what would be the
recursive version of the following multiple loops algorithm:

for (i=0;i<n;i++)
for (j=0;j<n;j++)
for (k=0;k<n;k++)
for (l=0;l<n;l++)
etc... (m times)
// Do something here
}
}
}
}
Could you help me with some pseudo code please? And please appologize
me if the term "permutation" that I used here is not correct.


You need a depth counter to find out in which "loop" you are,
then you run the respective loop.
Try this:

#include <stdio.h> /* puts, fputs; stderr, stdout */
#include <stdlib.h> /* malloc, exit */
#include <string.h> /* strlen */

void permutate_n_plus (char *str, size_t n, const size_t maxdepth,
const char *baseset, const size_t numbase)
{
size_t i;
char *currpos = &str[n-1];
const char *currchar = baseset;

if (n<maxdepth) { /* We are in an outer loop */
/* run through the baseset for the current depth,
** call permutate_n_plus() for greater depths */
for (i=0; i<numbase; i++) {
*currpos = *currchar++;
permutate_n_plus(str, n+1, maxdepth, baseset, numbase);
}
}
else { /* We are in the innermost (output) loop */
/* run through the baseset for the current depth,
** write out the result */
for (i=0; i<numbase; i++) {
*currpos = *currchar++;
fputs(str, stdout);

/* Uncomment this for immediate output
fflush(stdout);
*/
}

}
}

int main (int argc, char **argv)
{
char *string, *baseset;
size_t maxdepth;
unsigned long tmp;

if (argc!=3) {
puts("Usage:\n\t<program> baseset width");
exit(EXIT_SUCCESS);
}

baseset = argv[1];
if ( (tmp = strtoul(argv[2],NULL,10)) == 0 )
exit(EXIT_SUCCESS);

if ( (maxdepth = (size_t) tmp) != tmp ) {
fputs("width too large", stderr);
exit(EXIT_FAILURE);
}

if ( (string = malloc(maxdepth + 2)) == NULL ) {
fputs("cannot allocate memory for output string", stderr);
exit(EXIT_FAILURE);
}

/* insert separator and terminate string */
string[maxdepth] = '\t';
string[maxdepth+1] = '\0';

permutate_n_plus(string, 1, maxdepth, baseset, strlen(baseset));
puts("");

free(string);
exit(EXIT_SUCCESS);
}

-------
BTW: You do not need recursion. If the overall number of runs through
the second-to-innermost loop is less than ULONG_MAX, you can use one
loop index to designate the position to be changed.
Another way is creating an array of depth counters each of which runs
through the number of different characters just in the way it would
happen when you were using the recursive call. And so on... :-)
Cheers
Michael
--
E-Mail: Mine is a gmx dot de address.

Nov 14 '05 #2
"darin dimitrov" <da************@hotmail.com> wrote in message
news:2b**************************@posting.google.c om...
I need help with an algoritm that given a set of "n" distinct
numbers will
generate all the possible permutations of fixed length "m" of these
numbers WITH repetitions (a total of n^m possibilities). For example:

given the set {1, 2} would output: 111,112,121,122,211,212,221,222 if
we fix m=3. [snip code that wasn't quite C anyway] How can I generalize this for any m and n? I suppose some sort of a
recursive algorithm should be used (I don't believe this can be done
by simply iterating).


#include <stdio.h>
#include <stdlib.h>

int main(void) {
int i, n, m;
int *a;
char s[] = "12";

n = sizeof s - 1;
m = 3;

a = malloc(m * sizeof *a);
if (!a) abort();
for (i = 0; i < m; ++i)
a[i] = 0;

do {
for (i = m - 1; i >= 0; --i)
putchar(s[a[i]]);
putchar('\t');

for (i = 0; i < m; ++i)
if (++a[i] < n) break; else a[i] = 0;
} while (i < m);

putchar('\n');
free(a);

return 0;
}

Alex
Nov 14 '05 #3
On 26 Oct 2004 05:51:45 -0700
da************@hotmail.com (darin dimitrov) wrote:
Hello,

I need help with an algoritm that given a set of "n" distinct
numbers will
generate all the possible permutations of fixed length "m" of these
numbers WITH repetitions (a total of n^m possibilities). For example:

given the set {1, 2} would output: 111,112,121,122,211,212,221,222 if
we fix m=3.

What I could do so far is an iterative algorithm which could be used
only if we know before runnin the program "m" and "n" which is not
often the case :)
You can run iterative algorithms where you only know the number of
iterations at run time.
int n=2; //stores the numebr of elements in the set
// comments are not recommended on Usenet since even if you use a
language where they are supported (which means C99 on this group) they
don't survive line wrapping. So you should stick to /* */ style
comments for posting.
int m=3; //stores the length of the desired permutation
char s[] = "12"; //stores our set of numbers
char s1[] = new char[m]; //will store every permutation generated (of
You seem to be talking a foreign language here. comp.lang.c++ is just
down the hall on the right. We only talk C here.
length 3)
See, the comment wrapped.
int i, j, k; // loop variables

for (i=0; i<length(s); i++) { // first loop
for (j=0; j<length(s); j++) { // second loop
for (k=0; k<length(s); k++) { // third loop
You could use a block of indexes and only one loop and increment the
indicies them like you do digits in a number when counting. I.e. when
one of them you keep going to you get to it's last valid value then next
time reset it an increment the next 1.
// this code is executed 2^3=8 times
s1[0] = s[i];
s1[1] = s[j];
s1[2] = s[k];
The above would then be a loop.
printf("%s\n", s1); // print the permutation
}
}
}
<snip>
Could you help me with some pseudo code please? And please appologize
me if the term "permutation" that I used here is not correct.


I've given you some hints. If you want to discuss algorithms further
then please take it to somewhere like comp.programming and if you want
to discuss problems with coding in C++ take it to comp.lang.c++. If, you
decide to implement it using C instead (using malloc/free instead of
new/delete, then once you have some code you can bring it here to
discuss it. I also suggest reading the FAQ (google for comp.lang.c FAQ).
--
Flash Gordon
Sometimes I think shooting would be far too good for some people.
Although my email address says spam, it is real and I read it.
Nov 14 '05 #4
Thanks to all of you who responded to my request despite the fact that
I posted some C/C++ mixture that wasn't very useful. The code I posted
was just to show my point (I never wrote in an editor). In fact I was
looking for the algorithm, more than its implementation and I should
have posted my question in comp.programming. But your posts were
excellent and helped me so much so I don't regret posting here. Flash,
I have taken into consideration your remarks.

Nov 14 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Laphan | last post by:
Hi All This is a strange request, but I just cannot fathom how to do it. In theory the requirement is very basic, but in practise its a noodle!! I have 10 team names like so: Team A Team...
10
by: Steve Goldman | last post by:
Hi, I am trying to come up with a way to develop all n-length permutations of a given list of values. The short function below seems to work, but I can't help thinking there's a better way. ...
20
by: John Trunek | last post by:
I have a set of X items, but want permutations of length Y (X > Y). I am aware of the permutation functions in <algorithm>, but I don't believe this will do what I want. Is there a way, either...
6
by: chiara | last post by:
Hi everybody! I am just at the beginning as a programmer, so maybe this is a stupid question...Anyway,I need to write a function in C to generate generate all possible strings of given length...
11
by: Girish Sahani | last post by:
Hi guys, I want to generate all permutations of a string. I've managed to generate all cyclic permutations. Please help :) def permute(string): l= l.append(string) string1 = '' for i in...
8
by: girish | last post by:
Hi, I want to generate all non-empty substrings of a string of length >=2. Also, each substring is to be paired with 'string - substring' part and vice versa. Thus, gives me , , , , , ] etc....
20
by: anurag | last post by:
hey can anyone help me in writing a code in c (function) that prints all permutations of a string.please help
8
by: Mir Nazim | last post by:
Hello, I need to write scripts in which I need to generate all posible unique combinations of an integer list. Lists are a minimum 12 elements in size with very large number of possible...
9
by: Alan Isaac | last post by:
I need access to 2*n random choices for two types subject to a constraint that in the end I have drawn n of each. I first tried:: def random_types(n,typelist=): types = typelist*n...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.