我太密集了,无法解决以下优化问题:
有一个2D数组,比方说符号与时间,例如
A 1114334221111
B 9952111111111
C 1113439111131
D 1255432245662
还有一个符号列表,例如:
CABDC
您必须按照符号的顺序从数组中选择值,但您可以根据需要重复一次符号。您必须为每个符号选择至少一个值,并且您必须完成整个列表。例如,一种可能性是:
CCCAAAAAABDDC
1114334221661 = 35
是否有算法选择总和为最大值的符号列表?在第一次脸红时,它看起来像某种回溯算法,但可能会退化到指数时间。
答案 0 :(得分:5)
我可能采取的方法如下:
创建X
元素的数组(“(N+1)xM
”),其中N
= 2D数组的“宽度”,M
=中的符号数你的清单。
为所有值i设置X[0][i] = 0
(在M
范围内)。这是因为前0个所选项目的最大可能总和为0.我们也可以将X[a][b]
填入任何b>=a
的0,因为这些位置是我们无法达到的位置(我们不会选择足够的符号来表示那个符号)。类似地,我们可以将数组尾端的值的“三角形”设置为0,因为为了处于这些索引之一,我们必须选择太多重复的早期符号才能选择至少有一个项目用于以后的符号。
现在,如果所选择的当前符号是序列中的符号X[1][i]
,则将i
设置为等于前1个所选元素的最大可能总和。这对计算来说相当简单 - 它只是数组中该符号的相应值。
现在,如果所选择的当前符号是序列中的符号X[2][i]
,则将i
设置为等于前两个所选元素的最大可能总和。这也是半平凡的,虽然不像[1]那么简单 - 毕竟,现在它是符号的相应值加上 X[1][i-1]
或X[1][i]
- 因为我们可以在这个位置开始当前符号,或者已经在较早的位置开始它。
继续为每个X[k]
设置算法(设置X[k][i]
等于X[k-1][i-1]
或X[k-1][i]
的最大值,加上当前{{1}的相应符号值})直到i
到达k
。 N
列中的最大值是您的最大结果。
总体而言,您只需要查看每个数组元素一次,整个算法在X[k]
时间内运行。
(注意,从技术上讲,你不需要在内存中一直使用完整的NxM数组,只需要前一列和当前列。根据完整数组来解释它更容易。因此优化版本为算法使用O(MN)
内存。)
示例中的示例结果数组:
O(M)
如果你存储(在每个数组位置)哪个前一个符号被用作该位置的总和的一部分,那么很容易通过从右下角到左上角的路径读回去找出什么是最大序列。或者,您可以通过查看两个值中的哪一个(左侧或左侧)从您当前位置的较大位置进行追溯。在这种情况下,最大序列是CABDDDDDDDDDC。
答案 1 :(得分:2)
我认为shortest path略有不同。将数组的每个元素视为有向图中的节点。您应该能够修改任何标准的最短路径算法以添加符号排序。
答案 2 :(得分:2)
你可以把它作为最短路径问题,但与Fragsworth所说的不同,你不需要改变算法,只需要如何呈现数据:
图表中的每个节点都是2D数组中的单个单元格,您可以根据列表连接节点,权重设置为10 - cellValue。 你没有连接不遵守规则的节点(你不会将b [4]连接到[5]因为它不在列表“order”中)
的示例:
c [0]连接到具有权重9的c [1](10-c [1]值为1)=>这是选择“C”
的选项c [0]连接到具有权重9的[1](10-a [1]值为1)=>这是选择“A”的选项
b [2]用权重8连接到b [3](10-b [3]值为2)=>这是选择“B”的选项
b [2]用权重5连接到d [3](10-d [3]值为5)=>这是选择“D”的选项
你遇到的唯一问题是摆脱你选择“CCCCC ......”的选项,通过将你的“CABDC”列表中的第二个“C”称为(C2)来解决这个问题。从示例中的D节点(或其他C2节点)连接它。
现在你运行任何标准的最短路径算法(无需更改)从c [0]开始到c2 [n]结束,因为权重与值相反,你获得的最短路径将是最大值的总和。
答案 3 :(得分:0)
您可以选择贪婪算法,但有一些限制。您将始终必须在当前符号或下一个符号之间进行选择。如果当前符号的等效值大于下一个符号(并且您将能够稍后放置所有剩余符号),则使用当前符号。如果下一个符号编号较大,则选择下一个。如果它们相同,则需要一些额外的逻辑来决定。
答案 4 :(得分:0)
是否有算法选择总和为最大值的符号列表?
这应该很简单,因为你说你可以多次重复一个符号 并且您对符号数量没有限制,或者必须使用每个符号。
(我怀疑这可能太容易了,你只是没有描述整个问题,但无论如何这是解决方案)
for i through the length of array in time
symbol, value = get_max_value(array[i]) # iterates through every symbol to find max at the given time
print symbol, value