문제

나는 배열의 값을 떠고 원하는 값과 더 중요한 위치는 최대 네 개의 값이 있습니다.

나는 내가 원래 시스템을 통해 도보로 배열을 찾기 위 max 일반적인 방법으로,값을 비교하여 현재 위치에 있도록 하겠습니다 max 그리 멀리 및 업데이트 위치를 변수의 경우 최대도까지 변경합니다.이 일이 잘 O(n)algo 는 매우 간단합니다.나는 나중에 내가를 유지해야 하지만 정상 값을 가지고 있지만,상위 수 있습니다.나는 확장된 동일한 절차와 복잡한 max 그리 멀리로는 네 개의 배열 max 그 fars 고 지금은 코드를 추한 모습이 됩니다.

그것은 여전히 작동하고 여전히 충분히 빠르기 때문에만 사소한 금액의 계산을 추가되었습니다.그것은 여전히 효과적으로 산책을 통해 배열 및 검사 서 값이다.

나는 이것에는 MATLAB 으로 정렬 기능을 반환하는 두 가지 배열 정렬된 목록 및 첨부된 원래의 위치로 목록입니다.보고에 의해 처음 몇 값이 내가 정확히 무엇을 내가 필요합니다.나는 복제하는 이 기능으로 C#.NET2.0 프로그램입니다.

나는 내가 뭔가를 할 수 있는 유사한 목록으로 개체는 개체는 내장된 정렬 일상적인,하지만 내가 믿지 않는다 그것을 말할 수 있다 원래의 위치,그리고 사람들은 정말 무엇이 난다.

는 잘 작동,하지만 지금은 자신을 찾을 원하는 다섯 번째로 최대 값을 다시 쓰기 최대,그 이 검사는 현재 추한 혼란의 경우 문을 만 화합물 추함.그것은 작업을 잘 수 없는 느리게 추가하려면 다섯 번째 수준이지만,나에게 물어 보고 싶은 그래서 지역 사회가 있다면 더 나은 방법입니다.

분류 전체 목록은 더 많은 계산보다 나의 현재 방법이지만,나는 생각하지 않는 것이 문제가 목록으로는'유일한'하나 또는 두 개의 천 떠;그래서가 있다면 일종 일상을 줄 수 있는 다시 원래의 위치는 것이 이상적입니다.

배경으로,이 배열의 결과입니다 푸리에 변환에 kb 의 웨이브 파일,그래서 최대 값의 위치에 해당 샘플 데이터의 최대 주파수.나는 내용으로는 최고 네,하지만 볼 필요가 정말 수집단섯에 대한 더 많은 정확한 샘플 분류 수 있습니다.

도움이 되었습니까?

해결책

내가 제안할 수 있는 대안 알고리즘을 해야 하는 코드:)

사용 힙의 크기 K 여기서 K 을 나타내 수의 최고 원하는 요소를 저장합니다.초기화 이해의 첫 번째 K 요소는 원래의 배열입니다.에 대한 모든 N-K 요소를 걸어서 배열을 삽입할 때 필요합니다.

proc top_k (array<n>, heap<k>)
heap <- array<1..k-1>
for each (array<k..n-1>) 
  if array[i] > heap.min
     heap.erase(heap.min)
     heap.insert(array[i])
  end if
end for

다른 팁

여전히 사용할 수 있습의 목록은 아이디어는 요소를 넣어 목록에서 수 있는 구조로점 모두 인덱스와 값;하지만 종류에 가치,예를 들면:

class IndexAndValue : IComparable<IndexAndValue>
{
    public int index;
    public double value;

    public int CompareTo(IndexAndValue other)
    {
        return value.CompareTo(other.value);
    }
}

할 수 있습니다 다음 지팡이에 그들에게 목록을 유지하면서,이에 대한 정보를 인덱스입니다.을 유지하는 경우에만 가장 큰 m 항목 목록에서,다음의 효율성해야 O(mn).

내가 알지 못하는 알고리즘 당신이 현재 사용하여,그러나 나는 것이 좋다.을 인정하는 당신의 배열을 가지고 수레 f 최대 capacity 숫자를,다음 작업을 수행할 수 있습니다:

int capacity = 4; // number of floats you want to retrieve
float [] f; // your float list
float [] max_so_far = new float[capacity]; // max so far

// say that the first 'capacity' elements are the biggest, for now
for (int i = 0; i < capacity; i++)
  max_so_far[i] = i;

// for each number not processed
for (int i = capacity; i < f.length; i++)
{
  // find out the smallest 'max so far' number
  int m = 0;
  for (int j = 0; j < capacity; j++)
    if (f[max_so_far[j]] < f[max_so_far[m]])
      m = j;

  // if our current number is bigger than the smallest stored, replace it
  if (f[i] > f[max_so_far[m]])
    max_so_far[m] = i;
}

의 끝으로 알고리즘,당신은 지표의 가장 큰 요소에 저장 에 max_so_far.

지 주는 경우 capacity 가치가 성장,그것은 될 것입니다 약간 느린 보 대체는 목록을 정렬 추적을 유지하면 초기의 위치입니다.을 기억하는 정렬 소 O(n로그 n)비교하는 동안,이 알고리즘 취 O(n용량).

또 다른 옵션은 사용하여 빠른 선택합니다.빠른 선택의 위치를 반환합 k 번째 요소의 목록에.후에 위치하고의 값 k 번째 요소로 이동하고 각 요소의 작/보다 큰 k 번째 요소입니다.

내가 찾는 c#의 구현 빠른 여기에서 선택: 텍스트 링크

장점:

  1. O(n+k)평균 실행하는 시간입니다.

단점:

  1. K 요소를 정렬되지 않습니다.는 경우에 당신은 그들을 정렬 실행 시간은 오(n+logk)
  2. 나는 검사하지 않았지만,그는 아주 작은 k 최선의 선택을 할 것입 k 실행을 통해 배열을,각각의 시간을 찾는 다음 작/는 가장 큰 요소입니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top