这个东西,是接着上一篇的查找矩阵乘法顺序的一个实现.这个类,可以接受输入,并且计算出最终结果. 因为最近在学习C++,所以理所当然地把这个东西写成了类,而且是模板方式实现的.确实非常整洁. // matrix.h #ifndef MATRIX_H_ #define MATRIX_H_ #include <iostream> template<class T> class Matrix { private: T * * m_matrix ; int m_x, m_y ; long m_count ; // Find the optimal order char * * m_MatrixChainOrder (const T * const matrixChain, const int mCSize) ; // Calculate Matrix m_MatrixOptimalParens (const char * const * const record, const Matrix * const mArray, const int i, const int j) ; public: Matrix (void) ; Matrix (const T * const input, const int iSize, const int x = 1, const int y = 1) ; Matrix (const Matrix & m) ; void OptimalMultiplication (const Matrix * const mArray, const int mSize) ; Matrix & operator = (const Matrix & m) ; void Show (void) const ; ~Matrix (void) ; friend Matrix operator * (const Matrix & mL, const Matrix & mR) ; } ; template<class T> char * * Matrix<T> ::m_MatrixChainOrder (const T * const matrixChain, const int mCSize) { int rSize = mCSize - 1 ; int * * storage = new int *[rSize] ; for (int i = 0; i < rSize; ++i) storage[i] = new int[rSize] ; for (int i = 0; i < rSize; ++i) storage[i][i] = 0 ; char * * record = new char *[rSize] ; for (int i = 0; i < rSize; ++i) record[i] = new char[rSize] ; for (int i = 2; i <= rSize; ++i) { for (int j = 0; j <= rSize - i; ++j) { storage[j][j + i - 1] = INFINITY ; for (int k = j; k < j + i - 1; ++k) { int temp = storage[j][k] + storage[k + 1][j + i - 1] + matrixChain[j] * matrixChain[k + 1] * matrixChain[i + j] ; if (temp < storage[j][j + i - 1]) { storage[j][j + i - 1] = temp ; record[j][j + i - 1] = k + 1 ; } } } } std ::cout << "Optimal times: " << storage[0][rSize - 1] << std ::endl ; for (int i = 0; i < rSize; ++i) delete []storage[i] ; delete []storage ; return record ; } template<class T> Matrix<T> Matrix<T> ::m_MatrixOptimalParens (const char * const * const record, const Matrix * const mArray, const int i, const int j) { if (i == j) return mArray[i] ; else return m_MatrixOptimalParens (record, mArray, i, record[i][j] - 1) * m_MatrixOptimalParens (record, mArray, record[i][j], j) ; } template<class T> Matrix<T> ::Matrix (void) { m_x = m_y = 0 ; m_count = 0L ; m_matrix = NULL ; } template<class T> Matrix<T> ::Matrix (const T * const input, const int iSize, const int x, const int y) { if (x * y != iSize) { m_x = m_y = 0 ; m_count = 0L ; m_matrix = NULL ; std ::cout << "Error[0]/n" ; } m_matrix = new T *[x] ; for (int i = 0; i < x; ++i) m_matrix[i] = new T[y] ; int k = 0 ; for (int i = 0; i < x; ++i) { for (int j = 0; j < y; ++j) m_matrix[i][j] = input[k++] ; } m_x = x ; m_y = y ; m_count = 0L ; } template<class T> Matrix<T> ::Matrix (const Matrix & m) { m_x = m.m_x ; m_matrix = new T *[m_x] ; m_y = m.m_y ; for (int i = 0; i < m_x; ++i) m_matrix[i] = new T[m_y] ; for (int i = 0; i < m_x; ++i) { for (int j = 0; j < m_y; ++j) m_matrix[i][j] = m.m_matrix[i][j] ; } m_count = m.m_count ; } template<class T> void Matrix<T> ::OptimalMultiplication (const Matrix * const mArray, const int mSize) { T * matrixChain = new T[mSize + 1] ; for (int i = 0; i < mSize; ++i) matrixChain[i] = mArray[i].m_x ; matrixChain[mSize] = mArray[mSize - 1].m_y ; char * * record = new char *[mSize] ; for (int i = 0; i < mSize; ++i) record[i] = new char[mSize] ; record = m_MatrixChainOrder (matrixChain, mSize + 1) ; delete []matrixChain ; *this = m_MatrixOptimalParens (record, mArray, 0, mSize - 1) ; for (int i = 0; i < mSize; ++i) delete []record[i] ; delete []record ; } template<class T> Matrix<T> & Matrix<T> ::operator = (const Matrix & m) { if (this == &m) return *this ; for (int i = 0; i < m_x; ++i) delete []m_matrix[i] ; delete []m_matrix ; m_x = m.m_x ; m_matrix = new T *[m_x] ; m_y = m.m_y ; for (int i = 0; i < m_x; ++i) m_matrix[i] = new T[m_y] ; for (int i = 0; i < m_x; ++i) { for (int j = 0; j < m_y; ++j) m_matrix[i][j] = m.m_matrix[i][j] ; } m_count = m.m_count ; return *this ; } template<class T> void Matrix<T> ::Show (void) const { using std ::cout ; using std ::endl ; for (int i = 0; i < m_x; ++i) { for (int j = 0; j < m_y; ++j) cout << m_matrix[i][j] << " " ; cout << endl ; } cout << "Actual times: " << m_count << endl ; } template<class T> Matrix<T> ::~Matrix (void) { for (int i = 0; i < m_x; ++i) delete []m_matrix[i] ; delete []m_matrix ; } Matrix<int> operator * (const Matrix<int> & mL, const Matrix<int> & mR) { Matrix<int> newM ; newM.m_x = mL.m_x ; newM.m_matrix = new int *[newM.m_x] ; newM.m_y = mR.m_y ; for (int i = 0; i < newM.m_x; ++i) newM.m_matrix[i] = new int[newM.m_y] ; newM.m_count = 0L ; for (int i = 0; i < mL.m_x; ++i) { for (int j = 0; j < mR.m_y; ++j) { newM.m_matrix[i][j] = 0 ; for (int k = 0; k < mR.m_x; ++k) { newM.m_matrix[i][j] += mL.m_matrix[i][k] * mR.m_matrix[k][j] ; ++newM.m_count ; } } } newM.m_count += mL.m_count + mR.m_count ; return newM ; } Matrix<double> operator * (const Matrix<double> & mL, const Matrix<double> & mR) { Matrix<double> newM ; newM.m_x = mL.m_x ; newM.m_matrix = new double *[newM.m_x] ; newM.m_y = mR.m_y ; for (int i = 0; i < newM.m_x; ++i) newM.m_matrix[i] = new double[newM.m_y] ; newM.m_count = 0L ; for (int i = 0; i < mL.m_x; ++i) { for (int j = 0; j < mR.m_y; ++j) { newM.m_matrix[i][j] = 0 ; for (int k = 0; k < mR.m_x; ++k) { newM.m_matrix[i][j] += mL.m_matrix[i][k] * mR.m_matrix[k][j] ; ++newM.m_count ; } } } newM.m_count += mL.m_count + mR.m_count ; return newM ; } #endif