The code is just a basic, rough implementation of this stuff in case anyone is interested in studying the theory of how they work below (no comments or good variable names included, sorry…). It covers a: Merge sort, Quick sort, Radix (LSD) sort, Binary search, Linked-List hash table, & Pipe/Fork-Word-Counting map reduce (in Python & C).
Running sorts.py
('key-hash', 'jonnjonn', '->', '0x8bb05860') ('key-value:', 'jonnjonn', '=', {'home': '/home/jonnjonn', 'gid': 4, 'uid': 4, 'name': 'Jon Chipps'}) ('key-value:', 'jonnjonn', '=', {'home': '/home/_jonnjonn_', 'gid': 4, 'uid': 4, 'name': 'Jon Chipps'}) ('key-hash', 'jonnjono', '->', '0xf4c7560') ('key-value:', 'jonnjono', '=', {'home': '/home/jonnjono', 'gid': 5, 'uid': 5, 'name': 'Jon Chipps'}) ('key-value:', 'jonnjono', '=', {'home': '/home/_jonnjono_', 'gid': 5, 'uid': 5, 'name': 'Jon Chipps'}) ('key-hash', 'jonxjonp', '->', '0x2494c160') ('key-value:', 'jonxjonp', '=', {'home': '/home/jonxjonp', 'gid': 6, 'uid': 6, 'name': 'Jon Chipps'}) ('key-value:', 'jonxjonp', '=', {'home': '/home/_jonxjonp_', 'gid': 6, 'uid': 6, 'name': 'Jon Chipps'}) ('key-hash', 'jonpjonx', '->', '0xe346c4e0') ('key-value:', 'jonpjonx', '=', {'home': '/home/jonpjonx', 'gid': 7, 'uid': 7, 'name': 'Jon Chipps'}) ('key-value:', 'jonpjonx', '=', {'home': '/home/_jonpjonx_', 'gid': 7, 'uid': 7, 'name': 'Jon Chipps'}) ('map-reduce', 'search', ['better', 8]) Sorting... ('merge_r:', 262145, 'items', 'took', 1.4660530090332031, 'seconds', '385a7adb') ('quick_r:', 262145, 'items', 'took', 1.087796926498413, 'seconds', '385a7adb') ('radixlsd_f:', 262145, 'items', 'took', 1.1461758613586426, 'seconds', '385a7adb') Searching... ('bin_search_r:', True, 'index', 1368, '=', 51966, 'took', 2.5033950805664062e-05, 'seconds')
Running ./sorts 2> /dev/null
key-hash:jonnjonn=0x8bb05860 look:22624/-1/jonnjonn:(nil)/(nil)/(nil) look:22624/0/jonnjonn:0x20c2060/0x20c2010/(nil) jonnjonn={uid:jonnjonn, name:Jon Chipps, uid:1, gid:1, home:/home/jonnjonn} look:22624/0/jonnjonn:0x20c2060/0x20c2010/(nil) look:22624/0/jonnjonn:0x20c2060/0x20c2080/(nil) jonnjonn={uid:jonnjonn, name:Jon Chipps, uid:1, gid:1, home:/home/_jonnjonn_} key-hash:jonnjono=0xf4c7560 look:30048/-1/jonnjono:(nil)/(nil)/(nil) look:30048/0/jonnjono:0x20c20d0/0x20c2010/(nil) jonnjono={uid:jonnjono, name:Jon Chipps, uid:2, gid:2, home:/home/jonnjono} look:30048/0/jonnjono:0x20c20d0/0x20c2010/(nil) look:30048/0/jonnjono:0x20c20d0/0x20c20f0/(nil) jonnjono={uid:jonnjono, name:Jon Chipps, uid:2, gid:2, home:/home/_jonnjono_} key-hash:jonxjonp=0x2494c160 look:49504/-1/jonxjonp:(nil)/(nil)/(nil) look:49504/0/jonxjonp:0x20c2140/0x20c2010/(nil) jonxjonp={uid:jonxjonp, name:Jon Chipps, uid:3, gid:3, home:/home/jonxjonp} look:49504/0/jonxjonp:0x20c2140/0x20c2010/(nil) look:49504/0/jonxjonp:0x20c2140/0x20c2160/(nil) jonxjonp={uid:jonxjonp, name:Jon Chipps, uid:3, gid:3, home:/home/_jonxjonp_} key-hash:jonpjonx=0xe346c4e0 look:50400/-1/jonpjonx:(nil)/(nil)/(nil) look:50400/0/jonpjonx:0x20c21b0/0x20c2010/(nil) jonpjonx={uid:jonpjonx, name:Jon Chipps, uid:4, gid:4, home:/home/jonpjonx} look:50400/0/jonpjonx:0x20c21b0/0x20c2010/(nil) look:50400/0/jonpjonx:0x20c21b0/0x20c21d0/(nil) jonpjonx={uid:jonpjonx, name:Jon Chipps, uid:4, gid:4, home:/home/_jonpjonx_} merge-r:70/ms quick-r:40/ms radixlsd-r:30/ms binsearch-r[13455]=51966 mapreduce-search('better'):8
–code–
sorts.py
#!/usr/bin/python import hashlib import os import random import re import select import sys import time def merge_r(list): m = len(list) if (m < 2): return list q = (m / 2) l = list[0:q] r = list[q:m] n = (m - q) # recursive call on half-split lists l = merge_r(l) r = merge_r(r) # merge sort core loop i = 0; li = 0; ri = 0 while (i < m): if ((li < q) and (ri < n)): if (l[li] < r[ri]): list[i] = l[li]; i += 1; li += 1 else: list[i] = r[ri]; i += 1; ri += 1 else: if (li >= q): while (ri < n): list[i] = r[ri]; i += 1; ri += 1 if (ri >= n): while (li < q): list[i] = l[li]; i += 1; li += 1 return list def quick_r(list): llen = len(list) if (llen < 2): return list lptr = 0; pivp = (llen / 2); rptr = (llen - 1) pivv = list[pivp] # search for any left & right values to swap around our pivot point while (1): if (lptr > rptr): break # ignore any left & right values which are already in place while (list[lptr] < pivv): lptr += 1 while (list[rptr] > pivv): rptr -= 1 # perform a left & right swap if the left index is less than the right index if (lptr <= rptr): temp = list[lptr]; list[lptr] = list[rptr]; list[rptr] = temp lptr += 1; rptr -= 1 # note: at this point the left & right pointers should have crossed each other # recursive call on the left-half list l = quick_r(list[0:rptr+1]) # save any middle items that are not being processed any further m = [] if ((lptr - rptr) > 1): m = list[rptr+1:lptr] # recursive call on the right-half list r = quick_r(list[lptr:llen]) return (l + m + r) def radixlsd_f(list): llen = len(list) if (llen < 2): return list i = 0; m = 1 while (i < m): # create buckets for decimal digits 0-9 buckets = (10*[None]) x = 0 while (x < llen): # find the longest decimal integer during the first round if (i == 0): temp = abs(list[x]); d = 1 while (temp > 0): temp = (temp / 10) d += 1 m = max(m, d) # place the integer in its related bucket for this round b = ((list[x] / (10 ** i)) % 10) if (buckets[b] == None): buckets[b] = [] buckets[b].append(list[x]) x += 1 # assign the bucket lists back into the main list to be sorted again blist = [] for k in range(0, 10): if (buckets[k] != None): blist.extend(buckets[k]) #print(list,buckets[0:10],blist) list = blist i += 1 return list def bin_search_r(list, item, lo=None, hi=None): if ((lo == None) or (hi == None)): lo = 0 hi = len(list) mid = ((hi - lo) / 2) #print(lo,mid,hi,list[lo+mid]) if (list[lo + mid] == item): return (lo + mid) if ((hi - lo) < 1): return -1 if (list[lo + mid] < item): return bin_search_r(list, item, lo=lo+mid+1, hi=hi) return bin_search_r(list, item, lo=lo, hi=hi-mid-1) class HashTable: def __init__(self): self.size = (2**16) self.data = ([[]]*self.size) def hash(self, data): i = 0; l = len(data); j = 0 p = 0; z = l; h = 0 while ((j < l) or (j < 256)): c = ord(data[i]) s = (24 - ((j % 4) * 8)) p = (p | (c << s)) if (s == 0): #print("hash",hex(h),"^",hex(p),"^",hex(z)) h = (h ^ (p ^ z)) p = 0 z = (((z+(c+j)) + (z^(c^j)) + (z*(c*j)) + (z&(c&j))) & 0xffffffff) i = ((i + 1) % l) j = (j + 1) if (p != 0): #print("hash",hex(h),"^",hex(p),"^",hex(z)) h = (h ^ (p ^ z)) return h def look(self, k): i = (self.hash(k) % self.size) j = -1 for e in self.data[i]: if (e[0] == k): j = ((j + 1) * -1) break j -= 1 return [i, j] def g(self, k): k = str(k) z = self.look(k) i = z[0]; j = z[1] #print("get",i,j) try: return self.data[i][j][1] except: return None def s(self, k, v): k = str(k) z = self.look(k) i = z[0]; j = z[1] #print("set",i,j) if (j < 0): self.data[i].append([k, v]) else: self.data[i][j][1] = v class MapReduce: def __init__(self): self.pids = [] def map(self): self.pids = [] self.data = [] for x in range(0, 3): (r, w) = os.pipe() p = os.fork() if (p == 0): os.close(r) w = os.fdopen(w, "w") f = open("/tmp/textfile%d.txt" % (x), "r") d = f.read().lower().replace("\r", " ").replace("\n", " ") d = re.sub("[^a-z]+", " ", d) d = re.sub(" [ ]+", " ", d) l = d.split(" ") f.close() m = {} for n in l: if (not n): continue if (not n in m.keys()): m[n] = 0 m[n] += 1 g = {} for k in m.keys(): if (not m[k] in g.keys()): g[m[k]] = [] g[m[k]].append(k) l = g.keys() l = sorted(l) for k in l: w.write("%d %s\n" % (k, " ".join(g[k]))) w.close() sys.exit(0) else: os.close(w) r = os.fdopen(r, "r") self.pids.append([p, r, "", 0]) while (1): inplist = [] for c in self.pids: if (c[3] == 0): inplist.append(c[1]) if (len(inplist) < 1): break (inpready, outready, errready) = select.select(inplist, [], []) for s in inpready: for c in self.pids: if (c[1] == s): d = c[1].read() if (not d): c[3] = 1 else: c[2] += d for c in self.pids: os.wait() for c in self.pids: for l in c[2].split("\n"): self.data.append(l) def reduce(self): self.count = {} for l in self.data: if (l.strip() == ""): continue m = l.split(" ") n = int(m[0]) for w in m[1:]: if (not w in self.count.keys()): self.count[w] = 0 self.count[w] += n def search(self, word): try: return [word, self.count[word]] except: return [word, 0] def main(): print("") ht = HashTable() i = 4 for k in ["jonnjonn", "jonnjono", "jonxjonp", "jonpjonx"]: print("key-hash",k,"->",hex(ht.hash(str(k)))) ht.s(k, {"uid":k,"name":"Jon Chipps","uid":i,"gid":i,"home":"/home/%s"%(k)}) print("key-value:",k,"=",ht.g(k)) ht.s(k, {"uid":k,"name":"Jon Chipps","uid":i,"gid":i,"home":"/home/_%s_"%(k)}) print("key-value:",k,"=",ht.g(k)) print("") i += 1 mr = MapReduce() mr.map() mr.reduce() print("map-reduce","search",mr.search("better")) print("") numa = []; numb = []; numc = [] #sys.stderr.write(str(2**18)+"\n") for x in range(0, 2**18): r = int(random.random() * (10**7)) numa.append(r); numb.append(r); numc.append(r) #sys.stderr.write(str(r)+"\n") numa.append(51966); numb.append(51966); numc.append(51966) print("Sorting...") a=time.time();m=merge_r(numa);b=time.time();h=hashlib.md5(str(m)).hexdigest();print("merge_r:",len(m),"items","took",b-a,"seconds",h[0:8]) a=time.time();q=quick_r(numb);b=time.time();i=hashlib.md5(str(q)).hexdigest();print("quick_r:",len(q),"items","took",b-a,"seconds",i[0:8]) a=time.time();r=radixlsd_f(numc);b=time.time();j=hashlib.md5(str(r)).hexdigest();print("radixlsd_f:",len(r),"items","took",b-a,"seconds",j[0:8]) if ((h != i) or (i != j)): for x in range(0, 2**18): sys.stderr.write(str(m[x])+" "+str(q[x])+" "+str(r[x])+"\n") sys.exit(0) print("Searching...") a=time.time();k=bin_search_r(m, 51966);b=time.time();print("bin_search_r:",51966 in m,"index",k,"=",m[k],"took",b-a,"seconds") print("") if (__name__ == "__main__"): main()
mr.c
char **mr_data = NULL; int mr_llen = 0; char **mr_words = NULL; int *mr_counts = NULL; int mr_index(char **list, int size, char *item) { int x; for (x = 0; x < size; ++x) { if (strcmp(list[x], item) == 0) { return x; } } return -1; } void mr_lower(char *word) { while (*word != '\0') { *word = (*word | 0x60); ++word; } } char *mr_word(char *word) { int x; char *c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; char *a = NULL, *b = NULL; while ((a == NULL) || (b == NULL)) { if (*word == '\0') { break; } if (a == NULL) { int f = 0; for (x = 0; x < 52; ++x) { if (*word == c[x]) { f = 1; } } if (f == 1) { a = word; } } else if (b == NULL) { int f = 0; for (x = 0; x < 52; ++x) { if (*word == c[x]) { f = 1; } } if (f == 0) { b = word; } } ++word; } if (b != NULL) { *b = '\0'; } return a; } void mr_map() { int x, y, z; long size; char filename[1024]; int rw[3][2]; char *data = NULL; int cmax = 1; mr_llen = 0; mr_words = NULL; mr_counts = NULL; for (x = 0; x < 3; ++x) { pipe(rw[x]); pid_t p = fork(); if (p == 0) { close(rw[x][0]); bzero(filename, 1020 * sizeof(char)); snprintf(filename, 1010, "/tmp/textfile%d.txt", x); FILE *f = fopen(filename, "r"); fseek(f, 0, SEEK_END); size = ftell(f); fseek(f, 0, SEEK_SET); data = malloc((size + 24) * sizeof(char)); bzero(data, (size + 20) * sizeof(char)); fread(data, size + 10, sizeof(char), f); fclose(f); char *w = data; while ((w = mr_word(w)) != NULL) { mr_lower(w); //printf("[%d] (%s)\n", x, w); int i = mr_index(mr_words, mr_llen, w); if (i < 0) { mr_llen = (mr_llen + 1); mr_words = realloc(mr_words, mr_llen * sizeof(char *)); mr_counts = realloc(mr_counts, mr_llen * sizeof(int)); i = (mr_llen - 1); mr_words[i] = strdup(w); mr_counts[i] = 0; } mr_counts[i] += 1; cmax = max(cmax, mr_counts[i]); w += (strlen(w) + 1); } write(rw[x][1], &size, 1 * sizeof(long)); for (y = 1; y <= cmax; ++y) { int f = 0; bzero(data, (size + 20) * sizeof(char)); snprintf(data, (size + 10) * sizeof(char), "%d", y); for (z = 0; z < mr_llen; ++z) { if (mr_counts[z] == y) { strncat(data, " ", size + 10 - strlen(data)); strncat(data, mr_words[z], size + 10 - strlen(data)); free(mr_words[z]); f = 1; } } strncat(data, "\n", size + 10 - strlen(data)); if (f == 1) { write(rw[x][1], data, strlen(data)); } } close(rw[x][1]); free(data); free(mr_counts); free(mr_words); exit(0); } else { close(rw[x][1]); } } mr_data = malloc(3 * sizeof(char *)); for (x = 0; x < 3; ++x) { read(rw[x][0], &size, 1 * sizeof(long)); mr_data[x] = malloc((size + 24) * sizeof(char)); bzero(mr_data[x], (size + 20) * sizeof(char)); char *w = mr_data[x]; while (1) { mr_llen = read(rw[x][0], w, size + 10 - strlen(mr_data[x])); if (mr_llen < 1) { break; } w += mr_llen; } //printf("%s\n",mr_data[x]); close(rw[x][0]); wait(NULL); } } void mr_reduce() { int x; mr_llen = 0; mr_words = NULL; mr_counts = NULL; for (x = 0; x < 3; ++x) { char *w = mr_data[x], *p, *q; int c = 0, f = 0; while (*w != '\0') { if (*w == '\n') { c = 0; f = 0; ++w; continue; } if (*w == ' ') { f += 1; ++w; continue; } if (f == 0) { c = ((c * 10) + (*w - '0')); ++w; continue; } else { p = strchr(w, ' '); q = strchr(w, '\n'); if (p == NULL) { p = q; } else if (q != NULL) { if (q < p) { p = q; } } if (p != NULL) { char t = *p; *p = '\0'; //printf("mr-add[%d]+=(%s:%d)\n", x, w, c); int i = mr_index(mr_words, mr_llen, w); if (i < 0) { mr_llen = (mr_llen + 1); mr_words = realloc(mr_words, mr_llen * sizeof(char *)); mr_counts = realloc(mr_counts, mr_llen * sizeof(int)); i = (mr_llen - 1); mr_words[i] = strdup(w); mr_counts[i] = 0; } mr_counts[i] += c; *p = t; w = p; continue; } } } } } int mr_search(char *word) { int i = mr_index(mr_words, mr_llen, word); if (i > -1) { return mr_counts[i]; } return -1; }
ht.c
#define ht_size 65536 struct ht_data_s { char *k; void *v; struct ht_data_s *n; }; typedef struct ht_data_s ht_data_t; ht_data_t ht_data[ht_size]; int ht_stat = 0; unsigned long ht_hash(char *data) { unsigned long i = 0, l = strlen(data), j = 0; unsigned long p = 0, z = l, h = 0; while ((j < l) || (j < 256)) { unsigned int c = data[i]; unsigned int s = (24 - ((j % 4) * 8)); p = (p | (c << s)); if (s == 0) { h = (h ^ (p ^ z)); p = 0; } z = (((z+(c+j)) + (z^(c^j)) + (z*(c*j)) + (z&(c&j))) & 0xffffffff); i = ((i + 1) % l); j = (j + 1); } if (p != 0) { h = (h ^ (p ^ z)); } return h; } ht_data_t *ht_look(unsigned long *i, long *j, char *k) { if (ht_stat == 0) { bzero(ht_data, ht_size * sizeof(ht_data_t)); ht_stat = 1; } *i = (ht_hash(k) % ht_size); *j = -1; ht_data_t *ht_item = &(ht_data[*i]); while ((*ht_item).k != NULL) { if (strcmp((*ht_item).k, k) == 0) { *j = (((*j) + 1) * -1); break; } *j = ((*j) - 1); if ((*ht_item).n == NULL) { break; } ht_item = (*ht_item).n; } printf("look:%lu/%ld/%s:%p/%p/%p\n", *i, *j, k, (*ht_item).k, (*ht_item).v, (*ht_item).n); return ht_item; } void *ht_g(char *k) { unsigned long i; long j; ht_data_t *ht_item = ht_look(&i, &j, k); return (*ht_item).v; } void ht_s(char *k, void *v) { unsigned long i; long j; ht_data_t *ht_item = ht_look(&i, &j, k); if (j < 0) { if ((*ht_item).k == NULL) { (*ht_item).k = strdup(k); (*ht_item).v = v; (*ht_item).n = NULL; } else { ht_data_t *ht_temp = malloc(1 * sizeof(ht_data_t)); (*ht_temp).k = strdup(k); (*ht_temp).v = v; (*ht_temp).n = NULL; (*ht_item).n = ht_temp; } } else { if ((*ht_item).v != NULL) { free((*ht_item).v); } (*ht_item).v = v; } }
sorts.c
//gcc -Wall -o3 -lm -o sorts sorts.c int max(a, b) { if (a < b) { return b; } return a; } #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <time.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include "ht.c" #include "mr.c" int merge_r(int *list, int size) { if (size < 2) { return 0; } int a[size]; bcopy(list, a, size * sizeof(int)); int q = (size / 2); int n = (size - q); int *l = a; int *r = (a + q); merge_r(l, q); merge_r(r, n); int i = 0, li = 0, ri = 0; while (i < size) { if ((li < q) && (ri < n)) { if (l[li] < r[ri]) { list[i] = l[li]; i += 1; li += 1; } else { list[i] = r[ri]; i += 1; ri += 1; } } else { if (li >= q) { while (ri < n) { list[i] = r[ri]; i += 1; ri += 1; } } if (ri >= n) { while (li < q) { list[i] = l[li]; i += 1; li += 1; } } } } return 0; } int quick_r(int *list, int size) { if (size < 2) { return 0; } int lptr = 0, pivp = (size / 2), rptr = (size - 1); int pivv = list[pivp]; while (1) { if (lptr > rptr) { break; } while (list[lptr] < pivv) { lptr += 1; } while (list[rptr] > pivv) { rptr -= 1; } if (lptr <= rptr) { int temp = list[lptr]; list[lptr] = list[rptr]; list[rptr] = temp; lptr += 1; rptr -= 1; } } quick_r(list, rptr + 1); quick_r(list + lptr, size - lptr); return 0; } int radixlsd_f(int *list, int size) { int i = 0, m = 1; int lengths[10], sizes[10]; int **buckets = malloc(10 * sizeof(int *)); int x, y, z; int d, b, p; bzero(sizes, 10 * sizeof(int)); for (y = 0; y < 10; ++y) { buckets[y] = NULL; } while (i < m) { bzero(lengths, 10 * sizeof(int)); x = 0; p = pow(10, i); while (x < size) { if ((i == 0) && (abs(list[x]) > m)) { m = list[x]; } b = ((list[x] / p) % 10); lengths[b] += 1; if (lengths[b] > sizes[b]) { sizes[b] += 10; buckets[b] = realloc(buckets[b], sizes[b] * sizeof(int)); } buckets[b][lengths[b] - 1] = list[x]; x += 1; } x = 0; for (y = 0; y < 10; ++y) { for (z = 0; z < lengths[y]; ++z) { list[x] = buckets[y][z]; x += 1; } } if (i == 0) { d = 0; while (m != 0) { m = (m / 10); d += 1; } m = d; } i += 1; } return 0; } int bin_search_rp(int *list, int item, int lo, int hi) { int mid = ((hi - lo) / 2); //print(lo,mid,hi,list[lo+mid]) if (list[lo + mid] == item) { return (lo + mid); } if ((hi - lo) < 1) { return -1; } if (list[lo + mid] < item) { return bin_search_rp(list, item, lo+mid+1, hi); } return bin_search_rp(list, item, lo, hi-mid-1); } int bin_search_r(int *list, int size, int item) { return bin_search_rp(list, item, 0, size); } int main(int argc, char **argv) { printf("\n"); int i = 0; char *keys[4] = { "jonnjonn", "jonnjono", "jonxjonp", "jonpjonx" }; char temp[1028]; for (i = 0; i < 4; ++i) { printf("key-hash:%s=0x%lx\n", keys[i], ht_hash(keys[i])); bzero(temp, 1028 * sizeof(char)); snprintf(temp, 1024, "{uid:%s, name:Jon Chipps, uid:%d, gid:%d, home:/home/%s}", keys[i], i + 1, i + 1, keys[i]); ht_s(keys[i], strdup(temp)); printf("%s=%s\n", keys[i], (char *)ht_g(keys[i])); bzero(temp, 1028 * sizeof(char)); snprintf(temp, 1024, "{uid:%s, name:Jon Chipps, uid:%d, gid:%d, home:/home/_%s_}", keys[i], i + 1, i + 1, keys[i]); ht_s(keys[i], strdup(temp)); printf("%s=%s\n", keys[i], (char *)ht_g(keys[i])); printf("\n"); } int x, n = 262145; int numa[n], numb[n], numc[n]; //printf("%d\n", n); srand(time(NULL)); for (x = 0; x < n; ++x) { numa[x] = (rand() % 1000000); numb[x] = numa[x]; numc[x] = numb[x]; //printf("%d\n", numa[x]); } numa[n - 1] = 51966; numb[n - 1] = 51966; numc[n - 1] = 51966; clock_t starta = clock() / (CLOCKS_PER_SEC / 1000); merge_r(numa, n); clock_t enda = clock() / (CLOCKS_PER_SEC / 1000); unsigned long millisa = (enda - starta); printf("merge-r:%lu/ms\n", millisa); clock_t startb = clock() / (CLOCKS_PER_SEC / 1000); quick_r(numb, n); clock_t endb = clock() / (CLOCKS_PER_SEC / 1000); unsigned long millisb = (endb - startb); printf("quick-r:%lu/ms\n", millisb); clock_t startc = clock() / (CLOCKS_PER_SEC / 1000); radixlsd_f(numc, n); clock_t endc = clock() / (CLOCKS_PER_SEC / 1000); unsigned long millisc = (endc - startc); printf("radixlsd-r:%lu/ms\n", millisc); int f = bin_search_r(numa, n, 51966); printf("binsearch-r[%d]=%d\n", f, numa[f]); printf("\n"); mr_map(); mr_reduce(); printf("mapreduce-search('better'):%d\n", mr_search("better")); printf("\n"); for (x = 0; x < n; ++x) { fprintf(stderr, "%d %d %d\n", numa[x], numb[x], numc[x]); } return 0; }