2010-06-29 8 views
0

플로트 배열을 정렬하고 값을 수정 한 다음 원래 순서대로 배열을 구성해야하지만 수정 된 값이 필요합니다.

v[i]을 정렬
v[order(v)] 벡터가 정렬 된 벡터c/C++에서 가역 float 정렬

rank(v) 번째 자리에 간다 v 일부 상당이 있습니까 :

는 R, 나는 이것을 달성하기 위해 rank()order() 기능을 사용할 수 있습니다 표준 c 또는 C++ 라이브러리에서 이러한 함수를 사용합니까? 순열 행렬이나 같은 정보를 인코딩하는 다른 방법도 괜찮을 것입니다.
O (n) 공간과 O (nlogn) 시간이 이상적입니다.

+0

"값에 따라 작동합니까?"는 것은 변경된다는 의미입니까? –

+0

예. 내 질문을 더 명확하게 편집했습니다. –

답변

2

: 그것은 nth_element를 불렀다 및 Random Access Container의 모든 모델에 적용 할 수 있습니다 (그 중 vectordeque이 두드러진다).

지금, 값에 대한 연산이 실제로 값을 수정할 수 있으므로 순위가 변경 될 수 있습니다. 따라서 순위를 저장하는 것이 좋습니다.

  1. std::vector<float> 정렬 vector (어떤 조건없이 작품) 물론 당신이 nth_element에 의해 영향을하지 않으려면
  2. std::vector<float>

에 값

  • std::vector< std::pair<float, rank_t> >을에서 작동을
  • std::vector< std::pair<float, rank_t> >에 발생한 값의 현재 수정.

  • +0

    고마워,이 정확히 내가 무엇을 찾고 있었는지. 정렬하기 전에 배열의 포인터를 저장하는 것이 성능면에서 더 좋은 방법이라고 생각합니다. –

    +0

    흠 .. 그래, 그럴 수있어. 'std :: vector '을'std :: vector '에 붙여서 포인터 버전을 정렬하고 조작하십시오. –

    +0

    간단한 데이터 형식의 경우 포인터 간접 지정을 사용하면 성능에 어떤 도움이되는지 알 수 없습니다. 액세스 당 두 개의 메모리 히트를 취하여 스왑 조작이 32 비트 시스템에서 여전히 단순한 4 바이트 스왑이 될 위치를 비교할 것입니다. 포인터를 통한 정렬은 원본 데이터 유형을 스왑하는 비용이 포인터를 교환하는 비용보다 큰 경우에만 도움이됩니다. – Torlack

    0

    http://www.cplusplus.com/reference/algorithm/sort/

    당신은 또한 int를 보유하고 구조체로 부동 물건이 구조체의 배열을 구축하고 INT 필드에있는 각 요소의 위치를 ​​저장할 수 있습니다. 첫 번째 단계에서 float 필드에서 작동하는 비교 함수를 사용하여 stl sort를 사용하고 계산을 수행 한 다음 int 필드에서 작동하는 비교 함수로 정렬하여 원래 순서를 되 찾습니다.

    내가 정말 C 아니에요,이 작업을 수행 할 수있는 더 좋은 방법이있을 수 있습니다 ++ 사람

    ++ C의 rank 기능에 동등 물이있다
    +0

    및 간단한 부록을 사용하면 구조체를 다루지 않아서 원래 배열의 포인터 배열을 만들 수 있습니다. float *가 가리키는 값을 기준으로 정렬하는 비교 함수를 작성하고 포인터 배열을 사용하여 계산을 수행하면 원래 순서를 잃어 버릴 염려가 없습니다 – paintcan

    +0

    감사합니다. 처음에는 비슷한 생각을했지만 두 번 정렬하는 것을 피하려고했습니다. . 포인터 배열을 저장하는 것은 내가 원하는 것에 대해 가장 잘 작동하는 것처럼 보입니다. –

    0

    간단히 대답하면 배열을 정렬하기 전에 복사 한 다음 완료하면 복원하는 것입니다. 속도가 문제인 경우에만 더 복잡한 작업을 수행하십시오.

    class Comparator 
    { 
    public: 
        explicit Comparator(const std::vector<float>& array) : array(array) {} 
        bool operator()(size_t a, size_t b) {return array[a] < array[b];} 
    private: 
        const std::vector<float>& array; 
    }; 
    
    void Example(const std::vector<float> &floats) 
    { 
        std::vector<size_t> rank; 
        for (int i = 0; i < floats.size(); ++i) rank.push_back(i); 
        std::sort(rank.begin(), rank.end(), Comparator(floats)); 
    
        std::cout << "First: " << floats[rank.front()] << std::endl; 
        std::cout << "Last: " << floats[rank.back()] << std::endl; 
    } 
    

    또는 :

    C++에서

    , 당신은, 왠지이 (테스트, 그리고 수레는 벡터에있는 가정하지 않음) 같은 것을 배열 값을 비교하는 사용자 정의 비교를 사용하여 인덱스의 배열을 정렬 할 수 여분의 메모리를 쓴다면, (float, rank) 쌍의 벡터를 만들 수 있고, float 값을 기반으로 정렬 할 수 있습니다. 이 방법은 qsort()을 사용하는 C에서도 작동합니다.

    1

    대답은 부동 소수점을 정렬하는 대신 부동 소수점에 대한 포인터 배열을 만들고 포인터를 역 참조하고 그들이 가리키는 부동 소수점을 비교하는 비교 함수를 사용하여 포인터 배열을 정렬합니다.