C++ 'ya yeni oldum. Bu kodu çevrimiçi olarak gördüm, bir vektör içinde bir dize bulmaya çalışıyor.bir vektörde ortadaki nesneyi bulmak için, neden "mid = (beg + end)/2" yerine "mid = beg + (bit - dilenmek)/2" yi kullanın.
mid = (beg + end) /2
mid = (beg + (end - 1))/2
uygulanabilir alternatif midir: Ancak, ben sağ sonuna doğru fark etmiş: olarak
mid = beg + (end - beg)/2;
Neden bu şekilde yazılacak ilgisi var, neden yazılamaz?
Bunun nedenini anlamak için uğraşıyorum.
vector<string> text = {"apple", "beer", "cat", "dog"};
string sought = "beer";
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2;
while (mid != end && *mid != sought){
if(sought < *mid){
end = mid;
} else {
beg = mid + 1;
}
mid = beg + (end - beg)/2;
}
Biri için diğeri derlenmeyecektir. Alternatif de olmaz. İki yineleyici eklemek ne anlama geliyor? – chris
Evet, alternatifi denedim ve derlemem. Ama bunun arkasındaki sebebi anlamak için uğraşıyorum. Bana açıklar mısın? Teşekkürler – Thor
Beg değişkeni, sadece vektörün başlangıcında ilk kez. Bundan sonra, arama alanını küçültmek için ya yakın ucunu ya da uzak ucunu eski orta noktaya taşıyorsunuz. Bu yönteme ikili arama denir çünkü arama aralığını 1/2 yineleme ile azaltır (bu bir O (logn) algoritmasıdır) –