배열 목록과 많은 설정 시간이 있으면 각 배열의 일부 하위 범위에서 가장 작은 값을 빨리 찾아야합니다. 개념 :스팬에 대한 빠른 분
class SpanThing
{
int Data;
SpanThing(int[][] data) /// must be rectangulare
{
Data = data;
//// process, can take a while
}
int[] MinsBruteForce(int from, int to)
{
int[] result = new int[data.length];
foreach(int index, int[] dat; Data)
{
result[i] = int.max;
foreach(int v; dat[from .. to]);
result[i] = min(result[i], v);
}
return result;
}
int[] MinsSmart(int from, int to)
{
// same as MinsBruteForce but faster
}
}
각 노드는 관련 기간에 최소가 들어있는 데이터에 이진 트리를 구축하는 것이 작업을 수행하는 방법에 대한 나의 현재의 생각. 그런 식으로 하나의 행에 대한 스팬의 최소값을 구하는 것은 그것을 구성하는 트리 노드 만의 최소값을 찾는 것으로 구성됩니다. 이 집합은 각 행에 대해 동일하므로 한 번 계산할 수 있습니다.
누구나이 아이디어에 대해 문제점을 보거나 더 나은 방법을 알고 있습니까?
내가 이야기하고있는 트리 루트 노드가 전체 행에 대해 각 노드에 대한 최소 값을 포함 것이라고 sutch를 설정됩니다, 명확히하기 위해, 그것은을위한 최소 값을 가질 것이다 아이를 남아 부모의 스팬의 왼쪽 절반, 오른쪽의 스팬.
0 5 6 2 7 9 4 1 7 2 8 4 2
------------------------------------------------
| 5 | 6| | 7 | 9 | | 1 | 7 | 2 | 8 | 4 | 2
0 | 5 | 2 | 7 | 4 | 1 | 2 | 2
0 | 2 | 1 | 2
0 | 1
0
이 트리
배열에 매핑 세그먼트 경계를 신속 룩업의 결과로 산출 될 수있는 방식으로 정의 될 수있다.내가 최적화하려는 경우 고정 된 입력 집합과 많은 프론트 시간이 있지만 그 다음에 여러 가지 빠른 테스트를 수행해야합니다.
저는 실제로 로그 시간이라고 확신하지는 않습니다. 적어도 평균적인 경우는 그렇습니다. 나는 앉지 않았고 그것을 밖으로 당혹스럽게 만들었다. 그러나 그것은 더 좋을 수 있었다. +1 어쨌든 :) – BCS
무한대로 크기 N = 2 ** m으로 배열을 확장하십시오. 스팬에서 포인트를 찾을 때까지 배열에서 이진 검색 (k 스텝). 그런 다음 스팬의 작은 끝을 얻기 위해 왼쪽으로 m-k 걸음을 가져야하고 큰 끝으로 오른쪽으로 m-k 걸음을 내야합니다. 비용은 m과 2m 사이입니다. 여기서 m = log N입니다. –
나는 그것에 대해 생각할 것입니다. 행당 비용을 고려하고 있었고 스팬이 트리에서 무언가와 일치하는 경우 1의 하한이 있습니다. 최악의 경우는 첫 번째 요소와 마지막 요소를 제외한 모든 요소의 범위가되며 약 2 log n이됩니다. 더 흥미로운 것은 일반적인 경우입니다. – BCS