一道算法题

Flammable_ice 2014-04-30 07:07:41
考虑两个集合A和B,每个集合包含取值范围在0~10n之间的n个整数。我们希望计算出A与B的笛卡尔和,定义如下:C={x+y:x∈A,y∈B}注意到,C中整数值的范围在0~20n之间。我们希望找到C中的元素,并且求出C中的每个元素可表示为A中元素与B中元素和的次数。请在O(nlgn)时间内解决问题.(提示:请用次数至多是10n的多项式来表示A和B)。
1.重点就是红字部分没读懂题意,哪位高手用通俗易懂的数学式来表示这句话?
2.给个思路呗。既然提示是把A和B看成多项式,是否要用到多项式加法?

...全文
246 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Flammable_ice 2014-05-05
  • 打赏
  • 举报
回复
可以结贴了。感谢楼上诸位的解答。
lm_whales 2014-05-03
  • 打赏
  • 举报
回复
引用 3 楼 fetag 的回复:
如果C={x+y:x∈A,y∈B},那么可以先将C看成是一个pair的组合,即(x,y)和(y,x),并且它们在C中表示的是同一个元素,顺序无关,因为C里面实际上存的是x+y的和。这样的话,可以用下面的算法解决: 先将A,B内的两个集合分别排序,因为各有n个元素,所以排序的开销是O(nlogn)。 得到两个有序序列A'和B'后,找这两个有序序列可以组成的所有逆序对,原理参照merge排序,这个也可以在O(nlogn)开销内完成。 针对所有逆序对求和,并且记录有多少逆序对的和相同,以及总和的数量是多少,就是最终解了。
大神,这次似乎失手了,不过这应该无损于大神,因为每个人都有出错的时候。
lm_whales 2014-05-03
  • 打赏
  • 举报
回复
哦,居然还是写错了 原来这个数组A,B的每个元素,表示多项式次数,系数表示重复次数。
lm_whales 2014-05-03
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
对于集合A构造多项式f(x)=sum_{a\in A} x^a。也就是说A={1,2,4,5}的时候f(x)=x+x^2+x^4+x^5 然后A和B对应两个多项式f和g 做出来f(x)*g(x)以后再遍历一遍非零项就可以了。非零项的系数就是次数。nlogn的。
++ 果然高明 原来这个数组A,B的每个元素,表示多项式系数。
Flammable_ice 2014-05-01
  • 打赏
  • 举报
回复
引用 3 楼 fetag 的回复:
如果C={x+y:x∈A,y∈B},那么可以先将C看成是一个pair的组合,即(x,y)和(y,x),并且它们在C中表示的是同一个元素,顺序无关,因为C里面实际上存的是x+y的和。这样的话,可以用下面的算法解决: 先将A,B内的两个集合分别排序,因为各有n个元素,所以排序的开销是O(nlogn)。 得到两个有序序列A'和B'后,找这两个有序序列可以组成的所有逆序对,原理参照merge排序,这个也可以在O(nlogn)开销内完成。 针对所有逆序对求和,并且记录有多少逆序对的和相同,以及总和的数量是多少,就是最终解了。
1.貌似你提供了一种解题方案,但是你是否用到了题目中提示的A和B两个集合看成多项式的方法去求解? 2.红字内容我还是不懂啊。
FancyMouse 2014-05-01
  • 打赏
  • 举报
回复
引用 7 楼 z84616995z 的回复:
[quote=引用 5 楼 FancyMouse 的回复:] 对于集合A构造多项式f(x)=sum_{a\in A} x^a。也就是说A={1,2,4,5}的时候f(x)=x+x^2+x^4+x^5 然后A和B对应两个多项式f和g 做出来f(x)*g(x)以后再遍历一遍非零项就可以了。非零项的系数就是次数。nlogn的。
是不是可以这么理解。比如f(x)=x+x^2+x^4+x^5. g(x)=x^2+x^5+x^6+x^8. f(x)*g(x)可以用DFT在O(nlgn)时间内计算出。 它的结果是f(x)*g(x)=x^3+x^4+2x^6+3x^7+x^8+2x^9+3x^10+x^11+x^12+x^13 C中每个元素,比如C中元素3x^10是由A和B中的5+5和2+8和4+6 ,系数3就是A与B的笛卡尔和为10的出现次数。[/quote] 是
Flammable_ice 2014-05-01
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
对于集合A构造多项式f(x)=sum_{a\in A} x^a。也就是说A={1,2,4,5}的时候f(x)=x+x^2+x^4+x^5 然后A和B对应两个多项式f和g 做出来f(x)*g(x)以后再遍历一遍非零项就可以了。非零项的系数就是次数。nlogn的。
是不是可以这么理解。比如f(x)=x+x^2+x^4+x^5. g(x)=x^2+x^5+x^6+x^8. f(x)*g(x)可以用DFT在O(nlgn)时间内计算出。 它的结果是f(x)*g(x)=x^3+x^4+2x^6+3x^7+x^8+2x^9+3x^10+x^11+x^12+x^13 C中每个元素,比如C中元素3x^10是由A和B中的5+5和2+8和4+6 ,系数3就是A与B的笛卡尔和为10的出现次数。
FancyMouse 2014-05-01
  • 打赏
  • 举报
回复
引用 3 楼 fetag 的回复:
如果C={x+y:x∈A,y∈B},那么可以先将C看成是一个pair的组合,即(x,y)和(y,x),并且它们在C中表示的是同一个元素,顺序无关,因为C里面实际上存的是x+y的和。这样的话,可以用下面的算法解决: 先将A,B内的两个集合分别排序,因为各有n个元素,所以排序的开销是O(nlogn)。 得到两个有序序列A'和B'后,找这两个有序序列可以组成的所有逆序对,原理参照merge排序,这个也可以在O(nlogn)开销内完成。 针对所有逆序对求和,并且记录有多少逆序对的和相同,以及总和的数量是多少,就是最终解了。
A和B都是一维量,你逆序对哪来的?这乱扯也有点莫名。
FancyMouse 2014-05-01
  • 打赏
  • 举报
回复
对于集合A构造多项式f(x)=sum_{a\in A} x^a。也就是说A={1,2,4,5}的时候f(x)=x+x^2+x^4+x^5 然后A和B对应两个多项式f和g 做出来f(x)*g(x)以后再遍历一遍非零项就可以了。非零项的系数就是次数。nlogn的。
独孤过儿 2014-04-30
  • 打赏
  • 举报
回复
如果C={x+y:x∈A,y∈B},那么可以先将C看成是一个pair的组合,即(x,y)和(y,x),并且它们在C中表示的是同一个元素,顺序无关,因为C里面实际上存的是x+y的和。这样的话,可以用下面的算法解决: 先将A,B内的两个集合分别排序,因为各有n个元素,所以排序的开销是O(nlogn)。 得到两个有序序列A'和B'后,找这两个有序序列可以组成的所有逆序对,原理参照merge排序,这个也可以在O(nlogn)开销内完成。 针对所有逆序对求和,并且记录有多少逆序对的和相同,以及总和的数量是多少,就是最终解了。
Flammable_ice 2014-04-30
  • 打赏
  • 举报
回复
引用 1 楼 uuuououlcz 的回复:
O(nlgn)靠谱吗,假设n = 4,A = {1, 2, 3, 4},B = {10, 20, 30, 40},只是得到C的16个元素就已经O(n*n)了
你这种算法,我早就想到了,我看网上说用DFT解决 但我不太清楚怎么解决额
还有多远 2014-04-30
  • 打赏
  • 举报
回复
O(nlgn)靠谱吗,假设n = 4,A = {1, 2, 3, 4},B = {10, 20, 30, 40},只是得到C的16个元素就已经O(n*n)了

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧