【发布时间】:2010-04-01 13:06:50
【问题描述】:
有很多天真的方法可以解决这个问题,但我正在寻找一个好的解决方案。这是问题(将在Java中实现):
你有一个函数 foo(int a, int b) 如果“a”与“b”“相邻”则返回 true,如果“a”与“b”不相邻则返回 false。你有一个这样的数组[1,4,5,9,3,2,6,15,89,11,24],但实际上有一个很长的长度,比如120,并且会一遍又一遍地重复(它是一个遗传算法适应度函数)这就是为什么效率很重要。
我想要一个函数,它返回数组中每个可能的邻接“列表”的长度,但不包括只是较大列表子集的“列表”。
例如,如果 foo(1,4) -> true, foo(4,5) -> true, foo(5,9)-> false, foo(9,3) & foo(3,2) & foo(2,6), foo(6,15) -> true, 然后有'列表' (1,4,5) 和 (9,3,2,6),所以长度为 3 和 4。我不但不希望它返回 (3,2,6),因为这只是 9,3,2,6 的子集。
谢谢。
编辑
抱歉,我才意识到我没有解释整个问题,剩下的部分太难了。让我们重新开始。忘记第一个帖子。这会让我们感到困惑。
假设有一个函数 foo(int[] array) 如果数组是“好”数组则返回 true,如果数组是“坏”数组则返回 false。什么是好是坏在这里并不重要。
给定完整的数组 [1,6,8,9,5,11,45,16,9],假设子数组 [1,6,8] 是一个“好”数组,而 [9,5, 11,45] 是一个“好”的数组。此外 [5,11,45,16,9] 是一个“好”数组,也是最长的“好”子数组。请注意,虽然 [9,5,11,45] 是“好”数组,而 [5,11,45,16,9] 是“好”数组,但 [9,5,11,45,16,9 ] 是一个“坏”数组。
我们想要所有“好”数组的长度计数,而不是“好”数组的子数组。此外,如上所述,一个“好”数组可能从另一个“好”数组的中间开始,但两者的组合可能是一个“坏”数组。
【问题讨论】:
-
定义
naive approach。你想要比O(n^2)更好的东西吗? -
如果您一遍又一遍地执行此操作,并且速度比内存更重要,并且列表在运行之间会发生变化(略有变化),那么可能值得存储一个指向开头的指针每个链条。这样,当列表发生变化时,您就可以限制更新链列表所需的内容。
标签: java algorithm arrays function