我需要从一些givin数据中找到severel tops(来自图表的数据)。数据被放入一个数组中。
通过在顶部之后的特定间隔中的顶部和底部或相等元素之前的特定间隔中具有较低或相等的元素来定义顶部。我想保持简单,因为我不是专家。
我正致力于使用一些不同的工具分析一些股票图表。我希望你能帮助我,或者可能会提出一些其他的意见如何解决这个问题:)
答案 0 :(得分:1)
这是一个有效的例子:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class Test
{
static final int[] graph = new int[100]; static { randomGraph(); }
static final int window = 3;
public static void main(String[] args) {
final List<Integer> tops = new ArrayList<Integer>();
for (int i = 0; i < graph.length; i++)
if (max(i-window, i) <= graph[i] && graph[i] >= max(i+1, i+1+window))
tops.add(i);
System.out.println(tops);
}
static int max(int start, int end) {
int max = Integer.MIN_VALUE;
for (int i = Math.max(start, 0); i < Math.min(end, graph.length); i++)
max = Math.max(max, graph[i]);
return max;
}
private static void randomGraph() {
final Random r = new Random();
for (int i = 1; i < graph.length; i++)
graph[i] = graph[i-1] + r.nextInt(10) - 5;
System.out.println(Arrays.toString(graph));
}
}
答案 1 :(得分:0)
如果阵列不太大,可以使用强力解决方案。您可以迭代元素,并检查您为每个元素描述的谓词:
伪代码:
for (int i = 0; i < array.length; i++) {
boolean isPick = true;
for (int j = max(0,i-interval; j < min(array.length,i+interval; j++)
if (array[j] > array[i]) isPick=false;
//do something with the pick, isPick indicates if it is a pick or not.
如果数组非常大,您可能需要考虑的启发式解决方案是hill-climbing