2

デジタル数値配列の中央値を計算する方法については、前に説明しました。たとえば、中央値の計算にSTLコンテナを使用する場合の正しいアプローチは何ですか?を参照できます。。別の質問があります。それは、元のSTLコンテナの中央値のインデックスを取得する方法です。私の質問を説明するために、例を示します。

vector<int> myarray;
myarray.push_back(3);
myarray.push_back(1);
myarray.push_back(100);
myarray.push_back( 20);
myarray.push_back(200);
int n = myarray.size()/2;
nth_element(myarray.begin(), myarray.begin()+n, myarray.end());
int median = myarray[n];

上記のコードでは、中央値を取得できますが、元のベクトル配列(4)でそのインデックスを取得できません。何か案は?ありがとう!

4

4 に答える 4

6

それを行う簡単な方法はないと思います。

並べ替えたベクトルの順序が変更されたため、その中で検索すると常にが返されnます。

元のベクトルのコピーを保存して、その中で検索する必要があります。元のベクトルに重複が含まれている場合、それらのどれが実際に位置nに配置されたかが正確にわからないことに注意してください(これが関連性がある場合)。

別の方法として、nth_elementの実装を確認し、見つかったn番目の要素の元の位置も報告する独自のバージョンを実装することもできます。

于 2012-07-19T08:16:38.223 に答える
4

要素を検索できる場合

vector<int>::iterator itOfMedian = std::find(myarray.begin(), myarray.end(), median);
int index = itOfMedian - myarray.begin();

トリックを行う必要があります。

編集

ここにポイントがあるようです。nth_elementは引数ベクトルをソートします...したがって

vector<int> myArrayCopy = myarray;
// find median in myArrayCopy
vector<int>::iterator itOfMedian = std::find(myarray.begin(), myarray.end(), median);
int index = itOfMedian - myarray.begin();
于 2012-07-19T07:53:12.570 に答える
3

std :: nth_elementを使用して、中央値要素へのイテレータを見つけることができます。ただし、これはベクトルの部分的な並べ替えを行うため、コピーを使用する必要があります。

  std::vector<int> dataCopy = myarray;
  // we will use iterator middle later
  std::vector<int>::iterator middle = dataCopy.begin() + (dataCopy.size() / 2);
  // this sets iterator middle to the median element
  std::nth_element(dataCopy.begin(), middle, dataCopy.end());
  int nthValue = *middle;

今では複雑になります。中央値に対応する値があります。元のベクトルで検索し、std::distanceを使用してインデックスを取得できます。

std::vector<int>::iterator it = std::find(myarray.begin(), myarray.end(), nthValue);
std::vector<int>::size_type pos = std::distance(myarray.begin(), it);

nthValueただし、これはinの重複がない場合にのみ機能しmyarrayます。

于 2012-07-19T07:56:40.997 に答える
1

古いトピックを掘り下げて申し訳ありませんが、これを行うための良い方法があります。nth_element最初の要素でペアをソートするという事実を利用します。これを念頭に置いて、ペアの最初の部分が中央値の計算に参加する値であり、2番目の部分がインデックスであるペアのベクトルを作成します。例の変更:

vector<pair<unsigned int, size_t>> myarray;
myarray.push_back(pair<unsigned int, size_t>(  3, 0));
myarray.push_back(pair<unsigned int, size_t>(  1, 1));
myarray.push_back(pair<unsigned int, size_t>(100, 2));
myarray.push_back(pair<unsigned int, size_t>( 20, 3));
myarray.push_back(pair<unsigned int, size_t>(200, 4));

int n = myarray.size()/2;
nth_element(myarray.begin(), myarray.begin()+n, myarray.end());

int median = myarray[n].first;
int medianindex = myarray[n].second;

もちろんmyarray再配置されているのでmyarray[medianindex]、中央値ではありません。nth_element以前にコピーを作成した場合はmedianindex、が目的のインデックスになります。

于 2015-12-09T05:11:09.087 に答える