按升序排序数组,同时最小化“成本”

时间:2009-07-24 15:16:54

标签: algorithm

下个学期我正在参加comp 2210(数据结构),我一直在网上发布夏季学期的作业。到现在为止,我在完成作业时没有遇到任何问题。看一下下面的作业4,看看你是否可以给我一个如何处理它的提示。请不要提供完整的算法,只是一种方法。谢谢!

“成本排序”是一种算法,其中值序列必须按升序排列。排序是 通过一次一个地交换两个值的位置来执行,直到序列处于正确的顺序。每 交换产生成本,其计算为交换中涉及的两个值的总和。总数 该类别的成本是交换成本的总和。

  

例如,假设开始   序列是{3,2,1}。一种可能   一系列的交流是

Interchange 1: {3, 1, 2} interchange cost = 0 
Interchange 2: {1, 3, 2} interchange cost = 4 
Interchange 3: {1, 2, 3} interchange cost = 5, 
given a total cost of 9

您要编写一个程序,确定排列特定数字序列的最低成本。

编辑:教授不允许暴力强迫。

8 个答案:

答案 0 :(得分:9)

如果您想让教授感到惊讶,可以使用Simulated Annealing。然后,如果你管理它,你可以跳过一些课程:)。请注意,此算法仅提供近似答案。

否则:尝试使用Backtracking算法或Branch and Bound。这些都会找到最佳答案。

答案 1 :(得分:3)

你是什么意思“暴力强迫?”你的意思是“尝试所有可能的组合并选择最便宜的?”只是检查。

我认为“分支和绑定”是您正在寻找的 - 检查算法的任何来源。它就像“蛮力”一样,除非你尝试一系列动作,一旦这个动作序列不如迄今为止所尝试的任何其他动作序列更优化,你就可以放弃让你到达那一点的序列 - 成本。这是上面提到的“回溯”的一种风格。

我这样做的首选语言是Prolog,但我很奇怪。

模拟退火是一种PROBABLISTIC算法 - 如果解空间具有局部最小值,那么你可能被困在一个并得到你认为正确答案但不是。有很多方法可以找到所有相关的文献,但我不同意它是你想要的工具。

如果这是你想要的方式,你也可以尝试相关的遗传算法。

答案 2 :(得分:1)

你学过树了吗?您可以创建一个包含所有可能更改的树,从而获得所需的结果。当然,诀窍是避免创建整个树 - 特别是当它的一部分显然不是最好的解决方案时,对吧?

答案 3 :(得分:1)

我认为合适的方法是仔细思考最小“成本”排序的定义属性。然后通过模拟这种理想的排序来计算成本。这里的关键要素是您不必实施通用的最小成本排序算法。

例如,假设最小成本排序的定义属性是每个交换在其排序位置放置至少一个交换元素(我不知道这是否为真)。每个基于交换的排序都希望能够拥有这个属性,但在一般情况下这并不容易(可能吗?)。但是,您可以轻松创建一个采用未排序数组的程序,获取排序版本(它本身可以通过不理想的算法生成),然后使用此信息决定从未排序数组中实现排序数组的最低成本。

答案 4 :(得分:1)

<强>描述

我认为最便宜的方法是将最便宜的错放物品与属于其当场的物品交换。我相信这可以通过移动最贵的东西来降低成本。如果有n个元素不合适,那么最多只需要n-1次交换就可以将它们放置到位,成本为n-1 *成本最低的项目+所有其他不合适的成本。< / p>

如果全球最便宜的元素没有放错地方并且这个最便宜的元素与最便宜的元素之间的差距足够大,那么将最便宜的元素与最便宜的错误元素交换在一起可能会更便宜。那么成本是n-1 *最便宜+所有不合适的成本+最便宜的成本。

示例

对于[4,1,2,3],该算法交换(1,2)以产生:

[4,2,1,3]

然后交换(3,1)以产生:

[4,2,3,1]

然后交换(4,1)以产生:

[1,2,3,4]

请注意,[2,3,4]中每个放错位置的项目只移动一次,并与最低成本项目交换。

<强>代码

Ooops:“请不要提供完整的算法,只是一种方法。”删除了我的代码。

答案 5 :(得分:0)

为了让你继续前进,这可能没有完全意义。

确定所有可能的移动,以及每次移动的成本并以某种方式存储它们,执行最便宜的移动,然后确定可以从此变体执行的移动,将存储移动的其余部分存储,执行最少的移动昂贵的等等,直到数组排序。

我喜欢解决这样的问题。

答案 6 :(得分:0)

在一些ACM比赛中,此问题也称为傻排序问题。使用 Divide&amp ;;查看this solution

答案 7 :(得分:-1)

在相同的输入数据上尝试不同的排序算法并打印最小值。