' binary search & lower bound & upper bound '
์ฝ๋ฉ ํ ์คํธ๋ฅผ ํ๋ค๋ณด๋ฉด ์ด๋ถ ํ์์ ์์ฃผํ๊ฒ ๋๋ค. ๋๋ถ๋ถ ๋ด์ฅํจ์๋ก ์ฌ์ฉํ๋ฉด ๋์ง๋ง, ๋ฌธ์ ์ข ๋ฅ์ ๋ฐ๋ผ์ ์ง์ ๊ตฌํํด ์กฐ๊ฑด์ ๋ํด์ผ ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
c++ ๊ธฐ์ค์ผ๋ก ์ด์ง ํ์ ํจ์๋ ์ด 3๊ฐ์ง๊ฐ ์๋ค. ์ด ์ธ๊ฐ์ง ๋ชจ๋ ์ด์ง ํ์์ด ๊ธฐ๋ฐ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ์ด ๋์ด ์์ด์ผ ํ๋ค.
1. [ #include<algorithm> ] std::binary_search
- val๊ฐ์ด ์๋์ง ์๋์ง ํ์ธํ๋ ์๊ณ ๋ฆฌ์ฆ [ return bool ]
- std::lower_bound๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ์๊ณ ๋ฆฌ์ฆ.
2. [ #include<algorithm> ] std::lower_bound
- val๊ฐ์ ์์ ์์น๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
3. [ #include<algorithm> ] std::upper_bound
- val๊ฐ๋ณด๋ค ์ฒ์์ผ๋ก ํฐ ๊ฐ, ์ฆ val์ด ๊ฐ์ด ๋๋๊ณ ๊ทธ ๋ค์ ๊ฐ์ ์์น๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
_EXPORT_STD template <class _FwdIt, class _Ty>
_NODISCARD _CONSTEXPR20 bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) {
// test if _Val equivalent to some element
return _STD binary_search(_First, _Last, _Val, less<>{});
}
_EXPORT_STD template <class _FwdIt, class _Ty>
_NODISCARD _CONSTEXPR20 _FwdIt upper_bound(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) {
// find first element that _Val is before
return _STD upper_bound(_First, _Last, _Val, less<>{});
}
_EXPORT_STD template <class _FwdIt, class _Ty>
_NODISCARD _CONSTEXPR20 _FwdIt lower_bound(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) {
// find first element not before _Val
return _STD lower_bound(_First, _Last, _Val, less<>{});
}
๋ชจ๋ ํ์ํ๋ ค๋ ๋์์ด๋ ๋ชฉ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ex) val = 4๋ฅผ ๋ฃ์์ ๋ 3๊ฐ์ง ํจ์์ ๊ฒฐ๊ณผ ๊ฐ์ ์๋์ ๊ฐ์ด ๋ค๋ฅด๋ค.
๊ตฌํ ์ฝ๋
1. binary_search
int binary_search_Func(int pStart, int pEnd, int pTarget)
{
if (pStart > pEnd)
{
return 0;
}
int mMid = (pStart + pEnd) / 2;
if (arr[mMid] == pTarget)
{
return mMid;
}
else if (arr[mMid] > pTarget)
{
binary_search_Func(pStart, mMid - 1, pTarget);
}
else if (arr[mMid] < pTarget)
{
binary_search_Func(mMid + 1, pEnd, pTarget);
}
}
2. lower_bound
int Lower_Bound_Func(int pStart, int pEnd, int pTarget)
{
if (pStart >= pEnd)
{
return pStart;
}
int mMid = (pStart + pEnd) / 2;
if (arr[mMid] >= pTarget)
{
Lower_Bound_Func(pStart, mMid, pTarget);
}
else if (arr[mMid] < pTarget)
{
Lower_Bound_Func(mMid + 1, pEnd, pTarget);
}
}
3. upper_bound
int Upper_Bound_Func(int pStart, int pEnd, int pTarget)
{
if (pStart >= pEnd)
{
return pStart;
}
int mMid = (pStart + pEnd) / 2;
if (arr[mMid] > pTarget)
{
Upper_Bound_Func(pStart, mMid, pTarget);
}
else if (arr[mMid] <= pTarget)
{
Upper_Bound_Func(mMid + 1, pEnd, pTarget);
}
}
โป ์ฐธ๊ณ
lower_boud์ upper_bound๋ฅผ ๋ค ํ๋์ฉ ํ๋์ฉํ๋ฉด์ ์๊ฐํ์ง๋ง๊ณ ๋ง์ง๋ง ๊ฒฝ์ฐ๋ง ์๊ฐํ๋ฉด ์ฝ๋๋ฅผ ์ฝ๊ฒ ์งค์ ์๋ค.
ํ๋ผ๋ฏธํฐ์ val ๊ฐ์ด = 4 ์ผ ๋,
lower_bound์ upper_bound์ ๋์ผํ ์ ์ ๋จผ์ ์๊ฐํ์.
์ฒซ๋ฒ์งธ. ์ข ๋ฃ ์กฐ๊ฑด : if (pStart >= pEnd)
๋๋ฒ์งธ. mid์ ๊ฐ : (start + end) / 2
๋ค๋ฅธ ์ ์?
lower_bound์์ ์ํ๋ ๊ฐ์ val๊ฐ์ ์์ ์์น (4), upper_bound์์๋ val๊ฐ๋ณด๋ค ์ฒ์์ผ๋ก ํฐ ๊ฐ (5) ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก, ์ข ๋ฃ ์กฐ๊ฑด์ ๋ ์ฌ๋ฆฌ๋ฉฐ if (pStart >= pEnd) lower_bound๋ end๋ฅผ ์์ง์ด๊ณ upper_bound๋ start๋ฅผ ์์ง์ด๋๋กํด์ค์ผ ํ๋ค.
<< lower_bound >> mid์ ๊ฐ์ 4, val์ 4 ๊ฐ๊ฑฐ๋ ํด ๋ end๋ = mid ์์ ๋ start = mid + 1
<< upper_bound >> mid์ ๊ฐ์ 4, val์ 4 ๊ฐ๊ฑฐ๋ ์์ ๋ start = mid + 1 ํด ๋๋ end = mid
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/005.gif)
'๐จ๐ปโ๐ป programming > โฝ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Algorithm / ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ ] + ๋ฐฑ์ค 1865 ์ํ ๋ฌธ์ ํ์ด (2) | 2024.08.22 |
---|---|
[ Algorithm/ KMP ์๊ณ ๋ฆฌ์ฆ ] (4) | 2024.07.23 |
[Algorithm/ ๋นํธ๋ง์คํฌ] (4) | 2023.02.17 |
[Algorithm/ Sparse Table (ํฌ์ํ ์ด๋ธ)] ๋ฐฑ์ค 17435๋ฒ๊ณผ ํจ๊ป (0) | 2023.02.01 |
[Algorithm/Shortest Path] A* ์๊ณ ๋ฆฌ์ฆ - ๊ตฌํC++ (0) | 2022.06.20 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!