ํฌ์ŠคํŠธ

๐ŸŒ“ Linked-List

๐Ÿ’ซ @TODO


Linked-List ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
(ํ˜น์€ List ๋ฆฌ์ŠคํŠธ)

์›์†Œ๋ฅผ ์ €์žฅํ•  ๋•Œ ๊ทธ ๋‹ค์Œ ์›์†Œ๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
์›์†Œ๋“ค์€ ์ด๊ณณ ์ €๊ณณ์— ํฉ์–ด์ ธ์žˆ๋‹ค.

ํฉ์–ด์ ธ์žˆ๊ธฐ์— ์›ํ•˜๋Š” ์›์†Œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Œ
์ด๋ฅผํ…Œ๋ฉด ๋งˆ์ง€๋ง‰ ์›์†Œ๊ฐ€ ๋ญ”์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์—†์Œ
๋ชจ๋“  ์›์†Œ๋ฅผ ํ•œ ๋ฒˆ ์”ฉ ์ฝ์–ด์•ผ ํ•œ๋‹ค๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ข‹์ง€๋งŒ,
ํŠน์ •ํ•œ ์›์†Œ ํ•˜๋‚˜๋งŒ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ตœ์•…

์ˆœ์ฐจ ์ ‘๊ทผ Sequential Access

๊ทน์žฅ์—์„œ ์„œ๋กœ ํฉ์–ด์ ธ์„œ ์˜ํ™”๋ณด๊ธฐ
์„œ๋กœ ์–ด๋””์žˆ๋Š”์ง€๋Š” ์•Ž


๐Ÿซง

  • ์„ฑ์งˆ
    • k๋ฒˆ์งธ ์›์†Œ๋ฅผ ํ™•์ธ/๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด O(k)๊ฐ€ ํ•„์š”ํ•จ
    • ์ž„์˜์˜ ์œ„์น˜์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€/์ž„์˜ ์œ„์น˜์˜ ์›์†Œ ์ œ๊ฑฐ๋Š” O(1)
      • ์ถ”๊ฐ€, ์ œ๊ฑฐํ•  ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” (์ด๋ฏธ ์ ‘๊ทผํ•ด ์žˆ๋‹ค๋Š”) ๊ฒƒ์„ ์ „์ œ๋กœ
      • ์•„๋‹ˆ๋ผ๋ฉด readํ•˜๋Š” ๋งŒํผ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋” ๋“ค๊ฒ ์ฃ  (+O(k))
    • ์›์†Œ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์—ฐ์†ํ•ด์žˆ์ง€ ์•Š์•„ Cache hit rate๊ฐ€ ๋‚ฎ์ง€๋งŒ ํ• ๋‹น์ด ๋‹ค์†Œ ์‰ฌ์›€
  • ์ข…๋ฅ˜
    • ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ Singly Linked List
    • ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ Doubly Linked List (STL list)
    • ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ Circular Linked List
      • ํ™˜ํ˜• โ€œ
      • ์ˆœํ™˜ โ€œ

์ฒซ ๋ฒˆ์งธ ์š”์†Œ, ๋‘ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Œ
๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ
ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„, ํ•ด์‰ฌ ๋“ฑ์€ ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ

ย ๋ฐฐ์—ด์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
k๋ฒˆ์งธ ์›์†Œ์— ์ ‘๊ทผO(1)O(k)
์ž„์˜ ์œ„์น˜์— ์›์†Œ ์ถ”๊ฐ€/์ œ๊ฑฐO(N)O(1) (์ถ”๊ฐ€/์ œ๊ฑฐํ•  ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ)
๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๋ฐฐ์น˜์—ฐ์†๋ถˆ์—ฐ์†
์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ณต๊ฐ„ (Overhead)- (์—†์Œ, ๊ตณ์ด ๋งŒ๋“ ๋‹ค๋ฉด ๋ฐฐ์—ด ๊ธธ์ด)O(N) (์ฃผ์†Œ๊ฐ’, 32bit 4N๋ฐ”์ดํŠธ, 64bit 8N๋ฐ”์ดํŠธ, N์— ๋น„๋ก€ํ•˜๋Š” ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// ์•ผ๋งค ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
// ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋กœ ์‹ค๋ฌด์—์„œ๋Š” ์ ˆ๋Œ€ ์“ธ ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์ด์ง€๋งŒ,
// ์ฝ”ํ…Œ์—์„œ๋Š” ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„๋ณด๋‹ค ๋‚ฎ์€๋ฐ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋™์ผํ•ด์„œ ์• ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

const int MX = 1000005;
int dat[MX], pre[MX], nxt[MX];
int unused = 1; // top?

// ๋ฐฐ์—ด ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜, pre nxt์— ์›์†Œ index๋ฅผ ์ €์žฅ

// ๋‹จ, 0๋ฒˆ์ง€๋Š” ๊ณ ์ •์ ์ธ ๋‹จ์ˆœ ์‹œ์ž‘์ง€๋กœ์จ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Œ, ๋งจ ์ฒ˜์Œ ์›์†Œ ์•ž์— 0๋ฒˆ์ง€ ์›์†Œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ
// ์ด๋Ÿฐ Dummy node๋ฅผ ๋‘์ง€ ์•Š์œผ๋ฉด, ์‚ฝ์ž…์‚ญ์ œ ๋“ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์›์†Œ๊ฐ€ ์•„์˜ˆ ์—†๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด

// @ stl list์˜ ๊ฒฝ์šฐ dummy node๋Š” ๋งจ ๋งˆ์ง€๋ง‰์— ์žˆ์Œ

fill(pre, pre + MX, -1);
fill(nxt, nxt + MX, -1);

// traverse
// 0๋ฒˆ์ง€์—์„œ ์ถœ๋ฐœํ•ด nxt๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š”
void traverse()
{
	int cur = nxt[0];
	while(cur != -1)
	{
		cout << dat[cur] << ' ';
		cur = nxt[cur];
	}
	cout << "\n\n";
}

// insert (int addr์ถ”๊ฐ€ํ• ์œ„์น˜์ฃผ์†Œ, int num)
// ์ƒˆ๋กœ์šด ์›์†Œ ์ƒ์„ฑ
// ์ƒˆ๋กœ์šด ์›์†Œ pre, nxt ๋Œ€์ž…
// ์‚ฝ์ž…ํ•  ์œ„์น˜์˜ nxt ๊ฐ’๊ณผ ์‚ฝ์ž…ํ•  ์œ„์น˜์˜ ๋‹ค์Œ ์›์†Œ์˜ pre ๊ฐ’์„ ์ƒˆ ์›์†Œ๋กœ ๋ณ€๊ฒฝ
// unused 1 ์ฆ๊ฐ€
void insert(int addr, int num)
{
	dat[unused] = num;
	pre[unused] = addr;
	nxt[unused] = nxt[addr];
	if (nxt[addr] != -1) pre[nxt[addr]] = unused;
	nxt[addr] = unused;
	unused++;
}

// erase
// ์ด์ „ ์œ„์น˜์˜ nxt๋ฅผ ์‚ญ์ œํ•  ์œ„์น˜์˜ nxt๋กœ ๋ณ€๊ฒฝ
// ๋‹ค์Œ ์œ„์น˜์˜ pre๋ฅผ ์‚ญ์ œํ•  ์œ„์น˜์˜ pre๋กœ ๋ณ€๊ฒฝ

// ์•ผ๋งค ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ œ๊ฑฐ๋ฅผ ํ•ด๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ์Œ
// ๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ๋Š” ๋ชป์”€
void erase(int addr)
{
	// dummy node์˜ ์กด์žฌ๋กœ ์ธํ•ด ๊ทธ ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ์ง€์šฐ๋”๋ผ๋„ pre[addr]์€ -1์ด ์•„๋‹˜์ด ๋ณด์žฅ๋จ
	nxt[pre[addr]] = nxt[addr];
	if (nxt[addr] != -1) pre[nxt[addr]] = pre[addr];

	// ๋‚จ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ถ€๋Ÿฌ ์ง€์šธ ํ•„์š”๋Š” ์—†์Œ
	// ์–ด์ฐจํ”ผ ์ ‘๊ทผํ•  ์ผ๋„ ์—†๊ณ , ์ƒˆ๋กœ ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ ๋ฎ์–ด์”Œ์›Œ์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// STL list
#include <bits/stdc++.h>
using namespace std;

// push_back, pop_back, push_front, pop_front๋Š” ๋ชจ๋‘ O(1)
int main(void)
{
	list<int> L = { 1, 2 }; // 1 2
	list<int>::iterator t = L.begin(); // t๋Š” 1์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ค‘
	// c++ 11 ์ด์ƒ ์ผ๋•Œ auto t = L.begin() ๊ฐ€๋Šฅ
	L.push_front(10); // 10 1 2
	cout << *t << '\n'; // t๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’ = 1์„ ์ถœ๋ ฅ
	L.push_back(5); // 10 1 2 5
	L.insert(t, 6); // t๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ ์•ž์— 6์„ ์‚ฝ์ž…, 10 6 1 2 5
	t++; // t๋ฅผ 1์นธ ์•ž์œผ๋กœ ์ „์ง„, ํ˜„์žฌ t๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ 2
	t = L.erase(t); // t๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ์ œ๊ฑฐ, ๊ทธ ๋‹ค์Œ ์›์†Œ์ธ 5์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜
					// 10 6 1 5, t๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์€ 5
	cout << *t << '\n'; // 5
	for(auto i : L) cout << i << ' '; // C++ 11 ์ด์ƒ
	cout << '\n';
	for(list<int>::iterator it = L.begin(); it != L.end(); it++)
	cout << *it << ' ';
}// remove unique merge reverse sort splice
// []๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ, ๋”ฐ๋ผ์„œ ์ž„์˜ ์ ‘๊ทผ ๋ฐ˜๋ณต์ž๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” binary_search ์•Œ๊ณ ๋ฆฌ๋“ฌ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค

์ค‘๊ฐ„์— ๋งŒ๋‚˜๋Š” ๋‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ ๋“ค์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋งŒ๋‚˜๋Š” ์ง€์ ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•?

๋‘˜ ๋‹ค ๋๊นŒ์ง€ ์ง„ํ–‰์‹œํ‚จ ํ›„์— ๊ทธ ๊ธธ์ด๋ฅผ ๊ธฐ๋ก
๋‹ค์‹œ ์‹œ์ž‘์ ๋“ค๋กœ ๋Œ์•„์™€์„œ ์งง์€ ์ชฝ์„ ๊ธธ์ด ์ฐจ์ด๋งŒํผ ๋จผ์ € ์ง„ํ–‰
์ดํ›„ ๋™์‹œ์— ํ•˜๋‚˜์”ฉ ์ „์ง„ํ•ด๋‚˜๊ฐ€๋ฉฐ ๋งŒ๋‚˜๋Š” ์ง€์  ์ฐพ๊ธฐ

๊ณต๊ฐ„ ๋ณต์žก๋„ O(1), ์‹œ๊ฐ„ ๋ณต์žก๋„ O(A + B)


์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋ผ

Floydโ€™s cycle-finding algorithm, ๊ณต๊ฐ„ ๋ณต์žก๋„ O(1), ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N)


  • ์šด์˜ ์ฒด์ œ์—์„œ ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ
  • ํฌ์†Œ ํ–‰๋ ฌ Sparse Matrix์„ ํ‘œํ˜„ํ• ๋•Œ
  • ๋ฑ์ด๋‚˜ ์Šคํƒ, ํ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ๊ธฐ์ดˆ ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ
  • ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ปจํ…์ธ ๋ฅผ ์ €์žฅํ•  ๋•Œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉ. ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ์ค‘๊ฐ„์—์„œ ๋ฌธ์ž๊ฐ€ ์ž…๋ ฅ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ


์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.