一个m项,一个n项
相加:从第一项开始,每一次都拿两个多项式的头开始比较,小的项就进目标链表,前进一格,从而完成相加,复杂度o(m+n)
相乘 :
算法1:o(m*m*n*n)
每一项相乘,结果插入目标链表里
算法2:o(m*n*n)
拿一个多项式每一项与另一整个多项式相乘,然后将这m个或n个多项式相加;这个算法比上个算法的优点在于利用了这两个多项式升序排的条件
算法3:待续
一个m项,一个n项
相加:从第一项开始,每一次都拿两个多项式的头开始比较,小的项就进目标链表,前进一格,从而完成相加,复杂度o(m+n)
相乘 :
算法1:o(m*m*n*n)
每一项相乘,结果插入目标链表里
算法2:o(m*n*n)
拿一个多项式每一项与另一整个多项式相乘,然后将这m个或n个多项式相加;这个算法比上个算法的优点在于利用了这两个多项式升序排的条件
算法3:待续
转载于:https://www.cnblogs.com/xuehongyang/p/5342807.html
转载:https://www.cnblogs.com/catnip/p/4331347.html
一种算法是将结果保存在按指数排序的链表中。每个mn乘法都需要搜索链表中的重复项。由于链接列表的大小为mn,因此总运行时间为O(m 2 n2)。
M≤1时,方法易知。
M≥2时,每次将长度为M的链表的一项,与另一链表的所有项相乘,每次一组N个有序的多项式元素。
对于每两组上式的N个多项式元素,基本按两个有序链表求并的算法(除幂次相同需将系数相加)操作。
求并算法时间复杂度O(M+N),故该算法复杂度为(乘法时间)O(MN)+(求并时间)O((N+N)+(2N+N)+(3N+N)+……+(MN+N))=O(M2N)
同a先将两链表元素两两相乘并列出,对MN项元素进行O(NlogN)的排序
排序完成后,遍历代码,合并同幂次项,最后全部插入链表。
时间复杂度为:(乘法时间)O(MN)+(排序时间)O(MNlogMN)+(合并同类项时间)O(MN)=O(MNlogMN)
算法的选择取决于m和n的相对值。如果它们接近,那么(c)部分的解决方案更好。如果一个多项式非常小,那么解决方案为:(b)部分更好。
功能需要两个列表(具有元组作为值)作为输入 我在我的脑海中,后面的算法为此编写代码,但要正确编写它。Python程序将两个多项式相乘,其中多项式的每个项表示为一对整数(系数,指数)?
- >首先要求no。存储每个幂的系数的字典乘以多项式p2的所有系数。
然后将所有具有相同功率的字典系数相加。
def multpoly(p1,p2):
dp1=dict(map(reversed, p1))
dp2=dict(map(reversed, p2))
kdp1=list(dp1.keys())
kdp2=list(dp2.keys())
rslt={}
if len(kdp1)>=len(kdp2):
kd1=kdp1
kd2=kdp2
elif len(kdp1)
kd1=kdp2
kd2=kdp1
for n in kd2:
for m in kd1:
rslt[n]={m:0}
if len(dp1)<=len(dp2):
rslt[n][m+n]=rslt[n][m+n] + dp1[n]*dp2[m]
elif len(dp1)>len(dp2):
rslt[n][m+n]=rslt[n][m+n] + dp2[n]*dp1[m]
return(rslt)
+0
请提出具体问题。 –
+0
不清楚你问什么或你的问题是什么 –
+0
[this]的可能重复(http://stackoverflow.com/questions/39057546/how-to-calculate-sum-of-two-polynomials/ 39058521#39058521)问题? –
#include<iostream>
using namespace std;
//NODE节点的定义,这里最好的就是template模板,AN类型的任何数据域都可以在这里添加,比如再来一个结构体定义,data就可以封装多个数据
template <class AN>
struct NODE
{
AN DATA;
NODE<AN>* next = NULL;
};
struct element//element就是节点的数据域
{
double a;//系数
int e;//指数
element(double cc = 0, int ee = 0) :a(cc), e(ee) {};
};//定义element
//链表定义基类的定义
template<class AN>
class LinkList
{
public:
LinkList() { front = new NODE<AN>; front->next = NULL; }//无参构造函数
LinkList(AN a[], int n);//含参构造函数
~LinkList();//析构
NODE<AN>* front;
int Length = 0;
};
//派生类
class TruList :public LinkList<element>
{
public:
TruList(element data[], int n) :LinkList(data, n) {};//构造函数,构造出多项式链表
void Add(TruList& b);//函数相加
void Cut(TruList& b);//函数相减
void Sum(int x);//求某一点的值
void Der();//求导数
void PrintList();//输出
element* OneAndMore(TruList& a, element b);
void Pro(TruList& a, TruList& b);//多项式相乘
};
//基类构造函数
template<class AN>
LinkList<AN>::LinkList(AN a[], int n)//头插法插入数组
{
Length = n;
front = new NODE<AN>;
front->next = NULL;
for (int i = n - 1; i >= 0; i--)
{
NODE<AN>* s = new NODE<AN>;
s->DATA = a[i];
s->next = front->next;
front->next = s;
}
}
//基类析构函数
template<class AN>
LinkList<AN>::~LinkList()
{
NODE<AN>* p = front;
while (p)
{
front = p;
p = front->next;
delete front;
}
}
//Add函数
void TruList::Add(TruList& b)
{
NODE<element>* p_front = front;//p前面的指针
NODE<element>* p = p_front->next;//p指针指向a的第一个element
NODE<element>* q = b.front->next;//q指向b的第一个element
while (p && q)
{
if (p->DATA.e < q->DATA.e)//a的指数比b小
{
p_front = p;
p = p->next;//p和p_front向后移
}
else if (p->DATA.e > q->DATA.e)//a的指数比b大,把b加入到a
{
p_front->next = q;
p_front = q;
q = q->next;
p_front->next = p;
}
else//如果相等
{
p->DATA.a += q->DATA.a;
if (fabs(p->DATA.a) < 1e-7)
{
p_front->next = p->next;
delete p;
p = p_front->next;
}
else
{
p_front = p;
p = p_front->next;
}
NODE<element>* temp = q;
q = q->next;
delete temp;
}
}
if (q)p_front->next = q;
b.front->next = NULL;
}
//CUt函数
void TruList::Cut(TruList& b)
{
NODE<element>* p_front = front;//p前面的指针
NODE<element>* p = p_front->next;//p指针指向a的第一个element
NODE<element>* q = b.front->next;//q指向b的第一个element
while (p && q)
{
if (p->DATA.e < q->DATA.e)//a的指数比b小
{
p_front = p;
p = p->next;//p和p_front向后移
}
else if (p->DATA.e > q->DATA.e)//a的指数比b大,把-b加入到a
{
q->DATA.a = (-1)*(q->DATA.a);
p_front->next = q;
p_front = q;
q = q->next;
p_front->next = p;
}
else
{
p->DATA.a -= (q->DATA.a);
if (fabs(p->DATA.a) < 1e-7)
{
p_front->next = p->next;
delete p;
p = p_front->next;
}
else
{
p_front = p;
p = p_front->next;
}
NODE<element>* temp = q;
q = q->next;
delete temp;
}
}
if (q)//q后面还有节点
{
NODE<element>* qq = q;
while (q)
{
q->DATA.a = (-1) * q->DATA.a;
q = q->next;
}
p_front->next = qq;
}
b.front->next = NULL;
}
//Sum函数
void TruList::Sum(int x)
{
if (x == 0)throw"0";
double sum = 0;
NODE<element>* p = front->next;
while (p)
{
if (p->DATA.e < 0)//如果指数为负
{
int jiecheng = 1;
for (int i = 1; i < -(p->DATA.e); i++)
{
jiecheng = jiecheng * (1 / x) * (1 / x);
}
sum = sum + (p->DATA.a) * jiecheng;
}
else if (p->DATA.e == 0)
{
sum = sum + p->DATA.a;
}
else
{
int jiecheng = 1;
for (int i = 1; i < (p->DATA.e); i++)
{
jiecheng = jiecheng * x * x;
}
sum = sum + (p->DATA.a) * jiecheng;
}
p = p->next;
}
cout << sum;
}
//求导
void TruList::Der()
{
NODE<element>* p = front->next;
NODE<element>* p_front = front;
while (p)
{
if (p->DATA.e != 0)
{
p->DATA.a = p->DATA.a * p->DATA.e;
p->DATA.e = p->DATA.e - 1;
if (p->DATA.e != 0)
{
p_front = p;
p = p->next;
}
else if (p->DATA.e == 0 && p_front->DATA.e == 0)
{
p_front->DATA.a += p->DATA.a;
p = p->next;
}
else
{
p_front = p;
p = p->next;
}
}
else
{
p_front = p;
p = p->next;
}
}
}
//多项式乘单项式
element* TruList::OneAndMore(TruList& a, element b)//传入多项式链表和单项式的数据域
{
NODE<element>* p = a.front->next;//获取第一个
element* s = new element[100];//创建element用于存储和返回
int i = 0;//i用于s指针的定位
while (p)
{
s[i].a = p->DATA.a * b.a;//s[i]储存相乘的系数和指数
s[i].e = p->DATA.e * b.e;
i++;//计数+1
p = p->next;//多项式后移
}
return s;
}
//多项式相乘
void TruList::Pro(TruList& a, TruList& b)//多项式相乘函数,需要传入两个相乘的多项式类
{
NODE<element>* p = front->next;//获取第一个多项式
NODE<element>* q = b.front->next;//获取第二个多项式
element kong[1] = {};//创建一个element用于构造储存多项式的对象
TruList temp1(kong, 1);//temp1就是用于储存的多项式
while (q)//第二个单项式逐项乘第一个多项式
{
TruList temp2(OneAndMore(a, q->DATA), a.Length);//传入第一个单项式,进行单项式乘多项式
temp1.Add(temp2);//多项式相加
q = q->next;
}
temp1.PrintList();//输出
}
//输出函数
void TruList::PrintList()
{
NODE<element>* p = front->next;//获取第一个多项式的信息
int i = 0;
while (p)//如果p指向的区域非空
{
if (p->DATA.a < 0)//如果系数小于零
{
if (p->DATA.a == (-1))//如果系数小于零且等于-1
{
cout << "-";
if (p->DATA.e != 0 && p->DATA.e != 1)//如果指数为非0或非1
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)//如果指数为1
{
cout << "X";
}
p = p->next;
}
else//如果系数
{
cout << p->DATA.a;
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "X";
}
p = p->next;
}
}
else if (p->DATA.a == 0)//系数等于零直接跳过
{
p = p->next;
}
else//系数为正
{
if (i == 0)//如果是第一个,不用输出正号
{
if (p->DATA.a == 1)
{
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "X";
}
p = p->next;
}
else//系数不为1
{
cout << p->DATA.a;
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "X ";
}
p = p->next;
}
i++;
}
else//不是第一个要输出+
{
if (p->DATA.a == 1)
{
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "+X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "+X" << " ";
}
p = p->next;
}
else//系数不为1
{
cout << "+" << p->DATA.a;
if (p->DATA.e != 0 && p->DATA.e != 1)
{
cout << "X^" << p->DATA.e << " ";
}
else if (p->DATA.e == 1)
{
cout << "X";
}
p = p->next;
}
}
}
}
cout << endl;
}
int main()
{
//操作界面
int choose;
cout << " *********************************************************************************************" << endl << endl;;
cout << " 注:请按升幂次序依次输入多项式各项的系数和指数 如:X+8X^2 您可输入:1 1 8 2" << endl;
cout << " 多项式相加请输入 1" << endl;
cout << " 多项式相减请输入 2" << endl;
cout << " 多项式求导请输入 3" << endl;
cout << " 多项式求某个值请输入 4" << endl;
cout << " 多项式相乘请输入 5" << endl;
cout << " 退出请输入 0" << endl;
cout << "***********************************************************************************************" << endl;
do
{
cout << "请输入您的操作(数字):";
cin >> choose;
switch (choose)
{
case 0:break;
case 1:
{//多项式相加
//首先完成多项式链表的构建
cout << "请输入第一组多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << "请输入第二组多项式:";
a = 0, e = 0; i = 0;
element* p = new element[100];
do
{
cin >> a >> e;
p[i].a = a;
p[i].e = e;
i++;
} while (getchar() != '\n');
cout << endl;
//相加函数
TruList bb(p, i + 1);
aa.Add(bb);
aa.PrintList();
delete[] s;
delete[] p;
cout << endl;
break;
}
case 2://多项式相减
{//首先完成多项式链表的构建
cout << "请输入第一组多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << "请输入第二组多项式:";
a = 0, e = 0; i = 0;
element* p = new element[100];
do
{
cin >> a >> e;
p[i].a = a;
p[i].e = e;
i++;
} while (getchar() != '\n');
cout << endl;
//相加函数
TruList bb(p, i + 1);
aa.Cut(bb);
aa.PrintList();
delete[] s;
delete[] p;
cout << endl;
break;
}
case 3://多项式求导
{
cout << "请输入要求导的多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << endl;
aa.Der();
aa.PrintList();
delete[] s;
break;
}
case 4:
{
cout << "请输入要值的多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << "请输入您要求的X的值";
int m = 0; cin >> m;
aa.Sum(m);
cout << endl;
delete[] s;
break;
}
case 5://多项式相乘
{//首先完成多项式链表的构建
cout << "请输入第一组多项式:";
int a = 0, e = 0; int i = 0;
element* s = new element[100];
do
{
cin >> a >> e;
s[i].a = a;
s[i].e = e;
i++;
} while (getchar() != '\n');
TruList aa(s, i + 1);
cout << "请输入第二组多项式:";
a = 0, e = 0; i = 0;
element* p = new element[100];
do
{
cin >> a >> e;
p[i].a = a;
p[i].e = e;
i++;
} while (getchar() != '\n');
TruList bb(p, i + 1);
cout << endl;
aa.Pro(aa, bb);
break;
}
default:
{
cout << "输入错误,注意提示,请重新输入!" << endl;
}
}
} while (choose != 0);
}