source: cppstreams/test_change.cc @ 2

Last change on this file since 2 was 2, checked in by gobi, 13 years ago

import

File size: 3.4 KB
Line 
1#include "stream.h"
2#include <unordered_map>
3#include <map>
4#include <cstdlib>
5#include <sys/time.h>
6
7long timeval_diff(struct timeval &tv1, struct timeval &tv2)
8{
9    long ret = tv1.tv_usec - tv2.tv_usec;
10    if(ret<0) ret += 1000000;
11    return ret;
12}
13
14
15long change(int n, int max=50) {
16    if(n<0)
17        return 0;
18
19    if(n==0)
20        return 1;
21
22    long ret = 0;
23    if(n>=1 && max>=1) ret+=change(n-1, 1);
24    if(n>=2 && max>=2) ret+=change(n-2, 2);
25    if(n>=5 && max>=5) ret+=change(n-5, 5);
26    if(n>=10 && max>=10) ret+=change(n-10, 10);
27    if(n>=20 && max>=20) ret+=change(n-20, 20);
28    if(n>=50 && max>=50) ret+=change(n-50, 50);
29    return ret;
30}
31
32long changef(int n, int max=4) {
33    if(n<0)
34        return 0;
35
36    long ret = 1;
37    switch(max) {
38        case 4: ret += changef(n-50, 4);
39        case 3: ret += changef(n-20, 3);
40        case 2: ret += changef(n-10, 2);
41        case 1: ret += changef(n-5, 1);
42        case 0: ret += changef(n-2, 0);
43    }
44    return ret;
45}
46
47long changedyn0(int n, int max=4) {
48    if(n<0)
49        return 0;
50
51    if(max<0)
52        return 1;
53
54    static std::map<int,long> cache[5];
55    std::map<int,long>::iterator it = cache[max].find(n);
56    if(it != cache[max].end())
57        return cache[max][n];
58
59    long ret = 1;
60    switch(max) {
61        case 4: ret += changedyn0(n-50, 4);
62        case 3: ret += changedyn0(n-20, 3);
63        case 2: ret += changedyn0(n-10, 2);
64        case 1: ret += changedyn0(n-5, 1);
65        case 0: ret += changedyn0(n-2, 0);
66    }
67    cache[max][n] = ret;
68    return ret;
69}
70
71long changedyn(int n, int max=4) {
72    if(n<0)
73        return 0;
74
75    if(max<0)
76        return 1;
77
78    static std::unordered_map<int,long> cache[5];
79    std::unordered_map<int,long>::iterator it = cache[max].find(n);
80    if(it != cache[max].end())
81        return cache[max][n];
82
83    long ret = 1;
84    switch(max) {
85        case 4: ret += changedyn(n-50, 4);
86        case 3: ret += changedyn(n-20, 3);
87        case 2: ret += changedyn(n-10, 2);
88        case 1: ret += changedyn(n-5, 1);
89        case 0: ret += changedyn(n-2, 0);
90    }
91    cache[max][n] = ret;
92    return ret;
93}
94
95template<typename ST>
96stream<long> times(long n, long val, ST && s)
97{
98    if(n==0) return s;
99    return times(n-1, val, val<<=std::forward<ST>(s));
100}
101
102stream<long> change1 = 1l<<=change1;
103stream<long> change2 = times(2, 0, change2) + change1;
104stream<long> change5 = times(5, 0, change5) + change2;
105stream<long> change10 = times(10, 0, change10) + change5;
106stream<long> change20 = times(20, 0, change20) + change10;
107stream<long> change50 = times(50, 0, change50) + change20;
108
109int main(int, char *argv[]) {
110//    stream<long>::iterator it = change50.begin();
111//    for(int i=0; i<20; ++i)
112//    {
113//        assert(change(i) == *it);
114//        std::cout<<i<<" "<<change(i)<<" "<<changef(i)<<" "<<changedyn(i)<<" "<<*it<<std::endl;
115//        ++it;
116//    }
117
118    //std::cout<<j<<" "<<change(j)<<std::endl;
119    //std::cout<<j<<" "<<changef(j)<<std::endl;
120
121    const int n = atoi(argv[2]);
122    const int x = atoi(argv[1]);
123   
124        struct timeval tv1, tv2;
125    struct timezone tz;
126        switch(x) {
127                case 1:
128                        gettimeofday(&tv1, &tz);
129                        changedyn0(n);
130                        gettimeofday(&tv2, &tz);
131                        break;
132
133                case 2:
134                        gettimeofday(&tv1, &tz);
135                        changedyn(n);
136                        gettimeofday(&tv2, &tz);
137                        break;
138
139                case 3:
140                        gettimeofday(&tv1, &tz);
141                        stream<long>::iterator it = change50.begin();
142                        for(int i=0; i<n; ++i) ++it;
143                        *it; 
144                        gettimeofday(&tv2, &tz);
145                        break;
146        }
147    std::cout<<timeval_diff(tv2, tv1)<<std::endl;
148}
Note: See TracBrowser for help on using the repository browser.