“Real” is not an acceptible synonym for “80-bit floating-point number.” Real numbers aren't even countable, much less in a bijection to a set of size 2^80.
Navigation: Home | THE LOG | Log Archives | Resume | Contact Info | Public Key | SSL | Math Applets | Site Map | RSS2 | Atom | Backend
“Real” is not an acceptible synonym for “80-bit floating-point number.” Real numbers aren't even countable, much less in a bijection to a set of size 2^80.
Hal Canary |
Computer Science, Computers & Code, Mathematics |
2010-12-09 00:20:44 UTC
Permanent Link |
Comments Off (but feel free to email)
Even though I’ve studied this algorithm a couple of times, I’ve never had to implement it before. So I assigned it to myself.
/** should have a time-complecity of O(N×log(N))
and a space-compelcity of O(N) **/
void mergesort(int N, int array[]) {
int k; // k is the block size.
int x; //x is which block we are at.
int i,j; //indices in old[]
int p; // index in new[]
int ilimit,jlimit; //end of blocks.
int *hold = malloc(sizeof(hold) * N);
if (hold == NULL) {
fprintf(stderr,"malloc failed\n");
exit(2);
}
int *new = hold;
int *old = array;
int *tmp;
for (k = 1; k < N; k *= 2) {
p = 0;
for (x = 0; x < N; x += (2*k)) {
i = x;
ilimit = i + k;
j = ilimit;
if (ilimit >= N) {
while (i < N)
new[p++] = old[i++];
break; //out of for-loop
}
jlimit = j + k;
if (jlimit >= N)
jlimit = N;
while (1) {
if (old[i] < old[j]) {
new[p++] = old[i++];
if (i == ilimit) {
while (j < jlimit)
new[p++] = old[j++];
break; //out of while-loop
}
} else {
new[p++] = old[j++];
if (j == jlimit) {
while (i < ilimit)
new[p++] = old[i++];
break; //out of while-loop
}
}
} // End while loop.
} // End inner for loop.
tmp = old; old = new; new = tmp;
}// End outer for loop.
if (old != array)
for (i = 0; i < N; i++)
array[i] = old[i];
free(hold);
return;
}
Next step is to translate to Java and use .compareTo() with arrays of references:
public static void mergeSort(Comparable array[]) {
int N = array.length;
int k; // k is the block size.
int x; // x is which block we are at.
int i,j; //indices in old[]
int p; // index in new[]
int ilimit,jlimit; // end of blocks.
Comparable hold [] = new Comparable [N];
Comparable neww [] = hold;
Comparable old [] = array;
Comparable tmp [];
for (k = 1; k < N; k *= 2) {
p = 0;
for (x = 0; x < N; x += (2*k)) {
i = x;
ilimit = i + k;
j = ilimit;
if (ilimit >= N) {
while (i < N)
neww[p++] = old[i++];
break; //out of for-loop
}
jlimit = j + k;
if (jlimit >= N)
jlimit = N;
while (true) {
if (old[i].compareTo(old[j]) < 0) {
neww[p++] = old[i++];
if (i == ilimit) {
while (j < jlimit)
neww[p++] = old[j++];
break; //out of while-loop
}
} else {
neww[p++] = old[j++];
if (j == jlimit) {
while (i < ilimit)
neww[p++] = old[i++];
break; //out of while-loop
}
}
} // End while loop.
} // End inner for loop.
tmp = old; old = neww; neww = tmp;
}// End outer for loop.
if (old != array)
for (i = 0; i < N; i++)
array[i] = old[i];
}
Hal Canary |
Computer Science, Computers & Code |
2010-05-08 07:55:23 UTC
Permanent Link |
Comments Off (but feel free to email)
About ten years ago, I wrote a C++ program to print out all the prime numbers less than a given number using trial division. I recently went back and looked at the program and realized how little I knew at the time. Even though my first CS class covered object-oriented programming in C++, we never really talked the about simply using the new keyword on arrays to make use of dynamic arrays. The topic was covered in my second CS class, which I took three years later.
int *array;
int array_size = 128;
array = new int[array_size];
/* do somthing to fill the array */
int *temparray = new int[(array_size * 2)];
for (int i = 0; i < array_size; i++)
temparray[i] = array[i];
array_size = array_size * 2;
delete [] array;
array = temparray;
In the last few years, I have realized that for the simplest progrmas, C is often more efficient and straightforward than C++. In C, the code looks exactly the same, except that new is replaced by malloc() and delete is replaced by free().
int *array;
int *temparray;
int array_size = 128;
int i;
array = malloc(array_size * sizeof(*array));
/* do somthing to fill the array */
temparray = malloc(array_size * 2 * sizeof(*temparray));
for (i = 0; i < array_size; i++)
temparray[i] = array[i];
array_size = (array_size * 2);
free(array);
array = temparray;
Hal Canary |
Computer Science, Computers & Code |
2010-03-17 09:00:38 UTC
Permanent Link |
Comments Off (but feel free to email)
This example of why the right algorithm matters comes directly from my textbook. Here’s the C implementation:
Bad:
#include <stdio.h>
#include <stdlib.h>
long int fib(long int n) {
if (n==0)
return 1;
if (n==1)
return 1;
return fib(n-1) + fib(n-2);
}
int main(int argc, char *argv[]) {
if (argc <= 1) {
fprintf(stderr, "argument?\n\n");
exit(1);
}
long int n = atol(argv[1]);
printf("f(%li) = %li\n",n,fib(n));
return 0;
}
Good:
#include <stdio.h>
#include <stdlib.h>
long int fib(long int n) {
long a=1, b=1, c;
int i;
for (i = 1;i < n; i++){
c = a + b; a = b; b = c;
}
return b;
}
int main(int argc, char *argv[]) {
if (argc <= 1) {
fprintf(stderr, "argument?\n\n");
exit(1);
}
long int n = atol(argv[1]);
printf("f(%li) = %li\n",n,fib(n));
return 0;
}
Output:
$ time ./fib2 38 ; time ./fib1 38 f(38) = 63245986 real 0m0.002s user 0m0.000s sys 0m0.004s f(38) = 63245986 real 0m1.492s user 0m1.428s sys 0m0.004s
And you can show how nicely the good algorithm scales up by pulling out a bigint library, like Java’s BigInteger:
public class fib3 {
public static String fib(int n) {
java.math.BigInteger a,b,c;
int i;
a = b = java.math.BigInteger.ONE;
for (i = 1;i < n; i++) {
c = a.add(b); a = b; b = c;
}
return b.toString();
}
public static void main(String[] args) {
if (args.length < 1) {
System.err.println("argument?");
System.exit(1);
}
int n = Integer.parseInt(args[0]);
System.out.print("f(" +
Integer.toString(n) + ") = ");
System.out.println(fib(n));
}
}
Hal Canary |
Computer Science, Computers & Code |
2010-03-11 18:48:25 UTC
Permanent Link |
Comments Off (but feel free to email)
You are currently browsing the archives for the Computer Science category.
Copyright 1997-2012 by Hal Canary.
mailto: halcanary at gmail dot com
http://halcanary.org