I have a dynamic programming algorithm for Knapsack in C ++. When it was implemented as a function and access to the variables passed into it, it took 22 seconds for a particular instance. When I made this a member function of my KnapsackInstance class and whether it used variables that are data members of this class, it ran 37 seconds to run. As far as I know, only access to member functions goes through the vtable, so I find it difficult to explain what might happen.
Here is the function code
int KnapsackInstance::dpSolve() { int i; // Current item number int d; // Current weight int * tbl; // Array of size weightLeft int toret; tbl = new int[weightLeft+1]; if (!tbl) return -1; memset(tbl, 0, (weightLeft+1)*sizeof(int)); for (i = 1; i <= numItems; ++i) { for (d = weightLeft; d >= 0; --d) { if (profitsWeights.at(i-1).second <= d) { /* Either add this item or don't */ int v1 = profitsWeights.at(i-1).first + tbl[d-profitsWeights.at(i-1).second]; int v2 = tbl[d]; tbl[d] = (v1 < v2 ? v2 : v1); } } } toret = tbl[weightLeft]; delete[] tbl; return toret; }
tbl - one column of the DP table. We start from the first column and continue to the last column. The variable profitWeights is a vector of pairs, the first element of which is profit, and the second is weight. toret is the return value.
Here is the source function code: -
int dpSolve(vector<pair<int, int> > profitsWeights, int weightLeft, int numItems) { int i; // Current item number int d; // Current weight int * tbl; // Array of size weightLeft int toret; tbl = new int[weightLeft+1]; if (!tbl) return -1; memset(tbl, 0, (weightLeft+1)*sizeof(int)); for (i = 1; i <= numItems; ++i) { for (d = weightLeft; d >= 0; --d) { if (profitsWeights.at(i-1).second <= d) { /* Either add this item or don't */ int v1 = profitsWeights.at(i-1).first + tbl[d-profitsWeights.at(i-1).second]; int v2 = tbl[d]; tbl[d] = (v1 < v2 ? v2 : v1); } } } toret = tbl[weightLeft]; delete[] tbl; return toret; }
This was done on Debian Lenny with g ++ - 4.3.2 and -O3 -DNDEBUG enabled
thanks
source share