-
-
Notifications
You must be signed in to change notification settings - Fork 49
Open
Description
The Heap's algorithm which crawls over all permutations seem a good testcase, cause You can not be "smart" and use language specific optimisations, it's just pure operations on integer arrays (indexing, changing content of);
function allperms(N)
elts = collect(1:N)
c = ones(Int, N)
countfirst = 0
n = 1
k = 0
# doit(elts)
countfirst += elts[1]
@inbounds while n <= N
if c[n] < n
k = ifelse(isodd(n), 1, c[n])
elts[k], elts[n] = elts[n], elts[k]
c[n] += 1
n = 1
countfirst += elts[1]
# doit(elts)
else
c[n] = 1
n += 1
end
end
return countfirst
end
a similar implementation in c
:
void swap(int *p, int a, int b){
int tmp;
tmp = p[a];
p[a] = p[b];
p[b] = tmp;
}
long heaps(int N){
long count = 0;
int n;
int *p = malloc(sizeof(int)*N);
int *c = calloc(N, sizeof(int));
for (n=0; n < N; n++){
p[n] = n+1;
// c[n] = 0;
}
count += p[0];
for (n=0; n < N;){
if (c[n] < n){
swap(p, (n%2 ? c[n] : 0), n);
count += p[0];
c[n]++;
n = 0;
} else {
c[n] = 0;
n++;
}
}
free(p);
free(c);
return count;
}
EDIT: @inbounds
macro makes a fairer comparison to C (and speeds julias version!)
StefanKarpinski, AzamatB and rschwarz
Metadata
Metadata
Assignees
Labels
No labels