Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)
๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ/ํŠธ๋ฆฌ

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)

2023. 4. 13. 00:42

1. ๊ฐœ๋… ๐Ÿ›ซ

  ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)๋ž€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๋•Œ ํŠน์ • ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

  ํŠธ๋ฆฌ ์ข…๋ฅ˜ ์ค‘ ํ•˜๋‚˜๋กœ ์ด์ง„ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ์ด๋ฉฐ, ํŠน์ • ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. O(log N)

 

2. ๋™์ž‘๋ฐฉ์‹ ๐Ÿš

  ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  '๊ตฌ๊ฐ„ ํ•ฉ ํŠธ๋ฆฌ'๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  '๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜'์™€ '์›์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ํ•จ์ˆ˜'๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ํŠน์ • ์›์†Œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

  '1 9 3 8 4 5 5 9 10 3 4 5'๋ผ๋Š” 12๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.

1. ๊ตฌ๊ฐ„ ํ•ฉ ํŠธ๋ฆฌ ์ƒ์„ฑํ•˜๊ธฐ

  '๊ตฌ๊ฐ„'์€ ์›๋ž˜ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„๋ฅผ ๋ฐ˜์”ฉ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋Š” ์ „์ฒด ์›์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ๊ฐ„์ธ 0~11๋กœ ์„ค์ •๋œ๋‹ค. ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹์€ 0~5, ์˜ค๋ฅธ์ชฝ ์ž์‹์€ 6~11์˜ ๊ตฌ๊ฐ„์„ ๊ฐ€์ง„๋‹ค.

  ์ด๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ๊ฐ„์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” ๋…ธ๋“œ์˜ ๊ฐ’์„ ํ‘œํ˜„ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ตฌ๊ฐ„์„ ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋‹ค.)

  ๊ตฌ๊ฐ„ ํ•ฉ ํŠธ๋ฆฌ์˜ ์›์†Œ ๊ฐœ์ˆ˜๋Š” 32๊ฐœ์—ฌ์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ๊ฐ„๋‹จํžˆ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ N(=12) ๊ฐœ ์ผ ๋•Œ N๋ณด๋‹ค ํฐ ์ œ๊ณฑ์ˆ˜(= 16)๋ฅผ 2๋ฐฐ ํ•œ ๊ฒƒ(=32)์ด๋‹ค. ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜ N(=12)์— 4๋ฅผ ๊ณฑํ•œ ๊ฐ’(=48)์„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋กœ ํ• ๋‹นํ•ด ๋†“์œผ๋ฉด ๋œ๋‹ค.

  ๊ฐ๊ฐ์˜ ๋…ธ๋“œ ๊ฐ’๋“ค์€ ๋…ธ๋“œ์˜ ๊ตฌ๊ฐ„์— ์†ํ•œ ์›์†Œ๋“ค์˜ ํ•ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

static int init(int startIdx, int endIdx, int nodeIdx) {
    // ์ž๊ธฐ ์ž์‹ ๋งŒ์„ ์›์†Œ๋กœ ๊ฐ€์ง€๋Š” ๊ตฌ๊ฐ„ // ๋ ๊ตฌ๊ฐ„
    if(startIdx == endIdx)
        return segTree[nodeIdx] = arr[startIdx];

    int mid = (startIdx + endIdx) / 2;
    // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ๊ตฌ๊ฐ„ ํ•ฉ
    int leftSum = init(startIdx, mid, nodeIdx * 2);
    // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ๊ตฌ๊ฐ„ ํ•ฉ
    int rightSum = init(mid + 1, endIdx, nodeIdx * 2 + 1);

    return segTree[nodeIdx] = leftSum + rightSum;

}

2. ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

  4~8์˜ ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์˜ ์„ธ ๋…ธ๋“œ์˜ ๊ฐ’๋งŒ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  ํ•ด๋‹น ๋…ธ๋“œ๋“ค์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” 3๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„์„ ํƒ€๊ฒŸ ๊ตฌ๊ฐ„์ด๋ผ๊ณ  ํ•˜์ž.

  1. ํƒ์ƒ‰ํ•˜๋Š” ๊ตฌ๊ฐ„์ด ํƒ€๊ฒŸ ๊ตฌ๊ฐ„์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ
    ํ•ด๋‹น ๋…ธ๋“œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  2. ํƒ์ƒ‰ํ•˜๋Š” ๊ตฌ๊ฐ„์ด ํƒ€๊ฒŸ ๊ตฌ๊ฐ„์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    ๋” ์ด์ƒ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ํƒ์ƒ‰ํ•˜๋Š” ๊ตฌ๊ฐ„์ด ํƒ€๊ฒŸ ๊ตฌ๊ฐ„์— ์ผ๋ถ€๋ถ„ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ
    ์ž์‹ ๋…ธ๋“œ๋“ค์˜ ๊ตฌ๊ฐ„์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด์„œ 1๋ฒˆ๊ณผ 2๋ฒˆ์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•  ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ํ•œ๋‹ค.

  ์ด๋ฅผ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

// ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„ : left ~ right
static int sum(int startIdx, int endIdx, int nodeIdx, int left, int right) {
    // ๊ตฌ๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
    if(left > endIdx || right < startIdx)
        return 0;

    // ๊ตฌ๊ฐ„์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ
    if(left <= startIdx && endIdx <= right)
        return segTree[nodeIdx];

    // ๊ตฌ๊ฐ„์— ๊ฑธ์น˜๋Š” ๊ฒฝ์šฐ
    // ์ž์‹ ๋…ธ๋“œ๋กœ ์ง„์ž…ํ•˜์—ฌ ๊ตฌ๊ฐ„์— ์†ํ•˜๋Š” ๊ฒƒ๋งŒ ์ฐพ๊ธฐ
    int mid = (startIdx + endIdx) / 2;
    int leftRangeSum = sum(startIdx, mid, nodeIdx * 2, left, right);
    int rightRangeSum = sum(mid + 1, endIdx, nodeIdx * 2 + 1, left, right);
    return leftRangeSum + rightRangeSum;
}

3. ํŠน์ • ์›์†Œ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

  ํŠน์ • ์›์†Œ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ํ•ด๋‹น ์›์†Œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ตฌ๊ฐ„์˜ ๋…ธ๋“œ๋“ค์„ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 3๋ฒˆ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์•„๋ž˜ ํ‘œ์‹œ๋œ ๋…ธ๋“œ๋“ค์„ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธํ•ด์ค˜์•ผ ํ•œ๋‹ค. (๋™๊ทธ๋ผ๋ฏธ ์•ˆ์—๋Š” ๊ตฌ๊ฐ„์˜ ๋ฒ”์œ„๋ฅผ ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋‹ค.)

  ์ด๋ฅผ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

static void update(int startIdx, int endIdx, int nodeIdx, int targetIdx, int diff) {
    // ๊ตฌ๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
    if(targetIdx < startIdx || targetIdx > endIdx)
        return;

    // ๊ตฌ๊ฐ„์— ์†ํ•˜๋Š” ๊ฒฝ์šฐ(diff์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ) 
    // diff(๊ธฐ์กด๊ฐ’๊ณผ ์ƒˆ๋กœ์šด ๊ฐ’์˜ ์ฐจ์ด)๋ฅผ ๋”ํ•ด์ฃผ๊ธฐ
    segTree[nodeIdx] += diff;

    // leaf ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
    if(startIdx == endIdx)
        return;

    // ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—
    // targetIdx๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ์ž์‹๋…ธ๋“œ๋กœ ๋‚ด๋ ค๊ฐ€์•ผ ํ•จ
    int mid = (startIdx + endIdx) / 2;

    update(startIdx, mid, nodeIdx * 2, targetIdx, diff);
    update(mid + 1, endIdx, nodeIdx * 2 + 1, targetIdx, diff);
}

 

3. ๊ตฌํ˜„(JAVA) ๐Ÿš€

static int[] arr = {1, 9, 3, 8, 4, 5, 5, 9, 10, 3, 4, 5}; 
static int cnt = arr.length;
static int[] segTree = new int[4 * cnt];

public static void main(String[] args) {

    init(0, cnt - 1, 1);

    // 0๋ถ€ํ„ฐ 12๊นŒ์ง€์˜ ๊ตฌ๊ฐ„ ํ•ฉ(์ „์ฒด ๊ตฌ๊ฐ„)
    System.out.println(sum(0, cnt - 1, 1, 0, 12)); // 66
    // 4๋ถ€ํ„ฐ 8๊นŒ์ง€์˜ ๊ตฌ๊ฐ„ ํ•ฉ(์ „์ฒด ๊ตฌ๊ฐ„)
    System.out.println(sum(0, cnt - 1, 1, 4, 8)); // 33

    // 3๋ฒˆ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ 8์—์„œ 7๋กœ ์ˆ˜์ • (diff = -6)
    update(0, cnt - 1, 1, 3, -6);

    // ๋ณ€๊ฒฝ ํ›„ : 0~2 ๊ตฌ๊ฐ„ํ•ฉ
    // ๋ณ€ํ™”X
    System.out.println(sum(0, cnt - 1, 1, 0, 2)); // 13

    // ๋ณ€๊ฒฝ ํ›„ : ์ „์ฒด ๊ตฌ๊ฐ„ํ•ฉ
    // ๋ณ€ํ™”O (66 -> 60)
    System.out.println(sum(0, cnt - 1, 1, 0, 12)); // 60
}

// 1. ๊ตฌ๊ฐ„ ํ•ฉ ํŠธ๋ฆฌ ์ƒ์„ฑํ•˜๊ธฐ
static int init(int startIdx, int endIdx, int nodeIdx) {
    // ์ž๊ธฐ ์ž์‹ ๋งŒ์„ ์›์†Œ๋กœ ๊ฐ€์ง€๋Š” ๊ตฌ๊ฐ„ // ๋ ๊ตฌ๊ฐ„
    if(startIdx == endIdx)
        return segTree[nodeIdx] = arr[startIdx];

    int mid = (startIdx + endIdx) / 2;
    // ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ๊ตฌ๊ฐ„ ํ•ฉ
    int leftSum = init(startIdx, mid, nodeIdx * 2);
    // ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ๊ตฌ๊ฐ„ ํ•ฉ
    int rightSum = init(mid + 1, endIdx, nodeIdx * 2 + 1);

    return segTree[nodeIdx] = leftSum + rightSum;

}

// 2. ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
// ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„ : left ~ right
static int sum(int startIdx, int endIdx, int nodeIdx, int left, int right) {
    // ๊ตฌ๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
    if(left > endIdx || right < startIdx)
        return 0;

    // ๊ตฌ๊ฐ„์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ
    if(left <= startIdx && endIdx <= right)
        return segTree[nodeIdx];

    // ๊ตฌ๊ฐ„์— ๊ฑธ์น˜๋Š” ๊ฒฝ์šฐ
    // ์ž์‹ ๋…ธ๋“œ๋กœ ์ง„์ž…ํ•˜์—ฌ ๊ตฌ๊ฐ„์— ์†ํ•˜๋Š” ๊ฒƒ๋งŒ ์ฐพ๊ธฐ
    int mid = (startIdx + endIdx) / 2;
    int leftRangeSum = sum(startIdx, mid, nodeIdx * 2, left, right);
    int rightRangeSum = sum(mid + 1, endIdx, nodeIdx * 2 + 1, left, right);
    return leftRangeSum + rightRangeSum;
}

// 3. ํŠน์ • ์›์†Œ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
static void update(int startIdx, int endIdx, int nodeIdx, int targetIdx, int diff) {
    // ๊ตฌ๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
    if(targetIdx < startIdx || targetIdx > endIdx)
        return;

    // ๊ตฌ๊ฐ„์— ์†ํ•˜๋Š” ๊ฒฝ์šฐ(diff์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ) 
    // diff(๊ธฐ์กด๊ฐ’๊ณผ ์ƒˆ๋กœ์šด ๊ฐ’์˜ ์ฐจ์ด)๋ฅผ ๋”ํ•ด์ฃผ๊ธฐ
    segTree[nodeIdx] += diff;

    // leaf ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
    if(startIdx == endIdx)
        return;

    // ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—
    // targetIdx๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด ์ž์‹๋…ธ๋“œ๋กœ ๋‚ด๋ ค๊ฐ€์•ผ ํ•จ
    int mid = (startIdx + endIdx) / 2;

    update(startIdx, mid, nodeIdx * 2, targetIdx, diff);
    update(mid + 1, endIdx, nodeIdx * 2 + 1, targetIdx, diff);
}

 

4. ์‹œ๊ฐ„๋ณต์žก๋„ ๐Ÿ›ธ

  ๊ตฌ๊ฐ„ ํ•ฉ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ O(N log N)์ด๋‹ค.

  ๊ทธ๋ฆฌ๊ณ  ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ๊ฒฝ์‹ ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(log N)์ด๋‹ค.

 

ํ•ด๋‹น ๊ธ€์€
๋‚˜๋™๋นˆ ๋‹˜์˜ '41. ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)',
pseong ๋‹˜์˜ '์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(๊ตฌ๊ฐ„ ํŠธ๋ฆฌ), ๋А๋ฆฌ๊ฒŒ ๊ฐฑ์‹ ๋˜๋Š” ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Lazy Propagation)'
๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

'๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ > ํŠธ๋ฆฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์ž๋ฃŒ๊ตฌ์กฐ] ํž™(Heap)  (0) 2023.03.10
    '๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ/ํŠธ๋ฆฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [์ž๋ฃŒ๊ตฌ์กฐ] ํž™(Heap)
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”