diff options
Diffstat (limited to 'tests/performance/15_shuffle0.sy')
| -rw-r--r-- | tests/performance/15_shuffle0.sy | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/tests/performance/15_shuffle0.sy b/tests/performance/15_shuffle0.sy new file mode 100644 index 0000000..1500f4c --- /dev/null +++ b/tests/performance/15_shuffle0.sy @@ -0,0 +1,93 @@ +int hashmod; + +const int maxn = 10000000; +const int maxm = 10000000; +int bucket[maxn]; +int head[maxn]; +int next[maxm]; +int nextvalue[maxm]; +int key[maxm]; +int value[maxm]; +int cnt; + +int keys[maxm]; +int values[maxm]; +int requests[maxm]; +int ans[maxm]; + +int hash(int k){ + return k % hashmod; +} + +int insert(int k, int v){ + int h = hash(k); + if (head[h] == 0){ + cnt = cnt + 1; + head[h] = cnt; + key[cnt] = k; + value[cnt] = v; + next[cnt] = 0; + nextvalue[cnt] = 0; + return 0; + } + int p = head[h]; + while (p != 0){ + if (key[p] == k){ + cnt = cnt + 1; + nextvalue[cnt] = nextvalue[p]; + nextvalue[p] = cnt; + value[cnt] = v; + return 1; + } + p = next[p]; + } + cnt = cnt + 1; + next[cnt] = head[h]; + head[h] = cnt; + key[cnt] = k; + value[cnt] = v; + nextvalue[cnt] = 0; + return 0; +} + +int reduce(int k){ + int h = hash(k); + int p = head[h]; + + while (p != 0){ + if (key[p] == k){ + int ret = 0; + int x = p; + while (x != 0){ + ret = ret + value[x]; + x = nextvalue[x]; + } + return ret; + } + p = next[p]; + } + return 0; +} + +int main(){ + hashmod = getint(); + int ks = getarray(keys); + int vs = getarray(values); + int ms = getarray(requests); + + starttime(); + + int i = 0; + while (i < ks){ + insert(keys[i], values[i]); + i = i + 1; + } + i = 0; + while (i < ms){ + ans[i] = reduce(requests[i]); + i = i + 1; + } + stoptime(); + putarray(ms, ans); + return 0; +} |
