Home > Archive > CPP_DS > πŸ†™[Cpp DataStructure] μ•ˆμ •μ„±(stability) 확인

πŸ†™[Cpp DataStructure] μ•ˆμ •μ„±(stability) 확인
Cpp DataStructure

μ•ˆμ •μ„±(stability) 확인.

#include <iostream>
#include <cassert>
#include <fstream>

using namespace std;

struct Element
{
	int key;
	char value;
};

void Print(Element* arr, int size)
{
	for (int i = 0; i < size; i++)
		cout << arr[i].key << " ";
	cout << endl;

	for (int i = 0; i < size; i++)
		cout << arr[i].value << " ";
	cout << endl;
}

int main()
{
    	// μ•ˆμ •μ„± 확인(unstable)
	{
		Element arr[] = { {2, 'a'}, {2, 'b'}, {1, 'c' } };
		int size = sizeof(arr) / sizeof(arr[0]);

		Print(arr, size);

		int min_index;
		for(int i = 0; i < (size - 1); i++) 
		{
			min_index = i;
			for (int j = (i + 1); j < size; j++)
			{
				if (arr[j].key < arr[min_index].key) 
				{
					min_index = j;
				}
			}

			swap(arr[i], arr[min_index]);

			Print(arr, size);
		}
	}
	return 0;
}

μ‹€ν–‰ κ²°κ³Ό

2 2 1 
a b c 
1 2 2 
c b a 
1 2 2 
c b a

μ •λ ¬μ˜ μ•ˆμ •μ„±(stablity)μ΄λΌλŠ” κ°œλ…μ΄ μžˆμŠ΅λ‹ˆλ‹€.

  • 이 κ°œλ…μ€ stableν•œμ§€ unstableν•œμ§€λ‘œ κ΅¬λΆ„ν•©λ‹ˆλ‹€.
    • 즉, μ•ˆμ •μ μΈμ§€ λΆˆμ•ˆμ •μ μΈμ§€λ‘œ κ΅¬λΆ„ν•©λ‹ˆλ‹€.

μœ„ μ½”λ“œμ—μ„œ 보면 Element 배열을 μ •λ ¬ν•©λ‹ˆλ‹€.

이 Èlementλ₯Ό 보면 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

struct Element
{
	int key;
	char value;
};
  • Element의 keyλŠ” μ •μˆ˜μ΄κ³  valueλŠ” λ¬Έμžμž…λ‹ˆλ‹€.
    • κ·Έλž˜μ„œ μ •λ ¬ν•  λ•Œ keyλ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.
      • 그러면 swapμ‹œ value(문자)λŠ” ν•¨κ»˜ λ”°λΌκ°‘λ‹ˆλ‹€. -> 볡사λ₯Ό ν•˜λ‹ˆ λ”°λΌκ°€λŠ” 것 μž…λ‹ˆλ‹€.
Element arr[] = { {2, 'a'}, {2, 'b'}, {1, 'c' } };
  • 첫 번째 인덱슀의 μš”μ†Œμ˜ keyλŠ” 2이고 valueλŠ” 'a' μž…λ‹ˆλ‹€.
  • 두 번째 인덱슀의 μš”μ†Œμ˜ keyλŠ” 2이고 valueλŠ” 'b' μž…λ‹ˆλ‹€.
  • μ„Έ 번째 인덱슀의 μš”μ†Œμ˜ keyλŠ” 1이고 valueλŠ” 'c' μž…λ‹ˆλ‹€.

β€œμ •λ ¬μ‹œμ—λŠ” keyκ°€ μž‘μ€ μˆœμ„œλŒ€λ‘œ μ •λ ¬λ˜λ„λ‘ ν•  것 μž…λ‹ˆλ‹€.”

  • 즉, keyλ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ£Όλͺ©ν•΄μ•Ό ν•  점은 β€œμ²« 번째 μΈλ±μŠ€μ™€ 두 번째 인덱슀의 μš”μ†Œμ˜ Valueβ€μž…λ‹ˆλ‹€.

  • 두 인덱슀의 μš”μ†Œμ˜ key 값은 κ°™μœΌλ‚˜ value 값은 λ‹€λ¦…λ‹ˆλ‹€.

비ꡐ λ‘œμ§μ„ 보면 key값을 가지고 비ꡐλ₯Ό ν•˜μ§€λ§Œ swap μ‹œμ—λŠ” key와 valueλ₯Ό λͺ¨λ‘ 가지고 μ›€μ§μž…λ‹ˆλ‹€.

μ‹€ν–‰ κ²°κ³Όλ₯Ό 보고 value와 μ•ˆμ •μ„±μ˜ 상관 관계에 λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€.

μ‹€ν–‰ κ²°κ³Ό

2 2 1 
a b c 
1 2 2 
c b a 
1 2 2 
c b a
  • μ‹€ν–‰ κ²°κ³Όλ₯Ό 보면 (2 a), (2, b), (1, c)μ—μ„œ β€œ(1, c), (2, b), (2, a)” 순으둜 μ •λ ¬λœ 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ²˜μŒμ—λŠ” (2 a), (2, b) μˆœμ„œμ˜€μ§€λ§Œ μ •λ ¬ ν›„μ—λŠ” β€œ(2, b), (2, a)” 둜 μˆœμ„œκ°€ λ°”λ€Œμ–΄ μ •λ ¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
      • valueκ°€ 뒀바뀐 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
        • keyκ°€ 정렬이 λ˜μ—ˆμœΌλ―€λ‘œ 정렬은 잘 λ˜μ—ˆλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
        • κ·ΈλŸ¬λ‚˜ β€œkeyκ°€ 같은 값일 κ²½μš°μ—λŠ” value의 μˆœμ„œκ°€ a, bμ—μ„œ b, a 둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.”
          • β€œμ—¬κΈ°μ„œ stableν•œ 것과 unstableν•œ κ²ƒμ˜ 차이점이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.”

β€œν‚€ 값이 같아도 μ •λ ¬μ‹œ 벨λ₯˜ 값이 처음과 같이 μœ μ§€κ°€ λœλ‹€λ©΄ 그것은 stableν•˜λ‹€λΌκ³  ν•©λ‹ˆλ‹€, 그와 λ°˜λŒ€λ‘œ ν‚€ 값이 κ°™μœΌλ‚˜ 처음과 달리 벨λ₯˜μ˜ μˆœμ„œκ°€ λ°”λ€” κ²½μš°μ—λŠ” unstableν•˜λ‹€ 라고 ν•©λ‹ˆλ‹€.”

  • 이것도 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ„ λΆ„λ₯˜ν•˜λŠ” κΈ°μ€€ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.