Thread overview
lower bound ve upper bound
Feb 15, 2018
hsencan
Feb 15, 2018
kerdemdemir
February 15, 2018

Ali hocam sitenizdeki vektorler ile ilgili yazdığınız yazıyı okudum .Fakat lower_bound ile upper_bound kavramlarını tam kavrayamadım genel olarak ne işe yarıyorlar ?
Birde foruma yeni kayıt oldum ve biraz fazla konu açıyorum. (Aslında aklıma takılan tüm soruları sorsam sayfayı doldururum da :D ) bu konuda herhangi bir sorun yoktur umarım.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 16, 2018

Ben yine ornek vermek istedim.

Is yerinde benden soyle bir sey yapmami istediler.

"Relative unit" diye bir sey varmis. "arctan(1.0 / x)" Formulu ile hesaplaniyormus. Bana bir tablo verdiler 100, 50,33.3, 20, 10...(En asagida kodda tablonun geri kismi var. ) gibi
bunlara denk gelen relative unitleri veren bir kod yazmami istediler. Fakat 70 gelirsede 50 degerine yakinsasin istiyorlar. Yani tabloda olmayan bir deger verdiklerinde bir onceki degere yakinsasin. 70 icin bile arctan(1/50) calissin.

Asagidaki kodda bizim icin onemli kisimlar:

void RelativeUnitMap::print( double val )
{
   std::cout << " upperbound: " << relativeValsConstantMap.upper_bound(val)->first;
   std::cout << " lowerbound: " << relativeValsConstantMap.lower_bound(val)->first;
}

int main()
{
   RelativeUnitMap test;
   test.print(50);
   // upperbound: 100 lowerbound: 50  yazdiriyor
   test.print(75);
  // upperbound: 100 lowerbound: 100  yazdiriyor
}

Dikkatini cektiyse tablodaki tam deger ile cagirdigimda upperbound 100 donmus lowerbound ise 50. Yani bir tane olsa bile upper_bound bir sonrakine goturebiliyor.

Ben suna benzer bir fonksiyon kullandim :

void RelativeUnitMap::taKendisiYadaBirOnceki( double val )
{
   std::cout << " upperbound: " << (--relativeValsConstantMap.upper_bound(val))->first;
}

Ve istenilen sonuc:
int main()
{
   RelativeUnitMap test;
   test.taKendisiYadaBirOnceki(75); // 50
   test.taKendisiYadaBirOnceki(50); // 50
   test.taKendisiYadaBirOnceki(125); // 100
   test.taKendisiYadaBirOnceki(25); // 20
}

Kodun projeden kismen alip online derleyicede derledigim bir kismi :

#include <iostream>
#include <string>
#include <iomanip>
#include <map>
#include <cmath>

class RelativeUnitMap
{
public:

   RelativeUnitMap();
   void print(double val);
private:

   void InitConstantMap();
   std::map<double, double> relativeValsConstantMap;
};

void RelativeUnitMap::InitConstantMap()
{
   const double  tempArray[] = {std::numeric_limits<double>::max(), 100,50,33.3,20,10,9.5,9,8.5,8,7.5,7,6.5,6,5.5,5,4.5,4,3.5,3,2.5,2,1.5,1,0.9,0.8,0.7,0.6,0.5,
                                0.4,0.3,0.2};
   //Bizim kodda C++11 olmadigi icin uniform initilization kullanamiyoruz.
   for ( size_t i = 0; i < sizeof(tempArray)/sizeof(double); i++ )
   {
       relativeValsConstantMap.insert( std::make_pair(tempArray[i], atan(1.0 / tempArray[i]) ) );
   }
}

RelativeUnitMap::RelativeUnitMap()
{
   InitConstantMap();
}

void RelativeUnitMap::print( double val )
{
   std::cout << " upperbound: " << relativeValsConstantMap.upper_bound(val)->first;
   std::cout << " lowerbound: " << relativeValsConstantMap.lower_bound(val)->first;
}

int main()
{
   RelativeUnitMap test;
   test.print(50);

}

Ben sorulari cevaplarken bir suru sey ogreniyorum. Ve zaten bende cok soru soruyorum. Cevaplar faydali oluyorsa ne mutlu.

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 15, 2018

Sıralı oldukları varsayılan elemanları gösteren baş ve son erişicileri (iterator) varsa, lower_bound ve upper_bound aranan elemanı kapsayan aralığı döndürür. Şuradaki örnekte görüldüğü gibi, üç tane 20 varsa, lower_bound ilkini, upper_bound da sonuncudan bir sonrayı gösterir:

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

Böylece, bu iki erişici bir çift olarak standart algoritmalarla kullanılabilir.

(Tabii tam eşitlik değil, başka kıstasa göre de karşılaştırılabilirler ama sıralı olmak önemli çünkü ikili arama algoritmasını kullanırlar.)

Alıntı (hsencan):

>

biraz fazla konu açıyorum. (Aslında aklıma takılan tüm soruları sorsam sayfayı doldururum da :D ) bu konuda herhangi bir sorun yoktur umarım.

Salt soru sorup yanıt yazılmak için açılmış bir forumda öyle bir sorun olamaz herhalde. ;) Böyle endişe duyan başkaları da oldu ama ben anlayamıyorum. Belki site ücretinin mesaj sayısıyla ilgisi olduğunu düşünüyorsunuz: değil (aylık sabit). Nasıl bir sorun olabilir? :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]