Пример #1
0
 int RandomizedSelect(std::vector<int> & nums, int start, int end, int i)
 {
     if (nums.empty())   return 0;
     if (start == end)   return nums[start];
     int mid = RandomizedPartition(nums, start, end);
     int k = mid - start + 1;
     if (i == k)
         return nums[mid];
     else if (i < k)
         return RandomizedSelect(nums, start, mid - 1, i);
     else
         return RandomizedSelect(nums, mid + 1, end, i - k);
 }
Пример #2
0
int main()
{
    int64_t array[] = { 2, 8, 7, 1, 3, 5, 6, 4 };
    
    std::cout << RandomizedSelect(array, 0, 7, 3) << std::endl;
    getchar();
    return 0;
}
// -----------------------------------------------------------------------------
// Sort the entries of filtMagUpdateMap and set the threshold to be ? percentile
// -----------------------------------------------------------------------------
Real_t BFReconstructionEngine::SetNonHomThreshold(RealImageType::Pointer magUpdateMap)
{
  size_t dims[1] =
  { m_Geometry->N_z* m_Geometry->N_x};
  RealArrayType::Pointer TempMagMap = RealArrayType::New(dims, "TempMagMap");

  uint32_t ArrLength = m_Geometry->N_z * m_Geometry->N_x;
  Real_t threshold;

  //Copy into a new list for sorting
  Real_t* src = magUpdateMap->getPointer();
  Real_t* dest = TempMagMap->getPointer();
  ::memcpy(dest, src, ArrLength * sizeof(Real_t));

#ifdef DEBUG
  Real_t TempSum = 0;
  for(uint32_t i = 0; i < ArrLength; i++)
  { TempSum += TempMagMap->d[i]; }

  if(getVerbose()) { std::cout << "Temp mag map average= " << TempSum / ArrLength << std::endl; }
#endif //DEBUG

  /* for (uint32_t i = 0; i < m_Geometry->N_z; i++)
        for (uint32_t j = 0; j < m_Geometry->N_x; j++)
        {
            //TempMagMap->d[i*geometry->N_x+j]=i*geometry->N_x+j;
            TempMagMap->d[i * (uint32_t)m_Geometry->N_x + j] = magUpdateMap->getValue(i, j);
        } */

  uint32_t percentile_index = ArrLength / MBIR::Constants::k_NumNonHomogeniousIter;
  if(getVerbose()) { std::cout << "Percentile to select= " << percentile_index << std::endl; }

  //Partial selection sort

  /*Real_t max;
    uint32_t max_index;
    for (uint32_t i = 0; i <= percentile_index; i++)
    {
        max = TempMagMap->d[i];
        max_index = i;
        for (uint32_t j = i + 1; j < ArrLength; j++)
        {
            if(TempMagMap->d[j] > max)
            {
                max = TempMagMap->d[j];
                max_index = j;
            }
        }
        Real_t temp = TempMagMap->d[i];
        TempMagMap->d[i] = TempMagMap->d[max_index];
        TempMagMap->d[max_index] = temp;
    }
  threshold = TempMagMap->d[percentile_index];*/

  threshold = RandomizedSelect(TempMagMap, 0, ArrLength - 1, ArrLength - percentile_index);

  return threshold;
}
Пример #4
0
int64_t RandomizedSelect(int64_t* A, int64_t p, int64_t r, int64_t i)
{
    if (p == r)
    {
        return A[p];
    }
    int64_t q = RandomizedPartition(A, p, r);
    int64_t k = q - p + 1;
    if (i == k)
    {
        return A[q];
    }
    else if (i < k)
    {
        return RandomizedSelect(A, p, q - 1, i);
    }
    else
    {
        return RandomizedSelect(A, q + 1, r, i - k);
    }
}
Пример #5
0
int Find::RandomizedSelect(int a[], int p, int r, int pos)
{
    //if p == r, the pos = 1
    if (p == r)
    {
        return a[p];
    }

    int q = Common::RandParition(a, p, r);
    //min array size
    int k = q - p + 1;
    if (pos == k)
    {
        return a[q];
    }
    else if (pos < k)
    {
        return RandomizedSelect(a, p, q - 1, pos);
    }
    else
    {
        return RandomizedSelect(a, q + 1, r, pos - k);
    }
}