Chapter 1. Software, Data Structure, and C++
1. Abstraction
Abstraction should be between too abstract and too concrete.
Abstraction : a model of complex system that includes only the details essential to the perspective of the viewer of the system. Tells what the program must do, but not how the program does it.
2. Abstraction Data Type
A data type whose properties(data and operations) are specified independently of any particular implementation.
특정 구현에 관계없이 속성(데이터와 연산)이 지정되는 데이터 유형
-shape, better access and modification, organization, management, store format, same key operations (O)
-Implementation details, number of provided operations(X)
3. Information hiding = encapsulation
4. Data
: the way to represent information in a suitable format for communication or analysis by humans or machines.
In programming world, it is the information that is processed, objects that are manipulated(조작되는 개체들).
5. Data Abstraction
: Seperation of a data type's logical properties / implementation
6. Data : member vatiables / Operations : member functions (methods)
7. Data structure
: a collection of data elements whose organization is characterized by accessing operations that are used to store and retrieve the individual data elements
8. Composite Data Type
: a type that stores a collection of individual data components under one variable name
ex. arrays(structured)
class(unstructured), struct(unstructured) : can contain non homogeneous elements called members(=fields)
'.' is the member selection operator
9. Memory Allocation - Variables
-int, float : 4bytes
-short : 2bytes
-char : 1byte
ex. char name[10] = 10bytes
10. One-dimensional Array
Address[index] = BaseAddress + Index * Size of Element
Base Address : the location in the memory of the first element
11. Two-demensional Array
In memory, C++ stores arrays in row order.(저장은 일렬로 함)
int intArray[5][12];
ex) Baseaddress : 2000일때, intArray[3][7]의 주소?
4*3*12 + 4*7 = 172 -> 2172
Chapter 2. Unsorted/Sorted List
1. List Definitions
- Linear Relationship : Each element except the first has a unique predecessor(앞에 사람), and each element except the last has a unique successor(뒤에 사람).
2. Basic ADT Operations
Constructor(생성자) : A special member function of a class tha is implicitly invoked when a class object is created
- It cannot return value type
- A class have multiple constructors with different parameter sets
(Parameterless constructor = default constructor)
Transformer(변경자), Observer(관측자)
<Unsorted List>
3. Constructor
UnsortedType::UnsortedType(){
length = 0;
}
4. Size
int UnsortedType::size(){
return length;
}
5. isFull
bool UnsortedType::isFull(){
return (length == MAXSIZE);
}
6. appendItem : always 2 computations ( add item ,length ++)
7. InsertItem : depending on "length" & "pos" (근데 순서 고려 안하고 insert하면 3computations)
8. Time Complexity Rules
1. Ignore all coefficients (계수)
2. Ignore significantly smaller terms.
9. Big O examples
- O(1) = bounded(by a constant) time
- O(logN) = logarithmic time
- O(N) = linear time
- O(NlogN) N*log2N time
- O(N**2) quadratic time
- O(2**N) exponential time
** O(5N + 3M**2 ) : 면 N, M 중 누가 큰지 모르기때문에 O(N+ M**2) 이렇게 써야함
** Sort the array D( length = N ) : minimum item 찾는 데 n, 그다음으로 작은거 찾는데 n .. 이런식으로 해서 n**2
** 피보나치 수열의 N번째 아이템 return : Fibo(N) = Fibo(N-1) + Fibo(N-2) 이므로 2**N
근데 , 걍 1 1 2 3 5 8 이런식으로 하면 N 아닌가
10. removeItem : O(2N+1) 이지만 순서를 고려하지 않으면 O(N+2)도 가능
11. Clear
void UnsortedType::clear(){
length = 0;
}
data[]는 값을 가지고 있지만, appendItem이 overwrite 하기 때문에 괜찮음
<Sorted List>
: A list that is sorted by the value in the key; semantic(의미론적인) relationship
12. finditem : 찾으려는 값을 초과하면 break 하므로서 computation 줄일 수 있고, 이진 탐색으로서 더 줄일 수 있음
bool SortedType::findItem(ItemType item){
int mid;
int first = 0;
int last = length -1;
while(first <=last){
mid = (first + last) / 2;
if (item < data[mid]){
last = mid -1;
}
else if (item > data[mid]){
first = mid + 1;
}
else{
return true;
}
}
return false;
}
13. Are List and Array the same ? No
List : ADT
Array : CDT(Concrete Data Type)
Chapter 3. Stack
1. LIFO : Last In First Out
ex) Undo, Back(browser), Stack Trace
2. Constructor
StackType::StackType(){
top = -1;
}
-1 : To represent the stack is empty
3. Size
int StackType::size() const{
return (top+1);
}
4. isFull
bool StackType::isFull() const{
return (top == MAX_SIZE -1);
}
5. isEmpty
bool StackType::isEmpty() const{
return (top ==-1)
}
Class Template
6. class template은 cpp 파일에서 구현 X , header file 에서 구현해야함
- in heather file
template<class ItemType>
class StackType{
//...
}
- in c++ file
template<class ItemType>
void StackType<ItemType>::push(ItemType value){
//..
}
- main file
int main(){
StackType<int> tempStack;
}
Pointer
7. msg is a name of array and it means the base address.
char msg[8];
8. To declare a pointer variable, you must specify the type of value that the pointer will point to.
9. "*" is dereference operator.
10. It means a pointer points to nothing.
int *ptr = NULL;
* ptr = 13;
but, using nullptr is recommended to avoid ambiguous function overloading.
Memory Allocation Type
11. Process Memory Map
Process Memory Map : 프로세스가 실행될 때 운영체제에 의해 할당되는 메모리 영역
밑에서부터 보면,
CODE(TEXT) : 기계어로 코드 저장, 읽기 전용
DATA : 초기화된 전역변수, 정적변수 저장
BSS : 초기화되지 않은 전역변수, 정적변수 저장
STACK : 지역변수
HEAP : 동적 메모리 할당
12. Automatic Allocation
Variable Type | Allocation Time | Deallocation | Location | Size Change |
Local variables (지역 변수) | Function Call (함수 호출 시) | Function termination (함수 종료 시) | Stack | Fixed |
12-1. 함수는 스택 형식으로 저장됨 -> 지역 변수도 마찬가지
12-2. Activation Record
- argv , argc : 호출시 함수에 전달된 인자
- Return Address : 함수 종료 시 다시 복귀할 함수 주소
- Local Variables : 지역 변수(그림에선 c,d,e)
12-3. 다음과 같은 코드 컴파일 불가능
cin >> cnt;
int arr[cnt];
지역 변수는 컴파일할 때 모두 결정되어야 하기 때문
컴파일 vs 런타임
컴파일 : 코드가 올바르게 작성되었는지 확인하고 실행 파일을 만드는 단계
런타임 : 파일이 실제로 실행되면서 동작하는 단계
13. Dynamic Allocation
Variable Type | Allocation Time | Deallocation | Location | Size Change |
Variables with dynamic size | instructions : new, malloc ( 명령이 있을 떄 ) | instructions : delete, free ( 명령이 있을 때 ) | Heap | Flexible |
13-1. 동적 할당은 독립적인 스택임.
13-2. 함수가 종료된 후에도, 명령이 있지 않는 한 계속 존재
13-3. 따라서 명시적으로 메모리를 deallocated 해주어야 함.
13-4. 명시적으로 메모리를 deallocated 하지 않으면, 그것을 가르키는 포인터가 함수가 끝난 후 사라지고, 접근을 못하면서 메모리만 차지하게 됨 => Memory leakage(메모리 누수)
13-5. 따라서, garbage를 막고 싶으면
- delete
- keep the pointer using return or return by reference
14. Static Allocation
Variable Type | Allocation Time | Deallocation | Location | Size Changed |
Static/global variables | Compile Time ( Program Starts ) | Program Termination | DATA segment | Fized |
14-1. 표에서 컴파일 타임이 왜 프로그램이 시작할 때인지 의문이 들었는데, 아마 교수님께서 컴파일 이후에는 바꿀 수 없어서 저렇게 적어놓으신 거 같다 ..
Chapter 4. Queue
1. FIFO : First In, First Out
ex) Job Buffers, Network Buffers
2. dynamic array implementation
template<class ItemType>
class QueueType
{
private:
ItemType * data; //dynamic array implementation
int front;
int rear;
int maxQueue;
//...//
}
3. Constructor
template<class ItemType>
QueueType<ItemType>::QueueType(int maxQueue){
maxQueue = maxQue + 1; //reserved space
front = maxQueue -1; //reserved space is at the last location
rear = maxQueue -1; //reserved space is at the last location
data = new ItemType[maxQueue];
}
4. envolvement of Queue
O(n) : 하나 지우고 하나씩 다 앞으로
O(1) : 그냥 앞에걸 하나 빼는거
O(1) : circular queue
5. front == rear + 1 <= 이게 full queue 도 될 수 있고, empty queue도 될 수 있음
=> 해결책 reserved space (front always points to it)
=> Full Queue : (rear+1)%maxQueue == front;
=> Empty Queue : rear == front
6. Destructor
template<class ItemType>
QueueType<ItemType>::~QueueType(){
delete [] data;
}
7. Enqueue
template <class ItemType>
void QueueType<ItemType>::enqueue(ItemType newItem){
rear = (rear+1)% maxQueue;
data[rear] = newITem;
}
8. Dequeue
template<class ItemType>
ItemType QueueType<ItemType>::dequeue(){
ItemType ret;
front = (front+1)% maxQueue;
ret = data[front];
return ret;
}
4.5 . Programming Tips
Return by Reference
1. Call by reference : 객체를 그으으으대로 주소값까지 똑같이 넘겨줌
=> share the same memory
2. return by reference
int increment(int & a){
a++;
}
int main(){
int main_a = 3;
int ret = increment(main_a);
cout << ret << endl;
}
언제 사용하는가?
1. 리턴할 객체가 너무 클 때(복사하는데 오래걸림)
2. 여러개의 객체를 리턴받고 싶을때
3. 동적할당된 객체를 리턴받고 싶을때
Polymorphism
1. Overloading
: The abiltity to define multiple functions with the same name but different parameter lists
ex) add(int a, int b) / add(float a, float b, float c)
2. Overriding
: The ability of a derived class to provide a specific implementation of a method that is already defined int the base class
must have the same name, parameters(numbers & types) , return type
Chapter 5. Linked Structure
Linked Stack
struct NodeType{
ItemType value;
NodeType *next;
}
1. Constructor
StackType::StackType(){
topptr = nullptr;
}
2. push
void StackType::push(ItemType new_value){
// Exception Handeling -> isFull
NodeType * newNode;
newNode = new NodeType;
newNode -> value = new_value;
newNode -> next = topPtr;
topPtr = newNode;
}
3. isFull
bull StackType::isFull() const{
NodeType *newNode;
try{
newNode = new NodeType;
delete newNode;
return false;
}
catch(std::bac_alloc exception){
return true;
}
}
일단 노드를 더 만들어보고 안만들어지면 Full 인걸로
4. pop
ItemType StackType::pop(){
//Exception Handeling - isEmpty() -> return or throw
NodeType * tempPtr;
tempPtr = topPtr;
topPtr = topPtr -> next;
delete tempPtr;
}
5. isEmpty
bool StackType::isEmpty() const{
if (topPtr == nullptr){
return true;
}
return false;
}
6. Destructor
StackType::~StackType(){
NodeType * tempPtr= topPtr;
while (tempPtr != nullptr){
topPtr = topPtr -> next;
delete tempPtr;
tempPtr = topPtr;
}
}
Linked Queue
template<class ItemType>
class QueueType
{
private:
NodeType<ItemType> * pFront;
NodeType<ItemType> * pRear;
//...
}
노드타입형 포인터 필요
'C++' 카테고리의 다른 글
[Data Structure] Reviewing Up wrong C++ codes 2 (0) | 2024.11.30 |
---|---|
[Data Structure] Reviewing Up wrong C++ codes (1) | 2024.10.04 |
[C++] 기말고사 공부 로그 (0) | 2024.05.20 |
[C++] Vector와 Array (0) | 2024.04.21 |
[C++]중간고사 공부 로그 (0) | 2024.03.15 |