优化算法:导出集的最快方法

时间:2013-01-24 18:09:36

标签: algorithm optimization set

我正在为竞赛编写一个程序,我需要比其他竞争对手更快。为此我需要一点算法帮助;理想情况下,我会使用最快的算法。

对于这个问题,我有两件事。第一个是元组列表,每个元组包含两个元素(字符串),每个元素代表一个项目。第二个是整数,表示总共有多少个唯一项。例如:

项目数量= 3

[(“ball”,“chair”),(“ball”,“box”),(“box”,“chair”),(“chair”,“box”)]

可以重复相同的元组/它们不一定是唯一的。)我的程序应该计算出当项目被分为两组时可以“同意”的最大元组数。这意味着如果所有项目都分为两个理想的组,即组1和组2,那么组1中的第一个项目和组2中的第二个项目的最大元组数是多少。

例如,我之前的例子的答案是2,第1组中的“ball”和第2组中的“chair”和“box”,满足前两个元组。我不一定需要知道哪些项目在哪个组中,我只需要知道满足元组的最大数量是多少。

目前我正在尝试一种递归方法,但它在(n ^ 2)上运行,在我看来效率太低了。有没有人有一种可以产生更快算法的方法?

感谢!!!!!!!!!!

2 个答案:

答案 0 :(得分:1)

加快完成任务的方法:

<强> 1。使用整数

将字符串转换为整数(将字符串存储在数组中并使用tupples的位置。

String [] words = {“ball”,“chair”,“box”};

在tuppls球中现在有数字0(数组中的位置0),主席1,方框2。 比较整数比字符串快。

<强> 2。避免递归

由于递归开销,递归很慢 例如,在递归实现中查看binarys搜索算法,然后查看java如何实现binSearch()(使用while循环和迭代)

如果问题非常复杂,非递归实现对于人类大脑来说很复杂,那么递归是有帮助的。

迭代速度更快,但是当您通过实现自己的堆栈模仿递归调用时则不然。

但是你可以使用recursiove算法开始实现,一旦它工作并且它是一个合适的算法,然后尝试转换为非递归实现

第3。如果可能的话,避免使用对象

如果你想要最快,现在它变得丑陋!

tuppel数组可以存储在Point(x,y)类的数组中,也可能更快, 作为int的数组:
例: (1,2),(2,3),(3,4)可以存储为数组:(1,2,2,3,3,4) 这需要更少的内存,因为一个对象至少需要12个字节(在java中)。 更少的内存变得更快,当数组真的很大时,你的结构有望适合处理器缓存,而对象数组却不适合。

<强> 4。编程语言

在C语言中它比在Java中更快。

答案 1 :(得分:0)

最大切割是你问题的一个特例,所以我怀疑你有一个二次算法。 (最大切割是NP完全的,它对应于每个元组(A,B)也反向出现的情况(B,A)相同的次数。)

你在这里尝试的最佳策略是“分支机构”。它是您可能已编码的直接递归搜索的变体。您可以跟踪到目前为止找到的最佳解决方案的价值。在每次递归调用中,您都可以检查是否有可能通过目前已修复的选项击败最知名的解决方案。

可能有助于(或可能受到伤害)的一件事是“探测”:对于每个尚未修复的项目,看看是否将该项目置于双方中的一方仅导致次优解决方案;如果是这样,你知道该项目需要在另一边。

另一个有用的技巧是对作为第一个元素和元组的第二个元素频繁出现的项进行递归。

你应该特别注意“约束”步骤---根据你已经修复的选择找到最佳解决方案的上限。