C++
[강의] 11월 27일 수업정리
k-codestudy
2024. 11. 27. 17:58
다른 방식으로 이진 검색 알고리즘, 힙 구조에 대한 간단한 내용에 대한 수업을 들었다.
1. 이진 검색
1.1 배열 초기화에 대한 오해
배열의 초기화와 관련하여 오해하는 부분이 존재한다.
특히, 배열의 인덱스를 -1로 초기화하는 경우가 이에 해당이 되는데. 요세는 배열의 0번지를 의도적으로 비워두고 "값 없음" 으로 있고 없고를 판단하는 방식으로 사용한다.
하지만 -1로 초기화를 하는 경우 조건이 존재하는데 일반 int형이 아닌 unsigned int형을 사용해야한다. 이것이 핵심이다.
1.2 low, high를 이용하여 이진 검색
#include <iostream>
int main()
{
int arData[40]{};
for (int i = 0; i < 40; i++)
{
arData[i] = i * 2;
}
int nData{};
scanf_s("%d", &nData);
int* pData = arData;
int nLow = 0;
int nHigh = 39;
int nMiddle{};
bool nFind{};
while (nHigh >= nLow && !nFind)
{
nMiddle = (nLow + nHigh) / 2;
if (pData[nMiddle] < nData)
nLow = nMiddle + 1;
else if (pData[nMiddle] > nData)
nHigh = nMiddle - 1;
else
nFind = true;
}
if (nFind)
printf("nIndex : %d\n", nMiddle);
else
printf("실패\n");
}
1.3 함수화
#include <iostream>
bool binaySearch(int *pData, int nLow, int nHigh, int nData, int &nIndex);
int main()
{
int arData[40]{};
for (int i = 0; i < 40; i++)
{
arData[i] = i * 2;
}
int nData{};
int nResult{};
scanf_s("%d", &nData);
if (binaySearch(arData, 0, 39, nData, nResult))
printf("nIndex : %d\n", nResult);
else
printf("실패\n");
}
bool binaySearch(int* pData, int nLow, int nHigh, int nData, int& nIndex)
{
int nMiddle{};
bool nFind{};
while (nHigh >= nLow && !nFind)
{
nMiddle = (nLow + nHigh) / 2;
if (pData[nMiddle] < nData)
nLow = nMiddle + 1;
else if (pData[nMiddle] > nData)
nHigh = nMiddle - 1;
else
nFind = true;
}
nIndex = nMiddle;
return nFind;
}
1.4 재귀 함수
#include <iostream>
bool binaySearch(int* pData, int nLow, int nHigh, int nData, int& nIndex);
int main()
{
int arData[40]{};
for (int i = 0; i < 40; i++)
{
arData[i] = i * 2;
}
int nData{};
int nResult{};
scanf_s("%d", &nData);
if (binaySearch(arData, 0, 39, nData, nResult))
printf("nIndex : %d\n", nResult);
else
printf("실패\n");
}
bool binaySearch(int* pData, int nLow, int nHigh, int nData, int& nIndex)
{
if (nHigh < nLow)
return false;
int nMiddle = (nLow + nHigh) / 2;
if (pData[nMiddle] < nData)
return binaySearch(pData, nMiddle + 1, nHigh, nData, nIndex);
else if (pData[nMiddle] > nData)
return binaySearch(pData, nLow, nMiddle - 1, nData, nIndex);
nIndex = nMiddle;
return true;
}
2. HEAP 구조
HEAP구조는 데이터에서 최댓값과 최솟값을 빠르게 찾기 위해 고안된 완전 이진 트리이며 시간 복잡도가 O(log n)인 자료구조이다.
이는 특정 변종 ArrayList와 유사하며, 이전 데이터에 특정 조작이 이루어질 수 있다.
HEAP구조는 일반적으로 배열의 0번지를 사용하지 않는다. 이를 통해 "있다 / 없다"를 판단하거나, 계산을 간소화하기 위한 목적으로 1번 인덱스 부터 데이터를 저장한다.
힙에서 노드 간 관계는 다음과 같은 규칙이 존재한다.
- 왼쪽 자식 노드: n * 2
- 오른쪽 자식 노드: n * 2 + 1
- 부모 노드: n / 2 (n은 현재 노드의 인덱스이며, 정수 나눗셈 기준)