List BinarySearch

C# List, ¹è¿­Àº BinarySearch¸¦ Áö¿øÇÑ´Ù.
BinarySearch¸¦ ÇϱâÀü¿¡ Á¤·ÄÀÌ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.

using System;
using System.Collections.Generic;

class Test
{
    public void Run()
    {
        List<string> l = new List<string>();
        l.Add("acorn");      // 0
        l.Add("apple");      // 1
        l.Add("banana");     // 2
        l.Add("cantaloupe"); // 3
        l.Add("lettuce");    // 4
        l.Add("onion");      // 5
        l.Add("peach");      // 6
        l.Add("pepper");     // 7
        l.Add("squash");     // 8
        l.Add("tangerine");  // 9

        int i = l.BinarySearch("peach");
        Console.WriteLine(i);

        i = l.BinarySearch("banana");
        Console.WriteLine(i);

        i = l.BinarySearch("apple");
        Console.WriteLine(i);

        i = l.BinarySearch("abstract");
        Console.WriteLine(i + " complement ==> " + ~i);

        i = l.BinarySearch("assume");
        Console.WriteLine( i + " complement ==> " + ~i);
    }
}

½ÇÇà °á°ú)
6
2
1
-1 complement ==> 0
-3 complement ==> 2

°Ë»ö °á°ú°¡ 0º¸´Ù ÀÛÀ¸¸é °ªÀÌ Á¸ÀçÇÏÁö ¾ÊÀ»¶§ÀÌ´Ù. "~" º¸¼ö·Î ¹Ù²Ù¸é °á°ú°ªÀÌ µé¾î°¡¾ß ÇÒ À§Ä¡ÀÌ´Ù.
"abstract"ÀÇ °á°ú°ªÀº -1 º¸¼ö´Â 0ÀÌ´Ù.
"assume"ÀÇ °á°ú°ªÀº -3 º¸¼ö´Â 2ÀÌ´Ù.

IComparer¸¦ ÀÌ¿ëÇÏ¿© Ä¿½ºÅÒ ºñ±³ ÇÔ¼ö¸¦ ¸¸µé¼öµµ ÀÖ´Ù.
¾Æ·¡´Â Start¿Í End°ª¿¡ Æ÷ÇԵǴ À妽º¸¦ ã´Â ¿¹Á¦ÀÌ´Ù.

ÁÖÀÇ»çÇ×)
List.BinarySearch¸¦ ½ÇÇà ÇßÀ» ¶§ Compare(lhs, rhs )·Î ³Ñ¾î¿À´Â °ªÀÌ ¸ð³ë C#°ú À©µµ¿ìÁî C#ÀÌ ´Ù¸£´Ù.

BinarySearch Item ºñ±³°ªÀÌ Compare( ) ÇÔ¼ö·Î ³Ñ¾î¿Ã¶§ À¯´ÏƼ C#¿¡¼­´Â LHS, MS À©µµ¿ìÁî C#¿¡¼­´Â RHSÀÌ´Ù.
À¯´ÏƼ C#¿¡¼­´Â this.End°¡ -1ÀÌ´Ù.
MS À©µµ¿ìÁî C#¿¡¼­´Â other.End°¡ -1ÀÌ´Ù.

Ç÷§Æû¿¡ µû¶ó ¹üÀ§ ¾È¿¡ Æ÷ÇԵǴÂÁö üũ¸¦ ´Þ¸® ÇØ¾ß ÇÑ´Ù.
BinarySearch¿¡¼­ ³Ñ°ÜÁÖ´Â itemÀÇ( Range )ÀÇ End °ªÀÌ -1À» ºñ±³°ªÀ¸·Î Á¤ÇÑ´Ù.

using System;
using System.Collections.Generic;

public class Range
{
    public int Start { get; set; }
    public int End { get; set; }

    public Range( int start, int end)
    {
        Start = start;
        End = end;
    }

    public int Comp(Range other)
    {
        //BinarySearch Item ºñ±³°ªÀÌ Compare( ) ÇÔ¼ö·Î ³Ñ¾î¿Ã¶§
        //À¯´ÏƼ C#¿¡¼­´Â LHS, MS À©µµ¿ìÁî C#¿¡¼­´Â RHSÀÌ´Ù.
        if (other.End == -1)
        {           
            int v = other.Start;
            if (v >= Start && v <= End)
                return 0;
        }
        else
        {
            int v = Start;
            if (v >= other.Start && v <= other.End)
                return 0;
        }

        int val = other.Start;
        if (Start > val)
            return 1;
        else if (Start < val)
            return -1;
        else
            return 0;
    }
}

public class RangeComparer : IComparer<Range>
{
    public int Compare(Range x, Range y)
    {
        return x.Comp(y);
    }
}

class Test
{
    public void Run()
    {
        List<Range> list = new List<Range>();
        list.Add(new Range(1, 10));
        list.Add(new Range(20, 100));
        list.Add(new Range(300, 1000));
        list.Add(new Range(4000, 10000));
        list.Add(new Range(50000, 60000));

        RangeComparer rangeComparer = new RangeComparer();
        int index = list.BinarySearch(0, 5, new Range(10, -1), rangeComparer);
        Console.WriteLine(index);
        index = list.BinarySearch(new Range(21, -1), rangeComparer);
        Console.WriteLine(index);
        index = list.BinarySearch(new Range(301, -1), rangeComparer);
        Console.WriteLine(index);
        index = list.BinarySearch(new Range(10000, -1), rangeComparer);
        Console.WriteLine(index);
        index = list.BinarySearch(new Range(50001, -1), rangeComparer);
        Console.WriteLine(index);
        
    }
}

½ÇÇà°á°ú)
0
1
2
3
4

ÂüÁ¶)
https://www.dotnetperls.com/binarysearch