我必须编写一个java程序来模拟一个机器人,以便将它与相应的jar相匹配。机器人有两个臂,一个用于盖子,一个用于罐子。我无法将盖子与盖子或罐子与罐子进行比较。用户将输入三行:
5(n)
9 7 2 5 6(size of lids)
2 6 5 7 9(size of jars)
输出应为:
3 5 4 2 1
第2行中的第3个数字等于第3行中的第1个数字,依此类推。
我们应该使用分而治之的算法,我真的不知道从哪里开始。我所要做的就是它与quicksort类似。任何帮助将不胜感激。
答案 0 :(得分:0)
划分和征服算法最初可能会令人困惑。想想它就好像你有一些你无法解决的相对较大的问题,但如果这个问题多得多,那么你就能找到答案。将它应用于这种情况:假设不是有2个大的盖子和罐子尺寸列表,而是有1个盖子尺寸和一些罐子尺寸。你可以很容易地告诉我盖子适合哪个罐子,对吗?解决1盖子问题的想法基本上将大问题(几个盖子)分解成一个较小的盖子(1个盖子)。一旦这有意义,你可以继续算法。
您可能会使用一些递归来编写算法。从基础案例开始,解决最简单的有意义的问题(我喜欢1个盖子的例子)。一旦你能解决这个问题,你能否为每个盖子递归地解决同样的问题?我没有附上任何代码,因为我不想破坏你的学习经历(这显然是家庭作业)。
答案 1 :(得分:0)
“分而治之”的全部意义在于将工作分成多个较小的问题;然后你解决了较小的问题并将它们推出,直到它们组合成一个解决方案。这几乎意味着递归解决方案。
使用任何递归函数,您总是需要一个“基础案例”。这将是一个简单易用的简单案例。例如,如果您只有一个罐子和一个盖子,那么您只需返回罐子与盖子匹配即可。 (因为作为问题陈述的一部分,每个罐子总是有一个匹配的盖子。)
因此,一个开始的地方是一个简单的程序,只适用于长度为1的罐子/盖子列表。然后添加更多机器,使其更有能力。
使用快速排序,您可以选择一个分割数字的位置(“枢轴”),然后进行非常粗略的排序(只需取数字应位于枢轴左侧但位于右侧并移动到左边,反之亦然)。然后在子列表上递归调用quicksort。最终,每个对quicksort的递归调用都会遇到一个基本情况(长度为1的子列表);一旦他们都完成了基础案例,快速排序就完成了。 (注意:有一些方法可以通过添加更多代码来优化快速排序并使其更快,但我在这里谈论的是最简单的快速排序实现。)
也许在这种情况下你应该从长度为n的列表开始,只列出从1到n的数字,然后交换数字,直到你有一个正确的列表?
嗯。对于长度为2的列表,只有两种可能性:列表是否排列。如果他们排队你就完成了。如果没有,你交换数字使它们排成一行,你就完成了。嗯。这类似于某种方式的排序,但您不能像排序时那样直接比较数字。 (在排序中你总是知道3种类型低于5,但在这里可能不是这样。)所以,现在考虑一种方法来分解列表并继续这样做,直到你有一个长度为2或长度为1的子列表,然后处理那些微不足道的案件。
听起来很有趣。我希望你喜欢它。