0

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

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

# 项目 = 3

[("ball","chair"),("ball","box"),("box","chair"),("chair","box")]

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

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

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

谢谢!!!!!!!!!!

4

2 回答 2

1

加快您的任务的方法:

1.使用整数

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

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

在 tupls 中,球现在有数字 0(数组中的位置 0),椅子 1,框 2。比较整数比字符串快。

2.避免递归

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

如果问题非常复杂以至于非递归实现对人脑来说太复杂,那么递归会很有帮助。

迭代更快,但在您通过实现自己的堆栈来模仿递归调用的情况下则不然。

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

3. 尽可能避开物体

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

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

4. 编程语言

在 C 中它会比在 Java 中更快。

于 2013-01-24T18:35:56.233 回答
0

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

您在这里尝试的最佳策略是“分支和绑定”。它是您可能已经编写好的简单递归搜索的变体。您跟踪迄今为止找到的最佳解决方案的价值。在每个递归调用中,您检查是否有可能使用您迄今为止修复的选项击败最知名的解决方案。

可能有帮助(或可能有害)的一件事是“探查”:对于每个尚未修复的项目,看看是否将该项目放在两侧之一只会导致次优解决方案;如果是这样,您知道该项目需要在另一侧。

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

您应该特别注意“绑定”步骤——根据您已确定的选择,找到最佳解决方案的上限。

于 2013-01-25T16:47:38.463 回答