Вы думаете, или вам разрешено работать с полиномами Horner's representation? Это не только более эффективный способ вычисления значений полиномов, но во многих случаях может привести к более разреженной структуре данных. Например, Полином:
эквивалентно следующему выражению:
Так есть 3 вещи, чтобы отметить:
- На самом деле одна замечательная вещь этой схемы (хотя и не имеет прямого отношения к вашему вопросу) заключается в том, что ее расчет равен er, так как вы сохраняете много размножений.
- Индекс полиномом непосредственно зависит от длины выражения
- Все элементы в выражении являются isomorph, независимо от степени. Это справедливо и для каждой реальности.
Так что в этом повезло случае Полином я выбрал может быть очень легко и эффективно хранить в виде следующего списка/массива:
[7, 5, 1, -4, 1, 8, 1, -7]
или если вы хотите, как связанный список [ x_mult | сумма] номера: [7 | 5] -> [1 | 4] -> [1 | 8] -> [1 | -7]
тогда вы знаете, что элементы с четными индексами умножаются по x и добавляется к следующему элементу, схема довольно проста.
#include <iostream>
using namespace std;
int main()
{
// the x you want to calculate
int x = 1;
// the horner-representation of your polynom
int A[8] {7, 5, 1, -4, 1, 8, 1, -7};
int partial;
int result = 1;
// run calculations following horner-schema
for (int i = 0; i < 8; i++) {
if (i%2==0){
partial = A[i]*x; // this mult. is only needed at i=0
result *= partial;
} else{
partial = A[i];
result += partial;
}
}
cout << "x=" << x << ", p(x)=" << result << endl;
return 0;
}
Вопросы: Вы могли бы значительно улучшить производительность и использование памяти, если подавить нечетные индексы, и принять «1» 's, как должное, хранение первых 7 в другом месте. Кроме того, поскольку индекс напрямую зависит от длины списка, такие полиномы, как , будут иметь очень неэффективное представление.
Временное решение для проблемы с памятью: Возможным обходным путем будет наследовать ваш ListElement как ExpandedListElement, так что числа в его контейнерах не рассматриваются в качестве факторов, но, как количества повторений. Таким образом, ExpandedListElement [1000 | a] будет означать, что в вашем списке есть тысяча ListElements, которые выглядят следующим образом: [1 | a]. Таким образом, пример x^1000 + 3 имеет два элемента: ExpandedListElement [999 | 0] -> ListElement [1 | 3]. Вам также понадобится метод для выполнения цикла, который я опускаю (если вам нужно это обходное решение, дайте мне знать, и я опубликую его).
Я не тестировал его широко, но я предполагаю, что это хороший подход и для двух или более переменных. Я также оставил остальную часть деталей реализации OO, но основные DS и операции там и должны быть легко встроены в классы. Если вы попробуете, дайте мне знать, как это работает!
Приветствия
Andres
Не размещать ссылки на код, а не размещать код в виде изображений. Скопируйте и вставьте код как тест в тело вопроса. –
Зачем нужен связанный список, а не массив или карта? Каковы конкретные требования (какие операции необходимо поддерживать? Можете ли вы использовать контейнеры STL (например, 'std :: list',' std :: vector', 'std :: map') – MikeMB
просто x, y? Возможно z , t ...? –