请教3个算法题目:

booming 2005-07-11 08:21:03
1.设计算法在O(n)时间内将数组A[1..n]划分为左右两个部分,使得左边的所有元素为奇数,右边的所有为偶数,要求所使用的辅助存储空间大小为O(1).
请问,O(1)是否意思是只能开辟一个存储单元?


2.设P(x)=a0+a1x+...+adx^d是一个d次多项式。假设已有一算法能在O(i)时间内计算一个i次多项式与一个一次多项式的乘积,以及一个算法能在O(ilogi)时间内计算两个i次多项式的乘积。对于任意给定的d个整数n1,n2,..nd,用分治法设计一个有效算法,计算满足P(n1)=P(n2)=...=P(nd)=0且最高次系数为1的d次多项式P(x),并分析算法的效率。(王晓东p37,2-7)

3.设T[0:n-1]是n个元素的数组,对任一元素x,设S(x)={i|T[i]=x},当|S(x)|>n/2时,称x为主元素。设计一个线性时间算法,确定T[0:n-1]是否有主元素。(王晓东2-9)
请问,所谓线性时间是否为O(kn)?,如果这个题目不能再另外开辟数组,如何做?
...全文
3634 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
booming 2005-07-23
  • 打赏
  • 举报
回复
什么是序关系
booming 2005-07-23
  • 打赏
  • 举报
回复
什么叫序关系
booming 2005-07-21
  • 打赏
  • 举报
回复
或:2,3,2,5,2,6,2,7,2
booming 2005-07-21
  • 打赏
  • 举报
回复
不过,真的很谢谢你.mysword(一怒拔剑)
booming 2005-07-21
  • 打赏
  • 举报
回复
但不知道有没有体现分治法思想的方法.
booming 2005-07-21
  • 打赏
  • 举报
回复
我原先想的一个法子,寻找相同元素连续的2个子串,分别为个数最多,和第二多的两个子串

然后在来一个循环,看谁元素多,且多于n/2的为主元素.

我试了几个例子,好像没问题.但我不能证明是对的.
booming 2005-07-21
  • 打赏
  • 举报
回复
擂台方法还不大理解.

举个例子吧:
0,2,2,4,2,2,5,2

如何得出2?
gnefuil 2005-07-21
  • 打赏
  • 举报
回复
02242252
第一个擂主是0,第一个2把它打下来
第二个擂主是2,4把它打下来
然后擂主又是2
保持到最后

232526272
第一个擂主是2,然后3把它打下来
然后又是2,5打下来
又是2,6打下来
又是2,7打下来
最后又是2
booming 2005-07-21
  • 打赏
  • 举报
回复
另外,第3个题目能否用分治法,毕竟它出在分治法一章里.
booming 2005-07-21
  • 打赏
  • 举报
回复
若第3题中,数组元素不存在序关系,只能测试任意两个元素是否相等,试设计算法确定是否有主元素。算法的时间复杂度为O(nlogn)。更进一步,能找到一个线性时间算法吗?
eforensics 2005-07-21
  • 打赏
  • 举报
回复
可以参考二分搜索方法。
eforensics 2005-07-21
  • 打赏
  • 举报
回复
分治法比较难。
gnefuil 2005-07-16
  • 打赏
  • 举报
回复
不需要每一个元素都当擂主,一共只需要遍历两次数组

阶比较小的可以忽略,可以通过定义证明
rocpeng 2005-07-16
  • 打赏
  • 举报
回复
第一个问题就类似快速排序中partition函数的算法嘛。
还有楼上说的打擂台,我觉得只需要开辟1个单元啊,而且复杂度是线形的。
gnefuil 2005-07-15
  • 打赏
  • 举报
回复
算法导论

哪里要开辟新数组了?

O(d/2logd/2)=O(1/2*d*(logd-1))=O(dlogd-d)=O(dlogd)
在O里面,乘的常数和阶比较小的项都可以忽略
booming 2005-07-15
  • 打赏
  • 举报
回复
乘的常数可以忽略,书上有.
但和阶比较小的项都可以忽略,哪里有?
booming 2005-07-15
  • 打赏
  • 举报
回复
O(n^2)?
booming 2005-07-15
  • 打赏
  • 举报
回复
每次都要依次选一个元素做擂主,然后遍历整个数组,这样时间不会是线性的了吧?
booming 2005-07-14
  • 打赏
  • 举报
回复
O(d/2*log(d/2))也是O(dlogd),一样啊
----------------------------------
是不是这样得出的:
令f=O(d2*log(d/2))=O(dlog(d/2))<=C*dlog(d/2)=Cd(logd-1)<Cdlogd
即,f<=Cdlogd,故:f=O(dlogd).
booming 2005-07-14
  • 打赏
  • 举报
回复
另外,
3。方法很多
一个简单的方法是打擂台,就是从头开始遍历每个元素,用一个计数器记录当前擂主元素的重复个数。第一个数先作为擂主,如果下一个数与当前擂主相同,计数器就加一,否则减一,如果减到0,那么以再下一个数为擂主重新开始打擂台。最后再遍历一遍数组,计算最后的擂主出现的次数,如果大于n/2那么它就是主元素。很明显,如果某数是主元素,那么它一定会最后胜出。如果不存在主元素,第二次遍历得到的重复次数不会大于n/2
--------------
这样的话,要重新开辟一个数组了吧?

有不开辟数组的方法吗?空间使用O(1).
加载更多回复(14)
内容概要:本文档为程序设计基础上机测试题集1,涵盖多个编程练习题目,包括但不限于:发奖金(优化纸币组合)、求闰年数(计算指定年份内的闰年总数)、猴子吃桃(使用倒推法解决递减问题)、小游戏(判断数字之和是否为特定数值的倍数)、考拉兹猜想(验证数学猜想并打印序列)、凯撒密码(实现简单的字符加密算法)、百钱买百鸡(解决古代数学问题)、素数判定(判断输入是否为素数)、计算平均成绩统计不及格人数(处理学生成绩数据)以及打印数字图案(根据输入生成特定格式的数字矩阵)。每个题目都提供了具体的输入输出示例和C/C++代码实现。 适合人群:计算机专业学生或具有一定编程基础的学习者,尤其是正在学习C/C++语言和基础算法的人群。 使用场景及目标:①作为课堂作业或课后练习,巩固所学知识;②用于编程入门考试或竞赛准备;③帮助初学者理解常见算法思想和编程技巧,提高解决问题的能力。 阅读建议:建议读者先尝试独立完成每个题目,之后再参考提供的代码实现,对比自己的思路与标准答案之间的差异,注意代码规范性和效率优化。对于不太理解的地方,可以通过查阅相关资料或向老师请教来加深理解。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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