//метод, который непосредственно выполняет перемножение в правильном порядке //первоначально вызывается таким образом //dataStore.result = matrixChainMultiply(0, dataStore.sizes.Count - 2); private List <List <int> > matrixChainMultiply(int i, int j, Datatstore dataStore) { if (j > i) { List <List <int> > x = matrixChainMultiply(i, dataStore.s[i][j], dataStore); List <List <int> > y = matrixChainMultiply(dataStore.s[i][j] + 1, j, dataStore); return(matrixMultiply(x, y)); } else { return(dataStore.source[i]); } }
//метод печатающий строку с правильной расстановкой скобок private void printOrder(int i, int j, string order, Datatstore dataStore) { if (i == j) { order += "A" + i.ToString(); } else { order += "("; printOrder(i, dataStore.s[i][j], order, dataStore); order += "*"; printOrder(dataStore.s[i][j] + 1, j, order, dataStore); order += ")"; } }
private void matrixChainOrder(Datatstore dataStore) { int n = dataStore.sizes.Count - 1; //выделяем память под матрицы m и s dataStore.m = new List <List <int> >(); dataStore.s = new List <List <int> >(); for (int i = 0; i < n; i++) { dataStore.m.Add(new List <int>()); dataStore.s.Add(new List <int>()); //заполняем нулевыми элементами for (int a = 0; a < n; a++) { dataStore.m[i].Add(0); dataStore.s[i].Add(0); } } //выполняем итерационный алгоритм int j; for (int l = 1; l < n; l++) { for (int i = 0; i < n - l; i++) { j = i + l; dataStore.m[i][j] = int.MaxValue; for (int k = i; k < j; k++) { int q = dataStore.m[i][k] + dataStore.m[k + 1][j] + dataStore.sizes[i] * dataStore.sizes[k + 1] * dataStore.sizes[j + 1]; if (q < dataStore.m[i][j]) { dataStore.m[i][j] = q; dataStore.s[i][j] = k; } } } } }
static void Main(string[] args) { Console.WriteLine("Hello World!"); Datatstore dataStore = new Datatstore(); }