【问题标题】:Best Way to Save Results - Dynamic Programming保存结果的最佳方法 - 动态规划
【发布时间】:2012-02-14 11:04:10
【问题描述】:

我正在努力解决一个与Euler Problem 215 有点相似的问题。我想我可以在不解释整个问题和/或我解决问题的完整方法的情况下解释这一点。

现在我正在使用 RT([Arraylist of numbers], int i) 进行递归调用。根据该技术,我想保存结果,所以如果当 RT 询​​问相同的问题时,我可以简单地查找答案,而不是重复出现,直到达到基本情况。

只是为了说明 RT([3, 7.5, 10.5, 15], 2)。在递归中,右边在右边递增。 Arraylist 用于确定还需要调用基本情况的其他内容。

通常,我对动态编程的理解通常使用二维数组,其中使用所谓的参考点保存和存储结果。如果它类似于 RT(int x, int y),那就太好了。但是我的问题呢?

我想我可以将 ArrayList 更改为字符串 37510515,然后更改为一些使用的 ASCII 数字或数字本身。但是我希望我可以像使用 ArrayList 作为键的 HashMap 一样处理这个问题,但是这个 HashMap 的缺陷只适用于一个值(我知道我可以链接,但是在存储结果时如何工作呢?轻松跟踪调用它的“int i”是什么?)

简而言之,谁能帮我想出一种方法来存储结果,其中 ArrayList 和 int 作为两个引用?

提前致谢!

【问题讨论】:

  • 数字的arraylist是否总是以相同的顺序排列?那有关系吗?如果没有,那么 b-tree 将起作用,并将读取保持在最低限度。如果幸运的话,您会进行 1 次查找。在最坏的情况下,您必须(在您的情况下)运行树的 5 个级别。

标签: algorithm data-structures combinations dynamic-programming


【解决方案1】:

您可以使用您喜欢的任何类的对象作为 HashMap 的键,如果对象正确定义了 equals() 和 hashCode(),它将起作用。这些方法已经在 ArrayList 中正确实现,因此您应该会发现使用 ArrayLists 作为 HashMap 键效果很好。

如果您想使用 ArrayList 和数字组合作为 HashMap 的键,您可以为此定义一个类,在该类中实现 hashCode() 和 equals(),或者通过设置数字来作弊只是数组列表中的最后一个条目。

听起来你正在做的事情更像http://en.wikipedia.org/wiki/Memoization 而不是动态编程,但它可能会完成工作 - 我猜欧拉问题已被设置为使其可用于最佳技术 - 如果那是记忆或动态编程,您应该会发现它是负担得起的。时间太长了,我们都错过了一些更有效的方法。

进一步加快速度的一种方法是利用问题中的对称性 - 例如如果您的状态对应于一行(或一列)块,那么这与具有从右到左而不是从左到右或从下到上而不是从上到下布置的相同块的行的状态基本相同。

【讨论】:

  • 谢谢。我接受了你的建议。我采取了简单的方法,只是将数字添加到 ArrayList,而不是创建一个新对象并定义其 equals() 和 hashCode()。我会称它为一个小“黑客”,因为我以非预期的方式使用它。但是,它现在仍然有效。
【解决方案2】:

解决的一种方法是实现您自己的类来包装 arraylist 和 int,编写 hashCodeequals,如此处所述。

Using a byte array as Map key

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多